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()
}
}
}