KT-3302 Method that implements two differing interfaces are reported as "Incompatible types in superclasses"
#KT-3302 fixed
This commit is contained in:
+26
-1
@@ -17,6 +17,7 @@
|
||||
package org.jetbrains.jet.lang.resolve.java.kotlinSignature;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Multimap;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
@@ -200,6 +201,9 @@ public class SignaturesPropagationData {
|
||||
@NotNull ClassDescriptor containingClass
|
||||
) {
|
||||
List<FunctionDescriptor> superFunctions = Lists.newArrayList();
|
||||
|
||||
Map<ClassDescriptor, JetType> superclassToSupertype = getSuperclassToSupertypeMap(containingClass);
|
||||
|
||||
for (HierarchicalMethodSignature superSignature : method.getPsiMethod().getHierarchicalMethodSignature().getSuperSignatures()) {
|
||||
PsiMethod superMethod = superSignature.getMethod();
|
||||
|
||||
@@ -222,7 +226,18 @@ public class SignaturesPropagationData {
|
||||
}
|
||||
|
||||
assert superFun instanceof FunctionDescriptor : superFun.getClass().getName();
|
||||
superFunctions.add((FunctionDescriptor) superFun);
|
||||
|
||||
DeclarationDescriptor superFunContainer = superFun.getContainingDeclaration();
|
||||
assert superFunContainer instanceof ClassDescriptor: superFunContainer;
|
||||
|
||||
JetType supertype = superclassToSupertype.get(superFunContainer);
|
||||
assert supertype != null : "Couldn't find super type for super function: " + superFun;
|
||||
TypeSubstitutor supertypeSubstitutor = TypeSubstitutor.create(supertype);
|
||||
|
||||
FunctionDescriptor substitutedSuperFun = ((FunctionDescriptor) superFun).substitute(supertypeSubstitutor);
|
||||
assert substitutedSuperFun != null;
|
||||
|
||||
superFunctions.add(substitutedSuperFun);
|
||||
}
|
||||
|
||||
// sorting for diagnostic stability
|
||||
@@ -560,6 +575,16 @@ public class SignaturesPropagationData {
|
||||
return classifier;
|
||||
}
|
||||
|
||||
private static Map<ClassDescriptor, JetType> getSuperclassToSupertypeMap(ClassDescriptor containingClass) {
|
||||
Map<ClassDescriptor, JetType> superclassToSupertype = Maps.newHashMap();
|
||||
for (JetType supertype : TypeUtils.getAllSupertypes(containingClass.getDefaultType())) {
|
||||
ClassifierDescriptor superclass = supertype.getConstructor().getDeclarationDescriptor();
|
||||
assert superclass instanceof ClassDescriptor;
|
||||
superclassToSupertype.put((ClassDescriptor) superclass, supertype);
|
||||
}
|
||||
return superclassToSupertype;
|
||||
}
|
||||
|
||||
private static boolean isArrayType(@NotNull JetType type) {
|
||||
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
|
||||
return builtIns.isArray(type) || builtIns.isPrimitiveArray(type);
|
||||
|
||||
Reference in New Issue
Block a user