diff --git a/images/src/org/intellij/images/options/impl/ImagesOptionsTopHitProvider.java b/images/src/org/intellij/images/options/impl/ImagesOptionsTopHitProvider.java index 39675fc62d31..32efe6f703ae 100644 --- a/images/src/org/intellij/images/options/impl/ImagesOptionsTopHitProvider.java +++ b/images/src/org/intellij/images/options/impl/ImagesOptionsTopHitProvider.java @@ -15,19 +15,14 @@ */ package org.intellij.images.options.impl; -import com.intellij.ide.ui.ConfigurableOptionsTopHitProvider; +import com.intellij.application.options.editor.EditorOptionsTopHitProviderBase; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; /** * @author Sergey.Malenkov */ -public class ImagesOptionsTopHitProvider extends ConfigurableOptionsTopHitProvider { - @Override - public String getId() { - return "editor"; - } - +public class ImagesOptionsTopHitProvider extends EditorOptionsTopHitProviderBase { @Override protected Configurable getConfigurable(Project project) { return new OptionsConfigurabe(); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 32bc89d5518b..b6dacbe717fb 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -941,6 +941,10 @@ public class HighlightUtil extends HighlightUtilBase { isAllowed &= modifierOwnerParent instanceof PsiClass && !((PsiClass)modifierOwnerParent).isInterface(); } + if (containingClass != null && containingClass.isInterface()) { + isAllowed &= !PsiModifier.NATIVE.equals(modifier); + } + if (containingClass != null && containingClass.isAnnotationType()) { isAllowed &= !PsiModifier.STATIC.equals(modifier); isAllowed &= !PsiModifier.DEFAULT.equals(modifier); @@ -1518,6 +1522,12 @@ public class HighlightUtil extends HighlightUtilBase { .descriptionAndTooltip(JavaErrorMessages.message("bad.qualifier.in.super.method.reference", format(aClass), formatClass(superClass))).create(); } } + + if (expr instanceof PsiSuperExpression && !classT.isInheritor(aClass, false)) { + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) + .range(qualifier) + .descriptionAndTooltip(JavaErrorMessages.message("no.enclosing.instance.in.scope", format(aClass))).create(); + } } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/ReplaceWithTernaryOperatorFix.java b/java/java-analysis-impl/src/com/intellij/codeInspection/ReplaceWithTernaryOperatorFix.java index 212662fc7fdb..583cf36744b4 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/ReplaceWithTernaryOperatorFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/ReplaceWithTernaryOperatorFix.java @@ -22,6 +22,7 @@ import com.intellij.pom.Navigatable; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.util.PsiTypesUtil; +import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; /** @@ -95,7 +96,7 @@ public class ReplaceWithTernaryOperatorFix implements LocalQuickFix { return false; } - return !(expression.getParent() instanceof PsiExpressionStatement); + return !(expression.getParent() instanceof PsiExpressionStatement) && !PsiUtil.isAccessedForWriting(expression); } private static String suggestDefaultValue(@NotNull PsiExpression expression) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/ModifierNativeInInterface.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/ModifierNativeInInterface.java new file mode 100644 index 000000000000..aa3b062834f7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/ModifierNativeInInterface.java @@ -0,0 +1,5 @@ +interface A { + default native void m(){} + static native void m1(){} + native void m2(); +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/TypeNameInterfaceSuperMethodReferenceApplicability.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/TypeNameInterfaceSuperMethodReferenceApplicability.java index 28f175aae9e4..23bdff178cca 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/TypeNameInterfaceSuperMethodReferenceApplicability.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/TypeNameInterfaceSuperMethodReferenceApplicability.java @@ -38,5 +38,12 @@ class Test { } }; } + + interface D extends J { + default void m() { + D.super.toString(); + J.super.toString(); + } + } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithTernaryOperator/beforeLValue.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithTernaryOperator/beforeLValue.java new file mode 100644 index 000000000000..394fda7f580f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithTernaryOperator/beforeLValue.java @@ -0,0 +1,9 @@ +// "Replace with 'a != null ?:'" "false" +class A{ + void test(){ + A a = null; + a.field = 2; + } + + int field; +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java index f308271a953a..83770afac62b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java @@ -36,6 +36,7 @@ public class Interface8MethodsHighlightingTest extends LightCodeInsightFixtureTe public void testStaticMethodCalls() { doTest(false, false); } public void testStaticMethodCallsAndOverloadResolution() { doTest(false, false); } public void testDefaultMethodOverrideEquivalentObject() { doTest(false, false); } + public void testModifierNativeInInterface() { doTest(false, false); } public void testStaticMethods() { doTest(false, false); } public void testFinalStaticDefaultMethods() { doTest(false, false); } public void testIDEA122720() { doTest(false, false); } diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTestSuite.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTestSuite.java index adb0d9f35c50..0178b38bd58a 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTestSuite.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTestSuite.java @@ -17,10 +17,7 @@ package com.intellij.codeInspection; import com.intellij.codeInsight.completion.NormalCompletionDfaTest; import com.intellij.codeInsight.completion.SmartTypeCompletionDfaTest; -import com.intellij.codeInsight.daemon.quickFix.AddAssertStatementFixTest; -import com.intellij.codeInsight.daemon.quickFix.ReplaceFromOfNullableFixTest; -import com.intellij.codeInsight.daemon.quickFix.ReplaceWithOfNullableFixTest; -import com.intellij.codeInsight.daemon.quickFix.SurroundWithIfFixTest; +import com.intellij.codeInsight.daemon.quickFix.*; import com.intellij.slicer.SliceBackwardTest; import com.intellij.slicer.SliceTreeTest; import junit.framework.Test; @@ -51,6 +48,7 @@ public class DataFlowInspectionTestSuite { suite.addTestSuite(AddAssertStatementFixTest.class); suite.addTestSuite(SurroundWithIfFixTest.class); + suite.addTestSuite(ReplaceWithTernaryOperatorTest.class); suite.addTestSuite(ReplaceWithOfNullableFixTest.class); suite.addTestSuite(ReplaceFromOfNullableFixTest.class); return suite; diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/FileStatusMap.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/FileStatusMap.java index e417dfb07f60..4bf905f017ee 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/FileStatusMap.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/FileStatusMap.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,18 +53,18 @@ public class FileStatusMap implements Disposable { private final Map myDocumentToStatusMap = new WeakHashMap(); // all dirty if absent private volatile boolean myAllowDirt = true; - public FileStatusMap(@NotNull Project project) { + FileStatusMap(@NotNull Project project) { myProject = project; } @Override public void dispose() { // clear dangling references to PsiFiles/Documents. SCR#10358 - markAllFilesDirty(); + markAllFilesDirty("FileStatusMap dispose"); } @Nullable("null means the file is clean") - public static TextRange getDirtyTextRange(@NotNull Editor editor, int passId) { + static TextRange getDirtyTextRange(@NotNull Editor editor, int passId) { Document document = editor.getDocument(); FileStatusMap me = DaemonCodeAnalyzerEx.getInstanceEx(editor.getProject()).getFileStatusMap(); @@ -87,7 +87,7 @@ public class FileStatusMap implements Disposable { } } - public boolean wasErrorFound(@NotNull Document document) { + boolean wasErrorFound(@NotNull Document document) { synchronized(myDocumentToStatusMap) { FileStatus status = myDocumentToStatusMap.get(document); return status != null && status.errorFound; @@ -164,9 +164,9 @@ public class FileStatusMap implements Disposable { } } - public void markAllFilesDirty() { + void markAllFilesDirty(@NotNull @NonNls Object reason) { assertAllowModifications(); - LOG.debug("********************************* Mark all dirty"); + LOG.debug("Mark all dirty: ", reason); synchronized (myDocumentToStatusMap) { myDocumentToStatusMap.clear(); } @@ -220,10 +220,10 @@ public class FileStatusMap implements Disposable { } } - public void markFileScopeDirtyDefensively(@NotNull PsiFile file) { + void markFileScopeDirtyDefensively(@NotNull PsiFile file, @NotNull @NonNls Object reason) { assertAllowModifications(); if (LOG.isDebugEnabled()) { - LOG.debug("********************************* Mark dirty file defensively: "+file.getName()); + LOG.debug("Mark dirty file defensively: "+file.getName()+": "+reason); } // mark whole file dirty in case no subsequent PSI events will come, but file requires rehighlighting nevertheless // e.g. in the case of quick typing/backspacing char @@ -236,10 +236,10 @@ public class FileStatusMap implements Disposable { } } - public void markFileScopeDirty(@NotNull Document document, @NotNull TextRange scope, int fileLength) { + void markFileScopeDirty(@NotNull Document document, @NotNull TextRange scope, int fileLength, @NotNull @NonNls Object reason) { assertAllowModifications(); if (LOG.isDebugEnabled()) { - LOG.debug("********************************* Mark dirty: "+scope); + LOG.debug("Mark scope dirty: "+scope+" : "+reason); } synchronized(myDocumentToStatusMap) { FileStatus status = myDocumentToStatusMap.get(document); @@ -270,7 +270,7 @@ public class FileStatusMap implements Disposable { return document.createRangeMarker(union); } - public boolean allDirtyScopesAreNull(@NotNull Document document) { + boolean allDirtyScopesAreNull(@NotNull Document document) { synchronized (myDocumentToStatusMap) { PsiFile file = PsiDocumentManager.getInstance(myProject).getPsiFile(document); if (!ProblemHighlightFilter.shouldHighlightFile(file)) return true; @@ -342,7 +342,7 @@ public class FileStatusMap implements Disposable { @Override public T getUserData(@NotNull Key key) { - throw null; + throw new UnsupportedOperationException(); } @Override diff --git a/platform/core-impl/src/com/intellij/psi/impl/PsiTreeChangeEventImpl.java b/platform/core-impl/src/com/intellij/psi/impl/PsiTreeChangeEventImpl.java index 9c9bc6ca7d76..0805dc95d7c3 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/PsiTreeChangeEventImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/PsiTreeChangeEventImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,7 +42,7 @@ public class PsiTreeChangeEventImpl extends PsiTreeChangeEvent{ private PsiEventType myCode; - public PsiTreeChangeEventImpl(PsiManager manager) { + public PsiTreeChangeEventImpl(@NotNull PsiManager manager) { super(manager); } @@ -124,8 +124,9 @@ public class PsiTreeChangeEventImpl extends PsiTreeChangeEvent{ isGenericChange = genericChange; } + @NotNull @Override public String toString() { - return "PsiTreeChangeEventImpl{myCode=" + myCode + (isGenericChange ? " (generic)" : "") + '}'; + return "PsiTreeChangeEventImpl{" + myCode + (isGenericChange ? " (generic)" : "") + '}'; } } diff --git a/platform/diff-impl/src/com/intellij/diff/impl/DiffRequestProcessor.java b/platform/diff-impl/src/com/intellij/diff/impl/DiffRequestProcessor.java index 985f78421130..c4dee802b3da 100644 --- a/platform/diff-impl/src/com/intellij/diff/impl/DiffRequestProcessor.java +++ b/platform/diff-impl/src/com/intellij/diff/impl/DiffRequestProcessor.java @@ -55,6 +55,7 @@ import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.openapi.wm.ex.IdeFocusTraversalPolicy; import com.intellij.ui.HintHint; import com.intellij.ui.LightweightHint; +import com.intellij.ui.components.panels.Wrapper; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; @@ -87,9 +88,9 @@ public abstract class DiffRequestProcessor implements Disposable { @NotNull private final JPanel myPanel; @NotNull private final MyPanel myMainPanel; - @NotNull private final ModifiablePanel myContentPanel; - @NotNull private final ModifiablePanel myToolbarPanel; // TODO: allow to call 'updateToolbar' from Viewer ? - @NotNull private final ModifiablePanel myToolbarStatusPanel; + @NotNull private final Wrapper myContentPanel; + @NotNull private final Wrapper myToolbarPanel; // TODO: allow to call 'updateToolbar' from Viewer ? + @NotNull private final Wrapper myToolbarStatusPanel; @NotNull private DiffRequest myActiveRequest; @@ -118,9 +119,10 @@ public abstract class DiffRequestProcessor implements Disposable { myPanel = new JPanel(new BorderLayout()); myMainPanel = new MyPanel(); - myContentPanel = new ModifiablePanel(); - myToolbarPanel = new ModifiablePanel(); - myToolbarStatusPanel = new ModifiablePanel(); + myContentPanel = new Wrapper(); + myToolbarPanel = new Wrapper(); + myToolbarPanel.setFocusable(true); + myToolbarStatusPanel = new Wrapper(); myPanel.add(myMainPanel, BorderLayout.CENTER); @@ -469,7 +471,7 @@ public abstract class DiffRequestProcessor implements Disposable { @Nullable public JComponent getPreferredFocusedComponent() { JComponent component = myState.getPreferredFocusedComponent(); - return component != null ? component : myToolbarPanel.getContent(); + return component != null ? component : myToolbarPanel.getTargetComponent(); } @Nullable @@ -832,7 +834,7 @@ public abstract class DiffRequestProcessor implements Disposable { public Object getData(@NonNls String dataId) { Object data; - DataProvider contentProvider = DataManagerImpl.getDataProviderEx(myContentPanel.getContent()); + DataProvider contentProvider = DataManagerImpl.getDataProviderEx(myContentPanel.getTargetComponent()); if (contentProvider != null) { data = contentProvider.getData(dataId); if (data != null) return data; @@ -1016,8 +1018,6 @@ public abstract class DiffRequestProcessor implements Disposable { FrameDiffTool.ToolbarComponents init = myViewer.init(); buildToolbar(init.toolbarActions); - - myPanel.validate(); } @Override @@ -1060,16 +1060,12 @@ public abstract class DiffRequestProcessor implements Disposable { myContentPanel.setContent(myViewer.getComponent()); setTitle(myActiveRequest.getTitle()); - myPanel.validate(); - FrameDiffTool.ToolbarComponents toolbarComponents = myViewer.init(); buildToolbar(toolbarComponents.toolbarActions); buildActionPopup(toolbarComponents.popupActions); myToolbarStatusPanel.setContent(toolbarComponents.statusPanel); - - myPanel.validate(); } @Override @@ -1118,8 +1114,6 @@ public abstract class DiffRequestProcessor implements Disposable { myContentPanel.setContent(myWrapperViewer.getComponent()); setTitle(myActiveRequest.getTitle()); - myPanel.validate(); - FrameDiffTool.ToolbarComponents toolbarComponents1 = myViewer.init(); FrameDiffTool.ToolbarComponents toolbarComponents2 = myWrapperViewer.init(); @@ -1142,8 +1136,6 @@ public abstract class DiffRequestProcessor implements Disposable { myToolbarStatusPanel.setContent(toolbarComponents1.statusPanel); // TODO: combine both panels ? - - myPanel.validate(); } @Override diff --git a/platform/diff-impl/src/com/intellij/diff/tools/fragmented/ChangedBlock.java b/platform/diff-impl/src/com/intellij/diff/tools/fragmented/ChangedBlock.java index 6c94c2365c92..b58db4495d08 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/fragmented/ChangedBlock.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/fragmented/ChangedBlock.java @@ -82,14 +82,6 @@ public class ChangedBlock { return myLine2; } - public boolean hasInsertion() { - return myStartOffset2 != myEndOffset2; - } - - public boolean hasDeletion() { - return myStartOffset1 != myEndOffset1; - } - @NotNull public LineFragment getLineFragment() { return myLineFragment; diff --git a/platform/diff-impl/src/com/intellij/diff/tools/fragmented/OnesideDiffChange.java b/platform/diff-impl/src/com/intellij/diff/tools/fragmented/OnesideDiffChange.java index cdb30e3cad4e..d0a3d5706dc0 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/fragmented/OnesideDiffChange.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/fragmented/OnesideDiffChange.java @@ -235,6 +235,7 @@ public class OnesideDiffChange { @Nullable public GutterIconRenderer createRenderer() { + if (myViewer.isStateIsOutOfDate()) return null; if (!myViewer.isEditable(mySide.other(), true)) return null; boolean bothEditable = myViewer.isEditable(mySide, true); @@ -288,6 +289,9 @@ public class OnesideDiffChange { myViewer.applyChange(OnesideDiffChange.this, sourceSide); } }); + // applyChange() will schedule rediff, but we want to try to do it in sync + // and we can't do it inside write action + myViewer.rediff(); } }; } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/fragmented/OnesideDiffPanel.java b/platform/diff-impl/src/com/intellij/diff/tools/fragmented/OnesideDiffPanel.java index 493c4c494f97..396a8988786a 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/fragmented/OnesideDiffPanel.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/fragmented/OnesideDiffPanel.java @@ -37,25 +37,19 @@ public class OnesideDiffPanel extends DiffPanelBase { private static final String OPERATION_CANCELED_CONTENT = "OperationCanceledContent"; private static final String ERROR_CONTENT = "ErrorContent"; - @NotNull private final Editor myEditor; - - @NotNull private final JPanel myEditorPanel; @NotNull private final AsyncProcessIcon.Big myBusyIcon; public OnesideDiffPanel(@Nullable Project project, @NotNull OnesideContentPanel content, - @NotNull Editor editor, @NotNull DataProvider provider, @NotNull DiffContext context) { super(project, provider, context); - myEditor = editor; - myEditorPanel = content; myBusyIcon = new AsyncProcessIcon.Big("OnesideDiff"); JPanel centerPanel = new JPanel(new BorderLayout()); centerPanel.add(myNotificationsPanel, BorderLayout.NORTH); - centerPanel.add(myEditorPanel, BorderLayout.CENTER); + centerPanel.add(content, BorderLayout.CENTER); myContentPanel.add(centerPanel, GOOD_CONTENT); myContentPanel.add(myBusyIcon, LOADING_CONTENT); diff --git a/platform/diff-impl/src/com/intellij/diff/tools/fragmented/OnesideDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/fragmented/OnesideDiffViewer.java index b40ca61e9af3..44388a9bf6e2 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/fragmented/OnesideDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/fragmented/OnesideDiffViewer.java @@ -135,7 +135,7 @@ public class OnesideDiffViewer extends TextDiffViewerBase { List titles = DiffUtil.createTextTitles(myRequest, ContainerUtil.list(myEditor, myEditor)); OnesideContentPanel contentPanel = new OnesideContentPanel(titles, myEditor); - myPanel = new OnesideDiffPanel(myProject, contentPanel, myEditor, this, myContext); + myPanel = new OnesideDiffPanel(myProject, contentPanel, this, myContext); myFoldingModel = new MyFoldingModel(myEditor, this); @@ -383,6 +383,22 @@ public class OnesideDiffViewer extends TextDiffViewerBase { updateEditorCanBeTyped(); } + @CalledInAwt + protected void markSuppressEditorTyping() { + mySuppressEditorTyping = true; + updateEditorCanBeTyped(); + } + + @CalledInAwt + protected void markStateIsOutOfDate() { + myStateIsOutOfDate = true; + if (myChangedBlockData != null) { + for (OnesideDiffChange diffChange : myChangedBlockData.getDiffChanges()) { + diffChange.updateGutterActions(); + } + } + } + @Nullable private EditorHighlighter buildHighlighter(@Nullable Project project, @NotNull DocumentContent content1, @@ -611,8 +627,7 @@ public class OnesideDiffViewer extends TextDiffViewerBase { if (twosideStartLine == -1 || twosideEndLine == -1) { // this should never happen logDebugInfo(e, onesideStartPosition, onesideEndPosition, twosideStartLine, twosideEndLine); - mySuppressEditorTyping = true; - updateEditorCanBeTyped(); + markSuppressEditorTyping(); return; } @@ -630,7 +645,7 @@ public class OnesideDiffViewer extends TextDiffViewerBase { finally { // TODO: we can avoid marking state out-of-date in some simple cases (like in SimpleDiffViewer) // but this will greatly increase complexity, so let's wait if it's actually required by users - myStateIsOutOfDate = true; + markStateIsOutOfDate(); myFoldingModel.onDocumentChanged(e); scheduleRediff(); @@ -673,9 +688,8 @@ public class OnesideDiffViewer extends TextDiffViewerBase { protected void onDocumentChange(@NotNull DocumentEvent e) { if (myDuringTwosideDocumentModification) return; - myStateIsOutOfDate = true; - mySuppressEditorTyping = true; - updateEditorCanBeTyped(); + markStateIsOutOfDate(); + markSuppressEditorTyping(); myFoldingModel.onDocumentChanged(e); scheduleRediff(); @@ -701,7 +715,7 @@ public class OnesideDiffViewer extends TextDiffViewerBase { // no need to mark myStateIsOutOfDate - it will be made by DocumentListener // TODO: we can apply change manually, without marking state out-of-date. But we'll have to schedule rediff anyway. - rediff(); + scheduleRediff(); } // diff --git a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java index 3e1a7786d1bf..b6f55de5ba64 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java @@ -1103,21 +1103,18 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer { @Override protected boolean doScrollToChange() { if (myScrollToChange == null) return false; - SimpleDiffViewer.this.doScrollToChange(myScrollToChange); - return true; + return SimpleDiffViewer.this.doScrollToChange(myScrollToChange); } @Override protected boolean doScrollToFirstChange() { - SimpleDiffViewer.this.doScrollToChange(ScrollToPolicy.FIRST_CHANGE); - return true; + return SimpleDiffViewer.this.doScrollToChange(ScrollToPolicy.FIRST_CHANGE); } @Override protected boolean doScrollToContext() { if (myNavigationContext == null) return false; - SimpleDiffViewer.this.doScrollToContext(myNavigationContext); - return true; + return SimpleDiffViewer.this.doScrollToContext(myNavigationContext); } } } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffViewer.java index 342052fd48b5..5bb3ad3fb2b9 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffViewer.java @@ -672,14 +672,12 @@ public class SimpleThreesideDiffViewer extends ThreesideTextDiffViewer { @Override protected boolean doScrollToChange() { if (myScrollToChange == null) return false; - SimpleThreesideDiffViewer.this.doScrollToChange(myScrollToChange); - return true; + return SimpleThreesideDiffViewer.this.doScrollToChange(myScrollToChange); } @Override protected boolean doScrollToFirstChange() { - SimpleThreesideDiffViewer.this.doScrollToChange(ScrollToPolicy.FIRST_CHANGE); - return true; + return SimpleThreesideDiffViewer.this.doScrollToChange(ScrollToPolicy.FIRST_CHANGE); } } } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/FoldingModelSupport.java b/platform/diff-impl/src/com/intellij/diff/tools/util/FoldingModelSupport.java index 76e2baf88284..5f7c35df2be5 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/FoldingModelSupport.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/FoldingModelSupport.java @@ -85,14 +85,6 @@ public class FoldingModelSupport { // Init // - @Deprecated - protected void install(@Nullable final Iterator changedLines, - @NotNull final UserDataHolder context, - final boolean defaultExpanded, - final int range) { - install(changedLines, context, new Settings(range, defaultExpanded)); - } - /* * Iterator returns ranges of changed lines: start1, end1, start2, end2, ... */ @@ -498,11 +490,6 @@ public class FoldingModelSupport { } } - @Deprecated - public void updateContext(@NotNull UserDataHolder context, boolean defaultState) { - updateContext(context, new Settings(0, defaultState)); - } - public void updateContext(@NotNull UserDataHolder context, @NotNull final Settings settings) { if (myFoldings.isEmpty()) return; // do not rewrite cache by initial state context.putUserData(CACHE_KEY, getFoldingCache(settings)); diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/LineFragmentCache.java b/platform/diff-impl/src/com/intellij/diff/tools/util/LineFragmentCache.java index 9653f0fc77bf..f3eadad277d2 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/LineFragmentCache.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/LineFragmentCache.java @@ -47,14 +47,6 @@ public class LineFragmentCache { myFragments = new HashMap(3); } - public long getStamp1() { - return myModificationStamp1; - } - - public long getStamp2() { - return myModificationStamp2; - } - public boolean checkStamps(long stamp1, long stamp2) { return myModificationStamp1 == stamp1 && myModificationStamp2 == stamp2; } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/SimpleDiffPanel.java b/platform/diff-impl/src/com/intellij/diff/tools/util/SimpleDiffPanel.java index fd498a4a070f..d723d0c83fca 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/SimpleDiffPanel.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/SimpleDiffPanel.java @@ -28,17 +28,14 @@ public class SimpleDiffPanel extends DiffPanelBase { private static final String GOOD_CONTENT = "GoodContent"; private static final String ERROR_CONTENT = "ErrorContent"; - @NotNull private final JComponent myEditorsPanel; - public SimpleDiffPanel(@NotNull JComponent editorPanel, @NotNull DataProvider dataProvider, @NotNull DiffContext context) { super(context.getProject(), dataProvider, context); - myEditorsPanel = editorPanel; JPanel centerPanel = new JPanel(new BorderLayout()); centerPanel.add(myNotificationsPanel, BorderLayout.NORTH); - centerPanel.add(myEditorsPanel, BorderLayout.CENTER); + centerPanel.add(editorPanel, BorderLayout.CENTER); myContentPanel.add(centerPanel, GOOD_CONTENT); myContentPanel.add(DiffUtil.createMessagePanel("Error"), ERROR_CONTENT); diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/SyncScrollSupport.java b/platform/diff-impl/src/com/intellij/diff/tools/util/SyncScrollSupport.java index 5a97124251b8..e0447120699d 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/SyncScrollSupport.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/SyncScrollSupport.java @@ -68,9 +68,9 @@ public class SyncScrollSupport { return myDuringSyncScroll; } - public boolean setDisabled(boolean value) { + public void setDisabled(boolean value) { if (myDisabled == value) LOG.warn(new Throwable("myDisabled == value: " + myDisabled + " - " + value)); - return myDisabled = value; + myDisabled = value; } @NotNull @@ -170,9 +170,9 @@ public class SyncScrollSupport { myHelper22 = create(editors.get(2), editors.get(1), myScrollable2, Side.RIGHT); } - public boolean setDisabled(boolean value) { + public void setDisabled(boolean value) { if (myDisabled == value) LOG.warn(new Throwable("myDisabled == value: " + myDisabled + " - " + value)); - return myDisabled = value; + myDisabled = value; } public void visibleAreaChanged(VisibleAreaEvent e) { diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/base/DiffViewerBase.java b/platform/diff-impl/src/com/intellij/diff/tools/util/base/DiffViewerBase.java index e519314f7079..c897e28e9a06 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/base/DiffViewerBase.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/base/DiffViewerBase.java @@ -127,6 +127,7 @@ public abstract class DiffViewerBase implements DiffViewer, DataProvider { @CalledInAwt public final void rediff(boolean trySync) { if (isDisposed()) return; + abortRediff(); onBeforeRediff(); diff --git a/platform/lang-impl/src/com/intellij/application/options/editor/AutoImportOptionsTopHitProvider.java b/platform/lang-impl/src/com/intellij/application/options/editor/AutoImportOptionsTopHitProvider.java index 8778b9f27492..0b7d293b2297 100644 --- a/platform/lang-impl/src/com/intellij/application/options/editor/AutoImportOptionsTopHitProvider.java +++ b/platform/lang-impl/src/com/intellij/application/options/editor/AutoImportOptionsTopHitProvider.java @@ -15,19 +15,13 @@ */ package com.intellij.application.options.editor; -import com.intellij.ide.ui.ConfigurableOptionsTopHitProvider; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; /** * @author Sergey.Malenkov */ -public class AutoImportOptionsTopHitProvider extends ConfigurableOptionsTopHitProvider { - @Override - public String getId() { - return "editor"; - } - +public class AutoImportOptionsTopHitProvider extends EditorOptionsTopHitProviderBase { @Override protected Configurable getConfigurable(Project project) { return new AutoImportOptionsConfigurable(); diff --git a/platform/lang-impl/src/com/intellij/application/options/editor/CodeFoldingOptionsTopHitProvider.java b/platform/lang-impl/src/com/intellij/application/options/editor/CodeFoldingOptionsTopHitProvider.java index cedf5416d8a7..7cc91dab9b4f 100644 --- a/platform/lang-impl/src/com/intellij/application/options/editor/CodeFoldingOptionsTopHitProvider.java +++ b/platform/lang-impl/src/com/intellij/application/options/editor/CodeFoldingOptionsTopHitProvider.java @@ -15,7 +15,6 @@ */ package com.intellij.application.options.editor; -import com.intellij.ide.ui.ConfigurableOptionsTopHitProvider; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; @@ -24,25 +23,15 @@ import javax.swing.*; /** * @author Sergey.Malenkov */ -public class CodeFoldingOptionsTopHitProvider extends ConfigurableOptionsTopHitProvider { +public class CodeFoldingOptionsTopHitProvider extends EditorOptionsTopHitProviderBase.NoPrefix { private int myCount; - @Override - public String getId() { - return "editor"; - } - @Override protected Configurable getConfigurable(Project project) { myCount = 0; return new CodeFoldingConfigurable(); } - @Override - protected String getName(Configurable configurable) { - return null; - } - @Override protected String getOptionName(JCheckBox checkbox) { String name = super.getOptionName(checkbox); diff --git a/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsTopHitProvider.java b/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsTopHitProvider.java index 9828e92fc484..ab3432c5af07 100644 --- a/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsTopHitProvider.java +++ b/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsTopHitProvider.java @@ -15,26 +15,15 @@ */ package com.intellij.application.options.editor; -import com.intellij.ide.ui.ConfigurableOptionsTopHitProvider; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; /** * @author Sergey.Malenkov */ -public class EditorOptionsTopHitProvider extends ConfigurableOptionsTopHitProvider { - @Override - public String getId() { - return "editor"; - } - +public class EditorOptionsTopHitProvider extends EditorOptionsTopHitProviderBase.NoPrefix { @Override protected Configurable getConfigurable(Project project) { return new EditorOptions(); } - - @Override - protected String getName(Configurable configurable) { - return null; - } } diff --git a/platform/diff-impl/src/com/intellij/diff/impl/ModifiablePanel.java b/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsTopHitProviderBase.java similarity index 53% rename from platform/diff-impl/src/com/intellij/diff/impl/ModifiablePanel.java rename to platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsTopHitProviderBase.java index 3fff31d37435..e09b2e0cf010 100644 --- a/platform/diff-impl/src/com/intellij/diff/impl/ModifiablePanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/editor/EditorOptionsTopHitProviderBase.java @@ -13,29 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.intellij.diff.impl; +package com.intellij.application.options.editor; -import org.jetbrains.annotations.Nullable; +import com.intellij.ide.ui.ConfigurableOptionsTopHitProvider; +import com.intellij.openapi.options.Configurable; -import javax.swing.*; -import java.awt.*; - -public class ModifiablePanel extends JPanel { - @Nullable private JComponent myContent; - - public ModifiablePanel() { - super(new BorderLayout()); +/** + * @author Konstantin Bulenkov + */ +public abstract class EditorOptionsTopHitProviderBase extends ConfigurableOptionsTopHitProvider { + @Override + public String getId() { + return "editor"; } - public void setContent(@Nullable JComponent content) { - myContent = content; - removeAll(); - if (content != null) add(content, BorderLayout.CENTER); - invalidate(); - } - - @Nullable - public JComponent getContent() { - return myContent; + public static abstract class NoPrefix extends EditorOptionsTopHitProviderBase { + @Override + protected String getName(Configurable configurable) { + return null; + } } } diff --git a/platform/lang-impl/src/com/intellij/application/options/editor/EditorSmartKeysOptionsTopHitProvider.java b/platform/lang-impl/src/com/intellij/application/options/editor/EditorSmartKeysOptionsTopHitProvider.java index 28b185b10197..4be1dee5cb36 100644 --- a/platform/lang-impl/src/com/intellij/application/options/editor/EditorSmartKeysOptionsTopHitProvider.java +++ b/platform/lang-impl/src/com/intellij/application/options/editor/EditorSmartKeysOptionsTopHitProvider.java @@ -15,19 +15,13 @@ */ package com.intellij.application.options.editor; -import com.intellij.ide.ui.ConfigurableOptionsTopHitProvider; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; /** * @author Sergey.Malenkov */ -public class EditorSmartKeysOptionsTopHitProvider extends ConfigurableOptionsTopHitProvider { - @Override - public String getId() { - return "editor"; - } - +public class EditorSmartKeysOptionsTopHitProvider extends EditorOptionsTopHitProviderBase { @Override protected Configurable getConfigurable(Project project) { return new EditorSmartKeysConfigurable(); diff --git a/platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsOptionsTopHitProvider.java b/platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsOptionsTopHitProvider.java index 805412fbf4a7..8ffb74604409 100644 --- a/platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsOptionsTopHitProvider.java +++ b/platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsOptionsTopHitProvider.java @@ -15,26 +15,15 @@ */ package com.intellij.application.options.editor; -import com.intellij.ide.ui.ConfigurableOptionsTopHitProvider; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; /** * @author Sergey.Malenkov */ -public class EditorTabsOptionsTopHitProvider extends ConfigurableOptionsTopHitProvider { - @Override - public String getId() { - return "editor"; - } - +public class EditorTabsOptionsTopHitProvider extends EditorOptionsTopHitProviderBase.NoPrefix { @Override protected Configurable getConfigurable(Project project) { return new EditorTabsConfigurable(); } - - @Override - protected String getName(Configurable configurable) { - return null; - } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java index 8663b82128a9..346d1e1ad920 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java @@ -143,7 +143,7 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzerEx implements Pers myInitialized = true; myDisposed = false; - myFileStatusMap.markAllFilesDirty(); + myFileStatusMap.markAllFilesDirty("DCAI init"); Disposer.register(this, new Disposable() { @Override public void dispose() { @@ -477,7 +477,7 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzerEx implements Pers @Override public void restart() { - myFileStatusMap.markAllFilesDirty(); + myFileStatusMap.markAllFilesDirty("Global restart"); stopProcess(true, "Global restart"); } @@ -485,8 +485,9 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzerEx implements Pers public void restart(@NotNull PsiFile file) { Document document = myPsiDocumentManager.getCachedDocument(file); if (document == null) return; - myFileStatusMap.markFileScopeDirty(document, new TextRange(0, document.getTextLength()), file.getTextLength()); - stopProcess(true, "Psi file restart"); + String reason = "Psi file restart: " + file.getName(); + myFileStatusMap.markFileScopeDirty(document, new TextRange(0, document.getTextLength()), file.getTextLength(), reason); + stopProcess(true, reason); } @NotNull diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PsiChangeHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PsiChangeHandler.java index becc369f534b..b2acbad9c634 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PsiChangeHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PsiChangeHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -178,7 +178,7 @@ class PsiChangeHandler extends PsiTreeChangeAdapter implements Disposable { // mark file dirty just in case PsiFile psiFile = event.getFile(); if (psiFile != null) { - myFileStatusMap.markFileScopeDirtyDefensively(psiFile); + myFileStatusMap.markFileScopeDirtyDefensively(psiFile, event); } } @@ -186,15 +186,15 @@ class PsiChangeHandler extends PsiTreeChangeAdapter implements Disposable { public void propertyChanged(@NotNull PsiTreeChangeEvent event) { String propertyName = event.getPropertyName(); if (!propertyName.equals(PsiTreeChangeEvent.PROP_WRITABLE)) { - myFileStatusMap.markAllFilesDirty(); + myFileStatusMap.markAllFilesDirty(event); } } - private void queueElement(PsiElement child, final boolean whitespaceOptimizationAllowed, PsiTreeChangeEvent event) { + private void queueElement(@NotNull PsiElement child, final boolean whitespaceOptimizationAllowed, @NotNull PsiTreeChangeEvent event) { PsiFile file = event.getFile(); if (file == null) file = child.getContainingFile(); if (file == null) { - myFileStatusMap.markAllFilesDirty(); + myFileStatusMap.markAllFilesDirty(child); return; } @@ -216,30 +216,30 @@ class PsiChangeHandler extends PsiTreeChangeAdapter implements Disposable { file = child.getContainingFile(); } catch (PsiInvalidElementAccessException e) { - myFileStatusMap.markAllFilesDirty(); + myFileStatusMap.markAllFilesDirty(e); return; } if (file == null || file instanceof PsiCompiledElement) { - myFileStatusMap.markAllFilesDirty(); + myFileStatusMap.markAllFilesDirty(child); return; } int fileLength = file.getTextLength(); if (!file.getViewProvider().isPhysical()) { - myFileStatusMap.markFileScopeDirty(document, new TextRange(0, fileLength), fileLength); + myFileStatusMap.markFileScopeDirty(document, new TextRange(0, fileLength), fileLength, "Non-physical file update: "+file); return; } PsiElement element = whitespaceOptimizationAllowed && UpdateHighlightersUtil.isWhitespaceOptimizationAllowed(document) ? child : child.getParent(); while (true) { if (element == null || element instanceof PsiFile || element instanceof PsiDirectory) { - myFileStatusMap.markAllFilesDirty(); + myFileStatusMap.markAllFilesDirty("Top element: "+element); return; } final PsiElement scope = getChangeHighlightingScope(element); if (scope != null) { - myFileStatusMap.markFileScopeDirty(document, scope.getTextRange(), fileLength); + myFileStatusMap.markFileScopeDirty(document, scope.getTextRange(), fileLength, "Scope: "+scope); return; } diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java b/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java index 84329b36912b..ce5e9b6cbfae 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java @@ -50,7 +50,10 @@ import com.intellij.openapi.progress.*; import com.intellij.openapi.progress.util.ProgressIndicatorUtils; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectCoreUtil; import com.intellij.openapi.project.ProjectUtilCore; +import com.intellij.openapi.roots.FileIndex; +import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.util.*; import com.intellij.openapi.util.io.FileUtil; @@ -507,10 +510,12 @@ public class GlobalInspectionContextImpl extends GlobalInspectionContextBase imp @Override public void run() { try { + final FileIndex fileIndex = ProjectRootManager.getInstance(getProject()).getFileIndex(); scope.accept(new Processor() { @Override public boolean process(final VirtualFile file) { progressIndicator.checkCanceled(); + if (ProjectCoreUtil.isProjectOrWorkspaceFile(file) || !fileIndex.isInContent(file)) return true; final PsiFile[] psiFile = new PsiFile[1]; Document document = ApplicationManager.getApplication().runReadAction(new Computable() { diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java index f69a4e8e9f43..c1a4af74f289 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java @@ -814,7 +814,7 @@ public abstract class ChooseByNameBase { } @NotNull public String getTrimmedText() { - return StringUtil.notNullize(myTextField.getText()).trim(); + return StringUtil.trimLeading(StringUtil.notNullize(myTextField.getText())); } public void setFixLostTyping(boolean fixLostTyping) { diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java index 3c85e97a3a69..34bc35c19b30 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java @@ -285,6 +285,7 @@ public class ProjectRootManagerComponent extends ProjectRootManagerImpl { if (!myStartupActivityPerformed) return; if (myDoLogCachesUpdate) LOG.info(new Throwable("sync roots")); + else LOG.info("project roots have changed"); DumbServiceImpl dumbService = DumbServiceImpl.getInstance(myProject); if (FileBasedIndex.getInstance() instanceof FileBasedIndexImpl) { diff --git a/platform/lang-impl/src/com/intellij/openapi/util/SwitchBootJdkAction.java b/platform/lang-impl/src/com/intellij/openapi/util/SwitchBootJdkAction.java index 86650918fa15..52d50ee38f9d 100644 --- a/platform/lang-impl/src/com/intellij/openapi/util/SwitchBootJdkAction.java +++ b/platform/lang-impl/src/com/intellij/openapi/util/SwitchBootJdkAction.java @@ -17,6 +17,7 @@ package com.intellij.openapi.util; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationNamesInfo; import com.intellij.openapi.application.PathManager; @@ -48,9 +49,15 @@ public class SwitchBootJdkAction extends AnAction implements DumbAware { @NonNls private static final Logger LOG = Logger.getInstance("#com.intellij.ide.actions.SwitchBootJdkAction"); @NonNls private static final String productJdkConfigFileName = ApplicationNamesInfo.getInstance().getScriptName() + ".jdk"; @NonNls private static final File productJdkConfigFile = new File(PathManager.getConfigPath(), productJdkConfigFileName); + @NonNls private static final File customJdkFile = new File(PathManager.getHomePath() + File.separator + "jre" + File.separator + "jdk"); @Override public void update(AnActionEvent e) { + Presentation presentation = e.getPresentation(); + if (!SystemInfo.isMac || !customJdkFile.exists()) { + presentation.setEnabledAndVisible(false); + return; + } e.getPresentation().setText("Switch Boot JDK"); } @@ -190,7 +197,7 @@ public class SwitchBootJdkAction extends AnAction implements DumbAware { @Nullable @Override protected JComponent createNorthPanel() { - return new JBLabel("Specify Boot JDK path"); + return new JBLabel("Select Boot JDK"); } @Nullable @@ -218,7 +225,10 @@ public class SwitchBootJdkAction extends AnAction implements DumbAware { ArrayList jdkPathsList = new ArrayList(); if (!SystemInfo.isMac) return jdkPathsList; - jdkPathsList.add(new JdkBundleDescriptor(new File(PathManager.getHomePath() + File.separator + "jre" + File.separator + "jdk" ), "JDK bundled with IDE")); + + if (customJdkFile.exists()) { + jdkPathsList.add(new JdkBundleDescriptor(customJdkFile, "JDK bundled with IDE")); + } jdkPathsList.addAll(jdkBundlesFromLocation(STANDARD_JDK_6_LOCATION_ON_MAC_OS_X, "1.6.0")); jdkPathsList.addAll(jdkBundlesFromLocation(STANDARD_JDK_LOCATION_ON_MAC_OS_X, "jdk1.8.0_(\\d*).jdk")); diff --git a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java index a68926b084fc..c6bb7c5048c4 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndexImpl.java @@ -227,7 +227,7 @@ public class FileBasedIndexImpl extends FileBasedIndex { LOG.info(e); } } - scheduleIndexRebuild(); + scheduleIndexRebuild("File type change"); } }); @@ -1248,7 +1248,7 @@ public class FileBasedIndexImpl extends FileBasedIndex { try { doClearIndex(indexId); if (!cleanupOnly) { - scheduleIndexRebuild(); + scheduleIndexRebuild("checkRebuild"); } } catch (StorageException e) { @@ -1286,7 +1286,8 @@ public class FileBasedIndexImpl extends FileBasedIndex { } } - private static void scheduleIndexRebuild() { + private static void scheduleIndexRebuild(String reason) { + LOG.info("scheduleIndexRebuild, reason: " + reason); for (Project project : ProjectManager.getInstance().getOpenProjects()) { DumbService.getInstance(project).queueTask(new UnindexedFilesUpdater(project, false)); } diff --git a/platform/platform-impl/src/net/sf/cglib/proxy/AdvancedEnhancer.java b/platform/platform-impl/src/net/sf/cglib/proxy/AdvancedEnhancer.java index a2f21c3d0018..410c7b47c2a1 100644 --- a/platform/platform-impl/src/net/sf/cglib/proxy/AdvancedEnhancer.java +++ b/platform/platform-impl/src/net/sf/cglib/proxy/AdvancedEnhancer.java @@ -366,6 +366,7 @@ public class AdvancedEnhancer extends AbstractClassGenerator protected ClassLoader getDefaultClassLoader() { int maxIndex = -1; ClassLoader bestLoader = null; + ClassLoader nonPluginLoader = null; if (interfaces != null && interfaces.length > 0) { for (final Class anInterface : interfaces) { final ClassLoader loader = anInterface.getClassLoader(); @@ -376,6 +377,9 @@ public class AdvancedEnhancer extends AbstractClassGenerator bestLoader = loader; } } + else if (nonPluginLoader == null) { + nonPluginLoader = loader; + } } } ClassLoader superLoader = null; @@ -387,7 +391,7 @@ public class AdvancedEnhancer extends AbstractClassGenerator } } if (bestLoader != null) return bestLoader; - return superLoader; + return superLoader == null ? nonPluginLoader : superLoader; } private static Signature rename(Signature sig, int index) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesTreeList.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesTreeList.java index 0c5811916e19..e15334571397 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesTreeList.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ui/ChangesTreeList.java @@ -274,7 +274,7 @@ public abstract class ChangesTreeList extends JPanel implements TypeSafeDataP myChangeDecorator = changeDecorator; } - public void setDoubleClickHandler(final Runnable doubleClickHandler) { + public void setDoubleClickHandler(@NotNull final Runnable doubleClickHandler) { myDoubleClickHandler = doubleClickHandler; } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesView.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesView.java index b75002919dce..4b5a5f8bca3e 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesView.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XVariablesView.java @@ -68,12 +68,22 @@ public class XVariablesView extends XVariablesViewBase { } @Override - protected void clear() { - XDebuggerTree tree = getTree(); + public void dispose() { + clearInlineData(getTree()); + super.dispose(); + } + + private static void clearInlineData(XDebuggerTree tree) { tree.getProject().putUserData(DEBUG_VARIABLES, null); tree.getProject().putUserData(DEBUG_VARIABLES_TIMESTAMPS, null); - tree.setSourcePosition(null); tree.updateEditor(); + } + + @Override + protected void clear() { + XDebuggerTree tree = getTree(); + tree.setSourcePosition(null); + clearInlineData(tree); XDebuggerTreeNode node; XDebugSession session = getSession(getPanel()); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties index 5dd040bb66b2..e806398948d8 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties @@ -13,6 +13,7 @@ instance.variable.of.concrete.class.display.name=Type of instance field is concr instance.variable.of.concrete.class.problem.descriptor=Type of field ''{0}'' is concrete class #ref #loc chain.of.instanceof.checks.display.name=Chain of 'instanceof' checks chain.of.instanceof.checks.problem.descriptor=Chain of 'instanceof' checks indicates abstraction failure #loc +chain.of.class.equality.checks.problem.descriptor=Chain of class equality checks indicates abstraction failure #loc instanceof.concrete.class.display.name='instanceof' a concrete class instanceof.concrete.class.problem.descriptor='instanceof' concrete class #ref #loc instanceof.check.for.this.display.name='instanceof' check for 'this' diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/abstraction/InstanceofChainInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/abstraction/InstanceofChainInspection.java index b7ae3d74125f..b6c91cbdbaff 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/abstraction/InstanceofChainInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/abstraction/InstanceofChainInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2013 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2015 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,9 @@ import com.intellij.psi.util.PsiTreeUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.ig.psiutils.ControlFlowUtils; import com.siyeh.ig.psiutils.LibraryUtil; +import com.siyeh.ig.psiutils.ParenthesesUtils; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -46,6 +48,10 @@ public class InstanceofChainInspection extends BaseInspection { @Override @NotNull protected String buildErrorString(Object... infos) { + final Check check = (Check)infos[0]; + if (check == Check.CLASS_EQUALITY) { + return InspectionGadgetsBundle.message("chain.of.class.equality.checks.problem.descriptor"); + } return InspectionGadgetsBundle.message("chain.of.instanceof.checks.problem.descriptor"); } @@ -60,36 +66,41 @@ public class InstanceofChainInspection extends BaseInspection { return new InstanceofChainVisitor(); } + private enum Check { + CLASS_EQUALITY, INSTANCEOF, NEITHER + } + private class InstanceofChainVisitor extends BaseInspectionVisitor { @Override public void visitIfStatement(@NotNull PsiIfStatement ifStatement) { super.visitIfStatement(ifStatement); - final PsiElement parent = ifStatement.getParent(); - if (parent instanceof PsiIfStatement) { - final PsiIfStatement parentStatement = (PsiIfStatement)parent; - final PsiStatement elseBranch = parentStatement.getElseBranch(); - if (ifStatement.equals(elseBranch)) { - return; - } + if (ControlFlowUtils.isElseIf(ifStatement)) { + return; } final PsiStatement previousStatement = PsiTreeUtil.getPrevSiblingOfType(ifStatement, PsiStatement.class); if (previousStatement instanceof PsiIfStatement) { final PsiIfStatement previousIfStatement = (PsiIfStatement)previousStatement; - if (isInstanceofCheck(previousIfStatement.getCondition())) { + final PsiExpression condition = previousIfStatement.getCondition(); + if (chainCheck(condition, null) != Check.NEITHER) { return; } } int numChecks = 0; PsiIfStatement branch = ifStatement; + Check check = null; while (true) { final PsiExpression condition = branch.getCondition(); - if (!isInstanceofCheck(condition)) { + final Check chainCheck = chainCheck(condition, check); + if (chainCheck == Check.NEITHER) { if (numChecks > 1) { break; } return; } + else { + check = chainCheck; + } numChecks++; final PsiStatement elseBranch = branch.getElseBranch(); if (elseBranch instanceof PsiIfStatement) { @@ -109,32 +120,30 @@ public class InstanceofChainInspection extends BaseInspection { if (numChecks < 2) { return; } - registerStatementError(ifStatement); + registerStatementError(ifStatement, check); } - private boolean isInstanceofCheck(PsiExpression condition) { + private Check chainCheck(PsiExpression condition, Check check) { while (true) { if (condition == null) { - return false; + return Check.NEITHER; } - else if (condition instanceof PsiInstanceOfExpression) { - if (ignoreInstanceofOnLibraryClasses) { - final PsiInstanceOfExpression instanceOfExpression = (PsiInstanceOfExpression)condition; - if (isInstanceofOnLibraryClass(instanceOfExpression)) { - return false; - } - } - return true; + else if (check != Check.CLASS_EQUALITY && isInstanceofExpression(condition)) { + return Check.INSTANCEOF; } else if (condition instanceof PsiPolyadicExpression) { + if (check != Check.INSTANCEOF && isClassEqualityExpression(condition)) { + return Check.CLASS_EQUALITY; + } final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)condition; final PsiExpression[] operands = polyadicExpression.getOperands(); for (PsiExpression operand : operands) { - if (!isInstanceofCheck(operand)) { - return false; + final Check chainCheck = chainCheck(operand, check); + if (chainCheck != Check.NEITHER) { + return chainCheck; } } - return true; + return Check.NEITHER; } else if (condition instanceof PsiParenthesizedExpression) { final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)condition; @@ -151,22 +160,39 @@ public class InstanceofChainInspection extends BaseInspection { condition = postfixExpression.getOperand(); continue; } - return false; + return Check.NEITHER; } } - private boolean isInstanceofOnLibraryClass(PsiInstanceOfExpression instanceOfExpression) { - final PsiTypeElement checkType = instanceOfExpression.getCheckType(); - if (checkType == null) { + private boolean isClassEqualityExpression(PsiExpression expression) { + if (!(expression instanceof PsiBinaryExpression)) { return false; } - final PsiType type = checkType.getType(); - if (!(type instanceof PsiClassType)) { + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)expression; + if (binaryExpression.getOperationTokenType() != JavaTokenType.EQEQ) { return false; } - final PsiClassType classType = (PsiClassType)type; - final PsiClass aClass = classType.resolve(); - return LibraryUtil.classIsInLibrary(aClass); + return isClassObjectAccessExpression(binaryExpression.getLOperand()) || + isClassObjectAccessExpression(binaryExpression.getROperand()); + } + + private boolean isClassObjectAccessExpression(PsiExpression expression) { + expression = ParenthesesUtils.stripParentheses(expression); + if (!(expression instanceof PsiClassObjectAccessExpression)) { + return false; + } + final PsiClassObjectAccessExpression classObjectAccessExpression = (PsiClassObjectAccessExpression)expression; + final PsiTypeElement typeElement = classObjectAccessExpression.getOperand(); + return !ignoreInstanceofOnLibraryClasses || !LibraryUtil.isTypeInLibrary(typeElement.getType()); + } + + private boolean isInstanceofExpression(PsiExpression expression) { + if (!(expression instanceof PsiInstanceOfExpression)) { + return false; + } + final PsiInstanceOfExpression instanceOfExpression = (PsiInstanceOfExpression)expression; + final PsiTypeElement typeElement = instanceOfExpression.getCheckType(); + return !ignoreInstanceofOnLibraryClasses || typeElement == null || !LibraryUtil.isTypeInLibrary(typeElement.getType()); } } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/DuplicateConditionInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/DuplicateConditionInspection.java index cc734b3fbd42..1d200879a6ee 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/DuplicateConditionInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/DuplicateConditionInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2013 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2015 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import com.intellij.psi.tree.IElementType; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.ig.psiutils.ControlFlowUtils; import com.siyeh.ig.psiutils.EquivalenceChecker; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -69,13 +70,8 @@ public class DuplicateConditionInspection extends BaseInspection { @Override public void visitIfStatement(@NotNull PsiIfStatement statement) { super.visitIfStatement(statement); - final PsiElement parent = statement.getParent(); - if (parent instanceof PsiIfStatement) { - final PsiIfStatement parentStatement = (PsiIfStatement)parent; - final PsiStatement elseBranch = parentStatement.getElseBranch(); - if (statement.equals(elseBranch)) { - return; - } + if (ControlFlowUtils.isElseIf(statement)) { + return; } final Set conditions = new HashSet(); collectConditionsForIfStatement(statement, conditions, 0); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/IfStatementWithTooManyBranchesInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/IfStatementWithTooManyBranchesInspection.java index 2ff82f4cfc51..f90aabeb9034 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/IfStatementWithTooManyBranchesInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/IfStatementWithTooManyBranchesInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2015 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,12 +16,12 @@ package com.siyeh.ig.controlflow; import com.intellij.codeInspection.ui.SingleIntegerFieldOptionsPanel; -import com.intellij.psi.PsiElement; import com.intellij.psi.PsiIfStatement; import com.intellij.psi.PsiStatement; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.ig.psiutils.ControlFlowUtils; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -73,13 +73,8 @@ public class IfStatementWithTooManyBranchesInspection @Override public void visitIfStatement(@NotNull PsiIfStatement statement) { super.visitIfStatement(statement); - final PsiElement parent = statement.getParent(); - if (parent instanceof PsiIfStatement) { - final PsiIfStatement parentStatement = (PsiIfStatement)parent; - final PsiStatement elseBranch = parentStatement.getElseBranch(); - if (statement.equals(elseBranch)) { - return; - } + if (ControlFlowUtils.isElseIf(statement)) { + return; } final int branchCount = calculateBranchCount(statement); if (branchCount <= m_limit) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java index 7917a8ef73d9..e79c60e23a49 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ControlFlowUtils.java @@ -25,6 +25,16 @@ public class ControlFlowUtils { private ControlFlowUtils() {} + public static boolean isElseIf(PsiIfStatement ifStatement) { + final PsiElement parent = ifStatement.getParent(); + if (!(parent instanceof PsiIfStatement)) { + return false; + } + final PsiIfStatement parentStatement = (PsiIfStatement)parent; + final PsiStatement elseBranch = parentStatement.getElseBranch(); + return ifStatement.equals(elseBranch); + } + public static boolean statementMayCompleteNormally(@Nullable PsiStatement statement) { if (statement == null) { return true; diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/LibraryUtil.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/LibraryUtil.java index 0d2c8183150f..fbe379694a37 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/LibraryUtil.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/LibraryUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2015 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,8 +21,15 @@ import org.jetbrains.annotations.Nullable; public class LibraryUtil { - private LibraryUtil() { - super(); + private LibraryUtil() {} + + public static boolean isTypeInLibrary(@Nullable PsiType type) { + if (!(type instanceof PsiClassType)) { + return false; + } + final PsiClassType classType = (PsiClassType)type; + final PsiClass aClass = classType.resolve(); + return classIsInLibrary(aClass); } public static boolean classIsInLibrary(@Nullable PsiClass aClass) { diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/InstanceofChain.html b/plugins/InspectionGadgets/src/inspectionDescriptions/InstanceofChain.html index 04a3ebd9054c..39717d0afcbf 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/InstanceofChain.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/InstanceofChain.html @@ -1,7 +1,8 @@ -Reports any chains of if-else statements all of whose conditions are instanceof expressions -(or combinations of such expressions). Such constructions usually indicate a failure of object-oriented design, which +Reports any chains of if-else statements all of whose conditions are instanceof expressions +or class equality expressions (e.g. comparison with String.class). +Such constructions usually indicate a failure of object-oriented design, which dictates that such type-based dispatch should be done via polymorphic method calls rather than explicit chains of type tests. diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/abstraction/instanceof_chain/InstanceofChain.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/abstraction/instanceof_chain/InstanceofChain.java index cc1d5707f537..cb0223b94d69 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/abstraction/instanceof_chain/InstanceofChain.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/abstraction/instanceof_chain/InstanceofChain.java @@ -2,7 +2,7 @@ package com.siyeh.igtest.abstraction.instanceof_chain; public class InstanceofChain { void arg(Object o) { - if (o instanceof String || o instanceof String || o instanceof String) { + if (o != null || o instanceof String || o instanceof String || o instanceof String) { } else if (o instanceof Integer) { @@ -12,7 +12,7 @@ public class InstanceofChain { } void m(boolean b, Object o) { - if (o instanceof String) { + if (o instanceof String) { } else if (o instanceof Boolean) { @@ -20,8 +20,38 @@ public class InstanceofChain { } void n(Object o) { - if (o instanceof Integer) {} + if (o instanceof Integer) {} if (o instanceof Byte) {} if (o instanceof Long) {} } + + void f(Class objClass1, Class objClass2) { + if (objClass1 == String.class) { + if (objClass2 == Integer.class || objClass2 == Double.class) { + } else if (objClass2 == Boolean.class) { + } + } else if (objClass1 == Byte.class){ + if (objClass2 == Float.class){ + } + } + } + + void g(Object obj1, Object obj2) { + if (obj1.getClass() == String.class) { + if (obj2.getClass() == Integer.class || obj2.getClass() == Double.class) { + } else if (obj2.getClass() == Boolean.class) { + } + } else if (obj1.getClass() == Byte.class){ + if (obj2.getClass() == Float.class){ + } + } + } + + void h(Object o) { + if (o instanceof String) { + + } else if (o == null) { + + } + } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/abstraction/instanceof_chain/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/abstraction/instanceof_chain/expected.xml deleted file mode 100644 index f6524570189a..000000000000 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/abstraction/instanceof_chain/expected.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - InstanceofChain.java - 5 - Chain of 'instanceof' checks - Chain of 'instanceof' checks indicates abstraction failure #loc - - - - InstanceofChain.java - 23 - Chain of 'instanceof' checks - Chain of 'instanceof' checks indicates abstraction failure #loc - - - - InstanceofChain.java - 15 - Chain of 'instanceof' checks - Chain of 'instanceof' checks indicates abstraction failure #loc - - \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/DuplicateCondition.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/DuplicateCondition.java deleted file mode 100644 index aad58b54108e..000000000000 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/DuplicateCondition.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.siyeh.igtest.bugs; - -public class DuplicateCondition { - public void foo() - { - if(bar()||bar()) - { - System.out.println("1"); - }else if(bar()|| true) - { - System.out.println("2"); - } - } - - public boolean bar() - { - return true; - } - - void incompleteCode(String s) { - if (s.contains(A)) { - - } else if (s.contains(B)) { - - } - } -} diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/duplicate_condition/DuplicateCondition.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/duplicate_condition/DuplicateCondition.java index ef047398e14f..148dc19c35fc 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/duplicate_condition/DuplicateCondition.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/duplicate_condition/DuplicateCondition.java @@ -3,10 +3,34 @@ package com.siyeh.igtest.controlflow.duplicate_condition; public class DuplicateCondition { void x(boolean b) { - if (b || b || b ) { + if (b || b || b ) { - } else if (b) { + } else if (b) { - } else if (b) {} + } else if (b) {} + } + + public void foo() + { + if(bar()||bar()) + { + System.out.println("1"); + }else if(bar()|| true) + { + System.out.println("2"); + } + } + + public boolean bar() + { + return true; + } + + void incompleteCode(String s) { + if (s.contains(A)) { + + } else if (s.contains(B)) { + + } } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/duplicate_condition/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/duplicate_condition/expected.xml deleted file mode 100644 index 47f1e352b5e6..000000000000 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/duplicate_condition/expected.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - DuplicateCondition.java - 6 - Duplicate condition in 'if' statement - Duplicate condition <code>b</code> #loc - - - - DuplicateCondition.java - 6 - Duplicate condition in 'if' statement - Duplicate condition <code>b</code> #loc - - - - DuplicateCondition.java - 8 - Duplicate condition in 'if' statement - Duplicate condition <code>b</code> #loc - - - - DuplicateCondition.java - 6 - Duplicate condition in 'if' statement - Duplicate condition <code>b</code> #loc - - - - DuplicateCondition.java - 10 - Duplicate condition in 'if' statement - Duplicate condition <code>b</code> #loc - - \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/abstraction/InstanceofChainInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/abstraction/InstanceofChainInspectionTest.java index 5d2973ed9bf7..2145bcda4bed 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/abstraction/InstanceofChainInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/abstraction/InstanceofChainInspectionTest.java @@ -1,11 +1,18 @@ package com.siyeh.ig.abstraction; -import com.siyeh.ig.IGInspectionTestCase; +import com.intellij.codeInspection.InspectionProfileEntry; +import com.siyeh.ig.LightInspectionTestCase; +import org.jetbrains.annotations.Nullable; -public class InstanceofChainInspectionTest extends IGInspectionTestCase { +public class InstanceofChainInspectionTest extends LightInspectionTestCase { - public void test() throws Exception { - doTest("com/siyeh/igtest/abstraction/instanceof_chain", - new InstanceofChainInspection()); + public void testInstanceofChain() { + doTest(); + } + + @Nullable + @Override + protected InspectionProfileEntry getInspection() { + return new InstanceofChainInspection(); } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/controlflow/DuplicateConditionInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/controlflow/DuplicateConditionInspectionTest.java index aaa379cf6ad1..60cd9abe92ce 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/controlflow/DuplicateConditionInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/controlflow/DuplicateConditionInspectionTest.java @@ -1,10 +1,18 @@ package com.siyeh.ig.controlflow; -import com.siyeh.ig.IGInspectionTestCase; +import com.intellij.codeInspection.InspectionProfileEntry; +import com.siyeh.ig.LightInspectionTestCase; +import org.jetbrains.annotations.Nullable; -public class DuplicateConditionInspectionTest extends IGInspectionTestCase { +public class DuplicateConditionInspectionTest extends LightInspectionTestCase { - public void test() throws Exception { - doTest("com/siyeh/igtest/controlflow/duplicate_condition", new DuplicateConditionInspection()); + public void testDuplicateCondition() { + doTest(); + } + + @Nullable + @Override + protected InspectionProfileEntry getInspection() { + return new DuplicateConditionInspection(); } } \ No newline at end of file diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnDiffViewer.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnDiffViewer.java index 1778255b66dd..ccce9564be54 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnDiffViewer.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnDiffViewer.java @@ -5,7 +5,6 @@ import com.intellij.diff.FrameDiffTool.DiffViewer; import com.intellij.diff.FrameDiffTool.ToolbarComponents; import com.intellij.diff.contents.DiffContent; import com.intellij.diff.contents.EmptyContent; -import com.intellij.diff.impl.ModifiablePanel; import com.intellij.diff.requests.DiffRequest; import com.intellij.diff.requests.ErrorDiffRequest; import com.intellij.diff.tools.ErrorDiffTool; @@ -23,6 +22,7 @@ import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Key; import com.intellij.ui.EditorNotificationPanel; import com.intellij.ui.JBColor; +import com.intellij.ui.components.panels.Wrapper; import com.intellij.util.containers.HashMap; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; @@ -60,7 +60,7 @@ public class SvnDiffViewer implements DiffViewer { @NotNull private final JPanel myPanel; @NotNull private final Splitter mySplitter; - @NotNull private final ModifiablePanel myNotificationPanel; + @NotNull private final Wrapper myNotificationPanel; @NotNull private final DiffViewer myContentViewer; @NotNull private final DiffViewer myPropertiesViewer; @@ -85,7 +85,7 @@ public class SvnDiffViewer implements DiffViewer { mySplitter.setProportion(mySettings.getSplitterProportion()); mySplitter.setFirstComponent(myContentViewer.getComponent()); - myNotificationPanel = new ModifiablePanel(); + myNotificationPanel = new Wrapper(); MyPropertyContext propertyContext = initPropertyContext(context); myPropertiesViewer = createPropertiesViewer(propertyRequest, propertyContext); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnTreeConflictDiffRequestProvider.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnTreeConflictDiffRequestProvider.java index 35562e795f06..918985fcdb3c 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnTreeConflictDiffRequestProvider.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/difftool/SvnTreeConflictDiffRequestProvider.java @@ -8,11 +8,11 @@ import com.intellij.openapi.util.UserDataHolder; import com.intellij.diff.DiffContext; import com.intellij.diff.FrameDiffTool; import com.intellij.diff.chains.DiffRequestProducerException; -import com.intellij.diff.impl.ModifiablePanel; import com.intellij.diff.requests.DiffRequest; import com.intellij.openapi.vcs.changes.Change; import com.intellij.openapi.vcs.changes.actions.diff.ChangeDiffRequestProducer; import com.intellij.openapi.vcs.changes.actions.diff.ChangeDiffRequestProvider; +import com.intellij.ui.components.panels.Wrapper; import com.intellij.util.ThreeState; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -91,7 +91,7 @@ public class SvnTreeConflictDiffRequestProvider implements ChangeDiffRequestProv private static class SvnTreeConflictDiffViewer implements FrameDiffTool.DiffViewer { @NotNull private final DiffContext myContext; @NotNull private final SvnTreeConflictDiffRequest myRequest; - @NotNull private final ModifiablePanel myPanel = new ModifiablePanel(); + @NotNull private final Wrapper myPanel = new Wrapper(); @NotNull private final BackgroundTaskQueue myQueue; @NotNull private final TreeConflictRefreshablePanel myDelegate; diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/GuiDesignerOptionsTopHitProvider.java b/plugins/ui-designer/src/com/intellij/uiDesigner/GuiDesignerOptionsTopHitProvider.java index 7413c94a96fb..cf220ea6ceef 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/GuiDesignerOptionsTopHitProvider.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/GuiDesignerOptionsTopHitProvider.java @@ -15,19 +15,14 @@ */ package com.intellij.uiDesigner; -import com.intellij.ide.ui.ConfigurableOptionsTopHitProvider; +import com.intellij.application.options.editor.EditorOptionsTopHitProviderBase; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; /** * @author Sergey.Malenkov */ -public class GuiDesignerOptionsTopHitProvider extends ConfigurableOptionsTopHitProvider { - @Override - public String getId() { - return "editor"; - } - +public class GuiDesignerOptionsTopHitProvider extends EditorOptionsTopHitProviderBase { @Override protected Configurable getConfigurable(Project project) { return new GuiDesignerConfigurable(project); diff --git a/xml/xml-analysis-impl/src/com/intellij/xml/util/XmlRefCountHolder.java b/xml/xml-analysis-impl/src/com/intellij/xml/util/XmlRefCountHolder.java index ecb407e19d33..e24e55ce0173 100644 --- a/xml/xml-analysis-impl/src/com/intellij/xml/util/XmlRefCountHolder.java +++ b/xml/xml-analysis-impl/src/com/intellij/xml/util/XmlRefCountHolder.java @@ -160,7 +160,7 @@ public class XmlRefCountHolder { return myUsedNamespaces.contains(ns); } - private static class IdGatheringRecursiveVisitor extends XmlRecursiveElementVisitor { + private static class IdGatheringRecursiveVisitor extends XmlRecursiveElementWalkingVisitor { private final XmlRefCountHolder myHolder; private IdGatheringRecursiveVisitor(@NotNull XmlRefCountHolder holder) {