From 53a202f3bd14e55b40b7591cd1647b15f3a7fc98 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 17 Apr 2019 16:08:16 +0700 Subject: [PATCH 01/10] FindDfaProblemCauseFix: move computation to background thread (IDEA-209947) --- .../dataFlow/TrackingRunner.java | 19 ++++++--- .../dataFlow/fix/FindDfaProblemCauseFix.java | 39 ++++++++++++------- 2 files changed, 39 insertions(+), 19 deletions(-) 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..99f8ebda8e66 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 = getTarget(); + return StringUtil.repeat(" ", indent) + render(doc) + (target == null ? "" : " (" + target.getText() + ")") + "\n" + StreamEx.of(myChildren).map(child -> child.dump(doc, indent + 1)).joining(); } @@ -145,14 +147,19 @@ public class TrackingRunner extends StandardDataFlowRunner { @Nullable public PsiElement getTarget() { - return myTarget; + return myTarget != null ? myTarget.getElement() : 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..573e4915987e 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,6 +21,7 @@ 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.*; @@ -62,22 +65,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 +101,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 +130,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() { From 1295cf5ba1ef91c169d51cc7ac96631e2b714608 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 15 Apr 2019 16:27:17 +0200 Subject: [PATCH 02/10] do not measure module components and default project components, duration for components mean own only (excluding other components initialization time) Otherwise duplicated activity names produced because project components are already reported and can be more than one module. --- .../start-up-visualizer/package.json | 10 +- .../start-up-visualizer/public/index.html | 6 +- .../src/charts/ActivityChart.vue | 3 +- .../src/charts/ActivityChartManager.ts | 41 +- .../src/charts/ComponentChartManager.ts | 29 + .../start-up-visualizer/yarn.lock | 542 +++++++++++------- .../components/impl/ComponentManagerImpl.java | 16 +- .../diagnostic/StartUpPerformanceReporter.kt | 48 +- .../intellij/diagnostic/ParallelActivity.java | 7 +- 9 files changed, 427 insertions(+), 275 deletions(-) create mode 100644 platform/built-in-server/start-up-visualizer/src/charts/ComponentChartManager.ts 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 @@