Extracted method checking that loaded functions override super functions correctly.
This commit is contained in:
+16
-11
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user