unrelated defaults when one interface overrides 2 unrelated (IDEA-163469)
authorAnna.Kozlova <anna.kozlova@jetbrains.com>
Wed, 2 Nov 2016 11:37:41 +0000 (12:37 +0100)
committerAnna.Kozlova <anna.kozlova@jetbrains.com>
Wed, 2 Nov 2016 14:51:14 +0000 (15:51 +0100)
java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java
java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/UnrelatedDefaultsWhenOneInterfaceOverrides2Unrelated.java [new file with mode: 0644]
java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java

index 1b54bb0767ba3e716a9bb7b23ebd5197c6858dc0..67a5c6efa426b19dfd776f0cb324468bd1ef42b1 100644 (file)
@@ -512,14 +512,14 @@ public class GenericsHighlightUtil {
 
   private static String hasUnrelatedDefaults(List<PsiClass> defaults) {
     if (defaults.size() > 1) {
-      for (int i = 0; i < defaults.size(); i++) {
-        final PsiClass aClass1 = defaults.get(i);
-        for (int j = i + 1; j < defaults.size(); j++) {
-          final PsiClass aClass2 = defaults.get(j);
-          if (aClass2 != null && !belongToOneHierarchy(aClass1, aClass2)) {
-            return  HighlightUtil.formatClass(aClass1) + " and " + HighlightUtil.formatClass(aClass2);
-          }
-        }
+      PsiClass[] defaultClasses = defaults.toArray(PsiClass.EMPTY_ARRAY);
+      ArrayList<PsiClass> classes = new ArrayList<>(defaults);
+      for (final PsiClass aClass1 : defaultClasses) {
+        classes.removeIf(aClass2 -> aClass1.isInheritor(aClass2, true));
+      }
+
+      if (classes.size() > 1) {
+        return HighlightUtil.formatClass(classes.get(0)) + " and " + HighlightUtil.formatClass(classes.get(1));
       }
     }
 
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/UnrelatedDefaultsWhenOneInterfaceOverrides2Unrelated.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/UnrelatedDefaultsWhenOneInterfaceOverrides2Unrelated.java
new file mode 100644 (file)
index 0000000..9d1154a
--- /dev/null
@@ -0,0 +1,20 @@
+
+interface OraModMajorObject extends OraMajorObject {}
+interface OraModStoredSchemaObject extends OraStoredSchemaObject {}
+interface OraModCluster extends OraCluster, OraModMajorObject, OraModStoredSchemaObject {}
+
+interface OraStoredSchemaObject {
+  default boolean isNameSurrogate() {
+    return false;
+  }
+}
+interface OraMajorObject  {
+  default boolean isNameSurrogate() {
+    return false;
+  }
+}
+interface OraCluster extends OraMajorObject, OraStoredSchemaObject {
+  default boolean isNameSurrogate() {
+    return false;
+  }
+}
\ No newline at end of file
index 7d9960cf1e8f866e957d649417ab0c5227a98f3a..6e923f6b244d6d5370fadad057280eff1ca8c9b1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2016 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.
@@ -67,6 +67,10 @@ public class Interface8MethodsHighlightingTest extends LightCodeInsightFixtureTe
     doTest(false, false);
   }
 
+  public void testUnrelatedDefaultsWhenOneInterfaceOverrides2Unrelated() throws Exception {
+    doTest(false, false);
+  }
+
   public void testStaticMethodAccessibleBothThroughStaticImportAndInheritance() throws Exception {
     myFixture.addClass("package p; public interface Foo {" +
                        "    static void foo() {}" +