Supported several load from Java errors per declaration.
This commit is contained in:
+10
-5
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -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(),
|
||||||
|
|||||||
+8
-4
@@ -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());
|
||||||
|
|||||||
+2
-1
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user