Resolve enum in annotation arguments
This commit is contained in:
@@ -24,12 +24,14 @@ import org.jetbrains.jet.lang.descriptors.annotations.Annotated;
|
|||||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||||
import org.jetbrains.jet.lang.diagnostics.Errors;
|
import org.jetbrains.jet.lang.diagnostics.Errors;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
|
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.util.CallMaker;
|
import org.jetbrains.jet.lang.resolve.calls.util.CallMaker;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
|
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResults;
|
import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResults;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument;
|
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
|
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
|
||||||
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
|
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
|
||||||
|
import org.jetbrains.jet.lang.resolve.constants.EnumValue;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue;
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue;
|
||||||
import org.jetbrains.jet.lang.types.ErrorUtils;
|
import org.jetbrains.jet.lang.types.ErrorUtils;
|
||||||
@@ -227,6 +229,31 @@ public class AnnotationResolver {
|
|||||||
return trace.get(BindingContext.COMPILE_TIME_VALUE, expression);
|
return trace.get(BindingContext.COMPILE_TIME_VALUE, expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CompileTimeConstant<?> visitSimpleNameExpression(JetSimpleNameExpression expression, Void data) {
|
||||||
|
ResolvedCall<? extends CallableDescriptor> resolvedCall =
|
||||||
|
trace.getBindingContext().get(BindingContext.RESOLVED_CALL, expression);
|
||||||
|
if (resolvedCall != null) {
|
||||||
|
CallableDescriptor callableDescriptor = resolvedCall.getResultingDescriptor();
|
||||||
|
if (callableDescriptor instanceof PropertyDescriptor) {
|
||||||
|
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) callableDescriptor;
|
||||||
|
if (isEnumProperty(propertyDescriptor)) {
|
||||||
|
return new EnumValue(propertyDescriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CompileTimeConstant<?> visitQualifiedExpression(JetQualifiedExpression expression, Void data) {
|
||||||
|
JetExpression selectorExpression = expression.getSelectorExpression();
|
||||||
|
if (selectorExpression != null) {
|
||||||
|
return selectorExpression.accept(this, null);
|
||||||
|
}
|
||||||
|
return super.visitQualifiedExpression(expression, data);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompileTimeConstant<?> visitJetElement(JetElement element, Void nothing) {
|
public CompileTimeConstant<?> visitJetElement(JetElement element, Void nothing) {
|
||||||
// TODO:
|
// TODO:
|
||||||
@@ -237,6 +264,16 @@ public class AnnotationResolver {
|
|||||||
return expression.accept(visitor, null);
|
return expression.accept(visitor, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isEnumProperty(@NotNull PropertyDescriptor descriptor) {
|
||||||
|
if (DescriptorUtils.isKindOf(descriptor.getType(), ClassKind.ENUM_CLASS)) {
|
||||||
|
DeclarationDescriptor enumClassObject = descriptor.getContainingDeclaration();
|
||||||
|
if (DescriptorUtils.isKindOf(enumClassObject, ClassKind.CLASS_OBJECT)) {
|
||||||
|
return DescriptorUtils.isKindOf(enumClassObject.getContainingDeclaration(), ClassKind.ENUM_CLASS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public List<AnnotationDescriptor> getResolvedAnnotations(@Nullable JetModifierList modifierList, BindingTrace trace) {
|
public List<AnnotationDescriptor> getResolvedAnnotations(@Nullable JetModifierList modifierList, BindingTrace trace) {
|
||||||
if (modifierList == null) {
|
if (modifierList == null) {
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package test
|
package test
|
||||||
|
|
||||||
|
import test.MyEnum.*
|
||||||
|
|
||||||
ANNOTATION class MyClass [ANNOTATION]([ANNOTATION] param: Int, [ANNOTATION] val consProp: Int) {
|
ANNOTATION class MyClass [ANNOTATION]([ANNOTATION] param: Int, [ANNOTATION] val consProp: Int) {
|
||||||
ANNOTATION class object {
|
ANNOTATION class object {
|
||||||
}
|
}
|
||||||
@@ -36,4 +38,9 @@ val funLiteral = {([ANNOTATION] a: Int) -> a }
|
|||||||
|
|
||||||
|
|
||||||
annotation class AnnString(a: String)
|
annotation class AnnString(a: String)
|
||||||
annotation class AnnInt(a: Int)
|
annotation class AnnInt(a: Int)
|
||||||
|
annotation class AnnEnum(a: MyEnum)
|
||||||
|
|
||||||
|
enum class MyEnum {
|
||||||
|
A
|
||||||
|
}
|
||||||
+18
@@ -63,6 +63,24 @@ public class AnnotationDescriptorResolveTest extends JetLiteFixture {
|
|||||||
doTest(content, expectedAnnotation);
|
doTest(content, expectedAnnotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testEnumAnnotation() throws IOException {
|
||||||
|
String content = getContent("AnnEnum(MyEnum.A)");
|
||||||
|
String expectedAnnotation = "AnnEnum[a = MyEnum.A]";
|
||||||
|
doTest(content, expectedAnnotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testQualifiedEnumAnnotation() throws IOException {
|
||||||
|
String content = getContent("AnnEnum(test.MyEnum.A)");
|
||||||
|
String expectedAnnotation = "AnnEnum[a = MyEnum.A]";
|
||||||
|
doTest(content, expectedAnnotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testUnqualifiedEnumAnnotation() throws IOException {
|
||||||
|
String content = getContent("AnnEnum(A)");
|
||||||
|
String expectedAnnotation = "AnnEnum[a = MyEnum.A]";
|
||||||
|
doTest(content, expectedAnnotation);
|
||||||
|
}
|
||||||
|
|
||||||
private void doTest(@NotNull String content, @NotNull String expectedAnnotation) {
|
private void doTest(@NotNull String content, @NotNull String expectedAnnotation) {
|
||||||
NamespaceDescriptor test = getNamespaceDescriptor(content);
|
NamespaceDescriptor test = getNamespaceDescriptor(content);
|
||||||
ClassDescriptor myClass = getClassDescriptor(test, "MyClass");
|
ClassDescriptor myClass = getClassDescriptor(test, "MyClass");
|
||||||
|
|||||||
Reference in New Issue
Block a user