From b379ab3ebd82ee73d58893ec507639290760c629 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Sun, 22 Sep 2013 21:22:59 +0400 Subject: [PATCH] Resolve annotations on expressions and multi-declarations --- .../jet/lang/resolve/AnnotationResolver.java | 17 +++++++++++++++++ .../BasicExpressionTypingVisitor.java | 10 ++++++---- .../ExpressionTypingVisitorForStatements.java | 3 +++ .../tests/annotations/onExpression.kt | 3 +++ .../tests/annotations/onMultiDeclaration.kt | 7 +++++++ .../checkers/JetDiagnosticsTestGenerated.java | 10 ++++++++++ 6 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/annotations/onExpression.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/onMultiDeclaration.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java index d7040baab7b..dad93e92178 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java @@ -80,6 +80,15 @@ public class AnnotationResolver { return resolveAnnotations(scope, modifierList, trace, true); } + @NotNull + public List resolveAnnotationsWithArguments( + @NotNull JetScope scope, + @NotNull List annotationEntries, + @NotNull BindingTrace trace + ) { + return resolveAnnotationEntries(scope, annotationEntries, trace, true); + } + private List resolveAnnotations( @NotNull JetScope scope, @Nullable JetModifierList modifierList, @@ -91,6 +100,14 @@ public class AnnotationResolver { } List annotationEntryElements = modifierList.getAnnotationEntries(); + return resolveAnnotationEntries(scope, annotationEntryElements, trace, shouldResolveArguments); + } + + private List resolveAnnotationEntries( + @NotNull JetScope scope, + @NotNull List annotationEntryElements, @NotNull BindingTrace trace, + boolean shouldResolveArguments + ) { if (annotationEntryElements.isEmpty()) return Collections.emptyList(); List result = Lists.newArrayList(); for (JetAnnotationEntry entryElement : annotationEntryElements) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index d47adce15a7..6ab0aebef06 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -45,7 +45,6 @@ import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResults; import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsImpl; import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsUtil; import org.jetbrains.jet.lang.resolve.calls.util.CallMaker; -import org.jetbrains.jet.lang.resolve.calls.util.ExpressionAsFunctionDescriptor; import org.jetbrains.jet.lang.resolve.constants.*; import org.jetbrains.jet.lang.resolve.constants.StringValue; import org.jetbrains.jet.lang.resolve.name.LabelName; @@ -1169,12 +1168,15 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { } @Override - public JetTypeInfo visitAnnotatedExpression(JetAnnotatedExpression expression, ExpressionTypingContext data) { + public JetTypeInfo visitAnnotatedExpression(JetAnnotatedExpression expression, ExpressionTypingContext context) { + context.expressionTypingServices.getAnnotationResolver().resolveAnnotationsWithArguments( + context.scope, expression.getAttributes(), context.trace); + JetExpression baseExpression = expression.getBaseExpression(); if (baseExpression == null) { - return JetTypeInfo.create(null, data.dataFlowInfo); + return JetTypeInfo.create(null, context.dataFlowInfo); } - return facade.getTypeInfo(baseExpression, data); + return facade.getTypeInfo(baseExpression, context); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java index 4fe15b8824c..fe4ed3aa5be 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java @@ -145,6 +145,9 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito @Override public JetTypeInfo visitMultiDeclaration(JetMultiDeclaration multiDeclaration, ExpressionTypingContext context) { + context.expressionTypingServices.getAnnotationResolver().resolveAnnotationsWithArguments( + scope, multiDeclaration.getModifierList(), context.trace); + JetExpression initializer = multiDeclaration.getInitializer(); if (initializer == null) { context.trace.report(INITIALIZER_REQUIRED_FOR_MULTIDECLARATION.on(multiDeclaration)); diff --git a/compiler/testData/diagnostics/tests/annotations/onExpression.kt b/compiler/testData/diagnostics/tests/annotations/onExpression.kt new file mode 100644 index 00000000000..219e434aeb4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/onExpression.kt @@ -0,0 +1,3 @@ +fun foo() = [ann] 1 + +annotation class ann \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/onMultiDeclaration.kt b/compiler/testData/diagnostics/tests/annotations/onMultiDeclaration.kt new file mode 100644 index 00000000000..5a3b10cc898 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/onMultiDeclaration.kt @@ -0,0 +1,7 @@ +fun test(): Any? { + [ann] val (a, b) = P(1, 1) + return a + b +} + +annotation class ann +data class P(val a: Int, val b: Int) \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index eb94bac8917..d5b7ded5faf 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -610,6 +610,16 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/annotations/NonAnnotationClass.kt"); } + @TestMetadata("onExpression.kt") + public void testOnExpression() throws Exception { + doTest("compiler/testData/diagnostics/tests/annotations/onExpression.kt"); + } + + @TestMetadata("onMultiDeclaration.kt") + public void testOnMultiDeclaration() throws Exception { + doTest("compiler/testData/diagnostics/tests/annotations/onMultiDeclaration.kt"); + } + } @TestMetadata("compiler/testData/diagnostics/tests/backingField")