From d2a137d944d5046aab8b943bca727306fb0a1eb1 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Fri, 17 Feb 2012 22:32:11 +0400 Subject: [PATCH] fix reading of jet signature with type parameter referencing self === class Something> === reported by Max Also merge copy-paste in JavaDescriptorResolver --- .../resolve/java/JavaDescriptorResolver.java | 130 +++++++++--------- .../class/ClassParamReferencesSelf.kt | 5 + .../class/ClassParamReferencesSelf.txt | 7 + 3 files changed, 76 insertions(+), 66 deletions(-) create mode 100644 compiler/testData/readKotlinBinaryClass/class/ClassParamReferencesSelf.kt create mode 100644 compiler/testData/readKotlinBinaryClass/class/ClassParamReferencesSelf.txt diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 08eea89a8be..e82962fd00c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -465,29 +465,27 @@ public class JavaDescriptorResolver { 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, - String name, boolean reified, int index, TypeInfoVariance variance, TypeVariableResolver typeVariableResolver) + @NotNull + 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()) { throw new IllegalStateException(); } - - this.containingDeclaration = containingDeclaration; + this.psiOwner = psiOwner; this.name = name; - this.reified = reified; - this.index = index; - this.variance = variance; this.typeVariableResolver = typeVariableResolver; + this.typeParameterDescriptor = typeParameterDescriptor; } List upperBounds = new ArrayList(); @@ -518,19 +516,57 @@ public class JavaDescriptorResolver { @Override 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 previousTypeParameters = new ArrayList(); + // 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 r = new ArrayList(); + + @Override + public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) { TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification( containingDeclaration, Collections.emptyList(), // TODO: wrong reified, JetSignatureUtils.translateVariance(variance), name, - index); - PsiTypeParameter psiTypeParameter = getPsiTypeParameterByName(psiOwner, name); - TypeParameterDescriptorInitialization typeParameterDescriptorInitialization = new TypeParameterDescriptorInitialization(typeParameter, psiTypeParameter, upperBounds, lowerBounds); - done(typeParameterDescriptorInitialization); + formalTypeParameterIndex++); + + previousTypeParameters.add(typeParameter); + + 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 resolveClassTypeParametersFromJetSignature(String jetSignature, final PsiClass clazz, final ClassDescriptor classDescriptor, final TypeVariableResolver outerClassTypeVariableResolver) { - final List r = new ArrayList(); - - final List previousTypeParameters = new ArrayList(); - // 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); - } - }; - } - + JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(outerClassTypeVariableResolver, classDescriptor, clazz) { @Override public JetSignatureVisitor visitSuperclass() { // TODO @@ -569,8 +586,9 @@ public class JavaDescriptorResolver { // TODO return new JetSignatureAdapter(); } - }); - return r; + }; + new JetSignatureReader(jetSignature).accept(jetSignatureTypeParametersVisitor); + return jetSignatureTypeParametersVisitor.r; } private DeclarationDescriptor resolveParentDescriptor(PsiClass psiClass) { @@ -1478,29 +1496,9 @@ public class JavaDescriptorResolver { private List resolveMethodTypeParametersFromJetSignature(String jetSignature, final PsiMethod method, final DeclarationDescriptor functionDescriptor, final TypeVariableResolver classTypeVariableResolver) { - final List r = new ArrayList(); - - final List previousTypeParameters = new ArrayList(); - // 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; + JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(classTypeVariableResolver, functionDescriptor, method); + new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(jetSignatureTypeParametersVisitor); + return jetSignatureTypeParametersVisitor.r; } private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method, diff --git a/compiler/testData/readKotlinBinaryClass/class/ClassParamReferencesSelf.kt b/compiler/testData/readKotlinBinaryClass/class/ClassParamReferencesSelf.kt new file mode 100644 index 00000000000..e28efeedca1 --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/class/ClassParamReferencesSelf.kt @@ -0,0 +1,5 @@ +package test + +trait TraitWithP

+ +class ClassParamReferencesSelf> diff --git a/compiler/testData/readKotlinBinaryClass/class/ClassParamReferencesSelf.txt b/compiler/testData/readKotlinBinaryClass/class/ClassParamReferencesSelf.txt new file mode 100644 index 00000000000..78c19781123 --- /dev/null +++ b/compiler/testData/readKotlinBinaryClass/class/ClassParamReferencesSelf.txt @@ -0,0 +1,7 @@ +namespace test + +final class test.ClassParamReferencesSelf> : jet.Any { + final /*constructor*/ fun >(): test.ClassParamReferencesSelf> +} +abstract trait test.TraitWithP : jet.Any { +}