Annotations on classes and class objects supported
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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;
|
||||||
|
|
||||||
|
|||||||
+5
@@ -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
|
||||||
|
|||||||
+14
-1
@@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user