Frontend: added the support file annotations to LazyTopDownAnalyzer.

This commit is contained in:
Zalim Bashorov
2014-09-09 15:53:43 +04:00
parent 6d0bcf8b32
commit 48de3b706d
12 changed files with 113 additions and 27 deletions
@@ -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<JetAnnotationEntry> 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);
@@ -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<JetFile, JetScope> file2scope = UtilsPackage.keysToMap(c.getFiles(), new Function1<JetFile, JetScope>() {
@Override
public JetScope invoke(JetFile file) {
return scopeProvider.getFileScope(file);
}
});
resolveAnnotationsOnFiles(file2scope);
}
private void resolveAnnotationsOnFiles(@NotNull Map<JetFile, ? extends JetScope> file2scope) {
for (Map.Entry<JetFile, ? extends JetScope> entry : file2scope.entrySet()) {
JetFile file = entry.getKey();
@@ -263,6 +263,8 @@ public class LazyTopDownAnalyzer {
resolveImportsInAllFiles(c, resolveSession);
declarationResolver.resolveAnnotationsOnFiles(c, resolveSession.getScopeProvider());
overloadResolver.process(c);
bodyResolver.resolveBodies(c);
@@ -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<JetScript, LazyScriptDescriptor> scriptDescriptors;
private final MemoizedFunctionToNotNull<JetFile, LazyAnnotations> annotations;
private ScopeProvider scopeProvider;
private JetImportsFactory jetImportFactory;
@@ -164,6 +165,15 @@ public class ResolveSession implements KotlinCodeAnalyzer {
}
}
);
annotations = storageManager.createMemoizedFunction(new Function1<JetFile, LazyAnnotations>() {
@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<LazyPackageDescriptor> getAllPackages() {
LazyPackageDescriptor rootPackage = getPackageFragment(FqName.ROOT);
@@ -184,7 +184,7 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
DataFlowInfo.EMPTY
);
result.add(propertyDescriptor);
AnnotationResolver.resolveAnnotationsArguments(propertyDescriptor, trace);
AnnotationResolver.resolveAnnotationsArguments(propertyDescriptor.getAnnotations(), trace);
}
getNonDeclaredProperties(name, result);
@@ -40,6 +40,13 @@ abstract class LazyAnnotationsContext(
abstract val scope: JetScope
}
class LazyAnnotationsContextImpl(
annotationResolver: AnnotationResolver,
storageManager: StorageManager,
trace: BindingTrace,
override val scope: JetScope
) : LazyAnnotationsContext(annotationResolver, storageManager, trace)
public class LazyAnnotations(
val c: LazyAnnotationsContext,
val annotationEntries: List<JetAnnotationEntry>
@@ -133,4 +140,4 @@ public class LazyAnnotationDescriptor(
ForceResolveUtil.forceResolveAllContents(getType())
getAllValueArguments()
}
}
}
@@ -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);
}
}
+22
View File
@@ -0,0 +1,22 @@
[file: kotlin.deprecated("message")]
[file: suppress(<error>BAR</error>)]
[file: suppress(BAZ)]
[<error>k</error>otlin.deprecated("message")]
[<error>s</error>uppress(<error>BAR</error>)]
[<error>s</error>uppress(BAZ)]
[file: myAnnotation(1, "string")]
[file: boo.myAnnotation(1, <error>BAR</error>)]
[file: myAnnotation(N, BAZ)]
[<error>m</error>yAnnotation(1, "string")]
[<error>b</error>oo.myAnnotation(1, "string")]
[<error>m</error>yAnnotation(N, BAZ)]
package boo
val BAZ = "baz"
val N = 0
annotation class myAnnotation(val i: Int, val s: String)
@@ -0,0 +1,5 @@
[file: kotlin.<caret>deprecated("message")]
package foo
// REF: (kotlin).deprecated
@@ -0,0 +1,7 @@
[file: <caret>D("message")]
package foo
import kotlin.deprecated as D
// REF: (kotlin).deprecated
@@ -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");
@@ -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");