From 92a782ce6c042f086c281f0da22045a4408a1a0c Mon Sep 17 00:00:00 2001 From: "Natalia.Ukhorskaya" Date: Wed, 29 Aug 2012 12:55:00 +0400 Subject: [PATCH] AnnotationDescriptor refactoring: contains map of ValueParameterDescriptor and CompileTimeConstant for valueArgument. DescriptorUtils: add method to get a list of sorted value arguments from AnnotationDescriptor --- .../jet/codegen/AnnotationCodegen.java | 2 +- .../codegen/intrinsics/IntrinsicMethods.java | 2 +- .../annotations/AnnotationDescriptor.java | 28 ++++++++++++++----- .../jet/lang/resolve/AnnotationResolver.java | 8 ++++-- .../jet/lang/resolve/DescriptorUtils.java | 11 ++++++++ .../jet/test/util/NamespaceComparator.java | 2 +- .../translate/utils/AnnotationsUtils.java | 4 +-- 7 files changed, 42 insertions(+), 15 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java index 47bb9327a8c..96c4f4d8592 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java @@ -172,7 +172,7 @@ public abstract class AnnotationCodegen { for (AnnotationDescriptor annotation : annotations) { //noinspection ConstantConditions if ("Intrinsic".equals(annotation.getType().getConstructor().getDeclarationDescriptor().getName().getName())) { - value = (String) annotation.getValueArguments().get(0).getValue(); + value = (String) annotation.getAllValueArguments().values().iterator().next().getValue(); break; } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java index 3feeec7a2d0..ac8c9aea936 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java @@ -227,7 +227,7 @@ public class IntrinsicMethods { ClassifierDescriptor classifierDescriptor = annotation.getType().getConstructor().getDeclarationDescriptor(); assert classifierDescriptor != null; if ("Intrinsic".equals(classifierDescriptor.getName().getName())) { - String value = (String) annotation.getValueArguments().get(0).getValue(); + String value = (String) annotation.getAllValueArguments().values().iterator().next().getValue(); intrinsicMethod = namedMethods.get(value); if (intrinsicMethod != null) { break; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/annotations/AnnotationDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/annotations/AnnotationDescriptor.java index 53c807cc18c..52f3c9bef79 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/annotations/AnnotationDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/annotations/AnnotationDescriptor.java @@ -16,29 +16,38 @@ package org.jetbrains.jet.lang.descriptors.annotations; +import com.google.common.collect.Maps; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.types.JetType; -import javax.rmi.CORBA.ClassDesc; -import java.util.List; +import java.util.Map; +import java.util.Collections; /** * @author abreslav */ public class AnnotationDescriptor { private JetType annotationType; - private List> valueArguments; + private final Map> valueArguments = Maps.newHashMap(); @NotNull public JetType getType() { return annotationType; } + @Nullable + public CompileTimeConstant getValueArgument(@NotNull ValueParameterDescriptor valueParameterDescriptor) { + return valueArguments.get(valueParameterDescriptor); + } + @NotNull - public List> getValueArguments() { - return valueArguments; + public Map> getAllValueArguments() { + return Collections.unmodifiableMap(valueArguments); } public void setAnnotationType(@NotNull JetType annotationType) { @@ -48,7 +57,12 @@ public class AnnotationDescriptor { this.annotationType = annotationType; } - public void setValueArguments(@NotNull List> valueArguments) { - this.valueArguments = valueArguments; + public void setValueArgument(@NotNull ValueParameterDescriptor name, @NotNull CompileTimeConstant value) { + valueArguments.put(name, value); + } + + @Override + public String toString() { + return annotationType.toString() + DescriptorUtils.getSortedValueArguments(this); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java index 6ad6ed7bde1..cf2cce4e90e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java @@ -116,17 +116,19 @@ public class AnnotationResolver { private void resolveArguments(@NotNull OverloadResolutionResults results, @NotNull AnnotationDescriptor descriptor, BindingTrace trace) { - List> arguments = Lists.newArrayList(); for (Map.Entry descriptorToArgument : results.getResultingCall().getValueArguments().entrySet()) { // TODO: are varargs supported here? List valueArguments = descriptorToArgument.getValue().getArguments(); ValueParameterDescriptor parameterDescriptor = descriptorToArgument.getKey(); for (ValueArgument argument : valueArguments) { - arguments.add(resolveAnnotationArgument(argument.getArgumentExpression(), parameterDescriptor.getType(), trace)); + CompileTimeConstant compileTimeConstant = + resolveAnnotationArgument(argument.getArgumentExpression(), parameterDescriptor.getType(), trace); + if (compileTimeConstant != null) { + descriptor.setValueArgument(parameterDescriptor, compileTimeConstant); + } } } - descriptor.setValueArguments(arguments); } @Nullable diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java index 401c15eb0c3..d3aa33794c5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java @@ -21,8 +21,10 @@ import com.google.common.collect.Maps; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetFunction; +import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.Name; @@ -376,4 +378,13 @@ public class DescriptorUtils { assert classKind == ClassKind.CLASS || classKind == ClassKind.TRAIT || classKind == ClassKind.ANNOTATION_CLASS; return Visibilities.PUBLIC; } + + public static List getSortedValueArguments(AnnotationDescriptor descriptor) { + List resultList = Lists.newArrayList(); + for (Map.Entry> entry : descriptor.getAllValueArguments().entrySet()) { + resultList.add(entry.getKey().getName().getName() + " = " + entry.getValue().toString()); + } + Collections.sort(resultList); + return resultList; + } } diff --git a/compiler/tests/org/jetbrains/jet/test/util/NamespaceComparator.java b/compiler/tests/org/jetbrains/jet/test/util/NamespaceComparator.java index 4245f50663c..117b4d46c98 100644 --- a/compiler/tests/org/jetbrains/jet/test/util/NamespaceComparator.java +++ b/compiler/tests/org/jetbrains/jet/test/util/NamespaceComparator.java @@ -534,7 +534,7 @@ public class NamespaceComparator { public void serialize(AnnotationDescriptor annotation) { new TypeSerializer(sb).serialize(annotation.getType()); sb.append("("); - serializeCommaSeparated(annotation.getValueArguments()); + serializeCommaSeparated(DescriptorUtils.getSortedValueArguments(annotation)); sb.append(")"); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/AnnotationsUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/AnnotationsUtils.java index a6256535d82..1bf97152aec 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/AnnotationsUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/AnnotationsUtils.java @@ -48,10 +48,10 @@ public final class AnnotationsUtils { AnnotationDescriptor annotationDescriptor = getAnnotationByName(declarationDescriptor, annotation); assert annotationDescriptor != null; //TODO: this is a quick fix for unsupported default args problem - if (annotationDescriptor.getValueArguments().isEmpty()) { + if (annotationDescriptor.getAllValueArguments().isEmpty()) { return null; } - CompileTimeConstant constant = annotationDescriptor.getValueArguments().iterator().next(); + CompileTimeConstant constant = annotationDescriptor.getAllValueArguments().values().iterator().next(); //TODO: this is a quick fix for unsupported default args problem if (constant == null) { return null;