Use ExternalSignatureResolver to resolve field signatures
This commit is contained in:
@@ -154,6 +154,7 @@ public class InjectorForJavaDescriptorResolver {
|
|||||||
javaConstructorResolver.setValueParameterResolver(javaValueParameterResolver);
|
javaConstructorResolver.setValueParameterResolver(javaValueParameterResolver);
|
||||||
|
|
||||||
javaPropertyResolver.setAnnotationResolver(javaAnnotationResolver);
|
javaPropertyResolver.setAnnotationResolver(javaAnnotationResolver);
|
||||||
|
javaPropertyResolver.setExternalSignatureResolver(externalSignatureResolver);
|
||||||
javaPropertyResolver.setTrace(bindingTrace);
|
javaPropertyResolver.setTrace(bindingTrace);
|
||||||
javaPropertyResolver.setTypeTransformer(javaTypeTransformer);
|
javaPropertyResolver.setTypeTransformer(javaTypeTransformer);
|
||||||
|
|
||||||
|
|||||||
@@ -341,6 +341,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
|
|||||||
javaConstructorResolver.setValueParameterResolver(javaValueParameterResolver);
|
javaConstructorResolver.setValueParameterResolver(javaValueParameterResolver);
|
||||||
|
|
||||||
javaPropertyResolver.setAnnotationResolver(javaAnnotationResolver);
|
javaPropertyResolver.setAnnotationResolver(javaAnnotationResolver);
|
||||||
|
javaPropertyResolver.setExternalSignatureResolver(externalSignatureResolver);
|
||||||
javaPropertyResolver.setTrace(bindingTrace);
|
javaPropertyResolver.setTrace(bindingTrace);
|
||||||
javaPropertyResolver.setTypeTransformer(javaTypeTransformer);
|
javaPropertyResolver.setTypeTransformer(javaTypeTransformer);
|
||||||
|
|
||||||
|
|||||||
+47
-7
@@ -18,14 +18,16 @@ package org.jetbrains.jet.lang.resolve.java.resolver;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaBindingContext;
|
import org.jetbrains.jet.lang.resolve.java.JavaBindingContext;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeFieldSignatureData;
|
||||||
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData;
|
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData;
|
||||||
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesPropagationData;
|
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesPropagationData;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.structure.JavaField;
|
||||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod;
|
import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod;
|
||||||
import org.jetbrains.jet.lang.types.JetType;
|
import org.jetbrains.jet.lang.types.JetType;
|
||||||
|
|
||||||
@@ -41,12 +43,24 @@ public class ExternalSignatureResolver {
|
|||||||
this.trace = trace;
|
this.trace = trace;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class AlternativeMethodSignature {
|
private abstract static class MemberSignature {
|
||||||
|
private final String signatureError;
|
||||||
|
|
||||||
|
protected MemberSignature(@Nullable String signatureError) {
|
||||||
|
this.signatureError = signatureError;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public List<String> getErrors() {
|
||||||
|
return signatureError == null ? Collections.<String>emptyList() : Collections.singletonList(signatureError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class AlternativeMethodSignature extends MemberSignature {
|
||||||
private final JetType returnType;
|
private final JetType returnType;
|
||||||
private final JetType receiverType;
|
private final JetType receiverType;
|
||||||
private final List<ValueParameterDescriptor> valueParameters;
|
private final List<ValueParameterDescriptor> valueParameters;
|
||||||
private final List<TypeParameterDescriptor> typeParameters;
|
private final List<TypeParameterDescriptor> typeParameters;
|
||||||
private final String signatureError;
|
|
||||||
|
|
||||||
public AlternativeMethodSignature(
|
public AlternativeMethodSignature(
|
||||||
@Nullable JetType returnType,
|
@Nullable JetType returnType,
|
||||||
@@ -55,11 +69,11 @@ public class ExternalSignatureResolver {
|
|||||||
@NotNull List<TypeParameterDescriptor> typeParameters,
|
@NotNull List<TypeParameterDescriptor> typeParameters,
|
||||||
@Nullable String signatureError
|
@Nullable String signatureError
|
||||||
) {
|
) {
|
||||||
|
super(signatureError);
|
||||||
this.returnType = returnType;
|
this.returnType = returnType;
|
||||||
this.receiverType = receiverType;
|
this.receiverType = receiverType;
|
||||||
this.valueParameters = valueParameters;
|
this.valueParameters = valueParameters;
|
||||||
this.typeParameters = typeParameters;
|
this.typeParameters = typeParameters;
|
||||||
this.signatureError = signatureError;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -81,10 +95,19 @@ public class ExternalSignatureResolver {
|
|||||||
public List<TypeParameterDescriptor> getTypeParameters() {
|
public List<TypeParameterDescriptor> getTypeParameters() {
|
||||||
return typeParameters;
|
return typeParameters;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class AlternativeFieldSignature extends MemberSignature {
|
||||||
|
private final JetType returnType;
|
||||||
|
|
||||||
|
public AlternativeFieldSignature(@NotNull JetType returnType, @Nullable String signatureError) {
|
||||||
|
super(signatureError);
|
||||||
|
this.returnType = returnType;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public List<String> getErrors() {
|
public JetType getReturnType() {
|
||||||
return signatureError == null ? Collections.<String>emptyList() : Collections.singletonList(signatureError);
|
return returnType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,7 +145,24 @@ public class ExternalSignatureResolver {
|
|||||||
return new AlternativeMethodSignature(returnType, receiverType, valueParameters, typeParameters, error);
|
return new AlternativeMethodSignature(returnType, receiverType, valueParameters, typeParameters, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reportSignatureErrors(@NotNull FunctionDescriptor descriptor, @NotNull List<String> signatureErrors) {
|
@SuppressWarnings("MethodMayBeStatic")
|
||||||
|
@NotNull
|
||||||
|
public AlternativeFieldSignature resolveAlternativeFieldSignature(
|
||||||
|
@NotNull JavaField field,
|
||||||
|
@NotNull JetType returnType,
|
||||||
|
boolean isVar
|
||||||
|
) {
|
||||||
|
AlternativeFieldSignatureData data = new AlternativeFieldSignatureData(field, returnType, isVar);
|
||||||
|
|
||||||
|
if (data.isAnnotated() && !data.hasErrors()) {
|
||||||
|
return new AlternativeFieldSignature(data.getReturnType(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
String error = data.hasErrors() ? data.getError() : null;
|
||||||
|
return new AlternativeFieldSignature(returnType, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reportSignatureErrors(@NotNull CallableMemberDescriptor descriptor, @NotNull List<String> signatureErrors) {
|
||||||
trace.record(JavaBindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, descriptor, signatureErrors);
|
trace.record(JavaBindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, descriptor, signatureErrors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-22
@@ -30,10 +30,8 @@ import org.jetbrains.jet.lang.resolve.BindingTrace;
|
|||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
|
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
|
||||||
import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils;
|
import org.jetbrains.jet.lang.resolve.java.DescriptorResolverUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.java.JavaBindingContext;
|
|
||||||
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPropertyDescriptor;
|
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPropertyDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPropertyDescriptorForObject;
|
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPropertyDescriptorForObject;
|
||||||
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeFieldSignatureData;
|
|
||||||
import org.jetbrains.jet.lang.resolve.java.scope.NamedMembers;
|
import org.jetbrains.jet.lang.resolve.java.scope.NamedMembers;
|
||||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaField;
|
import org.jetbrains.jet.lang.resolve.java.structure.JavaField;
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
@@ -50,6 +48,7 @@ public final class JavaPropertyResolver {
|
|||||||
private JavaTypeTransformer typeTransformer;
|
private JavaTypeTransformer typeTransformer;
|
||||||
private BindingTrace trace;
|
private BindingTrace trace;
|
||||||
private JavaAnnotationResolver annotationResolver;
|
private JavaAnnotationResolver annotationResolver;
|
||||||
|
private ExternalSignatureResolver externalSignatureResolver;
|
||||||
|
|
||||||
public JavaPropertyResolver() {
|
public JavaPropertyResolver() {
|
||||||
}
|
}
|
||||||
@@ -69,6 +68,11 @@ public final class JavaPropertyResolver {
|
|||||||
this.annotationResolver = annotationResolver;
|
this.annotationResolver = annotationResolver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public void setExternalSignatureResolver(ExternalSignatureResolver externalSignatureResolver) {
|
||||||
|
this.externalSignatureResolver = externalSignatureResolver;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Set<VariableDescriptor> resolveFieldGroup(@NotNull NamedMembers members, @NotNull ClassOrNamespaceDescriptor owner) {
|
public Set<VariableDescriptor> resolveFieldGroup(@NotNull NamedMembers members, @NotNull ClassOrNamespaceDescriptor owner) {
|
||||||
Name propertyName = members.getName();
|
Name propertyName = members.getName();
|
||||||
@@ -110,10 +114,15 @@ public final class JavaPropertyResolver {
|
|||||||
|
|
||||||
JetType propertyType = getPropertyType(field, typeVariableResolver);
|
JetType propertyType = getPropertyType(field, typeVariableResolver);
|
||||||
|
|
||||||
propertyType = getAlternativeSignatureData(isVar, field, propertyDescriptor, propertyType);
|
ExternalSignatureResolver.AlternativeFieldSignature effectiveSignature =
|
||||||
|
externalSignatureResolver.resolveAlternativeFieldSignature(field, propertyType, isVar);
|
||||||
|
List<String> signatureErrors = effectiveSignature.getErrors();
|
||||||
|
if (!signatureErrors.isEmpty()) {
|
||||||
|
externalSignatureResolver.reportSignatureErrors(propertyDescriptor, signatureErrors);
|
||||||
|
}
|
||||||
|
|
||||||
propertyDescriptor.setType(
|
propertyDescriptor.setType(
|
||||||
propertyType,
|
effectiveSignature.getReturnType(),
|
||||||
Collections.<TypeParameterDescriptor>emptyList(),
|
Collections.<TypeParameterDescriptor>emptyList(),
|
||||||
DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
|
DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
|
||||||
(JetType) null
|
(JetType) null
|
||||||
@@ -163,24 +172,6 @@ public final class JavaPropertyResolver {
|
|||||||
return new JavaPropertyDescriptor(owner, annotations, visibility, isVar, propertyName);
|
return new JavaPropertyDescriptor(owner, annotations, visibility, isVar, propertyName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private JetType getAlternativeSignatureData(
|
|
||||||
boolean isVar,
|
|
||||||
@NotNull JavaField field,
|
|
||||||
@NotNull PropertyDescriptor propertyDescriptor,
|
|
||||||
@NotNull JetType propertyType
|
|
||||||
) {
|
|
||||||
AlternativeFieldSignatureData signatureData = new AlternativeFieldSignatureData(field, propertyType, isVar);
|
|
||||||
if (signatureData.hasErrors()) {
|
|
||||||
trace.record(JavaBindingContext.LOAD_FROM_JAVA_SIGNATURE_ERRORS, propertyDescriptor,
|
|
||||||
Collections.singletonList(signatureData.getError()));
|
|
||||||
}
|
|
||||||
else if (signatureData.isAnnotated()) {
|
|
||||||
return signatureData.getReturnType();
|
|
||||||
}
|
|
||||||
return propertyType;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private JetType getPropertyType(@NotNull JavaField field, @NotNull TypeVariableResolver typeVariableResolver) {
|
private JetType getPropertyType(@NotNull JavaField field, @NotNull TypeVariableResolver typeVariableResolver) {
|
||||||
JetType propertyType = typeTransformer.transformToType(field.getType(), typeVariableResolver);
|
JetType propertyType = typeTransformer.transformToType(field.getType(), typeVariableResolver);
|
||||||
|
|||||||
Reference in New Issue
Block a user