KT-3302 Method that implements two differing interfaces are reported as "Incompatible types in superclasses"

#KT-3302 fixed
This commit is contained in:
Evgeny Gerashchenko
2013-01-31 18:57:40 +04:00
parent 0f401d4c9d
commit 74771cb2db
36 changed files with 695 additions and 1 deletions
@@ -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);