Extracted method checking that loaded functions override super functions correctly.

This commit is contained in:
Evgeny Gerashchenko
2012-11-19 21:42:14 +04:00
parent 60f30732ed
commit 8252c51ebc
@@ -185,33 +185,38 @@ public final class JavaFunctionResolver {
throw new IllegalStateException("non-static method in subclass"); throw new IllegalStateException("non-static method in subclass");
} }
if (!signatureErrors.isEmpty()) { if (signatureErrors.isEmpty()) {
checkFunctionsOverrideCorrectly(method, functionDescriptorImpl);
}
else {
trace.record(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, functionDescriptorImpl, signatureErrors); trace.record(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, functionDescriptorImpl, signatureErrors);
} }
if (signatureErrors.isEmpty()) {
return functionDescriptorImpl;
}
private void checkFunctionsOverrideCorrectly(PsiMethodWrapper method, FunctionDescriptor functionDescriptor) {
List<FunctionDescriptor> superFunctions = SignaturesPropagation.getSuperFunctionsForMethod(method, trace); List<FunctionDescriptor> superFunctions = SignaturesPropagation.getSuperFunctionsForMethod(method, trace);
for (FunctionDescriptor superFunction : superFunctions) { for (FunctionDescriptor superFunction : superFunctions) {
TypeSubstitutor substitutor = SubstitutionUtils.buildDeepSubstitutor(((ClassDescriptor) ownerDescriptor).getDefaultType()); TypeSubstitutor substitutor = SubstitutionUtils.buildDeepSubstitutor(
((ClassDescriptor) functionDescriptor.getContainingDeclaration()).getDefaultType());
FunctionDescriptor superFunctionSubstituted = superFunction.substitute(substitutor); FunctionDescriptor superFunctionSubstituted = superFunction.substitute(substitutor);
// TODO replace asserted condition when propagation for parameters is supported // TODO replace asserted condition when propagation for parameters is supported
//OverridingUtil.OverrideCompatibilityInfo.Result overridableResult = //OverridingUtil.OverrideCompatibilityInfo.Result overridableResult =
// OverridingUtil.isOverridableBy(superFunctionSubstituted, functionDescriptorImpl).getResult(); // OverridingUtil.isOverridableBy(superFunctionSubstituted, functionDescriptor).getResult();
//if (overridableResult != OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE //if (overridableResult != OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE
// || !OverridingUtil.isReturnTypeOkForOverride(JetTypeChecker.INSTANCE, superFunctionSubstituted, functionDescriptorImpl)) { // || !OverridingUtil.isReturnTypeOkForOverride(JetTypeChecker.INSTANCE, superFunctionSubstituted, functionDescriptor)) {
if (!OverridingUtil.isReturnTypeOkForOverride(JetTypeChecker.INSTANCE, superFunctionSubstituted, functionDescriptorImpl)) { if (!OverridingUtil.isReturnTypeOkForOverride(JetTypeChecker.INSTANCE, superFunctionSubstituted, functionDescriptor)) {
throw new IllegalStateException("Loaded Java method overrides another, but resolved as Kotlin function, doesn't.\n" throw new IllegalStateException("Loaded Java method overrides another, but resolved as Kotlin function, doesn't.\n"
+ "super function = " + superFunction + "\n" + "super function = " + superFunction + "\n"
+ "this function = " + functionDescriptorImpl + "\n" + "this function = " + functionDescriptor + "\n"
+ "this method = " + PsiFormatUtil.getExternalName(psiMethod) + "\n" + "this method = " + PsiFormatUtil.getExternalName(method.getPsiMethod()) + "\n"
+ "@KotlinSignature = " + method.getSignatureAnnotation().signature()); + "@KotlinSignature = " + method.getSignatureAnnotation().signature());
} }
} }
} }
return functionDescriptorImpl;
}
@NotNull @NotNull
private Set<FunctionDescriptor> resolveNamedGroupFunctions( private Set<FunctionDescriptor> resolveNamedGroupFunctions(
@NotNull ClassOrNamespaceDescriptor owner, @NotNull PsiClass psiClass, @NotNull ClassOrNamespaceDescriptor owner, @NotNull PsiClass psiClass,