Resolve annotation arguments only once

This commit is contained in:
Andrey Breslav
2014-03-26 15:16:00 +04:00
parent 298ddcf0ad
commit 708694a09d
6 changed files with 34 additions and 7 deletions
@@ -223,11 +223,17 @@ public class AnnotationResolver {
return;
}
AnnotationDescriptorImpl annotationDescriptorImpl = (AnnotationDescriptorImpl) annotationDescriptor;
if (annotationDescriptorImpl.areValueArgumentsResolved()) return;
OverloadResolutionResults<FunctionDescriptor> results = resolveAnnotationCall(annotationEntry, scope, trace);
if (results.isSingleResult()) {
checkAnnotationType(annotationEntry, trace, results);
resolveAnnotationArguments(annotationDescriptor, results.getResultingCall(), trace);
}
else {
annotationDescriptorImpl.markValueArgumentsResolved();
}
}
public static void resolveAnnotationArguments(
@@ -240,15 +246,19 @@ public class AnnotationResolver {
return;
}
AnnotationDescriptorImpl annotationDescriptorImpl = (AnnotationDescriptorImpl) annotationDescriptor;
for (Map.Entry<ValueParameterDescriptor, ResolvedValueArgument> descriptorToArgument : resolvedCall.getValueArguments().entrySet()) {
ValueParameterDescriptor parameterDescriptor = descriptorToArgument.getKey();
ResolvedValueArgument resolvedArgument = descriptorToArgument.getValue();
CompileTimeConstant<?> value = getAnnotationArgumentValue(trace, parameterDescriptor, resolvedArgument);
if (value != null) {
((AnnotationDescriptorImpl) annotationDescriptor).setValueArgument(parameterDescriptor, value);
annotationDescriptorImpl.setValueArgument(parameterDescriptor, value);
}
}
annotationDescriptorImpl.markValueArgumentsResolved();
}
@Nullable