Additional Resolve: Use descriptor of constructor instead of class when resolving primary constructor annotations

#KT-6099
This commit is contained in:
Alexey Sedunov
2014-10-27 16:23:22 +03:00
parent d0f6f03380
commit a2930a581f
2 changed files with 22 additions and 5 deletions
+5 -2
View File
@@ -1,9 +1,10 @@
package rendererTest
annotation class TheAnnotation
annotation class AnotherAnnotation
[TheAnnotation]
public open class TheClass<out T : Int, X> {
public open class TheClass<out T : Int, X> [AnotherAnnotation] () {
private val privateVal: Int = 5
val shouldBeFinal: Int = 5
@@ -31,8 +32,10 @@ public trait TwoUpperBounds<T> where T : Number, T : Any
//package rendererTest
//internal final annotation class TheAnnotation : kotlin.Annotation defined in rendererTest
//public constructor TheAnnotation() defined in rendererTest.TheAnnotation
//internal final annotation class AnotherAnnotation : kotlin.Annotation defined in rendererTest
//public constructor AnotherAnnotation() defined in rendererTest.AnotherAnnotation
//rendererTest.TheAnnotation public open class TheClass<out T : kotlin.Int, X> defined in rendererTest
//public constructor TheClass<out T : kotlin.Int, X>() defined in rendererTest.TheClass
//rendererTest.AnotherAnnotation public constructor TheClass<out T : kotlin.Int, X>() defined in rendererTest.TheClass
//<out T : kotlin.Int> defined in rendererTest.TheClass
//<X> defined in rendererTest.TheClass
//private final val privateVal: kotlin.Int defined in rendererTest.TheClass
@@ -234,10 +234,10 @@ public abstract class ElementResolver {
private static void annotationAdditionalResolve(ResolveSession resolveSession, JetAnnotationEntry jetAnnotationEntry) {
Annotations annotations = null;
JetDeclaration declaration = PsiTreeUtil.getParentOfType(jetAnnotationEntry, JetDeclaration.class);
JetModifierList modifierList = PsiTreeUtil.getParentOfType(jetAnnotationEntry, JetModifierList.class);
JetDeclaration declaration = PsiTreeUtil.getParentOfType(modifierList, JetDeclaration.class);
if (declaration != null) {
Annotated descriptor = resolveSession.resolveToDescriptor(declaration);
annotations = descriptor.getAnnotations();
annotations = getAnnotationsByDeclaration(resolveSession, modifierList, declaration);
}
else {
JetFileAnnotationList fileAnnotationList = PsiTreeUtil.getParentOfType(jetAnnotationEntry, JetFileAnnotationList.class);
@@ -252,6 +252,20 @@ public abstract class ElementResolver {
}
}
private static Annotations getAnnotationsByDeclaration(
ResolveSession resolveSession,
JetModifierList modifierList,
JetDeclaration declaration
) {
Annotations annotations;Annotated descriptor = resolveSession.resolveToDescriptor(declaration);
if (declaration instanceof JetClass && modifierList == ((JetClass) declaration).getPrimaryConstructorModifierList()) {
descriptor = ((ClassDescriptor)descriptor).getUnsubstitutedPrimaryConstructor();
assert descriptor != null : "No constructor found: " + declaration.getText();
}
annotations = descriptor.getAnnotations();
return annotations;
}
private static void typeParameterAdditionalResolve(KotlinCodeAnalyzer analyzer, JetTypeParameter typeParameter) {
DeclarationDescriptor descriptor = analyzer.resolveToDescriptor(typeParameter);
assert descriptor instanceof LazyEntity;