From a792b29a787c7d50b6e3b3d9dfb0e763e78b6cf1 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 8 Jun 2015 13:32:08 +0300 Subject: [PATCH] Exception fix: more accurate type annotation parsing #EA-69124 Fixed --- .../org/jetbrains/kotlin/resolve/AnnotationResolver.java | 9 +++++++++ .../kotlin/resolve/FunctionDescriptorResolver.kt | 4 ++++ .../src/org/jetbrains/kotlin/resolve/TypeResolver.kt | 2 +- .../ExpressionTypingVisitorForStatements.java | 1 + .../annotations/RecursivelyAnnotatedParameterType.kt | 2 ++ .../annotations/RecursivelyAnnotatedParameterType.txt | 9 +++++++++ .../kotlin/checkers/JetDiagnosticsTestGenerated.java | 6 ++++++ 7 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedParameterType.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedParameterType.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationResolver.java index 84ed9c4377f..03757caa657 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationResolver.java @@ -105,6 +105,15 @@ public class AnnotationResolver { return resolveAnnotations(scope, modifierList, trace, true); } + @NotNull + public Annotations resolveAnnotationsWithoutArguments( + @NotNull JetScope scope, + @NotNull List annotationEntries, + @NotNull BindingTrace trace + ) { + return resolveAnnotationEntries(scope, annotationEntries, trace, false); + } + @NotNull public Annotations resolveAnnotationsWithArguments( @NotNull JetScope scope, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt index e46cf911df8..1bcd3941b71 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt @@ -147,6 +147,7 @@ class FunctionDescriptorResolver( typeResolver.resolveType(innerScope, receiverTypeRef, trace, true) else expectedFunctionType.getReceiverType() + receiverType?.let { AnnotationResolver.resolveAnnotationsArguments(it.getAnnotations()) } val valueParameterDescriptors = createValueParameterDescriptors(function, functionDescriptor, innerScope, trace, expectedFunctionType) @@ -166,6 +167,9 @@ class FunctionDescriptorResolver( modality, visibility ) + for (valueParameterDescriptor in valueParameterDescriptors) { + AnnotationResolver.resolveAnnotationsArguments(valueParameterDescriptor.getType().getAnnotations()) + } } private fun createValueParameterDescriptors( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt index 9767e1221c1..3eaac56a7d4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt @@ -104,7 +104,7 @@ public class TypeResolver( private fun doResolvePossiblyBareType(c: TypeResolutionContext, typeReference: JetTypeReference): PossiblyBareType { AnnotationResolver.reportDeprecatedAnnotationSyntax(typeReference.getAnnotations(), c.trace); - val annotations = annotationResolver.resolveAnnotationsWithArguments(c.scope, typeReference.getAnnotationEntries(), c.trace) + val annotations = annotationResolver.resolveAnnotationsWithoutArguments(c.scope, typeReference.getAnnotationEntries(), c.trace) val typeElement = typeReference.getTypeElement() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java index 6dece3bb9b1..5dc79eae135 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java @@ -136,6 +136,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito VariableDescriptor propertyDescriptor = components.descriptorResolver. resolveLocalVariableDescriptor(scope, property, context.dataFlowInfo, context.trace); + AnnotationResolver.resolveAnnotationsArguments(propertyDescriptor.getType().getAnnotations()); JetExpression initializer = property.getInitializer(); JetTypeInfo typeInfo; if (initializer != null) { diff --git a/compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedParameterType.kt b/compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedParameterType.kt new file mode 100644 index 00000000000..fbe79905ad2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedParameterType.kt @@ -0,0 +1,2 @@ +// Class constructor parameter type CAN be recursively annotated +annotation class RecursivelyAnnotated(val x: @RecursivelyAnnotated(1) Int) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedParameterType.txt b/compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedParameterType.txt new file mode 100644 index 00000000000..44fdbbdefe4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedParameterType.txt @@ -0,0 +1,9 @@ +package + +internal final annotation class RecursivelyAnnotated : kotlin.Annotation { + public constructor RecursivelyAnnotated(/*0*/ x: @[RecursivelyAnnotated(x = IntegerValueType(1): IntegerValueType(1))] kotlin.Int) + internal final val x: @[RecursivelyAnnotated(x = IntegerValueType(1): IntegerValueType(1))] kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 9e929a3b12e..c06426a7096 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -861,6 +861,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("RecursivelyAnnotatedParameterType.kt") + public void testRecursivelyAnnotatedParameterType() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedParameterType.kt"); + doTest(fileName); + } + @TestMetadata("RecursivelyAnnotatedParameterWithAt.kt") public void testRecursivelyAnnotatedParameterWithAt() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedParameterWithAt.kt");