From cbd50b31161304daec0afc1759ba47b4cd32bdbf Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Wed, 27 Nov 2013 17:54:06 +0100 Subject: [PATCH 1/4] Behave the same as EditorImpl. --- .../plugins/terminal/JBTerminalSystemSettingsProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalSystemSettingsProvider.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalSystemSettingsProvider.java index 4adeb3cab133..dc1524bf6a20 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalSystemSettingsProvider.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalSystemSettingsProvider.java @@ -174,7 +174,7 @@ class JBTerminalSystemSettingsProvider extends DefaultTabbedSettingsProvider imp @Override public boolean useAntialiasing() { - return UISettings.getInstance().ANTIALIASING_IN_EDITOR; + return true; // we return true here because all the settings are checked again in UiSettings.setupAntialiasing } @Override From 3de5bbe58ffb4dfa5f09888046bd420fa6ffd3a9 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Wed, 27 Nov 2013 18:09:40 +0100 Subject: [PATCH 2/4] Setup composite as it is done in EditorImpl.paintComponent. --- .../src/org/jetbrains/plugins/terminal/JBTerminalPanel.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalPanel.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalPanel.java index 767df1e3612c..259d93c56665 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalPanel.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalPanel.java @@ -114,6 +114,7 @@ public class JBTerminalPanel extends TerminalPanel implements FocusListener, Ter @Override protected void setupAntialiasing(Graphics graphics) { + UIUtil.setupComposite((Graphics2D)graphics); UISettings.setupAntialiasing(graphics); } From b889d6e1488074364c81c43450daf7ef008a4fa0 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 27 Nov 2013 18:35:31 +0100 Subject: [PATCH 3/4] cache intermediate dir infos in RootIndex --- .../intellij/openapi/roots/impl/RootIndex.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/RootIndex.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/RootIndex.java index df8b295ec9de..e2f74affe06f 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/RootIndex.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/RootIndex.java @@ -338,27 +338,37 @@ class RootIndex { DirectoryInfo info = myInfoCache.get(root); if (info != null) { if (dir != root) { - myInfoCache.put(dir, info); + cacheInfos(dir, root, info); } return info == NULL_INFO ? null : info; } info = myRoots.get(root); if (info != null) { - myInfoCache.put(dir, info); + cacheInfos(dir, root, info); return info; } if (isAnyExcludeRoot(root) || FileTypeManager.getInstance().isFileIgnored(root)) { - myInfoCache.put(dir, NULL_INFO); + cacheInfos(dir, root, NULL_INFO); return null; } } - myInfoCache.put(dir, NULL_INFO); + cacheInfos(dir, null, NULL_INFO); return null; } + private void cacheInfos(VirtualFile dir, @Nullable VirtualFile stopAt, @NotNull DirectoryInfo info) { + while (dir != null) { + myInfoCache.put(dir, info); + if (dir == stopAt) { + break; + } + dir = dir.getParent(); + } + } + private boolean isAnyExcludeRoot(VirtualFile root) { return myModuleExcludedRoots.contains(root) || myLibraryExcludedRoots.contains(root); } From 56f1936b8f7073a3d31a3b4b47fd24acccd8c0cf Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 27 Nov 2013 18:58:42 +0100 Subject: [PATCH 4/4] dfa: don't try to merge obviously incompatible states --- .../dataFlow/DfaInstructionState.java | 42 ++++++++++++------- .../dataFlow/DfaMemoryStateImpl.java | 7 +++- .../codeInspection/dataFlow/StateMerger.java | 8 +--- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaInstructionState.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaInstructionState.java index 22d2a09837a1..e519963352f5 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaInstructionState.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaInstructionState.java @@ -28,12 +28,10 @@ import com.intellij.codeInspection.dataFlow.instructions.Instruction; import com.intellij.openapi.util.Pair; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; -import java.util.Collections; -import java.util.List; -import java.util.PriorityQueue; -import java.util.Set; +import java.util.*; public class DfaInstructionState implements Comparable { public static final DfaInstructionState[] EMPTY_ARRAY = new DfaInstructionState[0]; @@ -96,15 +94,16 @@ class StateQueue { } if (memoryStates.size() > 1 && joinInstructions.contains(instruction)) { - StateMerger merger = new StateMerger(); - while (true) { - List nextStates = merger.mergeByEquality(memoryStates); - if (nextStates == null) nextStates = merger.mergeByType(memoryStates); - if (nextStates == null) nextStates = merger.mergeByNullability(memoryStates); - if (nextStates == null) nextStates = merger.mergeByUnknowns(memoryStates); - if (nextStates == null) break; - memoryStates = nextStates; + MultiMap groups = MultiMap.create(); + for (DfaMemoryStateImpl memoryState : memoryStates) { + groups.putValue(memoryState.getSuperficialKey(), memoryState); } + + memoryStates = ContainerUtil.newArrayList(); + for (Map.Entry> entry : groups.entrySet()) { + memoryStates.addAll(mergeGroup((List)entry.getValue())); + } + } return ContainerUtil.map(memoryStates, new Function() { @@ -113,7 +112,22 @@ class StateQueue { return new DfaInstructionState(instruction, state); } }); + } + + private static List mergeGroup(List group) { + if (group.size() < 2) { + return group; + } + + StateMerger merger = new StateMerger(); + while (true) { + List nextStates = merger.mergeByEquality(group); + if (nextStates == null) nextStates = merger.mergeByType(group); + if (nextStates == null) nextStates = merger.mergeByNullability(group); + if (nextStates == null) nextStates = merger.mergeByUnknowns(group); + if (nextStates == null) break; + group = nextStates; + } + return group; } - - } \ No newline at end of file diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java index ccf45ae12e6d..35f37f66358a 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java @@ -26,6 +26,7 @@ package com.intellij.codeInspection.dataFlow; import com.intellij.codeInspection.dataFlow.value.*; import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.UnorderedPair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.JavaTokenType; @@ -101,7 +102,11 @@ public class DfaMemoryStateImpl implements DfaMemoryState { return myUnknownVariables.equals(that.myUnknownVariables); } - boolean equalsSuperficially(DfaMemoryStateImpl other) { + Object getSuperficialKey() { + return Pair.create(myEphemeral, myStack); + } + + private boolean equalsSuperficially(DfaMemoryStateImpl other) { return myEphemeral == other.myEphemeral && myStack.equals(other.myStack); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java index aa69d05ea9a6..0a4308ded015 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java @@ -125,7 +125,7 @@ class StateMerger { List complementary = ContainerUtil.filter(similarStates, new Condition() { @Override public boolean value(DfaMemoryStateImpl state2) { - return state1.equalsSuperficially(state2) && state1.equalsByRelations(state2) && state1.equalsByVariableStates(state2); + return state1.equalsByRelations(state2) && state1.equalsByVariableStates(state2); } }); if (complementary.size() > 1) { @@ -162,8 +162,7 @@ class StateMerger { List complementary = ContainerUtil.filter(similarStates, new Condition() { @Override public boolean value(DfaMemoryStateImpl state2) { - return state1.equalsSuperficially(state2) && - state1.equalsByRelations(state2) && + return state1.equalsByRelations(state2) && areEquivalentModuloVar(state1, state2, var) && areVarStatesEqualModuloNullability(state1, state2, var); } @@ -300,9 +299,6 @@ class StateMerger { } private boolean seemCompatible(DfaMemoryStateImpl state1, DfaMemoryStateImpl state2, DfaVariableValue differentVar) { - if (!state1.equalsSuperficially(state2)) { - return false; - } Map varValues1 = getVarValues(state1); Map varValues2 = getVarValues(state2);