fix reading of jet signature with type parameter referencing self

===
class Something<A : Comparable<A>>
===

reported by Max

Also merge copy-paste in JavaDescriptorResolver
This commit is contained in:
Stepan Koltsov
2012-02-17 22:32:11 +04:00
parent 6cb7833e9b
commit d2a137d944
3 changed files with 76 additions and 66 deletions
@@ -465,29 +465,27 @@ public class JavaDescriptorResolver {
private abstract class JetSignatureTypeParameterVisitor extends JetSignatureExceptionsAdapter { private abstract class JetSignatureTypeParameterVisitor extends JetSignatureExceptionsAdapter {
private final DeclarationDescriptor containingDeclaration;
private final PsiTypeParameterListOwner psiOwner;
private final String name;
private final boolean reified;
private final int index;
private final TypeInfoVariance variance;
private final TypeVariableResolver typeVariableResolver;
protected JetSignatureTypeParameterVisitor(DeclarationDescriptor containingDeclaration, PsiTypeParameterListOwner psiOwner, @NotNull
String name, boolean reified, int index, TypeInfoVariance variance, TypeVariableResolver typeVariableResolver) private final PsiTypeParameterListOwner psiOwner;
@NotNull
private final String name;
@NotNull
private final TypeVariableResolver typeVariableResolver;
@NotNull
private final TypeParameterDescriptor typeParameterDescriptor;
protected JetSignatureTypeParameterVisitor(PsiTypeParameterListOwner psiOwner,
String name, TypeVariableResolver typeVariableResolver, TypeParameterDescriptor typeParameterDescriptor)
{ {
if (name.isEmpty()) { if (name.isEmpty()) {
throw new IllegalStateException(); throw new IllegalStateException();
} }
this.containingDeclaration = containingDeclaration;
this.psiOwner = psiOwner; this.psiOwner = psiOwner;
this.name = name; this.name = name;
this.reified = reified;
this.index = index;
this.variance = variance;
this.typeVariableResolver = typeVariableResolver; this.typeVariableResolver = typeVariableResolver;
this.typeParameterDescriptor = typeParameterDescriptor;
} }
List<JetType> upperBounds = new ArrayList<JetType>(); List<JetType> upperBounds = new ArrayList<JetType>();
@@ -518,19 +516,57 @@ public class JavaDescriptorResolver {
@Override @Override
public void visitFormalTypeParameterEnd() { public void visitFormalTypeParameterEnd() {
PsiTypeParameter psiTypeParameter = getPsiTypeParameterByName(psiOwner, name);
TypeParameterDescriptorInitialization typeParameterDescriptorInitialization = new TypeParameterDescriptorInitialization(typeParameterDescriptor, psiTypeParameter, upperBounds, lowerBounds);
done(typeParameterDescriptorInitialization);
}
protected abstract void done(@NotNull TypeParameterDescriptorInitialization typeParameterDescriptor);
}
private class JetSignatureTypeParametersVisitor extends JetSignatureExceptionsAdapter {
@NotNull
private final DeclarationDescriptor containingDeclaration;
@NotNull
private final PsiTypeParameterListOwner psiOwner;
private final List<TypeParameterDescriptor> previousTypeParameters = new ArrayList<TypeParameterDescriptor>();
// note changes state in this method
private final TypeVariableResolver typeVariableResolver;
private JetSignatureTypeParametersVisitor(@NotNull TypeVariableResolver containerTypeVariableResolver, @NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameterListOwner psiOwner) {
this.containingDeclaration = containingDeclaration;
this.psiOwner = psiOwner;
this.typeVariableResolver = new TypeVariableResolverFromTypeDescriptors(previousTypeParameters, containerTypeVariableResolver);
}
private int formalTypeParameterIndex = 0;
List<TypeParameterDescriptorInitialization> r = new ArrayList<TypeParameterDescriptorInitialization>();
@Override
public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification( TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification(
containingDeclaration, containingDeclaration,
Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong
reified, reified,
JetSignatureUtils.translateVariance(variance), JetSignatureUtils.translateVariance(variance),
name, name,
index); formalTypeParameterIndex++);
PsiTypeParameter psiTypeParameter = getPsiTypeParameterByName(psiOwner, name);
TypeParameterDescriptorInitialization typeParameterDescriptorInitialization = new TypeParameterDescriptorInitialization(typeParameter, psiTypeParameter, upperBounds, lowerBounds); previousTypeParameters.add(typeParameter);
done(typeParameterDescriptorInitialization);
return new JetSignatureTypeParameterVisitor(psiOwner, name, typeVariableResolver, typeParameter) {
@Override
protected void done(@NotNull TypeParameterDescriptorInitialization typeParameterDescriptor) {
r.add(typeParameterDescriptor);
previousTypeParameters.add(typeParameterDescriptor.descriptor);
}
};
} }
protected abstract void done(@NotNull TypeParameterDescriptorInitialization typeParameterDescriptor);
} }
/** /**
@@ -538,26 +574,7 @@ public class JavaDescriptorResolver {
*/ */
private List<TypeParameterDescriptorInitialization> resolveClassTypeParametersFromJetSignature(String jetSignature, final PsiClass clazz, private List<TypeParameterDescriptorInitialization> resolveClassTypeParametersFromJetSignature(String jetSignature, final PsiClass clazz,
final ClassDescriptor classDescriptor, final TypeVariableResolver outerClassTypeVariableResolver) { final ClassDescriptor classDescriptor, final TypeVariableResolver outerClassTypeVariableResolver) {
final List<TypeParameterDescriptorInitialization> r = new ArrayList<TypeParameterDescriptorInitialization>(); JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(outerClassTypeVariableResolver, classDescriptor, clazz) {
final List<TypeParameterDescriptor> previousTypeParameters = new ArrayList<TypeParameterDescriptor>();
// note changes state in this method
final TypeVariableResolver typeVariableResolver = new TypeVariableResolverFromTypeDescriptors(previousTypeParameters, outerClassTypeVariableResolver);
new JetSignatureReader(jetSignature).accept(new JetSignatureExceptionsAdapter() {
private int formalTypeParameterIndex = 0;
@Override
public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
return new JetSignatureTypeParameterVisitor(classDescriptor, clazz, name, reified, formalTypeParameterIndex++, variance, typeVariableResolver) {
@Override
protected void done(TypeParameterDescriptorInitialization typeParameterDescriptor) {
r.add(typeParameterDescriptor);
previousTypeParameters.add(typeParameterDescriptor.descriptor);
}
};
}
@Override @Override
public JetSignatureVisitor visitSuperclass() { public JetSignatureVisitor visitSuperclass() {
// TODO // TODO
@@ -569,8 +586,9 @@ public class JavaDescriptorResolver {
// TODO // TODO
return new JetSignatureAdapter(); return new JetSignatureAdapter();
} }
}); };
return r; new JetSignatureReader(jetSignature).accept(jetSignatureTypeParametersVisitor);
return jetSignatureTypeParametersVisitor.r;
} }
private DeclarationDescriptor resolveParentDescriptor(PsiClass psiClass) { private DeclarationDescriptor resolveParentDescriptor(PsiClass psiClass) {
@@ -1478,29 +1496,9 @@ public class JavaDescriptorResolver {
private List<TypeParameterDescriptorInitialization> resolveMethodTypeParametersFromJetSignature(String jetSignature, final PsiMethod method, private List<TypeParameterDescriptorInitialization> resolveMethodTypeParametersFromJetSignature(String jetSignature, final PsiMethod method,
final DeclarationDescriptor functionDescriptor, final TypeVariableResolver classTypeVariableResolver) final DeclarationDescriptor functionDescriptor, final TypeVariableResolver classTypeVariableResolver)
{ {
final List<TypeParameterDescriptorInitialization> r = new ArrayList<TypeParameterDescriptorInitialization>(); JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(classTypeVariableResolver, functionDescriptor, method);
new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(jetSignatureTypeParametersVisitor);
final List<TypeParameterDescriptor> previousTypeParameters = new ArrayList<TypeParameterDescriptor>(); return jetSignatureTypeParametersVisitor.r;
// note changes state in this method
final TypeVariableResolver typeVariableResolver = new TypeVariableResolverFromTypeDescriptors(previousTypeParameters, classTypeVariableResolver);
new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(new JetSignatureExceptionsAdapter() {
private int formalTypeParameterIndex = 0;
@Override
public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
return new JetSignatureTypeParameterVisitor(functionDescriptor, method, name, reified, formalTypeParameterIndex++, variance, typeVariableResolver) {
@Override
protected void done(TypeParameterDescriptorInitialization typeParameterDescriptor) {
r.add(typeParameterDescriptor);
previousTypeParameters.add(typeParameterDescriptor.descriptor);
}
};
}
});
return r;
} }
private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method, private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method,
@@ -0,0 +1,5 @@
package test
trait TraitWithP<P>
class ClassParamReferencesSelf<A : TraitWithP<A>>
@@ -0,0 +1,7 @@
namespace test
final class test.ClassParamReferencesSelf</*0,r*/ A : test.TraitWithP<A>> : jet.Any {
final /*constructor*/ fun </*0,r*/ A : test.TraitWithP<A>><init>(): test.ClassParamReferencesSelf</*0,r*/ A : test.TraitWithP<A>>
}
abstract trait test.TraitWithP</*0,r*/ P : jet.Any?> : jet.Any {
}