diff --git a/java/java-impl/src/com/intellij/psi/impl/source/PsiJavaFileBaseImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/PsiJavaFileBaseImpl.java index e3b86c672a69..c4ea8ce7bbaa 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/PsiJavaFileBaseImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/PsiJavaFileBaseImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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. @@ -51,6 +51,7 @@ import com.intellij.util.containers.MostlySingularMultiMap; import com.intellij.util.indexing.FileBasedIndex; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -187,13 +188,14 @@ public abstract class PsiJavaFileBaseImpl extends PsiFileImpl implements PsiJava private String myNameToFilter; private boolean myIsProcessingOnDemand; private final Collection myHiddenNames = new HashSet(); + private final Collection myCollectedElements = new HashSet(); private StaticImportFilteringProcessor(PsiScopeProcessor delegate, String nameToFilter) { myDelegate = delegate; myNameToFilter = nameToFilter; } - public void setNameToFilter(String nameToFilter) { + public void setNameToFilter(@Nullable String nameToFilter) { myNameToFilter = nameToFilter; } @@ -224,18 +226,18 @@ public abstract class PsiJavaFileBaseImpl extends PsiFileImpl implements PsiJava public boolean execute(PsiElement element, ResolveState state) { if (element instanceof PsiModifierListOwner && ((PsiModifierListOwner)element).hasModifierProperty(PsiModifier.STATIC)) { if (myNameToFilter != null && - (!(element instanceof PsiNamedElement) || !myNameToFilter.equals(((PsiNamedElement)element).getName()))) { - return true; + !(element instanceof PsiNamedElement && myNameToFilter.equals(((PsiNamedElement)element).getName()))) { + return true; } if (element instanceof PsiNamedElement && myIsProcessingOnDemand) { final String name = ((PsiNamedElement)element).getName(); if (myHiddenNames.contains(name)) return true; } - return myDelegate.execute(element, state); - } - else { - return true; + if (myCollectedElements.add(element)) { + return myDelegate.execute(element, state); + } } + return true; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/staticImportConflict/Usage.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/staticImportConflict/Usage.java index 58d350cfe02e..c0874a4b0a76 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/staticImportConflict/Usage.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/staticImportConflict/Usage.java @@ -15,6 +15,7 @@ */ import x.Base1; import static x.Base2.F; +import static x.Base1.m; import static x.Base2.m; import static x.Base2.II.IF; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/staticImportConflict/UsageOnDemand.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/staticImportConflict/UsageOnDemand.java new file mode 100644 index 000000000000..630858504fcc --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/staticImportConflict/UsageOnDemand.java @@ -0,0 +1,24 @@ +/* + * Copyright 2000-2011 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import static x.Base1.*; +import static x.Base2.*; + +class UsageOnDemand { + void use() { + m(1); //Base1.m(int) + m(1.0f); //Base2.m(float) + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AdvHighlightingJdk7Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AdvHighlightingJdk7Test.java index 3e84000727d4..43b77746464e 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AdvHighlightingJdk7Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/AdvHighlightingJdk7Test.java @@ -52,4 +52,8 @@ public class AdvHighlightingJdk7Test extends DaemonAnalyzerTestCase { public void testStaticImportConflict() throws Exception { doTest(BASE_PATH + "staticImportConflict/Usage.java", BASE_PATH + "/staticImportConflict", false, false); } + + public void testStaticOnDemandImportConflict() throws Exception { + doTest(BASE_PATH + "staticImportConflict/UsageOnDemand.java", BASE_PATH + "/staticImportConflict", false, false); + } }