From 48de3b706d68604ebfc1f9cb98a7f7b96ad42db9 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Tue, 9 Sep 2014 15:53:43 +0400 Subject: [PATCH] Frontend: added the support file annotations to LazyTopDownAnalyzer. --- .../jet/lang/resolve/AnnotationResolver.java | 21 +++++------------- .../jet/lang/resolve/DeclarationResolver.java | 13 +++++++++++ .../jet/lang/resolve/LazyTopDownAnalyzer.java | 2 ++ .../jet/lang/resolve/lazy/ResolveSession.java | 21 +++++++++++++++--- .../descriptors/AbstractLazyMemberScope.java | 2 +- .../lazy/descriptors/LazyAnnotations.kt | 9 +++++++- .../lang/resolve/lazy/ElementResolver.java | 20 ++++++++++++----- idea/testData/checker/AnnotationOnFile.kt | 22 +++++++++++++++++++ .../resolve/references/AnnotationOnFile.kt | 5 +++++ .../references/AnnotationOnFileWithImport.kt | 7 ++++++ .../checkers/JetPsiCheckerTestGenerated.java | 6 +++++ .../ReferenceResolveTestGenerated.java | 12 ++++++++++ 12 files changed, 113 insertions(+), 27 deletions(-) create mode 100644 idea/testData/checker/AnnotationOnFile.kt create mode 100644 idea/testData/resolve/references/AnnotationOnFile.kt create mode 100644 idea/testData/resolve/references/AnnotationOnFileWithImport.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 e9c06c8089b..6183892a2bf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java @@ -23,7 +23,6 @@ import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.descriptors.annotations.Annotated; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.Annotations; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationsImpl; @@ -42,7 +41,7 @@ import org.jetbrains.jet.lang.resolve.constants.ArrayValue; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.constants.IntegerValueTypeConstant; import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyAnnotationDescriptor; -import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyAnnotationsContext; +import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyAnnotationsContextImpl; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.jet.lang.types.ErrorUtils; @@ -123,7 +122,7 @@ public class AnnotationResolver { } private Annotations resolveAnnotationEntries( - @NotNull final JetScope scope, + @NotNull JetScope scope, @NotNull List annotationEntryElements, @NotNull BindingTrace trace, boolean shouldResolveArguments @@ -133,17 +132,7 @@ public class AnnotationResolver { for (JetAnnotationEntry entryElement : annotationEntryElements) { AnnotationDescriptor descriptor = trace.get(BindingContext.ANNOTATION, entryElement); if (descriptor == null) { - descriptor = new LazyAnnotationDescriptor( - new LazyAnnotationsContext(this, storageManager, trace) { - - @NotNull - @Override - public JetScope getScope() { - return scope; - } - }, - entryElement - ); + descriptor = new LazyAnnotationDescriptor(new LazyAnnotationsContextImpl(this, storageManager, trace, scope), entryElement); } if (shouldResolveArguments) { resolveAnnotationArguments(entryElement, trace); @@ -210,8 +199,8 @@ public class AnnotationResolver { } } - public static void resolveAnnotationsArguments(@NotNull Annotated descriptor, @NotNull BindingTrace trace) { - for (AnnotationDescriptor annotationDescriptor : descriptor.getAnnotations()) { + public static void resolveAnnotationsArguments(@NotNull Annotations annotations, @NotNull BindingTrace trace) { + for (AnnotationDescriptor annotationDescriptor : annotations) { JetAnnotationEntry annotationEntry = trace.getBindingContext().get(ANNOTATION_DESCRIPTOR_TO_PSI_ELEMENT, annotationDescriptor); assert annotationEntry != null : "Cannot find annotation entry: " + annotationDescriptor; resolveAnnotationArguments(annotationEntry, trace); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java index 16046584cc0..69074168de7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -34,6 +34,7 @@ import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.calls.CallsPackage; import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer; +import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider; import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyPackageDescriptor; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; @@ -41,6 +42,7 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.renderer.DescriptorRenderer; +import org.jetbrains.jet.utils.UtilsPackage; import javax.inject.Inject; import java.util.*; @@ -97,6 +99,17 @@ public class DeclarationResolver { checkRedeclarationsInInnerClassNames(c); } + public void resolveAnnotationsOnFiles(@NotNull TopDownAnalysisContext c, @NotNull final ScopeProvider scopeProvider) { + Map file2scope = UtilsPackage.keysToMap(c.getFiles(), new Function1() { + @Override + public JetScope invoke(JetFile file) { + return scopeProvider.getFileScope(file); + } + }); + + resolveAnnotationsOnFiles(file2scope); + } + private void resolveAnnotationsOnFiles(@NotNull Map file2scope) { for (Map.Entry entry : file2scope.entrySet()) { JetFile file = entry.getKey(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/LazyTopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/LazyTopDownAnalyzer.java index d2994aee66f..f46f5c84b26 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/LazyTopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/LazyTopDownAnalyzer.java @@ -263,6 +263,8 @@ public class LazyTopDownAnalyzer { resolveImportsInAllFiles(c, resolveSession); + declarationResolver.resolveAnnotationsOnFiles(c, resolveSession.getScopeProvider()); + overloadResolver.process(c); bodyResolver.resolveBodies(c); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java index 824b3ba99c8..385bdaf6991 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSession.java @@ -28,6 +28,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.ReadOnly; import org.jetbrains.jet.context.GlobalContext; import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.descriptors.annotations.Annotations; import org.jetbrains.jet.lang.descriptors.impl.ModuleDescriptorImpl; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.*; @@ -35,9 +36,7 @@ import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo; import org.jetbrains.jet.lang.resolve.lazy.data.JetScriptInfo; import org.jetbrains.jet.lang.resolve.lazy.declarations.DeclarationProviderFactory; import org.jetbrains.jet.lang.resolve.lazy.declarations.PackageMemberDeclarationProvider; -import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyClassDescriptor; -import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyPackageDescriptor; -import org.jetbrains.jet.lang.resolve.lazy.descriptors.LazyScriptDescriptor; +import org.jetbrains.jet.lang.resolve.lazy.descriptors.*; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; @@ -63,6 +62,8 @@ public class ResolveSession implements KotlinCodeAnalyzer { private final MemoizedFunctionToNotNull scriptDescriptors; + private final MemoizedFunctionToNotNull annotations; + private ScopeProvider scopeProvider; private JetImportsFactory jetImportFactory; @@ -164,6 +165,15 @@ public class ResolveSession implements KotlinCodeAnalyzer { } } ); + + annotations = storageManager.createMemoizedFunction(new Function1() { + @Override + public LazyAnnotations invoke(JetFile file) { + JetScope scope = getScopeProvider().getFileScope(file); + LazyAnnotationsContextImpl lazyAnnotationContext = new LazyAnnotationsContextImpl(annotationResolve, storageManager, trace, scope); + return new LazyAnnotations(lazyAnnotationContext, file.getAnnotationEntries()); + } + }); } @NotNull @@ -420,6 +430,11 @@ public class ResolveSession implements KotlinCodeAnalyzer { return result; } + @NotNull + public Annotations getFileAnnotations(@NotNull JetFile file) { + return annotations.invoke(file); + } + @NotNull private List getAllPackages() { LazyPackageDescriptor rootPackage = getPackageFragment(FqName.ROOT); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java index 3a97aba8f92..660657d5013 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java @@ -184,7 +184,7 @@ public abstract class AbstractLazyMemberScope @@ -133,4 +140,4 @@ public class LazyAnnotationDescriptor( ForceResolveUtil.forceResolveAllContents(getType()) getAllValueArguments() } -} \ No newline at end of file +} diff --git a/idea/ide-lazy-resolve/src/org/jetbrains/jet/lang/resolve/lazy/ElementResolver.java b/idea/ide-lazy-resolve/src/org/jetbrains/jet/lang/resolve/lazy/ElementResolver.java index 56d500ad462..784b23cc1d7 100644 --- a/idea/ide-lazy-resolve/src/org/jetbrains/jet/lang/resolve/lazy/ElementResolver.java +++ b/idea/ide-lazy-resolve/src/org/jetbrains/jet/lang/resolve/lazy/ElementResolver.java @@ -28,6 +28,7 @@ import org.jetbrains.jet.di.InjectorForBodyResolve; import org.jetbrains.jet.lang.cfg.JetFlowInformationProvider; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.Annotated; +import org.jetbrains.jet.lang.descriptors.annotations.Annotations; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; @@ -231,16 +232,23 @@ public class ElementResolver { } private static void annotationAdditionalResolve(ResolveSession resolveSession, JetAnnotationEntry jetAnnotationEntry) { + Annotations annotations = null; + JetDeclaration declaration = PsiTreeUtil.getParentOfType(jetAnnotationEntry, JetDeclaration.class); if (declaration != null) { Annotated descriptor = resolveSession.resolveToDescriptor(declaration); + annotations = descriptor.getAnnotations(); + } + else { + JetFileAnnotationList fileAnnotationList = PsiTreeUtil.getParentOfType(jetAnnotationEntry, JetFileAnnotationList.class); + if (fileAnnotationList != null) { + annotations = resolveSession.getFileAnnotations(fileAnnotationList.getContainingJetFile()); + } + } - AnnotationResolver.resolveAnnotationsArguments( - descriptor, - resolveSession.getTrace() - ); - - ForceResolveUtil.forceResolveAllContents(descriptor.getAnnotations()); + if (annotations != null) { + AnnotationResolver.resolveAnnotationsArguments(annotations, resolveSession.getTrace()); + ForceResolveUtil.forceResolveAllContents(annotations); } } diff --git a/idea/testData/checker/AnnotationOnFile.kt b/idea/testData/checker/AnnotationOnFile.kt new file mode 100644 index 00000000000..9668a31589e --- /dev/null +++ b/idea/testData/checker/AnnotationOnFile.kt @@ -0,0 +1,22 @@ +[file: kotlin.deprecated("message")] +[file: suppress(BAR)] +[file: suppress(BAZ)] + +[kotlin.deprecated("message")] +[suppress(BAR)] +[suppress(BAZ)] + +[file: myAnnotation(1, "string")] +[file: boo.myAnnotation(1, BAR)] +[file: myAnnotation(N, BAZ)] + +[myAnnotation(1, "string")] +[boo.myAnnotation(1, "string")] +[myAnnotation(N, BAZ)] + +package boo + +val BAZ = "baz" +val N = 0 + +annotation class myAnnotation(val i: Int, val s: String) diff --git a/idea/testData/resolve/references/AnnotationOnFile.kt b/idea/testData/resolve/references/AnnotationOnFile.kt new file mode 100644 index 00000000000..2240e810c71 --- /dev/null +++ b/idea/testData/resolve/references/AnnotationOnFile.kt @@ -0,0 +1,5 @@ +[file: kotlin.deprecated("message")] + +package foo + +// REF: (kotlin).deprecated diff --git a/idea/testData/resolve/references/AnnotationOnFileWithImport.kt b/idea/testData/resolve/references/AnnotationOnFileWithImport.kt new file mode 100644 index 00000000000..ede65b752fd --- /dev/null +++ b/idea/testData/resolve/references/AnnotationOnFileWithImport.kt @@ -0,0 +1,7 @@ +[file: D("message")] + +package foo + +import kotlin.deprecated as D + +// REF: (kotlin).deprecated diff --git a/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java index 782e6da01ae..8c8905306b3 100644 --- a/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java @@ -47,6 +47,12 @@ public class JetPsiCheckerTestGenerated extends AbstractJetPsiCheckerTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/checker"), Pattern.compile("^(.+)\\.kt$"), false); } + @TestMetadata("AnnotationOnFile.kt") + public void testAnnotationOnFile() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/checker/AnnotationOnFile.kt"); + doTest(fileName); + } + @TestMetadata("AnonymousInitializers.kt") public void testAnonymousInitializers() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/checker/AnonymousInitializers.kt"); diff --git a/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveTestGenerated.java b/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveTestGenerated.java index 5117c054f34..e7ff7408ff3 100644 --- a/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveTestGenerated.java @@ -51,6 +51,18 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest doTest(fileName); } + @TestMetadata("AnnotationOnFile.kt") + public void testAnnotationOnFile() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/AnnotationOnFile.kt"); + doTest(fileName); + } + + @TestMetadata("AnnotationOnFileWithImport.kt") + public void testAnnotationOnFileWithImport() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/AnnotationOnFileWithImport.kt"); + doTest(fileName); + } + @TestMetadata("AnnotationParameter.kt") public void testAnnotationParameter() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/references/AnnotationParameter.kt");