diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/Main.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/Main.java index 1e8346fde..c62e00c51 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/Main.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/Main.java @@ -69,6 +69,7 @@ import org.checkerframework.afu.scenelib.type.Type; import org.checkerframework.afu.scenelib.util.CommandLineUtils; import org.checkerframework.afu.scenelib.util.coll.VivifyingMap; +import org.checkerframework.checker.signature.qual.BinaryName; import org.objectweb.asm.TypePath; import org.plumelib.options.Option; import org.plumelib.options.OptionGroup; @@ -306,7 +307,7 @@ private static AScene filteredScene(final AScene scene) { final AScene filtered = new AScene(); filtered.packages.putAll(scene.packages); filtered.imports.putAll(scene.imports); - for (Map.Entry entry : scene.classes.entrySet()) { + for (Map.Entry<@BinaryName String, AClass> entry : scene.classes.entrySet()) { String key = entry.getKey(); AClass clazz0 = entry.getValue(); AClass clazz1 = filtered.classes.getVivify(key); diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/find/Criteria.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/find/Criteria.java index 364a79bc4..c36ddceb7 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/find/Criteria.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/find/Criteria.java @@ -13,6 +13,7 @@ import org.checkerframework.afu.scenelib.io.ASTPath; import org.checkerframework.afu.scenelib.io.DebugWriter; import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.signature.qual.BinaryName; import org.checkerframework.checker.signature.qual.ClassGetName; import org.objectweb.asm.TypePath; @@ -261,8 +262,8 @@ public ASTPath getASTPath() { * * @return class name from {@link InClassCriterion}, or null if none present */ - public @Nullable @ClassGetName String getClassName() { - String result = null; + public @Nullable @BinaryName String getClassName() { + @BinaryName String result = null; for (Criterion c : criteria.values()) { if (c.getKind() == Criterion.Kind.IN_CLASS) { if (result == null) { diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/find/InClassCriterion.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/find/InClassCriterion.java index 7fb45633d..19e8a17e7 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/find/InClassCriterion.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/find/InClassCriterion.java @@ -11,7 +11,7 @@ import javax.lang.model.element.Name; import org.checkerframework.afu.annotator.scanner.AnonymousClassScanner; import org.checkerframework.afu.annotator.scanner.LocalClassScanner; -import org.checkerframework.checker.signature.qual.ClassGetName; +import org.checkerframework.checker.signature.qual.BinaryName; // If there are dollar signs in a name, then there are two // possibilities regarding how the dollar sign got there. @@ -31,7 +31,7 @@ public final class InClassCriterion implements Criterion { static boolean debug = false; /** The class name. */ - public final @ClassGetName String className; + public final @BinaryName String className; /** If true, require an exact match. */ private final boolean exactMatch; @@ -42,7 +42,7 @@ public final class InClassCriterion implements Criterion { * @param className the class name * @param exactMatch if true, require an exact match */ - public InClassCriterion(@ClassGetName String className, boolean exactMatch) { + public InClassCriterion(@BinaryName String className, boolean exactMatch) { this.className = className; this.exactMatch = exactMatch; } diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/find/Insertions.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/find/Insertions.java index 7708df7a9..5ced93159 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/find/Insertions.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/find/Insertions.java @@ -46,6 +46,7 @@ import org.checkerframework.afu.scenelib.type.BoundedType; import org.checkerframework.afu.scenelib.type.DeclaredType; import org.checkerframework.afu.scenelib.type.Type; +import org.checkerframework.checker.signature.qual.BinaryName; import org.objectweb.asm.TypePath; /** @@ -85,7 +86,7 @@ public Insertions() { * @return {@link java.util.Set} of {@link Insertion}s with an {@link InClassCriterion} for the * given class */ - public Set forClass(CompilationUnitTree cut, String qualifiedClassName) { + public Set forClass(CompilationUnitTree cut, @BinaryName String qualifiedClassName) { Set set = new LinkedHashSet<>(); forClass(cut, qualifiedClassName, set); return set; @@ -110,7 +111,8 @@ public Set forOuterClass(CompilationUnitTree cut, String qualifiedOut } Set set = new LinkedHashSet<>(); for (String innerClassPath : map.keySet()) { - String qualifiedClassName = qualifiedOuterClassName + innerClassPath; + @SuppressWarnings("signature:assignment") // string concatenation + @BinaryName String qualifiedClassName = qualifiedOuterClassName + innerClassPath; forClass(cut, qualifiedClassName, set); } return set; @@ -118,7 +120,8 @@ public Set forOuterClass(CompilationUnitTree cut, String qualifiedOut } /** Side-effects {@code result} to add {@link Insertion}s for {@code qualifiedClassName}. */ - private void forClass(CompilationUnitTree cut, String qualifiedClassName, Set result) { + private void forClass( + CompilationUnitTree cut, @BinaryName String qualifiedClassName, Set result) { if (Main.temporaryDebug) { System.out.printf( "calling forClass(cut, %s, set of size %d)%n", qualifiedClassName, result.size()); @@ -243,7 +246,7 @@ public List toList() { */ @SuppressWarnings("CatchAndPrintStackTrace") // maybe rethrow the exception private Set organizeTypedInsertions( - CompilationUnitTree cut, String className, Collection insertions) { + CompilationUnitTree cut, @BinaryName String className, Collection insertions) { Map outerInsertions = new HashMap<>(); Set innerInsertions = new LinkedHashSet<>(); List innerInsertionsList = new ArrayList<>(); diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/specification/IndexFileSpecification.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/specification/IndexFileSpecification.java index 2cac6be03..2174df97b 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/specification/IndexFileSpecification.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/annotator/specification/IndexFileSpecification.java @@ -44,6 +44,7 @@ import org.checkerframework.afu.scenelib.type.DeclaredType; import org.checkerframework.afu.scenelib.type.Type; import org.checkerframework.afu.scenelib.util.coll.VivifyingMap; +import org.checkerframework.checker.signature.qual.BinaryName; import org.checkerframework.checker.signature.qual.ClassGetName; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; @@ -169,9 +170,8 @@ private void parseScene() { parsePackage(clist, entry.getKey(), entry.getValue()); } - @SuppressWarnings("signature:assignment") // scene-lib is not fully annotated - VivifyingMap<@ClassGetName String, AClass> classes = scene.classes; - for (Map.Entry<@ClassGetName String, AClass> entry : classes.entrySet()) { + VivifyingMap<@BinaryName String, AClass> classes = scene.classes; + for (Map.Entry<@BinaryName String, AClass> entry : classes.entrySet()) { String key = entry.getKey(); AClass clazz = entry.getValue(); if (key.endsWith(".package-info")) { diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/AClass.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/AClass.java index ccf24f330..ec06e0118 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/AClass.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/AClass.java @@ -12,6 +12,8 @@ import javax.lang.model.element.VariableElement; import org.checkerframework.afu.scenelib.Annotation; import org.checkerframework.afu.scenelib.util.coll.VivifyingMap; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.plumelib.util.CollectionsPlume; /** An annotated class. */ @@ -45,7 +47,7 @@ public class AClass extends ADeclaration { * The type element representing the class. Clients must call {@link #setTypeElement(TypeElement)} * before accessing this field. */ - private /*@MonotonicNonNull*/ TypeElement typeElement = null; + private @MonotonicNonNull TypeElement typeElement = null; /** The fully-qualified name of the annotated class. */ public final String className; @@ -54,7 +56,7 @@ public class AClass extends ADeclaration { private final HashSet enums = new HashSet<>(); /** The enum constants of this class, or null if this class is not an enum. */ - private /*@MonotonicNonNull*/ List enumConstants = null; + private @MonotonicNonNull List enumConstants = null; /** * The simple class names any of this class's outer classes (or this class) that are annotations. @@ -290,7 +292,7 @@ public void markAsEnum(String className) { * * @return the enum constants, or null if this is not an enum */ - public /*@Nullable*/ List getEnumConstants() { + public @Nullable List getEnumConstants() { if (enumConstants == null) { return null; } @@ -409,7 +411,7 @@ public void markAsRecord(String className) { * * @return a type element representing this class */ - public /*@Nullable*/ TypeElement getTypeElement() { + public @Nullable TypeElement getTypeElement() { return typeElement; } diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/AMethod.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/AMethod.java index 5156877d7..27016ba08 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/AMethod.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/AMethod.java @@ -13,6 +13,7 @@ import javax.lang.model.type.TypeMirror; import org.checkerframework.afu.scenelib.Annotation; import org.checkerframework.afu.scenelib.util.coll.VivifyingMap; +import org.checkerframework.checker.nullness.qual.Nullable; /** An annotated method; contains bounds, return, parameters, receiver, and throws. */ public class AMethod extends ADeclaration { @@ -23,14 +24,14 @@ public class AMethod extends ADeclaration { public final String methodSignature; /** The type parameters of this method. */ - private /*@Nullable*/ List typeParameters = null; + private @Nullable List typeParameters = null; /** The method's annotated type parameter bounds. */ public final VivifyingMap bounds = ATypeElement.newVivifyingLHMap_ATE(); /** The return type of the method, or null if the method's return type is unknown or void. */ - private /*@Nullable*/ TypeMirror returnTypeMirror; + private @Nullable TypeMirror returnTypeMirror; /** The method's annotated return type. Non-null even if returnTypeMirror is null. */ public final ATypeElement returnType; // initialized in constructor @@ -230,7 +231,7 @@ public AField vivifyAndAddTypeMirrorToPostcondition(String expression, TypeMirro * * @return the return type, or null if the return type is unknown or void */ - public /*@Nullable*/ TypeMirror getReturnTypeMirror() { + public @Nullable TypeMirror getReturnTypeMirror() { return returnTypeMirror; } @@ -239,7 +240,7 @@ public AField vivifyAndAddTypeMirrorToPostcondition(String expression, TypeMirro * * @param returnTypeMirror the return type */ - public void setReturnTypeMirror(/*@Nullable*/ TypeMirror returnTypeMirror) { + public void setReturnTypeMirror(@Nullable TypeMirror returnTypeMirror) { if (returnTypeMirror == null) { return; } diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/AScene.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/AScene.java index d75d330fd..21eb140aa 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/AScene.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/AScene.java @@ -8,6 +8,8 @@ import org.checkerframework.afu.scenelib.Annotation; import org.checkerframework.afu.scenelib.io.IndexFileParser; import org.checkerframework.afu.scenelib.util.coll.VivifyingMap; +import org.checkerframework.checker.signature.qual.BinaryName; +import org.checkerframework.checker.signature.qual.ClassGetName; /** * An AScene (annotated scene) represents the annotations on a set of Java classes and @@ -57,8 +59,8 @@ public class AScene implements Cloneable { public final Map> imports = new LinkedHashMap<>(); /** This scene's annotated classes; map key is class name */ - public final VivifyingMap classes = - new VivifyingMap(new LinkedHashMap<>()) { + public final VivifyingMap<@BinaryName String, AClass> classes = + new VivifyingMap<@BinaryName String, AClass>(new LinkedHashMap<>()) { @Override public AClass createValueFor(String k) { return new AClass(k); @@ -133,7 +135,7 @@ public int hashCode() { * * @return an immutable map from binary names to AClass objects */ - public Map getClasses() { + public Map<@ClassGetName String, AClass> getClasses() { return ImmutableMap.copyOf(classes); } diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/LocalLocation.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/LocalLocation.java index 3610365d3..7e30ce711 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/LocalLocation.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/el/LocalLocation.java @@ -173,7 +173,7 @@ public boolean equals(LocalLocation o) { } @Override - public boolean equals(/*@ReadOnly*/ Object o) { + public boolean equals(Object o) { return o instanceof LocalLocation && equals((LocalLocation) o); } diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/ASTIndex.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/ASTIndex.java index fe50c19a4..fdd107aa1 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/ASTIndex.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/ASTIndex.java @@ -63,6 +63,7 @@ import org.checkerframework.afu.annotator.find.CaseUtils; import org.checkerframework.afu.scenelib.util.JVMNames; import org.checkerframework.afu.scenelib.util.coll.WrapperMap; +import org.checkerframework.checker.signature.qual.BinaryName; /** Cache of {@code ASTPath} data for the nodes of a compilation unit tree. */ public class ASTIndex extends WrapperMap { @@ -134,7 +135,7 @@ private void saveAll( * @param node the class */ private void saveClass(ClassTree node) { - String className = ((JCTree.JCClassDecl) node).sym.flatname.toString(); + @BinaryName String className = ((JCTree.JCClassDecl) node).sym.flatname.toString(); ASTRecord rec = new ASTRecord(cut, className, null, null, ASTPath.empty()); counters.push(0); node.accept(this, rec); @@ -261,7 +262,7 @@ public Void visitClass(ClassTree node, ASTRecord rec) { if (member.getKind() == Tree.Kind.BLOCK) { save(member, rec, kind, ASTPath.INITIALIZER, i++); } else if (ASTPath.isClassEquiv(member.getKind())) { - String className = ((JCTree.JCClassDecl) member).sym.flatname.toString(); + @BinaryName String className = ((JCTree.JCClassDecl) member).sym.flatname.toString(); member.accept(this, new ASTRecord(cut, className, null, null, ASTPath.empty())); } else { member.accept(this, rec); @@ -402,7 +403,7 @@ public Void visitNewClass(NewClassTree node, ASTRecord rec) { saveAll(node.getArguments(), rec, kind, ASTPath.ARGUMENT); if (classBody != null) { Name name = classBody.getSimpleName(); - String className = null; + @BinaryName String className = null; if (name == null || name.toString().isEmpty()) { int i = counters.pop(); counters.push(++i); @@ -617,7 +618,7 @@ public static Tree getNode(CompilationUnitTree cut, ASTRecord rec) { ExpressionTree et = cut.getPackageName(); String pkg = et == null ? "" : et.toString(); if (!pkg.isEmpty() && rec.className.indexOf('.') < 0) { - String className = pkg + "." + rec.className; + @BinaryName String className = pkg + "." + rec.className; rec = new ASTRecord(cut, className, rec.methodName, rec.varName, rec.astPath); } return revIndex.get(rec); diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/ASTRecord.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/ASTRecord.java index ff11e31fa..59f65da08 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/ASTRecord.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/ASTRecord.java @@ -10,6 +10,7 @@ import java.util.ArrayDeque; import java.util.Deque; import java.util.Objects; +import org.checkerframework.checker.signature.qual.BinaryName; /** * Structure bundling an {@link ASTPath} with information about its starting point. Necessary @@ -20,7 +21,7 @@ public class ASTRecord implements Comparable { public final CompilationUnitTree ast; /** Name of the enclosing class declaration. */ - public final String className; + public final @BinaryName String className; /** Name of the enclosing method declaration, or null if there is none. */ public final String methodName; @@ -42,7 +43,7 @@ public class ASTRecord implements Comparable { */ public ASTRecord( CompilationUnitTree ast, - String className, + @BinaryName String className, String methodName, String varName, ASTPath astPath) { diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/IndexFileParser.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/IndexFileParser.java index c8ba04948..0450e168e 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/IndexFileParser.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/IndexFileParser.java @@ -1654,7 +1654,7 @@ private BoundedType parseBoundedType(DeclaredType type) throws IOException, Pars private void parseClass() throws IOException, ParseException { expectKeyword("class"); String basename = expectIdentifier(); - String fullName = curPkgPrefix + basename; + @BinaryName String fullName = curPkgPrefix + basename; AClass c = scene.classes.getVivify(fullName); expectChar(':'); diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/JavapParser.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/JavapParser.java index 59db2a7f8..b21ce069d 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/JavapParser.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/JavapParser.java @@ -392,7 +392,7 @@ private void parse() throws IOException, ParseException { trim("class "); trim("interface "); int nameEnd = line.indexOf(' '); - String className = (nameEnd == -1) ? line : line.substring(0, line.indexOf(' ')); + @BinaryName String className = (nameEnd == -1) ? line : line.substring(0, line.indexOf(' ')); String pp = IOUtils.packagePart(className); String bp = IOUtils.basenamePart(className); nextLine(); diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/classfile/ClassAnnotationSceneReader.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/classfile/ClassAnnotationSceneReader.java index 5719cf7e0..ea3d55d8c 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/classfile/ClassAnnotationSceneReader.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/classfile/ClassAnnotationSceneReader.java @@ -36,6 +36,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.signature.qual.BinaryName; import org.checkerframework.checker.signature.qual.ClassGetName; +import org.checkerframework.checker.signature.qual.InternalForm; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; @@ -130,10 +131,10 @@ public ClassAnnotationSceneReader( public void visit( int version, int access, - String name, + @InternalForm String name, String signature, String superName, - String[] interfaces) { + @InternalForm String @Nullable [] interfaces) { classWriter.visit(version, access, name, signature, superName, interfaces); aClass = scene.classes.getVivify(name.replace('/', '.')); } diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/classfile/ClassAnnotationSceneWriter.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/classfile/ClassAnnotationSceneWriter.java index 6cb126a98..427132c7b 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/classfile/ClassAnnotationSceneWriter.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/io/classfile/ClassAnnotationSceneWriter.java @@ -151,11 +151,12 @@ public byte[] toByteArray() { return ((ClassWriter) cv).toByteArray(); } + @SuppressWarnings("override.param") // ASM is not annotated @Override public void visit( int version, int access, - String name, + @ClassGetName String name, String signature, String superName, String[] interfaces) { diff --git a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/tools/IndexFileMerger.java b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/tools/IndexFileMerger.java index 85fc159f5..2486bb124 100644 --- a/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/tools/IndexFileMerger.java +++ b/annotation-file-utilities/src/main/java/org/checkerframework/afu/scenelib/tools/IndexFileMerger.java @@ -32,6 +32,7 @@ import org.checkerframework.afu.scenelib.io.IndexFileParser; import org.checkerframework.afu.scenelib.io.IndexFileWriter; import org.checkerframework.afu.scenelib.util.CommandLineUtils; +import org.checkerframework.checker.signature.qual.BinaryName; import org.plumelib.util.FileIOException; /** Utility for merging index files, including multiple versions for the same class. */ @@ -42,7 +43,7 @@ public static void main(String[] args) { System.exit(0); } - final SetMultimap annotatedFor = HashMultimap.create(); + final SetMultimap<@BinaryName String, String> annotatedFor = HashMultimap.create(); String[] inputArgs; // TODO: document assumptions @@ -84,7 +85,8 @@ public static void main(String[] args) { int ix = relPath.indexOf(File.separator); String subdir = ix < 0 ? relPath : relPath.substring(0, ix); // trim .jaif or .jann and subdir, convert directory to package id - String classname = + @SuppressWarnings("signature:assignment") // string manipulation + @BinaryName String classname = relPath .substring(0, relPath.lastIndexOf('.')) .substring(relPath.indexOf('/') + 1) @@ -259,8 +261,9 @@ public Void visitElement(AElement el, Void v) { AnnotationDef afDef = Annotations.createValueAnnotationDef( "AnnotatedFor", Collections.emptySet(), stringArray, "IndexFileMerger"); - for (Map.Entry> entry : annotatedFor.asMap().entrySet()) { - String key = entry.getKey(); + for (Map.Entry<@BinaryName String, Collection> entry : + annotatedFor.asMap().entrySet()) { + @BinaryName String key = entry.getKey(); Collection values = entry.getValue(); Annotation afAnno = new Annotation(