Annotations on classes and class objects supported

This commit is contained in:
Andrey Breslav
2012-06-05 15:14:23 +04:00
parent c57eb23e25
commit 3bf7c37c77
7 changed files with 63 additions and 9 deletions
@@ -79,8 +79,8 @@ public class InjectorForLazyResolve {
this.typeResolver.setDescriptorResolver(descriptorResolver);
this.typeResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver);
annotationResolver.setCallResolver(callResolver);
annotationResolver.setExpressionTypingServices(expressionTypingServices);
this.annotationResolver.setCallResolver(callResolver);
this.annotationResolver.setExpressionTypingServices(expressionTypingServices);
callResolver.setDescriptorResolver(descriptorResolver);
callResolver.setExpressionTypingServices(expressionTypingServices);
@@ -109,4 +109,8 @@ public class InjectorForLazyResolve {
return this.scopeProvider;
}
public AnnotationResolver getAnnotationResolver() {
return this.annotationResolver;
}
}
@@ -41,7 +41,7 @@ public abstract class AbstractPsiBasedDeclarationProvider implements Declaration
private boolean indexCreated = false;
private void createIndex() {
protected final void createIndex() {
if (indexCreated) return;
indexCreated = true;
@@ -17,6 +17,8 @@
package org.jetbrains.jet.lang.resolve.lazy;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.JetClassObject;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
/**
@@ -25,4 +27,7 @@ import org.jetbrains.jet.lang.psi.JetClassOrObject;
public interface ClassMemberDeclarationProvider extends DeclarationProvider {
@NotNull
JetClassOrObject getOwnerClassOrObject();
@Nullable
JetClassObject getClassObject();
}
@@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.*;
@@ -47,6 +48,9 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
private final ClassKind kind;
private ClassReceiver implicitReceiver;
private List<AnnotationDescriptor> annotations;
private ClassDescriptor classObjectDescriptor;
private boolean classObjectDescriptorResolved = false;
private final LazyClassMemberScope unsubstitutedMemberScope;
private final JetScope unsubstitutedInnerClassesScope;
@@ -162,17 +166,31 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
@Override
public JetType getClassObjectType() {
throw new UnsupportedOperationException(); // TODO
ClassDescriptor classObjectDescriptor = getClassObjectDescriptor();
return classObjectDescriptor == null ? null : classObjectDescriptor.getDefaultType();
}
@Override
public boolean isClassObjectAValue() {
throw new UnsupportedOperationException(); // TODO
return true;
}
@Override
public ClassDescriptor getClassObjectDescriptor() {
throw new UnsupportedOperationException(); // TODO
if (!classObjectDescriptorResolved) {
JetClassObject classObject = declarationProvider.getClassObject();
if (classObject != null) {
JetObjectDeclaration objectDeclaration = classObject.getObjectDeclaration();
if (objectDeclaration != null) {
ClassMemberDeclarationProvider classMemberDeclarationProvider = resolveSession.getDeclarationProviderFactory()
.getClassMemberDeclarationProvider(objectDeclaration);
classObjectDescriptor = new LazyClassDescriptor(resolveSession, this, Name.special("<class object>"),
classMemberDeclarationProvider);
}
}
classObjectDescriptorResolved = true;
}
return classObjectDescriptor;
}
@NotNull
@@ -204,7 +222,19 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
@Override
public List<AnnotationDescriptor> getAnnotations() {
throw new UnsupportedOperationException(); // TODO
if (annotations == null) {
JetClassOrObject classOrObject = declarationProvider.getOwnerClassOrObject();
JetModifierList modifierList = classOrObject.getModifierList();
if (modifierList != null) {
AnnotationResolver annotationResolver = resolveSession.getInjector().getAnnotationResolver();
annotations = annotationResolver
.resolveAnnotations(resolveSession.getResolutionScope(classOrObject), modifierList, resolveSession.getTrace());
}
else {
annotations = Collections.emptyList();
}
}
return annotations;
}
@NotNull
@@ -17,6 +17,7 @@
package org.jetbrains.jet.lang.resolve.lazy;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetClassObject;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -27,6 +28,7 @@ import org.jetbrains.jet.lang.resolve.name.Name;
public class PsiBasedClassMemberDeclarationProvider extends AbstractPsiBasedDeclarationProvider implements ClassMemberDeclarationProvider {
private final JetClassOrObject classOrObject;
private JetClassObject jetClassObject;
public PsiBasedClassMemberDeclarationProvider(@NotNull JetClassOrObject classOrObject) {
this.classOrObject = classOrObject;
@@ -41,10 +43,21 @@ public class PsiBasedClassMemberDeclarationProvider extends AbstractPsiBasedDecl
@Override
protected void doCreateIndex() {
for (JetDeclaration declaration : classOrObject.getDeclarations()) {
putToIndex(declaration);
if (declaration instanceof JetClassObject) {
jetClassObject = (JetClassObject) declaration;
}
else {
putToIndex(declaration);
}
}
}
@Override
public JetClassObject getClassObject() {
createIndex();
return jetClassObject;
}
@Override
public boolean isPackageDeclared(@NotNull Name name) {
throw new UnsupportedOperationException("Shouldn't be called on a ClassMemberDeclarationProvider");
@@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
@@ -60,7 +61,7 @@ public class ResolveSession {
this.module = rootDescriptor;
DeclarationProvider provider = declarationProviderFactory.getPackageMemberDeclarationProvider(FqName.ROOT);
assert provider != null : "No declaration provider for root package in " + rootDescriptor;
this.rootPackage = new LazyPackageDescriptor(rootDescriptor, JetPsiUtil.ROOT_NAMESPACE_NAME, this, provider);
this.rootPackage = new LazyPackageDescriptor(rootDescriptor, FqNameUnsafe.ROOT_NAME, this, provider);
rootDescriptor.setRootNs(rootPackage);
this.declarationProviderFactory = declarationProviderFactory;
@@ -61,6 +61,7 @@ public class AllInjectorsGenerator {
generator.addPublicField(ExpressionTypingServices.class);
generator.addPublicField(TypeResolver.class);
generator.addPublicField(ScopeProvider.class);
generator.addPublicField(AnnotationResolver.class);
generator.generate("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForLazyResolve");
}