diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/TrackingRunner.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/TrackingRunner.java index 6d7a17c6c006..ab3afe97ea78 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/TrackingRunner.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/TrackingRunner.java @@ -14,6 +14,7 @@ import com.intellij.codeInspection.dataFlow.value.DfaVariableValue; import com.intellij.codeInspection.dataFlow.value.VariableDescriptor; import com.intellij.openapi.editor.Document; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.Segment; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.util.ArrayUtil; @@ -91,7 +92,7 @@ public class TrackingRunner extends StandardDataFlowRunner { public static class CauseItem { final @NotNull List myChildren; final @NotNull DfaProblemType myProblem; - final @Nullable PsiElement myTarget; + final @Nullable SmartPsiElementPointer myTarget; CauseItem(@NotNull String problem, @Nullable PsiElement target) { this(new CustomDfaProblemType(problem), target); @@ -100,7 +101,7 @@ public class TrackingRunner extends StandardDataFlowRunner { CauseItem(@NotNull DfaProblemType problem, @Nullable PsiElement target) { myChildren = new ArrayList<>(); myProblem = problem; - myTarget = target; + myTarget = target == null ? null : SmartPointerManager.createPointer(target); } CauseItem(@NotNull String problem, @NotNull MemoryStateChange change) { @@ -135,7 +136,8 @@ public class TrackingRunner extends StandardDataFlowRunner { } private String dump(Document doc, int indent) { - return StringUtil.repeat(" ", indent) + render(doc) + (myTarget == null ? "" : " (" + myTarget.getText() + ")") + "\n" + + PsiElement target = myTarget != null ? myTarget.getElement() : null; + return StringUtil.repeat(" ", indent) + render(doc) + (target == null ? "" : " (" + target.getText() + ")") + "\n" + StreamEx.of(myChildren).map(child -> child.dump(doc, indent + 1)).joining(); } @@ -144,15 +146,20 @@ public class TrackingRunner extends StandardDataFlowRunner { } @Nullable - public PsiElement getTarget() { - return myTarget; + public PsiFile getFile() { + return myTarget != null ? myTarget.getContainingFile() : null; + } + + public Segment getTargetSegment() { + return myTarget == null ? null : myTarget.getRange(); } public String render(Document doc) { - if (myTarget != null) { + Segment range = getTargetSegment(); + if (range != null) { String cause = myProblem.toString(); if (cause.endsWith("#ref")) { - int offset = myTarget.getTextRange().getStartOffset(); + int offset = range.getStartOffset(); int number = doc.getLineNumber(offset); return cause.replaceFirst("#ref$", "line #" + (number + 1)); } diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/fix/FindDfaProblemCauseFix.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/fix/FindDfaProblemCauseFix.java index 755ecc40a896..61dc3def536b 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/fix/FindDfaProblemCauseFix.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/fix/FindDfaProblemCauseFix.java @@ -10,6 +10,8 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.dataFlow.TrackingRunner; import com.intellij.ide.util.PsiNavigationSupport; import com.intellij.lang.injection.InjectedLanguageManager; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileEditorManager; @@ -19,9 +21,13 @@ import com.intellij.openapi.ui.popup.JBPopupAdapter; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.LightweightWindowEvent; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.Segment; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.*; +import com.intellij.psi.PsiExpression; +import com.intellij.psi.PsiFile; +import com.intellij.psi.SmartPointerManager; +import com.intellij.psi.SmartPsiElementPointer; import com.intellij.util.containers.ContainerUtil; import one.util.streamex.EntryStream; import org.jetbrains.annotations.Nls; @@ -62,22 +68,28 @@ public class FindDfaProblemCauseFix implements LocalQuickFix, LowPriorityAction @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { + ApplicationManager.getApplication().executeOnPooledThread(() -> ReadAction.run(this::findCause)); + } + + private void findCause() { PsiExpression element = myAnchor.getElement(); if (element == null) return; + PsiFile file = element.getContainingFile(); + List items = + TrackingRunner.findProblemCause(myUnknownMembersAsNullable, myIgnoreAssertStatements, element, myProblemType); + + ApplicationManager.getApplication().invokeLater(() -> ReadAction.run(() -> displayProblemCause(file, items))); + } + + private static void displayProblemCause(PsiFile file, List items) { + if (!file.isValid()) return; + Project project = file.getProject(); Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor(); if (editor == null) return; Document document = editor.getDocument(); - PsiFile file = element.getContainingFile(); PsiFile topLevelFile = InjectedLanguageManager.getInstance(project).getTopLevelFile(file); if (topLevelFile == null || document != topLevelFile.getViewProvider().getDocument()) return; - List items = - TrackingRunner.findProblemCause(myUnknownMembersAsNullable, myIgnoreAssertStatements, element, myProblemType); TrackingRunner.CauseItem root = ContainerUtil.getOnlyItem(items); - if (root == null) { - HintManagerImpl hintManager = (HintManagerImpl)HintManager.getInstance(); - hintManager.showErrorHint(editor, "Unable to find the cause"); - return; - } class CauseWithDepth { final int myDepth; final TrackingRunner.CauseItem myCauseItem; @@ -92,8 +104,12 @@ public class FindDfaProblemCauseFix implements LocalQuickFix, LowPriorityAction return StringUtil.repeat(" ", myDepth - 1) + myCauseItem.render(document); } } - List causes = - EntryStream.ofTree(root, (depth, c) -> c.children()).skip(1).mapKeyValue((d, i) -> new CauseWithDepth(d, i)).toList(); + List causes; + if (root == null) { + causes = Collections.emptyList(); + } else { + causes = EntryStream.ofTree(root, (depth, c) -> c.children()).skip(1).mapKeyValue((d, i) -> new CauseWithDepth(d, i)).toList(); + } if (causes.isEmpty()) { HintManagerImpl hintManager = (HintManagerImpl)HintManager.getInstance(); hintManager.showErrorHint(editor, "Unable to find the cause"); @@ -117,9 +133,9 @@ public class FindDfaProblemCauseFix implements LocalQuickFix, LowPriorityAction if (h == null) return; h.dropHighlight(); if (cause == null) return; - PsiElement target = cause.myCauseItem.getTarget(); - if (target == null || !target.isValid()) return; - TextRange range = target.getTextRange(); + Segment target = cause.myCauseItem.getTargetSegment(); + if (target == null) return; + TextRange range = TextRange.create(target); h.highlight(Pair.create(range, Collections.singletonList(range))); }) .addListener(new JBPopupAdapter() { @@ -134,10 +150,9 @@ public class FindDfaProblemCauseFix implements LocalQuickFix, LowPriorityAction } private static void navigate(Editor editor, PsiFile file, TrackingRunner.CauseItem item) { - PsiElement target = item.getTarget(); - if (target == null) return; - TextRange range = target.getTextRange(); - PsiFile targetFile = target.getContainingFile(); + Segment range = item.getTargetSegment(); + if (range == null) return; + PsiFile targetFile = item.getFile(); assert targetFile == file; PsiNavigationSupport.getInstance().createNavigatable(file.getProject(), targetFile.getVirtualFile(), range.getStartOffset()) .navigate(true); diff --git a/platform/built-in-server/start-up-visualizer/package.json b/platform/built-in-server/start-up-visualizer/package.json index 3f91a38ed4d7..ca500573d11d 100644 --- a/platform/built-in-server/start-up-visualizer/package.json +++ b/platform/built-in-server/start-up-visualizer/package.json @@ -8,21 +8,21 @@ }, "//": "https://github.com/amcharts/amcharts4/issues/1101", "dependencies": { - "@amcharts/amcharts4": "4.3.7", + "@amcharts/amcharts4": "4.3.14", "element-ui": "^2.7.2", "semver": "^6.0.0", "vue": "^2.6.10", "vue-class-component": "^7.0.2", "vue-property-decorator": "^8.1.0", - "vue-router": "^3.0.2", + "vue-router": "^3.0.5", "vuex": "^3.1.0", "vuex-persist": "^2.0.0" }, "devDependencies": { "@types/semver": "^6.0.0", - "@vue/cli-plugin-typescript": "^3.5.3", - "@vue/cli-service": "^3.5.3", - "typescript": "^3.4.1", + "@vue/cli-plugin-typescript": "^3.6.0", + "@vue/cli-service": "^3.6.0", + "typescript": "^3.4.3", "vue-template-compiler": "^2.6.10", "vuex-module-decorators": "^0.9.8" }, diff --git a/platform/built-in-server/start-up-visualizer/public/index.html b/platform/built-in-server/start-up-visualizer/public/index.html index 24c1bbda0379..b4f47be040ad 100644 --- a/platform/built-in-server/start-up-visualizer/public/index.html +++ b/platform/built-in-server/start-up-visualizer/public/index.html @@ -14,9 +14,9 @@
- - - + + + diff --git a/platform/built-in-server/start-up-visualizer/src/charts/ActivityChart.vue b/platform/built-in-server/start-up-visualizer/src/charts/ActivityChart.vue index bc1306fa354f..65ae815799c9 100644 --- a/platform/built-in-server/start-up-visualizer/src/charts/ActivityChart.vue +++ b/platform/built-in-server/start-up-visualizer/src/charts/ActivityChart.vue @@ -5,9 +5,10 @@