Fix rewrite for ANNOTATION slice (EA-49336)

This commit is contained in:
Nikolay Krasko
2013-09-10 18:27:25 +04:00
parent 8c53d19452
commit 08b8f56740
12 changed files with 106 additions and 19 deletions
@@ -94,12 +94,17 @@ public class AnnotationResolver {
if (annotationEntryElements.isEmpty()) return Collections.emptyList(); if (annotationEntryElements.isEmpty()) return Collections.emptyList();
List<AnnotationDescriptor> result = Lists.newArrayList(); List<AnnotationDescriptor> result = Lists.newArrayList();
for (JetAnnotationEntry entryElement : annotationEntryElements) { for (JetAnnotationEntry entryElement : annotationEntryElements) {
AnnotationDescriptor descriptor = new AnnotationDescriptor(); AnnotationDescriptor descriptor = trace.get(BindingContext.ANNOTATION, entryElement);
resolveAnnotationStub(scope, entryElement, descriptor, trace); if (descriptor == null) {
trace.record(BindingContext.ANNOTATION, entryElement, descriptor); descriptor = new AnnotationDescriptor();
resolveAnnotationStub(scope, entryElement, descriptor, trace);
trace.record(BindingContext.ANNOTATION, entryElement, descriptor);
}
if (shouldResolveArguments) { if (shouldResolveArguments) {
resolveAnnotationArguments(entryElement, scope, trace); resolveAnnotationArguments(entryElement, scope, trace);
} }
result.add(descriptor); result.add(descriptor);
} }
return result; return result;
@@ -360,15 +365,21 @@ public class AnnotationResolver {
for (JetAnnotationEntry annotation : annotations) { for (JetAnnotationEntry annotation : annotations) {
AnnotationDescriptor annotationDescriptor = trace.get(BindingContext.ANNOTATION, annotation); AnnotationDescriptor annotationDescriptor = trace.get(BindingContext.ANNOTATION, annotation);
if (annotationDescriptor == null) { if (annotationDescriptor == null) {
// TODO: Unresolved annotation throw new IllegalStateException("Annotation for annotation should have been resolved: " + annotation);
annotationDescriptor = new AnnotationDescriptor();
annotationDescriptor.setAnnotationType(ErrorUtils.createErrorType("Unresolved annotation type"));
trace.record(BindingContext.ANNOTATION, annotation, annotationDescriptor);
} }
result.add(annotationDescriptor); result.add(annotationDescriptor);
} }
return result; return result;
} }
public static void reportUnsupportedAnnotationForTypeParameter(@NotNull JetModifierListOwner modifierListOwner, BindingTrace trace) {
JetModifierList modifierList = modifierListOwner.getModifierList();
if (modifierList == null) return;
for (JetAnnotationEntry annotationEntry : modifierList.getAnnotationEntries()) {
trace.report(Errors.UNSUPPORTED.on(annotationEntry, "Annotations for type parameters are not supported yet"));
}
}
} }
@@ -227,7 +227,7 @@ public class DeclarationResolver {
@Override @Override
public void visitObjectDeclaration(JetObjectDeclaration declaration) { public void visitObjectDeclaration(JetObjectDeclaration declaration) {
PropertyDescriptor propertyDescriptor = descriptorResolver.resolveObjectDeclarationAsPropertyDescriptor( PropertyDescriptor propertyDescriptor = descriptorResolver.resolveObjectDeclarationAsPropertyDescriptor(
namespaceLike.getOwnerForChildren(), declaration, context.getObjects().get(declaration), trace); scopeForFunctions, namespaceLike.getOwnerForChildren(), declaration, context.getObjects().get(declaration), trace);
namespaceLike.addPropertyDescriptor(propertyDescriptor); namespaceLike.addPropertyDescriptor(propertyDescriptor);
} }
@@ -239,7 +239,7 @@ public class DeclarationResolver {
((MutableClassDescriptorLite)namespaceLike.getOwnerForChildren()).getClassObjectDescriptor(); ((MutableClassDescriptorLite)namespaceLike.getOwnerForChildren()).getClassObjectDescriptor();
assert classObjectDescriptor != null; assert classObjectDescriptor != null;
PropertyDescriptor propertyDescriptor = descriptorResolver.resolveObjectDeclarationAsPropertyDescriptor( PropertyDescriptor propertyDescriptor = descriptorResolver.resolveObjectDeclarationAsPropertyDescriptor(
classObjectDescriptor, enumEntry, context.getClasses().get(enumEntry), trace); scopeForFunctions, classObjectDescriptor, enumEntry, context.getClasses().get(enumEntry), trace);
classObjectDescriptor.getBuilder().addPropertyDescriptor(propertyDescriptor); classObjectDescriptor.getBuilder().addPropertyDescriptor(propertyDescriptor);
} }
}); });
@@ -102,9 +102,12 @@ public class DescriptorResolver {
List<TypeParameterDescriptor> typeParameters = Lists.newArrayList(); List<TypeParameterDescriptor> typeParameters = Lists.newArrayList();
int index = 0; int index = 0;
for (JetTypeParameter typeParameter : classElement.getTypeParameters()) { for (JetTypeParameter typeParameter : classElement.getTypeParameters()) {
// TODO: Support
AnnotationResolver.reportUnsupportedAnnotationForTypeParameter(typeParameter, trace);
TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptorImpl.createForFurtherModification( TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptorImpl.createForFurtherModification(
descriptor, descriptor,
annotationResolver.getResolvedAnnotations(typeParameter.getModifierList(), trace), Collections.<AnnotationDescriptor>emptyList(),
typeParameter.hasModifier(JetTokens.REIFIED_KEYWORD), typeParameter.hasModifier(JetTokens.REIFIED_KEYWORD),
typeParameter.getVariance(), typeParameter.getVariance(),
JetPsiUtil.safeName(typeParameter.getName()), JetPsiUtil.safeName(typeParameter.getName()),
@@ -570,10 +573,12 @@ public class DescriptorResolver {
trace.report(VARIANCE_ON_TYPE_PARAMETER_OF_FUNCTION_OR_PROPERTY.on(typeParameter)); trace.report(VARIANCE_ON_TYPE_PARAMETER_OF_FUNCTION_OR_PROPERTY.on(typeParameter));
} }
// TODO: Annotations are not resolved! // TODO: Support annotation for type parameters
AnnotationResolver.reportUnsupportedAnnotationForTypeParameter(typeParameter, trace);
TypeParameterDescriptorImpl typeParameterDescriptor = TypeParameterDescriptorImpl.createForFurtherModification( TypeParameterDescriptorImpl typeParameterDescriptor = TypeParameterDescriptorImpl.createForFurtherModification(
containingDescriptor, containingDescriptor,
annotationResolver.getResolvedAnnotations(typeParameter.getModifierList(), trace), Collections.<AnnotationDescriptor>emptyList(),
typeParameter.hasModifier(JetTokens.REIFIED_KEYWORD), typeParameter.hasModifier(JetTokens.REIFIED_KEYWORD),
typeParameter.getVariance(), typeParameter.getVariance(),
JetPsiUtil.safeName(typeParameter.getName()), JetPsiUtil.safeName(typeParameter.getName()),
@@ -822,14 +827,14 @@ public class DescriptorResolver {
@NotNull @NotNull
public VariableDescriptor resolveObjectDeclaration( public VariableDescriptor resolveObjectDeclaration(
@NotNull JetScope scope,
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@NotNull JetClassOrObject objectDeclaration, @NotNull JetClassOrObject objectDeclaration,
@NotNull ClassDescriptor classDescriptor, BindingTrace trace @NotNull ClassDescriptor classDescriptor, BindingTrace trace
) { ) {
boolean isProperty = (containingDeclaration instanceof NamespaceDescriptor) boolean isProperty = (containingDeclaration instanceof NamespaceDescriptor) || (containingDeclaration instanceof ClassDescriptor);
|| (containingDeclaration instanceof ClassDescriptor);
if (isProperty) { if (isProperty) {
return resolveObjectDeclarationAsPropertyDescriptor(containingDeclaration, objectDeclaration, classDescriptor, trace); return resolveObjectDeclarationAsPropertyDescriptor(scope, containingDeclaration, objectDeclaration, classDescriptor, trace);
} }
else { else {
return resolveObjectDeclarationAsLocalVariable(containingDeclaration, objectDeclaration, classDescriptor, trace); return resolveObjectDeclarationAsLocalVariable(containingDeclaration, objectDeclaration, classDescriptor, trace);
@@ -838,6 +843,7 @@ public class DescriptorResolver {
@NotNull @NotNull
public PropertyDescriptor resolveObjectDeclarationAsPropertyDescriptor( public PropertyDescriptor resolveObjectDeclarationAsPropertyDescriptor(
@NotNull JetScope scope,
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@NotNull JetClassOrObject objectDeclaration, @NotNull JetClassOrObject objectDeclaration,
@NotNull ClassDescriptor classDescriptor, BindingTrace trace @NotNull ClassDescriptor classDescriptor, BindingTrace trace
@@ -845,7 +851,7 @@ public class DescriptorResolver {
JetModifierList modifierList = objectDeclaration.getModifierList(); JetModifierList modifierList = objectDeclaration.getModifierList();
PropertyDescriptorImpl propertyDescriptor = new PropertyDescriptorForObjectImpl( PropertyDescriptorImpl propertyDescriptor = new PropertyDescriptorForObjectImpl(
containingDeclaration, containingDeclaration,
annotationResolver.getResolvedAnnotations(modifierList, trace), annotationResolver.resolveAnnotationsWithoutArguments(scope, modifierList, trace),
resolveVisibilityFromModifiers(objectDeclaration, getDefaultVisibilityForObjectPropertyDescriptor(classDescriptor)), resolveVisibilityFromModifiers(objectDeclaration, getDefaultVisibilityForObjectPropertyDescriptor(classDescriptor)),
JetPsiUtil.safeName(objectDeclaration.getName()), JetPsiUtil.safeName(objectDeclaration.getName()),
classDescriptor classDescriptor
@@ -205,8 +205,11 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
if (classifier == null) { if (classifier == null) {
throw new IllegalStateException("Object declaration " + name + " found in the DeclarationProvider " + declarationProvider + " but not in the scope " + this); throw new IllegalStateException("Object declaration " + name + " found in the DeclarationProvider " + declarationProvider + " but not in the scope " + this);
} }
JetScope scope = getScopeForMemberDeclarationResolution(classOrObjectDeclaration);
VariableDescriptor propertyDescriptor = resolveSession.getInjector().getDescriptorResolver() VariableDescriptor propertyDescriptor = resolveSession.getInjector().getDescriptorResolver()
.resolveObjectDeclaration(thisDescriptor, classOrObjectDeclaration, classifier, resolveSession.getTrace()); .resolveObjectDeclaration(scope, thisDescriptor, classOrObjectDeclaration, classifier, resolveSession.getTrace());
result.add(propertyDescriptor); result.add(propertyDescriptor);
} }
} }
@@ -93,7 +93,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
ClassDescriptor classDescriptor = context.trace.getBindingContext().get(BindingContext.CLASS, declaration); ClassDescriptor classDescriptor = context.trace.getBindingContext().get(BindingContext.CLASS, declaration);
if (classDescriptor != null) { if (classDescriptor != null) {
VariableDescriptor variableDescriptor = context.expressionTypingServices.getDescriptorResolver() VariableDescriptor variableDescriptor = context.expressionTypingServices.getDescriptorResolver()
.resolveObjectDeclaration(scope.getContainingDeclaration(), declaration, classDescriptor, context.trace); .resolveObjectDeclaration(scope, scope.getContainingDeclaration(), declaration, classDescriptor, context.trace);
scope.addVariableDescriptor(variableDescriptor); scope.addVariableDescriptor(variableDescriptor);
} }
return DataFlowUtils.checkStatementType(declaration, context, context.dataFlowInfo); return DataFlowUtils.checkStatementType(declaration, context, context.dataFlowInfo);
@@ -0,0 +1,10 @@
annotation class A1
annotation class A2(val some: Int = 12)
class TopLevelClass<<!UNSUPPORTED!>A1<!> <!UNSUPPORTED!>A2(3)<!> <!UNSUPPORTED!>A2<!> <!UNSUPPORTED!>A1(12)<!> <!UNSUPPORTED!>A2("Test")<!> T> {
class InnerClass<<!UNSUPPORTED!>A1<!> <!UNSUPPORTED!>A2(3)<!> <!UNSUPPORTED!>A2<!> <!UNSUPPORTED!>A1(12)<!> <!UNSUPPORTED!>A2("Test")<!> T> {
fun test() {
class InFun<<!UNSUPPORTED!>A1<!> <!UNSUPPORTED!>A2(3)<!> <!UNSUPPORTED!>A2<!> <!UNSUPPORTED!>A1(12)<!> <!UNSUPPORTED!>A2("Test")<!> T>
}
}
}
@@ -0,0 +1,12 @@
annotation class A1
annotation class A2(val some: Int = 12)
fun <<!UNSUPPORTED!>A1<!> <!UNSUPPORTED!>A2(3)<!> <!UNSUPPORTED!>A2<!> <!UNSUPPORTED!>A1(12)<!> <!UNSUPPORTED!>A2("Test")<!> T> topFun() = 12
class SomeClass {
fun <<!UNSUPPORTED!>A1<!> <!UNSUPPORTED!>A2(3)<!> <!UNSUPPORTED!>A2<!> <!UNSUPPORTED!>A1(12)<!> <!UNSUPPORTED!>A2("Test")<!> T> method() = 12
fun foo() {
fun <<!UNSUPPORTED!>A1<!> <!UNSUPPORTED!>A2(3)<!> <!UNSUPPORTED!>A2<!> <!UNSUPPORTED!>A1(12)<!> <!UNSUPPORTED!>A2("Test")<!> T> innerFun() = 12
}
}
@@ -0,0 +1,8 @@
annotation class A1
annotation class A2(val some: Int = 12)
val <<!UNSUPPORTED!>A1<!> <!UNSUPPORTED!>A2(3)<!> <!UNSUPPORTED!>A2<!> <!UNSUPPORTED!>A1(12)<!> <!UNSUPPORTED!>A2("Test")<!> T> topProp = 12
class SomeClass {
val <<!UNSUPPORTED!>A1<!> <!UNSUPPORTED!>A2(3)<!> <!UNSUPPORTED!>A2<!> <!UNSUPPORTED!>A1(12)<!> <!UNSUPPORTED!>A2("Test")<!> T> field = 12
}
@@ -0,0 +1,9 @@
package test
// Checks that there is no rewrite error at ANNOTATION slice because of resolving annotations for object in lazy resolve and resolving
// object as property (method tries to resolve annotations too).
BadAnnotation
object SomeObject
val some = SomeObject
@@ -0,0 +1,8 @@
package test
[ERROR : Unresolved annotation type]() internal val SomeObject: test.SomeObject
internal val some: test.SomeObject
[ERROR : Unresolved annotation type]() internal object SomeObject {
/*primary*/ private constructor SomeObject()
}
@@ -545,6 +545,16 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
doTest("compiler/testData/diagnostics/tests/annotations/AnnotatedConstructorParams.kt"); doTest("compiler/testData/diagnostics/tests/annotations/AnnotatedConstructorParams.kt");
} }
@TestMetadata("AnnotationForClassTypeParameter.kt")
public void testAnnotationForClassTypeParameter() throws Exception {
doTest("compiler/testData/diagnostics/tests/annotations/AnnotationForClassTypeParameter.kt");
}
@TestMetadata("AnnotationForFunctionTypeParameter.kt")
public void testAnnotationForFunctionTypeParameter() throws Exception {
doTest("compiler/testData/diagnostics/tests/annotations/AnnotationForFunctionTypeParameter.kt");
}
@TestMetadata("AnnotationForObject.kt") @TestMetadata("AnnotationForObject.kt")
public void testAnnotationForObject() throws Exception { public void testAnnotationForObject() throws Exception {
doTest("compiler/testData/diagnostics/tests/annotations/AnnotationForObject.kt"); doTest("compiler/testData/diagnostics/tests/annotations/AnnotationForObject.kt");
@@ -560,6 +570,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
doTest("compiler/testData/diagnostics/tests/annotations/AnnotationsForClasses.kt"); doTest("compiler/testData/diagnostics/tests/annotations/AnnotationsForClasses.kt");
} }
@TestMetadata("AnnotationsForPropertyTypeParameter.kt")
public void testAnnotationsForPropertyTypeParameter() throws Exception {
doTest("compiler/testData/diagnostics/tests/annotations/AnnotationsForPropertyTypeParameter.kt");
}
@TestMetadata("BasicAnnotations.kt") @TestMetadata("BasicAnnotations.kt")
public void testBasicAnnotations() throws Exception { public void testBasicAnnotations() throws Exception {
doTest("compiler/testData/diagnostics/tests/annotations/BasicAnnotations.kt"); doTest("compiler/testData/diagnostics/tests/annotations/BasicAnnotations.kt");
@@ -2394,6 +2394,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
doTestCheckingPrimaryConstructors("compiler/testData/lazyResolve/namespaceComparator/simpleClass.kt"); doTestCheckingPrimaryConstructors("compiler/testData/lazyResolve/namespaceComparator/simpleClass.kt");
} }
@TestMetadata("UnresolvedAnnotationOnObject.kt")
public void testUnresolvedAnnotationOnObject() throws Exception {
doTestCheckingPrimaryConstructors("compiler/testData/lazyResolve/namespaceComparator/UnresolvedAnnotationOnObject.kt");
}
@TestMetadata("varargIterator.kt") @TestMetadata("varargIterator.kt")
public void testVarargIterator() throws Exception { public void testVarargIterator() throws Exception {
doTestCheckingPrimaryConstructors("compiler/testData/lazyResolve/namespaceComparator/varargIterator.kt"); doTestCheckingPrimaryConstructors("compiler/testData/lazyResolve/namespaceComparator/varargIterator.kt");