Allow annotations to be retrieved from binding. In this patch refactors the annotation access code in JdtUtil and fixes the issue of retrieving @UnusedCast from a method call binding. Change-Id: I2f18a6235b59d96966d20e9e082b5feccc6499e5
diff --git a/dev/core/src/com/google/gwt/dev/javac/JSORestrictionsChecker.java b/dev/core/src/com/google/gwt/dev/javac/JSORestrictionsChecker.java index e3eb085..2d249d3 100644 --- a/dev/core/src/com/google/gwt/dev/javac/JSORestrictionsChecker.java +++ b/dev/core/src/com/google/gwt/dev/javac/JSORestrictionsChecker.java
@@ -210,21 +210,21 @@ return true; } - private void checkJsFunction(TypeDeclaration type, TypeBinding typeBinding) { - ReferenceBinding binding = (ReferenceBinding) typeBinding; - if (JdtUtil.getAnnotation(binding, "jsinterop.annotations.JsFunction") == null) { + private void checkJsFunction(TypeDeclaration type) { + if (JdtUtil.getAnnotationByName( + type.annotations, "jsinterop.annotations.JsFunction") == null) { return; } - if (!binding.isFunctionalInterface(type.scope)) { + if (!type.binding.isFunctionalInterface(type.scope)) { errorOn(type, ERR_JS_FUNCTION_ONLY_ALLOWED_ON_FUNCTIONAL_INTERFACE); return; } } private ClassState checkType(TypeDeclaration type) { - SourceTypeBinding binding = type.binding; - checkJsFunction(type, binding); + checkJsFunction(type); + SourceTypeBinding binding = type.binding; if (!JdtUtil.isJsoSubclass(binding)) { return ClassState.NORMAL; }
diff --git a/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java b/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java index ada3271..0c13e7e 100644 --- a/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java +++ b/dev/core/src/com/google/gwt/dev/javac/JdtCompiler.java
@@ -711,6 +711,9 @@ options.sourceLevel = jdtSourceLevel; options.targetJDK = jdtSourceLevel; + // Make sure the annotations are stored in and accessible through the bindings. + options.storeAnnotations = true; + // Generate debug info for debugging the output. options.produceDebugAttributes = ClassFileConstants.ATTR_VARS | ClassFileConstants.ATTR_LINES
diff --git a/dev/core/src/com/google/gwt/dev/javac/JdtUtil.java b/dev/core/src/com/google/gwt/dev/javac/JdtUtil.java index f9c23b7..f89f10d 100644 --- a/dev/core/src/com/google/gwt/dev/javac/JdtUtil.java +++ b/dev/core/src/com/google/gwt/dev/javac/JdtUtil.java
@@ -27,13 +27,10 @@ import com.google.gwt.thirdparty.guava.common.collect.Lists; import org.eclipse.jdt.core.compiler.CharOperation; -import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.impl.BooleanConstant; import org.eclipse.jdt.internal.compiler.impl.StringConstant; import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding; -import org.eclipse.jdt.internal.compiler.lookup.Binding; -import org.eclipse.jdt.internal.compiler.lookup.ClassScope; import org.eclipse.jdt.internal.compiler.lookup.ElementValuePair; import org.eclipse.jdt.internal.compiler.lookup.FieldBinding; import org.eclipse.jdt.internal.compiler.lookup.LocalTypeBinding; @@ -42,7 +39,6 @@ import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding; import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; import org.eclipse.jdt.internal.compiler.lookup.SyntheticArgumentBinding; -import org.eclipse.jdt.internal.compiler.lookup.SyntheticMethodBinding; import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; import java.util.Arrays; @@ -197,12 +193,13 @@ private JdtUtil() { } - public static String getAnnotationParameterString(AnnotationBinding a, String paramName) { - if (a != null) { - for (ElementValuePair maybeValue : a.getElementValuePairs()) { - if (maybeValue.getValue() instanceof StringConstant && - paramName.equals(String.valueOf(maybeValue.getName()))) { - return ((StringConstant) maybeValue.getValue()).stringValue(); + public static String getAnnotationParameterString( + AnnotationBinding annotationBinding, String parameterName) { + if (annotationBinding != null) { + for (ElementValuePair parameterNameValuePair : annotationBinding.getElementValuePairs()) { + if (parameterNameValuePair.getValue() instanceof StringConstant && + parameterName.equals(String.valueOf(parameterNameValuePair.getName()))) { + return ((StringConstant) parameterNameValuePair.getValue()).stringValue(); } } } @@ -210,76 +207,64 @@ } public static boolean getAnnotationParameterBoolean( - AnnotationBinding a, String paramName, boolean defaultValue) { - Boolean rv = getAnnotationParameterBoolean(a, paramName); - return rv == null ? defaultValue : rv; + AnnotationBinding annotationBinding, String parameterName, boolean defaultValue) { + Boolean booleanParameterValue = getAnnotationParameterBoolean(annotationBinding, parameterName); + return booleanParameterValue == null ? defaultValue : booleanParameterValue; } - public static Boolean getAnnotationParameterBoolean(AnnotationBinding a, String paramName) { - if (a != null) { - for (ElementValuePair maybeValue : a.getElementValuePairs()) { - if (maybeValue.getValue() instanceof BooleanConstant && - paramName.equals(String.valueOf(maybeValue.getName()))) { - return ((BooleanConstant) maybeValue.getValue()).booleanValue(); + public static Boolean getAnnotationParameterBoolean( + AnnotationBinding annotationBinding, String parameterName) { + if (annotationBinding != null) { + for (ElementValuePair parameterNameValuePair : annotationBinding.getElementValuePairs()) { + if (parameterNameValuePair.getValue() instanceof BooleanConstant && + parameterName.equals(String.valueOf(parameterNameValuePair.getName()))) { + return ((BooleanConstant) parameterNameValuePair.getValue()).booleanValue(); } } } return null; } - static AnnotationBinding getAnnotation(AnnotationBinding[] annotations, String nameToFind) { - if (annotations != null) { - for (AnnotationBinding a : annotations) { - ReferenceBinding annBinding = a.getAnnotationType(); - String annName = CharOperation.toString(annBinding.compoundName); - if (nameToFind.equals(annName)) { - return a; - } - } - } - return null; - } - - public static AnnotationBinding getAnnotation(Annotation[] annotations, String nameToFind) { - if (annotations != null) { - for (Annotation a : annotations) { - AnnotationBinding annBinding = a.getCompilerAnnotation(); - if (annBinding != null) { - String annName = CharOperation.toString(annBinding.getAnnotationType().compoundName); - if (nameToFind.equals(annName)) { - return annBinding; - } - } - } - } - return null; - } - - public static AnnotationBinding getAnnotation(Binding binding, String nameToFind) { - if (binding instanceof SourceTypeBinding) { - ClassScope scope = ((SourceTypeBinding) binding).scope; - return scope != null ? getAnnotation(scope.referenceType().annotations, nameToFind) : null; - } else if (binding instanceof ReferenceBinding) { - return getAnnotation(((ReferenceBinding) binding).getAnnotations(), nameToFind); - } else if (binding instanceof SyntheticMethodBinding) { - return null; - } else if (binding instanceof MethodBinding) { - AbstractMethodDeclaration abMethod = safeSourceMethod((MethodBinding) binding); - return abMethod != null ? getAnnotation(abMethod.annotations, nameToFind) : null; - } else if (binding instanceof FieldBinding) { - return getAnnotation(((FieldBinding) binding).sourceField().annotations, nameToFind); - } else { + public static AnnotationBinding getAnnotationByName(Annotation[] annotations, String name) { + if (annotations == null) { return null; } + for (Annotation annotation : annotations) { + AnnotationBinding annotationBinding = annotation.getCompilerAnnotation(); + if (matchAnnotationName(annotationBinding, name)) { + return annotationBinding; + } + } + return null; + } + + public static AnnotationBinding getAnnotationByName( + AnnotationBinding[] annotationsBindings, String name) { + if (annotationsBindings == null) { + return null; + } + for (AnnotationBinding annotationBinding : annotationsBindings) { + if (matchAnnotationName(annotationBinding, name)) { + return annotationBinding; + } + } + return null; + } + + private static boolean matchAnnotationName(AnnotationBinding annotationBinding, String name) { + if (annotationBinding == null) { + return false; + } + return name.equals(CharOperation.toString(annotationBinding.getAnnotationType().compoundName)); } public static TypeBinding getAnnotationParameterTypeBinding( - AnnotationBinding a, String paramName) { - if (a != null) { - for (ElementValuePair maybeValue : a.getElementValuePairs()) { - if (maybeValue.getValue() instanceof Class && - paramName.equals(String.valueOf(maybeValue.getName()))) { - return (TypeBinding) maybeValue.getValue(); + AnnotationBinding annotationBinding, String parameterName) { + if (annotationBinding != null) { + for (ElementValuePair parameterNameValuePair : annotationBinding.getElementValuePairs()) { + if (parameterNameValuePair.getValue() instanceof Class && + parameterName.equals(String.valueOf(parameterNameValuePair.getName()))) { + return (TypeBinding) parameterNameValuePair.getValue(); } } } @@ -287,14 +272,14 @@ } public static TypeBinding[] getAnnotationParameterTypeBindingArray( - AnnotationBinding annotationBinding, String paramName) { + AnnotationBinding annotationBinding, String parameterName) { if (annotationBinding == null) { return null; } - for (ElementValuePair maybeValue : annotationBinding.getElementValuePairs()) { - Object value = maybeValue.getValue(); - if (!paramName.equals(String.valueOf(maybeValue.getName()))) { + for (ElementValuePair parameterNameValuePair : annotationBinding.getElementValuePairs()) { + Object value = parameterNameValuePair.getValue(); + if (!parameterName.equals(String.valueOf(parameterNameValuePair.getName()))) { continue; } if (value instanceof Object[]) { @@ -310,15 +295,15 @@ } public static StringConstant[] getAnnotationParameterStringConstantArray( - AnnotationBinding annotationBinding, String paramName) { + AnnotationBinding annotationBinding, String parameterName) { if (annotationBinding == null) { return null; } - for (ElementValuePair maybeValue : annotationBinding.getElementValuePairs()) { - if (!paramName.equals(String.valueOf(maybeValue.getName()))) { + for (ElementValuePair parameterNameValuePair : annotationBinding.getElementValuePairs()) { + if (!parameterName.equals(String.valueOf(parameterNameValuePair.getName()))) { continue; } - Object value = maybeValue.getValue(); + Object value = parameterNameValuePair.getValue(); if (value instanceof Object[]) { Object[] values = (Object[]) value; StringConstant[] stringConstants = new StringConstant[values.length]; @@ -336,7 +321,7 @@ return ImmutableSet.of(); } AnnotationBinding suppressWarnings = - getAnnotation(annotations, SuppressWarnings.class.getName()); + getAnnotationByName(annotations, SuppressWarnings.class.getName()); if (suppressWarnings != null) { StringConstant[] values = JdtUtil.getAnnotationParameterStringConstantArray(suppressWarnings, "value"); @@ -352,17 +337,6 @@ return ImmutableSet.of(); } - /** - * Work around JDT bug. - */ - public static AbstractMethodDeclaration safeSourceMethod(MethodBinding mb) { - try { - return mb.sourceMethod(); - } catch (Exception e) { - return null; - } - } - public static String signature(FieldBinding binding) { StringBuilder sb = new StringBuilder(); sb.append(binding.declaringClass.constantPoolName());
diff --git a/dev/core/src/com/google/gwt/dev/javac/JsInteropUtil.java b/dev/core/src/com/google/gwt/dev/javac/JsInteropUtil.java index 454e5f8..0db2245 100644 --- a/dev/core/src/com/google/gwt/dev/javac/JsInteropUtil.java +++ b/dev/core/src/com/google/gwt/dev/javac/JsInteropUtil.java
@@ -151,7 +151,7 @@ } private static AnnotationBinding getInteropAnnotation(Annotation[] annotations, String name) { - return JdtUtil.getAnnotation(annotations, "jsinterop.annotations." + name); + return JdtUtil.getAnnotationByName(annotations, "jsinterop.annotations." + name); } }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java index 5930ad1..d2cb9b6 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java +++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java
@@ -4164,31 +4164,32 @@ private static boolean isUncheckedGenericMethodCall(MessageSend messageSend) { if (messageSend.binding.genericMethod() != null) { - return JdtUtil.getAnnotation(messageSend.binding.genericMethod(), - "javaemul.internal.annotations.UncheckedCast") != null; + return JdtUtil.getAnnotationByName(messageSend.binding().getAnnotations(), + "javaemul.internal.annotations.UncheckedCast") != null; } return false; } private static void maybeSetInliningMode(AbstractMethodDeclaration x, JMethod method) { - MethodBinding bind = x.binding; - if (JdtUtil.getAnnotation(bind, "javaemul.internal.annotations.DoNotInline") != null) { + if (JdtUtil.getAnnotationByName( + x.annotations, "javaemul.internal.annotations.DoNotInline") != null) { method.setInliningMode(InliningMode.DO_NOT_INLINE); - } else if (JdtUtil.getAnnotation(bind, "javaemul.internal.annotations.ForceInline") != null) { + } else if (JdtUtil.getAnnotationByName( + x.annotations, "javaemul.internal.annotations.ForceInline") != null) { method.setInliningMode(InliningMode.FORCE_INLINE); } } private static void maybeSetHasNoSideEffects(AbstractMethodDeclaration x, JMethod method) { - if (JdtUtil.getAnnotation(x.binding, - "javaemul.internal.annotations.HasNoSideEffects") != null) { + if (JdtUtil.getAnnotationByName( + x.annotations, "javaemul.internal.annotations.HasNoSideEffects") != null) { method.setHasSideEffects(false); } } private void maybeAddMethodSpecialization(AbstractMethodDeclaration x, JMethod method) { - AnnotationBinding specializeAnnotation = - JdtUtil.getAnnotation(x.binding, "javaemul.internal.annotations.SpecializeMethod"); + AnnotationBinding specializeAnnotation = JdtUtil.getAnnotationByName( + x.annotations, "javaemul.internal.annotations.SpecializeMethod"); if (specializeAnnotation == null) { return; }