Supported several load from Java errors per declaration.

This commit is contained in:
Evgeny Gerashchenko
2012-11-19 21:38:01 +04:00
parent 4525e05268
commit 60f30732ed
6 changed files with 33 additions and 21 deletions
@@ -38,6 +38,7 @@ import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import static org.jetbrains.jet.lang.diagnostics.DiagnosticUtils.sortedDiagnostics; import static org.jetbrains.jet.lang.diagnostics.DiagnosticUtils.sortedDiagnostics;
@@ -118,17 +119,21 @@ public final class AnalyzerWithCompilerReport {
private void reportAlternativeSignatureErrors() { private void reportAlternativeSignatureErrors() {
assert analyzeExhaust != null; assert analyzeExhaust != null;
BindingContext bc = analyzeExhaust.getBindingContext(); BindingContext bc = analyzeExhaust.getBindingContext();
Collection<DeclarationDescriptor> descriptorsWithErrors = bc.getKeys(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERROR); Collection<DeclarationDescriptor> descriptorsWithErrors = bc.getKeys(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS);
if (!descriptorsWithErrors.isEmpty()) { if (!descriptorsWithErrors.isEmpty()) {
StringBuilder message = new StringBuilder("The following Java entities have annotations wrong Kotlin signatures:\n"); StringBuilder messageStart = new StringBuilder("The following Java entities have annotations wrong Kotlin signatures:\n");
for (DeclarationDescriptor descriptor : descriptorsWithErrors) { for (DeclarationDescriptor descriptor : descriptorsWithErrors) {
PsiElement declaration = BindingContextUtils.descriptorToDeclaration(bc, descriptor); PsiElement declaration = BindingContextUtils.descriptorToDeclaration(bc, descriptor);
assert declaration instanceof PsiModifierListOwner; assert declaration instanceof PsiModifierListOwner;
String externalName = PsiFormatUtil.getExternalName((PsiModifierListOwner) declaration); String externalName = PsiFormatUtil.getExternalName((PsiModifierListOwner) declaration);
message.append(externalName).append(": "); messageStart.append(externalName).append(": ");
message.append(bc.get(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERROR, descriptor)).append("\n"); List<String> errors = bc.get(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, descriptor);
assert errors != null;
for (String error : errors) {
messageCollectorWrapper.report(CompilerMessageSeverity.ERROR,
messageStart + error + "\n", CompilerMessageLocation.NO_LOCATION);
}
} }
messageCollectorWrapper.report(CompilerMessageSeverity.ERROR, message.toString(), CompilerMessageLocation.NO_LOCATION);
} }
} }
@@ -198,8 +198,8 @@ public final class JavaConstructorResolver {
valueParameterDescriptors = alternativeMethodSignatureData.getValueParameters(); valueParameterDescriptors = alternativeMethodSignatureData.getValueParameters();
} }
else if (alternativeMethodSignatureData.hasErrors()) { else if (alternativeMethodSignatureData.hasErrors()) {
trace.record(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERROR, constructorDescriptor, trace.record(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, constructorDescriptor,
alternativeMethodSignatureData.getError()); Collections.singletonList(alternativeMethodSignatureData.getError()));
} }
constructorDescriptor.initialize(classDescriptor.getTypeConstructor().getParameters(), constructorDescriptor.initialize(classDescriptor.getTypeConstructor().getParameters(),
@@ -140,10 +140,12 @@ public final class JavaFunctionResolver {
.resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver); .resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver);
JetType returnType = makeReturnType(returnPsiType, method, methodTypeVariableResolver); JetType returnType = makeReturnType(returnPsiType, method, methodTypeVariableResolver);
final List<String> signatureErrors = Lists.newArrayList();
returnType = SignaturesPropagation.modifyReturnTypeAccordingToSuperMethods(returnType, method, trace, new Function1<String, Void>() { returnType = SignaturesPropagation.modifyReturnTypeAccordingToSuperMethods(returnType, method, trace, new Function1<String, Void>() {
@Override @Override
public Void invoke(String error) { public Void invoke(String error) {
trace.record(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERROR, functionDescriptorImpl, error); signatureErrors.add(error);
return null; return null;
} }
}); });
@@ -157,8 +159,7 @@ public final class JavaFunctionResolver {
methodTypeParameters = alternativeMethodSignatureData.getTypeParameters(); methodTypeParameters = alternativeMethodSignatureData.getTypeParameters();
} }
else if (alternativeMethodSignatureData.hasErrors()) { else if (alternativeMethodSignatureData.hasErrors()) {
trace.record(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERROR, functionDescriptorImpl, signatureErrors.add(alternativeMethodSignatureData.getError());
alternativeMethodSignatureData.getError());
} }
functionDescriptorImpl.initialize( functionDescriptorImpl.initialize(
@@ -184,7 +185,10 @@ public final class JavaFunctionResolver {
throw new IllegalStateException("non-static method in subclass"); throw new IllegalStateException("non-static method in subclass");
} }
if (trace.get(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERROR, functionDescriptorImpl) == null) { if (!signatureErrors.isEmpty()) {
trace.record(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, functionDescriptorImpl, signatureErrors);
}
if (signatureErrors.isEmpty()) {
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) ownerDescriptor).getDefaultType());
@@ -269,7 +269,8 @@ public final class JavaPropertyResolver {
} }
} }
else { else {
trace.record(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERROR, propertyDescriptor, signatureData.getError()); trace.record(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, propertyDescriptor,
Collections.singletonList(signatureData.getError()));
} }
return propertyType; return propertyType;
} }
@@ -38,6 +38,7 @@ import org.jetbrains.jet.util.slicedmap.*;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import static org.jetbrains.jet.util.slicedmap.RewritePolicy.DO_NOTHING; import static org.jetbrains.jet.util.slicedmap.RewritePolicy.DO_NOTHING;
@@ -256,8 +257,8 @@ public interface BindingContext {
WritableSlice<ClassDescriptor, Boolean> INCOMPLETE_HIERARCHY = Slices.createCollectiveSetSlice(); WritableSlice<ClassDescriptor, Boolean> INCOMPLETE_HIERARCHY = Slices.createCollectiveSetSlice();
WritableSlice<DeclarationDescriptor, String> LOAD_FROM_JAVA_SIGNATURE_ERROR = WritableSlice<DeclarationDescriptor, List<String>> LOAD_FROM_JAVA_SIGNATURE_ERRORS =
new BasicWritableSlice<DeclarationDescriptor, String>(Slices.ONLY_REWRITE_TO_EQUAL, true); new BasicWritableSlice<DeclarationDescriptor, List<String>>(Slices.ONLY_REWRITE_TO_EQUAL, true);
WritableSlice<CallableDescriptor, Boolean> IS_DECLARED_IN_JAVA = Slices.createSimpleSlice(); WritableSlice<CallableDescriptor, Boolean> IS_DECLARED_IN_JAVA = Slices.createSimpleSlice();
@@ -48,6 +48,7 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.resolve.DescriptorRenderer; import org.jetbrains.jet.resolve.DescriptorRenderer;
import java.io.IOException; import java.io.IOException;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@@ -76,7 +77,7 @@ public class JdkAnnotationsSanityTest extends KotlinTestWithEnvironment {
final BindingContext bindingContext = injector.getBindingTrace().getBindingContext(); final BindingContext bindingContext = injector.getBindingTrace().getBindingContext();
JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver(); JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver();
final Map<DeclarationDescriptor, String> errors = Maps.newHashMap(); final Map<DeclarationDescriptor, List<String>> errors = Maps.newHashMap();
Iterable<FqName> affectedClasses = getAffectedClasses(kotlinAnnotationsRoot); Iterable<FqName> affectedClasses = getAffectedClasses(kotlinAnnotationsRoot);
AlternativeSignatureErrorFindingVisitor visitor = new AlternativeSignatureErrorFindingVisitor(bindingContext, errors); AlternativeSignatureErrorFindingVisitor visitor = new AlternativeSignatureErrorFindingVisitor(bindingContext, errors);
@@ -94,7 +95,7 @@ public class JdkAnnotationsSanityTest extends KotlinTestWithEnvironment {
if (!errors.isEmpty()) { if (!errors.isEmpty()) {
StringBuilder sb = new StringBuilder("Error(s) in JDK alternative signatures: \n"); StringBuilder sb = new StringBuilder("Error(s) in JDK alternative signatures: \n");
for (Map.Entry<DeclarationDescriptor, String> entry : errors.entrySet()) { for (Map.Entry<DeclarationDescriptor, List<String>> entry : errors.entrySet()) {
sb.append(DescriptorRenderer.TEXT.render(entry.getKey())).append(" : ").append(entry.getValue()).append("\n"); sb.append(DescriptorRenderer.TEXT.render(entry.getKey())).append(" : ").append(entry.getValue()).append("\n");
} }
fail(sb.toString()); fail(sb.toString());
@@ -206,9 +207,9 @@ public class JdkAnnotationsSanityTest extends KotlinTestWithEnvironment {
private static class AlternativeSignatureErrorFindingVisitor extends DeclarationDescriptorVisitorEmptyBodies<Void, Void> { private static class AlternativeSignatureErrorFindingVisitor extends DeclarationDescriptorVisitorEmptyBodies<Void, Void> {
private final BindingContext bindingContext; private final BindingContext bindingContext;
private final Map<DeclarationDescriptor, String> errors; private final Map<DeclarationDescriptor, List<String>> errors;
public AlternativeSignatureErrorFindingVisitor(BindingContext bindingContext, Map<DeclarationDescriptor, String> errors) { public AlternativeSignatureErrorFindingVisitor(BindingContext bindingContext, Map<DeclarationDescriptor, List<String>> errors) {
this.bindingContext = bindingContext; this.bindingContext = bindingContext;
this.errors = errors; this.errors = errors;
} }
@@ -239,9 +240,9 @@ public class JdkAnnotationsSanityTest extends KotlinTestWithEnvironment {
} }
private Void visitDeclaration(@NotNull DeclarationDescriptor descriptor) { private Void visitDeclaration(@NotNull DeclarationDescriptor descriptor) {
String error = bindingContext.get(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERROR, descriptor); List<String> errors = bindingContext.get(BindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, descriptor);
if (error != null) { if (errors != null) {
errors.put(descriptor, error); this.errors.put(descriptor, errors);
} }
return null; return null;
} }