EA-36935 Rewriting annotations exception when file contains object with annotation.

This commit is contained in:
Nikolay Krasko
2012-08-29 19:38:37 +04:00
parent 0852f3939f
commit 03989b9055
6 changed files with 31 additions and 25 deletions
@@ -19,14 +19,13 @@ package org.jetbrains.jet.lang.descriptors.annotations;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import java.util.Map;
import java.util.Collections; import java.util.Collections;
import java.util.Map;
/** /**
* @author abreslav * @author abreslav
@@ -51,9 +50,6 @@ public class AnnotationDescriptor {
} }
public void setAnnotationType(@NotNull JetType annotationType) { public void setAnnotationType(@NotNull JetType annotationType) {
if (false && !(annotationType.getConstructor().getDeclarationDescriptor() instanceof ClassDescriptor)) {
throw new IllegalStateException();
}
this.annotationType = annotationType; this.annotationType = annotationType;
} }
@@ -103,8 +103,6 @@ public class AnnotationResolver {
trace.report(Errors.NOT_AN_ANNOTATION_CLASS.on(entryElement, descriptor.getName().getName())); trace.report(Errors.NOT_AN_ANNOTATION_CLASS.on(entryElement, descriptor.getName().getName()));
} }
} }
}
if (results.isSuccess()) {
JetType annotationType = results.getResultingDescriptor().getReturnType(); JetType annotationType = results.getResultingDescriptor().getReturnType();
annotationDescriptor.setAnnotationType(annotationType); annotationDescriptor.setAnnotationType(annotationType);
resolveArguments(results, annotationDescriptor, trace); resolveArguments(results, annotationDescriptor, trace);
@@ -179,20 +177,28 @@ public class AnnotationResolver {
} }
@NotNull @NotNull
public List<AnnotationDescriptor> createAnnotationStubs(@Nullable JetModifierList modifierList, BindingTrace trace) { public List<AnnotationDescriptor> getResolvedAnnotations(@Nullable JetModifierList modifierList, BindingTrace trace) {
if (modifierList == null) { if (modifierList == null) {
return Collections.emptyList(); return Collections.emptyList();
} }
return createAnnotationStubs(modifierList.getAnnotationEntries(), trace); return getResolvedAnnotations(modifierList.getAnnotationEntries(), trace);
} }
@SuppressWarnings("MethodMayBeStatic")
@NotNull @NotNull
public List<AnnotationDescriptor> createAnnotationStubs(List<JetAnnotationEntry> annotations, BindingTrace trace) { public List<AnnotationDescriptor> getResolvedAnnotations(List<JetAnnotationEntry> annotations, BindingTrace trace) {
List<AnnotationDescriptor> result = Lists.newArrayList(); List<AnnotationDescriptor> result = Lists.newArrayList();
for (JetAnnotationEntry annotation : annotations) { for (JetAnnotationEntry annotation : annotations) {
AnnotationDescriptor annotationDescriptor = new AnnotationDescriptor(); AnnotationDescriptor annotationDescriptor = trace.get(BindingContext.ANNOTATION, annotation);
if (annotationDescriptor == null) {
// TODO: Unresolved annotation
annotationDescriptor = new AnnotationDescriptor();
annotationDescriptor.setAnnotationType(ErrorUtils.createErrorType("Unresolved annotation type"));
trace.record(BindingContext.ANNOTATION, annotation, annotationDescriptor);
}
result.add(annotationDescriptor); result.add(annotationDescriptor);
trace.record(BindingContext.ANNOTATION, annotation, annotationDescriptor);
} }
return result; return result;
} }
@@ -93,7 +93,7 @@ public class DescriptorResolver {
for (JetTypeParameter typeParameter : classElement.getTypeParameters()) { for (JetTypeParameter typeParameter : classElement.getTypeParameters()) {
TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptorImpl.createForFurtherModification( TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptorImpl.createForFurtherModification(
descriptor, descriptor,
annotationResolver.createAnnotationStubs(typeParameter.getModifierList(), trace), annotationResolver.getResolvedAnnotations(typeParameter.getModifierList(), trace),
typeParameter.hasModifier(JetTokens.REIFIED_KEYWORD), typeParameter.hasModifier(JetTokens.REIFIED_KEYWORD),
typeParameter.getVariance(), typeParameter.getVariance(),
JetPsiUtil.safeName(typeParameter.getName()), JetPsiUtil.safeName(typeParameter.getName()),
@@ -412,19 +412,15 @@ public class DescriptorResolver {
int index, int index,
BindingTrace trace BindingTrace trace
) { ) {
// JetTypeReference extendsBound = typeParameter.getExtendsBound(); // TODO: Annotations are not resolved!
// JetType bound = extendsBound == null
// ? JetStandardClasses.getDefaultBound()
// : typeResolver.resolveType(extensibleScope, extendsBound);
TypeParameterDescriptorImpl typeParameterDescriptor = TypeParameterDescriptorImpl.createForFurtherModification( TypeParameterDescriptorImpl typeParameterDescriptor = TypeParameterDescriptorImpl.createForFurtherModification(
containingDescriptor, containingDescriptor,
annotationResolver.createAnnotationStubs(typeParameter.getModifierList(), trace), annotationResolver.getResolvedAnnotations(typeParameter.getModifierList(), trace),
typeParameter.hasModifier(JetTokens.REIFIED_KEYWORD), typeParameter.hasModifier(JetTokens.REIFIED_KEYWORD),
typeParameter.getVariance(), typeParameter.getVariance(),
JetPsiUtil.safeName(typeParameter.getName()), JetPsiUtil.safeName(typeParameter.getName()),
index index
); );
// typeParameterDescriptor.addUpperBound(bound);
extensibleScope.addTypeParameterDescriptor(typeParameterDescriptor); extensibleScope.addTypeParameterDescriptor(typeParameterDescriptor);
trace.record(BindingContext.TYPE_PARAMETER, typeParameter, typeParameterDescriptor); trace.record(BindingContext.TYPE_PARAMETER, typeParameter, typeParameterDescriptor);
return typeParameterDescriptor; return typeParameterDescriptor;
@@ -607,7 +603,7 @@ public class DescriptorResolver {
) { ) {
VariableDescriptor variableDescriptor = new LocalVariableDescriptor( VariableDescriptor variableDescriptor = new LocalVariableDescriptor(
containingDeclaration, containingDeclaration,
annotationResolver.createAnnotationStubs(parameter.getModifierList(), trace), annotationResolver.getResolvedAnnotations(parameter.getModifierList(), trace),
JetPsiUtil.safeName(parameter.getName()), JetPsiUtil.safeName(parameter.getName()),
type, type,
parameter.isMutable()); parameter.isMutable());
@@ -626,7 +622,7 @@ public class DescriptorResolver {
if (JetPsiUtil.isScriptDeclaration(variable)) { if (JetPsiUtil.isScriptDeclaration(variable)) {
PropertyDescriptor propertyDescriptor = new PropertyDescriptor( PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
containingDeclaration, containingDeclaration,
annotationResolver.createAnnotationStubs(variable.getModifierList(), trace), annotationResolver.getResolvedAnnotations(variable.getModifierList(), trace),
Modality.FINAL, Modality.FINAL,
Visibilities.INTERNAL, Visibilities.INTERNAL,
variable.isVar(), variable.isVar(),
@@ -661,7 +657,7 @@ public class DescriptorResolver {
) { ) {
VariableDescriptorImpl variableDescriptor = new LocalVariableDescriptor( VariableDescriptorImpl variableDescriptor = new LocalVariableDescriptor(
containingDeclaration, containingDeclaration,
annotationResolver.createAnnotationStubs(variable.getModifierList(), trace), annotationResolver.getResolvedAnnotations(variable.getModifierList(), trace),
JetPsiUtil.safeName(variable.getName()), JetPsiUtil.safeName(variable.getName()),
type, type,
variable.isVar()); variable.isVar());
@@ -694,7 +690,7 @@ public class DescriptorResolver {
JetModifierList modifierList = objectDeclaration.getModifierList(); JetModifierList modifierList = objectDeclaration.getModifierList();
PropertyDescriptor propertyDescriptor = new PropertyDescriptor( PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
containingDeclaration, containingDeclaration,
annotationResolver.createAnnotationStubs(modifierList, trace), annotationResolver.getResolvedAnnotations(modifierList, trace),
Modality.FINAL, Modality.FINAL,
ModifiersChecker.resolveVisibilityFromModifiers(objectDeclaration), ModifiersChecker.resolveVisibilityFromModifiers(objectDeclaration),
false, false,
@@ -720,7 +716,7 @@ public class DescriptorResolver {
) { ) {
VariableDescriptorImpl variableDescriptor = new LocalVariableDescriptor( VariableDescriptorImpl variableDescriptor = new LocalVariableDescriptor(
containingDeclaration, containingDeclaration,
annotationResolver.createAnnotationStubs(objectDeclaration.getModifierList(), trace), annotationResolver.getResolvedAnnotations(objectDeclaration.getModifierList(), trace),
JetPsiUtil.safeName(objectDeclaration.getName()), JetPsiUtil.safeName(objectDeclaration.getName()),
classDescriptor.getDefaultType(), classDescriptor.getDefaultType(),
/*isVar =*/ false); /*isVar =*/ false);
@@ -68,7 +68,7 @@ public class TypeResolver {
JetType cachedType = trace.getBindingContext().get(BindingContext.TYPE, typeReference); JetType cachedType = trace.getBindingContext().get(BindingContext.TYPE, typeReference);
if (cachedType != null) return cachedType; if (cachedType != null) return cachedType;
final List<AnnotationDescriptor> annotations = annotationResolver.createAnnotationStubs(typeReference.getAnnotations(), trace); final List<AnnotationDescriptor> annotations = annotationResolver.getResolvedAnnotations(typeReference.getAnnotations(), trace);
JetTypeElement typeElement = typeReference.getTypeElement(); JetTypeElement typeElement = typeReference.getTypeElement();
JetType type = resolveTypeElement(scope, annotations, typeElement, false, trace, checkBounds); JetType type = resolveTypeElement(scope, annotations, typeElement, false, trace, checkBounds);
@@ -0,0 +1,3 @@
// Check that there won't be "Rewrite at slice ANNOTATION key" exception - EA-36935
<!UNRESOLVED_REFERENCE!>someErrorAnnotation<!> object Test {
}
@@ -514,6 +514,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
doTest("compiler/testData/diagnostics/tests/annotations/AnnotatedConstructorParams.kt"); doTest("compiler/testData/diagnostics/tests/annotations/AnnotatedConstructorParams.kt");
} }
@TestMetadata("AnnotationForObject.kt")
public void testAnnotationForObject() throws Exception {
doTest("compiler/testData/diagnostics/tests/annotations/AnnotationForObject.kt");
}
@TestMetadata("AnnotationsForClasses.kt") @TestMetadata("AnnotationsForClasses.kt")
public void testAnnotationsForClasses() throws Exception { public void testAnnotationsForClasses() throws Exception {
doTest("compiler/testData/diagnostics/tests/annotations/AnnotationsForClasses.kt"); doTest("compiler/testData/diagnostics/tests/annotations/AnnotationsForClasses.kt");