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.setDescriptorResolver(descriptorResolver);
this.typeResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver); this.typeResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver);
annotationResolver.setCallResolver(callResolver); this.annotationResolver.setCallResolver(callResolver);
annotationResolver.setExpressionTypingServices(expressionTypingServices); this.annotationResolver.setExpressionTypingServices(expressionTypingServices);
callResolver.setDescriptorResolver(descriptorResolver); callResolver.setDescriptorResolver(descriptorResolver);
callResolver.setExpressionTypingServices(expressionTypingServices); callResolver.setExpressionTypingServices(expressionTypingServices);
@@ -109,4 +109,8 @@ public class InjectorForLazyResolve {
return this.scopeProvider; return this.scopeProvider;
} }
public AnnotationResolver getAnnotationResolver() {
return this.annotationResolver;
}
} }
@@ -41,7 +41,7 @@ public abstract class AbstractPsiBasedDeclarationProvider implements Declaration
private boolean indexCreated = false; private boolean indexCreated = false;
private void createIndex() { protected final void createIndex() {
if (indexCreated) return; if (indexCreated) return;
indexCreated = true; indexCreated = true;
@@ -17,6 +17,8 @@
package org.jetbrains.jet.lang.resolve.lazy; package org.jetbrains.jet.lang.resolve.lazy;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.JetClassObject;
import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetClassOrObject;
/** /**
@@ -25,4 +27,7 @@ import org.jetbrains.jet.lang.psi.JetClassOrObject;
public interface ClassMemberDeclarationProvider extends DeclarationProvider { public interface ClassMemberDeclarationProvider extends DeclarationProvider {
@NotNull @NotNull
JetClassOrObject getOwnerClassOrObject(); 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.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.psi.*; 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.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.*; import org.jetbrains.jet.lang.resolve.scopes.*;
@@ -47,6 +48,9 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
private final ClassKind kind; private final ClassKind kind;
private ClassReceiver implicitReceiver; private ClassReceiver implicitReceiver;
private List<AnnotationDescriptor> annotations;
private ClassDescriptor classObjectDescriptor;
private boolean classObjectDescriptorResolved = false;
private final LazyClassMemberScope unsubstitutedMemberScope; private final LazyClassMemberScope unsubstitutedMemberScope;
private final JetScope unsubstitutedInnerClassesScope; private final JetScope unsubstitutedInnerClassesScope;
@@ -162,17 +166,31 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
@Override @Override
public JetType getClassObjectType() { public JetType getClassObjectType() {
throw new UnsupportedOperationException(); // TODO ClassDescriptor classObjectDescriptor = getClassObjectDescriptor();
return classObjectDescriptor == null ? null : classObjectDescriptor.getDefaultType();
} }
@Override @Override
public boolean isClassObjectAValue() { public boolean isClassObjectAValue() {
throw new UnsupportedOperationException(); // TODO return true;
} }
@Override @Override
public ClassDescriptor getClassObjectDescriptor() { 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 @NotNull
@@ -204,7 +222,19 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
@Override @Override
public List<AnnotationDescriptor> getAnnotations() { 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 @NotNull
@@ -17,6 +17,7 @@
package org.jetbrains.jet.lang.resolve.lazy; package org.jetbrains.jet.lang.resolve.lazy;
import org.jetbrains.annotations.NotNull; 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.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.resolve.name.Name; 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 { public class PsiBasedClassMemberDeclarationProvider extends AbstractPsiBasedDeclarationProvider implements ClassMemberDeclarationProvider {
private final JetClassOrObject classOrObject; private final JetClassOrObject classOrObject;
private JetClassObject jetClassObject;
public PsiBasedClassMemberDeclarationProvider(@NotNull JetClassOrObject classOrObject) { public PsiBasedClassMemberDeclarationProvider(@NotNull JetClassOrObject classOrObject) {
this.classOrObject = classOrObject; this.classOrObject = classOrObject;
@@ -41,10 +43,21 @@ public class PsiBasedClassMemberDeclarationProvider extends AbstractPsiBasedDecl
@Override @Override
protected void doCreateIndex() { protected void doCreateIndex() {
for (JetDeclaration declaration : classOrObject.getDeclarations()) { 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 @Override
public boolean isPackageDeclared(@NotNull Name name) { public boolean isPackageDeclared(@NotNull Name name) {
throw new UnsupportedOperationException("Shouldn't be called on a ClassMemberDeclarationProvider"); 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.BindingTrace;
import org.jetbrains.jet.lang.resolve.BindingTraceContext; import org.jetbrains.jet.lang.resolve.BindingTraceContext;
import org.jetbrains.jet.lang.resolve.name.FqName; 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.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
@@ -60,7 +61,7 @@ public class ResolveSession {
this.module = rootDescriptor; this.module = rootDescriptor;
DeclarationProvider provider = declarationProviderFactory.getPackageMemberDeclarationProvider(FqName.ROOT); DeclarationProvider provider = declarationProviderFactory.getPackageMemberDeclarationProvider(FqName.ROOT);
assert provider != null : "No declaration provider for root package in " + rootDescriptor; 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); rootDescriptor.setRootNs(rootPackage);
this.declarationProviderFactory = declarationProviderFactory; this.declarationProviderFactory = declarationProviderFactory;
@@ -61,6 +61,7 @@ public class AllInjectorsGenerator {
generator.addPublicField(ExpressionTypingServices.class); generator.addPublicField(ExpressionTypingServices.class);
generator.addPublicField(TypeResolver.class); generator.addPublicField(TypeResolver.class);
generator.addPublicField(ScopeProvider.class); generator.addPublicField(ScopeProvider.class);
generator.addPublicField(AnnotationResolver.class);
generator.generate("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForLazyResolve"); generator.generate("compiler/frontend/src", "org.jetbrains.jet.di", "InjectorForLazyResolve");
} }