[KeepAnno] Use unqualified name in class name patterns

The use of "simple name" was misleading as it was not aligned with the
meaning of "simple name" in java. This updates the naming to
"unqualified" which aligns with it being all of the name that is *not*
the package prefix.

Change-Id: I598f2f3d120b8a7833cb2ae46f324226646874d6
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/AnnotationPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/AnnotationPattern.java
index cfd4302..0327246 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/AnnotationPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/AnnotationPattern.java
@@ -69,7 +69,7 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern namePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern namePattern() default @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Specify which retention policies must be set for the annotations.
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/ClassNamePattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/ClassNamePattern.java
index 58b9fe8..3c9e261 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/ClassNamePattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/ClassNamePattern.java
@@ -29,8 +29,8 @@
    *
    * <ul>
    *   <li>constant
-   *   <li>simpleName
-   *   <li>simpleNamePattern
+   *   <li>unqualifiedName
+   *   <li>unqualifiedNamePattern
    *   <li>packageName
    * </ul>
    *
@@ -45,8 +45,8 @@
    *
    * <ul>
    *   <li>name
-   *   <li>simpleName
-   *   <li>simpleNamePattern
+   *   <li>unqualifiedName
+   *   <li>unqualifiedNamePattern
    *   <li>packageName
    * </ul>
    *
@@ -55,38 +55,40 @@
   Class<?> constant() default Object.class;
 
   /**
-   * Exact simple name of the class or interface.
+   * Exact and unqualified name of the class or interface.
    *
-   * <p>For example, the simple name of {@code com.example.MyClass} is {@code MyClass}.
+   * <p>For example, the unqualified name of {@code com.example.MyClass} is {@code MyClass}. Note
+   * that for inner classes a `$` will appear in the unqualified name,such as, {@code
+   * MyClass$MyInnerClass}.
    *
-   * <p>The default matches any simple name.
+   * <p>The default matches any unqualified name.
    *
-   * <p>Mutually exclusive with the following other properties defining class-simple-name:
+   * <p>Mutually exclusive with the following other properties defining class-unqualified-name:
    *
    * <ul>
-   *   <li>simpleNamePattern
+   *   <li>unqualifiedNamePattern
    *   <li>name
    *   <li>constant
    * </ul>
    */
-  String simpleName() default "";
+  String unqualifiedName() default "";
 
   /**
-   * Define the simple-name pattern by a string pattern.
+   * Define the unqualified class-name pattern by a string pattern.
    *
-   * <p>The default matches any simple name.
+   * <p>The default matches any unqualified name.
    *
-   * <p>Mutually exclusive with the following other properties defining class-simple-name:
+   * <p>Mutually exclusive with the following other properties defining class-unqualified-name:
    *
    * <ul>
-   *   <li>simpleName
+   *   <li>unqualifiedName
    *   <li>name
    *   <li>constant
    * </ul>
    *
-   * @return The string pattern of the class simple name.
+   * @return The string pattern of the unqualified class name.
    */
-  StringPattern simpleNamePattern() default @StringPattern(exact = "");
+  StringPattern unqualifiedNamePattern() default @StringPattern(exact = "");
 
   /**
    * Exact package name of the class or interface.
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/InstanceOfPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/InstanceOfPattern.java
index 591d750..975f144 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/InstanceOfPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/InstanceOfPattern.java
@@ -31,5 +31,5 @@
   boolean inclusive() default true;
 
   /** Instances of classes matching the class-name pattern. */
-  ClassNamePattern classNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern classNamePattern() default @ClassNamePattern(unqualifiedName = "");
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepBinding.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepBinding.java
index f92ab49..68adfaa 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepBinding.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepBinding.java
@@ -140,7 +140,7 @@
    *
    * @return The class-name pattern that defines the class.
    */
-  ClassNamePattern classNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern classNamePattern() default @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the instance-of pattern as classes that are instances of the fully qualified class name.
@@ -295,7 +295,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern classAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern classAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the member-annotated-by pattern by fully qualified class name.
@@ -355,7 +356,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern memberAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern memberAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the member-access pattern by matching on access flags.
@@ -422,7 +424,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern methodAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern methodAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the method-access pattern by matching on access flags.
@@ -604,7 +607,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern fieldAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern fieldAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the field-access pattern by matching on access flags.
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepCondition.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepCondition.java
index 65d13d8..90b641e 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepCondition.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepCondition.java
@@ -102,7 +102,7 @@
    *
    * @return The class-name pattern that defines the class.
    */
-  ClassNamePattern classNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern classNamePattern() default @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the instance-of pattern as classes that are instances of the fully qualified class name.
@@ -257,7 +257,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern classAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern classAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the member pattern in full by a reference to a binding.
@@ -330,7 +331,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern memberAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern memberAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the member-access pattern by matching on access flags.
@@ -402,7 +404,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern methodAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern methodAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the method-access pattern by matching on access flags.
@@ -612,7 +615,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern fieldAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern fieldAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the field-access pattern by matching on access flags.
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepForApi.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepForApi.java
index aac3246..6a06f60 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepForApi.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepForApi.java
@@ -115,7 +115,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern memberAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern memberAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the member-access pattern by matching on access flags.
@@ -182,7 +183,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern methodAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern methodAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the method-access pattern by matching on access flags.
@@ -364,7 +366,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern fieldAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern fieldAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the field-access pattern by matching on access flags.
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepTarget.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepTarget.java
index e7e8c74..04f1aac 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepTarget.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/KeepTarget.java
@@ -199,7 +199,7 @@
    *
    * @return The class-name pattern that defines the class.
    */
-  ClassNamePattern classNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern classNamePattern() default @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the instance-of pattern as classes that are instances of the fully qualified class name.
@@ -354,7 +354,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern classAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern classAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the member pattern in full by a reference to a binding.
@@ -427,7 +428,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern memberAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern memberAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the member-access pattern by matching on access flags.
@@ -499,7 +501,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern methodAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern methodAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the method-access pattern by matching on access flags.
@@ -709,7 +712,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern fieldAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern fieldAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the field-access pattern by matching on access flags.
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/TypePattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/TypePattern.java
index 2fa0ffd..47fdb1d 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/TypePattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/TypePattern.java
@@ -62,5 +62,5 @@
    *   <li>constant
    * </ul>
    */
-  ClassNamePattern classNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern classNamePattern() default @ClassNamePattern(unqualifiedName = "");
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByNative.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByNative.java
index 076a93c..4bf6253 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByNative.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByNative.java
@@ -205,7 +205,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern memberAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern memberAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the member-access pattern by matching on access flags.
@@ -272,7 +273,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern methodAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern methodAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the method-access pattern by matching on access flags.
@@ -454,7 +456,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern fieldAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern fieldAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the field-access pattern by matching on access flags.
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByReflection.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByReflection.java
index cf2225d..4a0c692 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByReflection.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/UsedByReflection.java
@@ -205,7 +205,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern memberAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern memberAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the member-access pattern by matching on access flags.
@@ -272,7 +273,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern methodAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern methodAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the method-access pattern by matching on access flags.
@@ -454,7 +456,8 @@
    *
    * @return The class-name pattern that defines the annotation.
    */
-  ClassNamePattern fieldAnnotatedByClassNamePattern() default @ClassNamePattern(simpleName = "");
+  ClassNamePattern fieldAnnotatedByClassNamePattern() default
+      @ClassNamePattern(unqualifiedName = "");
 
   /**
    * Define the field-access pattern by matching on access flags.
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/ClassNameParser.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/ClassNameParser.java
index e066873..538c8ca 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/ClassNameParser.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/asm/ClassNameParser.java
@@ -5,7 +5,7 @@
 package com.android.tools.r8.keepanno.asm;
 
 import com.android.tools.r8.keepanno.asm.ClassNameParser.ClassNameProperty;
-import com.android.tools.r8.keepanno.asm.ClassSimpleNameParser.ClassSimpleNameProperty;
+import com.android.tools.r8.keepanno.asm.ClassUnqualifiedNameParser.ClassUnqualifiedNameProperty;
 import com.android.tools.r8.keepanno.asm.PackageNameParser.PackageNameProperty;
 import com.android.tools.r8.keepanno.asm.TypeParser.TypeProperty;
 import com.android.tools.r8.keepanno.ast.AnnotationConstants.ClassNamePattern;
@@ -85,23 +85,27 @@
               getParsingContext().property(name).annotation(descriptor);
           ClassNameParser fullNameParser = new ClassNameParser(parsingContext);
           PackageNameParser packageParser = new PackageNameParser(parsingContext);
-          ClassSimpleNameParser simpleNameParser = new ClassSimpleNameParser(parsingContext);
+          ClassUnqualifiedNameParser unqualifiedNameParser =
+              new ClassUnqualifiedNameParser(parsingContext);
           fullNameParser.setProperty(ClassNamePattern.name, ClassNameProperty.NAME);
           fullNameParser.setProperty(ClassNamePattern.constant, ClassNameProperty.CONSTANT);
           packageParser.setProperty(ClassNamePattern.packageName, PackageNameProperty.NAME);
-          simpleNameParser.setProperty(ClassNamePattern.simpleName, ClassSimpleNameProperty.NAME);
-          simpleNameParser.setProperty(
-              ClassNamePattern.simpleNamePattern, ClassSimpleNameProperty.PATTERN);
+          unqualifiedNameParser.setProperty(
+              ClassNamePattern.unqualifiedName, ClassUnqualifiedNameProperty.NAME);
+          unqualifiedNameParser.setProperty(
+              ClassNamePattern.unqualifiedNamePattern, ClassUnqualifiedNameProperty.PATTERN);
 
           return new ParserVisitor(
               parsingContext,
-              ImmutableList.of(fullNameParser, packageParser, simpleNameParser),
+              ImmutableList.of(fullNameParser, packageParser, unqualifiedNameParser),
               () -> {
                 if (fullNameParser.isDeclared()) {
-                  if (simpleNameParser.isDeclared() || packageParser.isDeclared()) {
+                  if (unqualifiedNameParser.isDeclared() || packageParser.isDeclared()) {
                     throw parsingContext.error(
                         "Cannot specify both the full class name and its "
-                            + (simpleNameParser.isDeclared() ? "simple name" : "package"));
+                            + (unqualifiedNameParser.isDeclared()
+                                ? "unqualified name"
+                                : "package"));
                   }
                   setValue.accept(fullNameParser.getValue());
                   return;
@@ -111,7 +115,7 @@
                         .setPackagePattern(
                             packageParser.getValueOrDefault(KeepPackagePattern.any()))
                         .setNamePattern(
-                            simpleNameParser.getValueOrDefault(
+                            unqualifiedNameParser.getValueOrDefault(
                                 KeepUnqualfiedClassNamePattern.any()))
                         .build());
               });
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/ClassSimpleNameParser.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/ClassUnqualifiedNameParser.java
similarity index 79%
rename from src/keepanno/java/com/android/tools/r8/keepanno/asm/ClassSimpleNameParser.java
rename to src/keepanno/java/com/android/tools/r8/keepanno/asm/ClassUnqualifiedNameParser.java
index d65aa22..896fea9 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/ClassSimpleNameParser.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/asm/ClassUnqualifiedNameParser.java
@@ -1,34 +1,34 @@
-// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 package com.android.tools.r8.keepanno.asm;
 
-import com.android.tools.r8.keepanno.asm.ClassSimpleNameParser.ClassSimpleNameProperty;
+import com.android.tools.r8.keepanno.asm.ClassUnqualifiedNameParser.ClassUnqualifiedNameProperty;
 import com.android.tools.r8.keepanno.asm.StringPatternParser.StringProperty;
 import com.android.tools.r8.keepanno.ast.KeepUnqualfiedClassNamePattern;
 import com.android.tools.r8.keepanno.ast.ParsingContext;
 import java.util.function.Consumer;
 import org.objectweb.asm.AnnotationVisitor;
 
-public class ClassSimpleNameParser
-    extends PropertyParserBase<KeepUnqualfiedClassNamePattern, ClassSimpleNameProperty> {
+public class ClassUnqualifiedNameParser
+    extends PropertyParserBase<KeepUnqualfiedClassNamePattern, ClassUnqualifiedNameProperty> {
 
   private final StringPatternParser parser;
 
-  public ClassSimpleNameParser(ParsingContext parsingContext) {
+  public ClassUnqualifiedNameParser(ParsingContext parsingContext) {
     super(parsingContext);
     parser = new StringPatternParser(parsingContext);
   }
 
-  public enum ClassSimpleNameProperty {
+  public enum ClassUnqualifiedNameProperty {
     NAME,
     PATTERN
   }
 
   @Override
   public boolean tryProperty(
-      ClassSimpleNameProperty property,
+      ClassUnqualifiedNameProperty property,
       String name,
       Object value,
       Consumer<KeepUnqualfiedClassNamePattern> setValue) {
@@ -47,7 +47,7 @@
 
   @Override
   AnnotationVisitor tryPropertyAnnotation(
-      ClassSimpleNameProperty property,
+      ClassUnqualifiedNameProperty property,
       String name,
       String descriptor,
       Consumer<KeepUnqualfiedClassNamePattern> setValue) {
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java
index 07789a5..9151b1b 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java
@@ -503,7 +503,7 @@
             v.visit(ClassNamePattern.packageName, packagePattern.getExactPackageAsString());
           }
           writeStringPattern(
-              clazz.getNamePattern().asStringPattern(), ClassNamePattern.simpleNamePattern, v);
+              clazz.getNamePattern().asStringPattern(), ClassNamePattern.unqualifiedNamePattern, v);
         });
   }
 
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java
index f529bd1..9b0ae29 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java
@@ -245,9 +245,9 @@
     public static final String classNameGroup = "class-name";
     public static final String name = "name";
     public static final String constant = "constant";
-    public static final String classSimpleNameGroup = "class-simple-name";
-    public static final String simpleName = "simpleName";
-    public static final String simpleNamePattern = "simpleNamePattern";
+    public static final String classUnqualifiedNameGroup = "class-unqualified-name";
+    public static final String unqualifiedName = "unqualifiedName";
+    public static final String unqualifiedNamePattern = "unqualifiedNamePattern";
     public static final String packageName = "packageName";
   }
 
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java
index 9932654..e2ce313 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java
@@ -81,7 +81,7 @@
  *     ::= any
  *       | PACKAGE_PATTERN UNQUALIFIED_CLASS_NAME_PATTERN
  *
- *   UNQUALIFIED_CLASS_NAME_PATTERN ::= any | exact simple-class-name
+ *   UNQUALIFIED_CLASS_NAME_PATTERN ::= STRING_PATTERN
  *
  *   INSTANCE_OF_PATTERN ::= INSTANCE_OF_PATTERN_INCLUSIVE | INSTANCE_OF_PATTERN_EXCLUSIVE
  *   INSTANCE_OF_PATTERN_INCLUSIVE ::= QUALIFIED_CLASS_NAME_PATTERN
@@ -128,6 +128,10 @@
  *
  *   RETENTION_POLICY
  *     ::= RUNTIME | CLASS
+ *
+ *   STRING_PATTERN
+ *     ::= exact string-content
+ *       | [prefix string-content] any [suffix string-content]
  * </pre>
  */
 public final class KeepEdge extends KeepDeclaration {
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepUnqualfiedClassNamePattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepUnqualfiedClassNamePattern.java
index abb24be..a974f67 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepUnqualfiedClassNamePattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepUnqualfiedClassNamePattern.java
@@ -24,26 +24,26 @@
     return new Builder();
   }
 
-  private final KeepStringPattern simpleNamePattern;
+  private final KeepStringPattern unqualifiedNamePattern;
 
-  private KeepUnqualfiedClassNamePattern(KeepStringPattern simpleNamePattern) {
-    this.simpleNamePattern = simpleNamePattern;
+  private KeepUnqualfiedClassNamePattern(KeepStringPattern unqualifiedNamePattern) {
+    this.unqualifiedNamePattern = unqualifiedNamePattern;
   }
 
   public boolean isAny() {
-    return simpleNamePattern.isAny();
+    return unqualifiedNamePattern.isAny();
   }
 
   public boolean isExact() {
-    return simpleNamePattern.isExact();
+    return unqualifiedNamePattern.isExact();
   }
 
   public String asExactString() {
-    return simpleNamePattern.asExactString();
+    return unqualifiedNamePattern.asExactString();
   }
 
   public KeepStringPattern asStringPattern() {
-    return simpleNamePattern;
+    return unqualifiedNamePattern;
   }
 
   @Override
@@ -55,17 +55,17 @@
       return false;
     }
     KeepUnqualfiedClassNamePattern that = (KeepUnqualfiedClassNamePattern) o;
-    return simpleNamePattern.equals(that.simpleNamePattern);
+    return unqualifiedNamePattern.equals(that.unqualifiedNamePattern);
   }
 
   @Override
   public int hashCode() {
-    return simpleNamePattern.hashCode();
+    return unqualifiedNamePattern.hashCode();
   }
 
   @Override
   public String toString() {
-    return simpleNamePattern.toString();
+    return unqualifiedNamePattern.toString();
   }
 
   public static class Builder {
diff --git a/src/test/java/com/android/tools/r8/keepanno/ClassNameStringPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/ClassNameStringPatternsTest.java
index 02195c5..43cf4a7 100644
--- a/src/test/java/com/android/tools/r8/keepanno/ClassNameStringPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/ClassNameStringPatternsTest.java
@@ -80,7 +80,7 @@
             @TypePattern(
                 classNamePattern =
                     @ClassNamePattern(
-                        simpleNamePattern =
+                        unqualifiedNamePattern =
                             @StringPattern(startsWith = "ClassNameStringPatternsTest$Foo")))
           }),
       @KeepTarget(
@@ -89,7 +89,7 @@
           methodParameterTypePatterns = {
             @TypePattern(
                 classNamePattern =
-                    @ClassNamePattern(simpleNamePattern = @StringPattern(endsWith = "Bar")))
+                    @ClassNamePattern(unqualifiedNamePattern = @StringPattern(endsWith = "Bar")))
           }),
     })
     public void foo() throws Exception {
diff --git a/src/test/java/com/android/tools/r8/keepanno/MembersAnnotatedByPatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/MembersAnnotatedByPatternsTest.java
index 52850da..a024909 100644
--- a/src/test/java/com/android/tools/r8/keepanno/MembersAnnotatedByPatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/MembersAnnotatedByPatternsTest.java
@@ -121,10 +121,11 @@
           classConstant = OnMethods.class,
           kind = KeepItemKind.CLASS_AND_METHODS,
           methodAnnotatedByClassNamePattern =
-              @ClassNamePattern(simpleName = "MembersAnnotatedByPatternsTest$C"),
+              @ClassNamePattern(unqualifiedName = "MembersAnnotatedByPatternsTest$C"),
           constrainAnnotations =
               @AnnotationPattern(
-                  namePattern = @ClassNamePattern(simpleName = "MembersAnnotatedByPatternsTest$C")))
+                  namePattern =
+                      @ClassNamePattern(unqualifiedName = "MembersAnnotatedByPatternsTest$C")))
     })
     public void foo(Class<?> clazz) throws Exception {
       for (Field field : clazz.getDeclaredFields()) {
diff --git a/src/test/java/com/android/tools/r8/keepanno/classpatterns/ClassNamePatternsTest.java b/src/test/java/com/android/tools/r8/keepanno/classpatterns/ClassNamePatternsTest.java
index 699ddd6..d6b97d1 100644
--- a/src/test/java/com/android/tools/r8/keepanno/classpatterns/ClassNamePatternsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/classpatterns/ClassNamePatternsTest.java
@@ -195,7 +195,7 @@
     @UsesReflection({
       @KeepTarget(
           kind = KeepItemKind.CLASS_AND_METHODS,
-          classNamePattern = @ClassNamePattern(simpleName = "B"),
+          classNamePattern = @ClassNamePattern(unqualifiedName = "B"),
           methodName = "foo",
           methodReturnTypeConstant = String.class)
     })
@@ -216,13 +216,13 @@
             kind = KeepItemKind.CLASS_AND_METHODS,
             classNamePattern =
                 @ClassNamePattern(
-                    simpleName = "A",
+                    unqualifiedName = "A",
                     packageName = "com.android.tools.r8.keepanno.classpatterns.pkg2"),
             methodName = "foo",
             methodReturnTypePattern =
                 @TypePattern(
                     classNamePattern =
-                        @ClassNamePattern(packageName = "java.lang", simpleName = "String"))))
+                        @ClassNamePattern(packageName = "java.lang", unqualifiedName = "String"))))
     public void foo() throws Exception {
       Util.lookupClassesAndInvokeMethods();
     }
@@ -240,11 +240,11 @@
             kind = KeepItemKind.CLASS_AND_METHODS,
             classNamePattern =
                 @ClassNamePattern(
-                    simpleName = "A",
+                    unqualifiedName = "A",
                     packageName = "com.android.tools.r8.keepanno.classpatterns.pkg2"),
             methodName = "foo",
             methodReturnTypePattern =
-                @TypePattern(classNamePattern = @ClassNamePattern(simpleName = "String"))))
+                @TypePattern(classNamePattern = @ClassNamePattern(unqualifiedName = "String"))))
     public void foo() throws Exception {
       Util.lookupClassesAndInvokeMethods();
     }
diff --git a/src/test/java/com/android/tools/r8/keepanno/utils/KeepAnnoMarkdownGenerator.java b/src/test/java/com/android/tools/r8/keepanno/utils/KeepAnnoMarkdownGenerator.java
index f79c36e..5a45f17 100644
--- a/src/test/java/com/android/tools/r8/keepanno/utils/KeepAnnoMarkdownGenerator.java
+++ b/src/test/java/com/android/tools/r8/keepanno/utils/KeepAnnoMarkdownGenerator.java
@@ -25,8 +25,8 @@
 import static com.android.tools.r8.keepanno.utils.KeepItemAnnotationGenerator.USED_BY_NATIVE;
 import static com.android.tools.r8.keepanno.utils.KeepItemAnnotationGenerator.USED_BY_REFLECTION;
 import static com.android.tools.r8.keepanno.utils.KeepItemAnnotationGenerator.USES_REFLECTION;
+import static com.android.tools.r8.keepanno.utils.KeepItemAnnotationGenerator.getUnqualifiedName;
 import static com.android.tools.r8.keepanno.utils.KeepItemAnnotationGenerator.quote;
-import static com.android.tools.r8.keepanno.utils.KeepItemAnnotationGenerator.simpleName;
 
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.keepanno.doctests.ForApiDocumentationTest;
@@ -116,7 +116,7 @@
   }
 
   private static String getPrefix(ClassReference annoType) {
-    return "`@" + simpleName(annoType);
+    return "`@" + getUnqualifiedName(annoType);
   }
 
   private static String getSuffix() {
@@ -196,24 +196,24 @@
   }
 
   private String getMdAnnotationLink(ClassReference clazz) {
-    return "[@" + simpleName(clazz) + "](" + getClassJavaDocUrl(clazz) + ")";
+    return "[@" + getUnqualifiedName(clazz) + "](" + getClassJavaDocUrl(clazz) + ")";
   }
 
   private String getMdAnnotationPropertyLink(ClassReference clazz, GroupMember method) {
     String methodName = method.name;
     String url = getClassJavaDocUrl(clazz) + "#" + methodName + "()";
-    return "[@" + simpleName(clazz) + "." + methodName + "](" + url + ")";
+    return "[@" + getUnqualifiedName(clazz) + "." + methodName + "](" + url + ")";
   }
 
   private String getMdEnumLink(ClassReference clazz) {
-    return "[" + simpleName(clazz) + "](" + getClassJavaDocUrl(clazz) + ")";
+    return "[" + getUnqualifiedName(clazz) + "](" + getClassJavaDocUrl(clazz) + ")";
   }
 
   private String getMdEnumMemberLink(EnumReference enumMember) {
     ClassReference clazz = enumMember.enumClass;
     String enumName = enumMember.name();
     String url = getClassJavaDocUrl(clazz) + "#" + enumName;
-    return "[" + simpleName(clazz) + "." + enumName + "](" + url + ")";
+    return "[" + getUnqualifiedName(clazz) + "." + enumName + "](" + url + ")";
   }
 
   private void println() {
diff --git a/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java b/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
index c2a658d..b6be4dc 100644
--- a/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
+++ b/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
@@ -199,20 +199,20 @@
       ImmutableList.of(FIELD_ACCESS_VOLATILE, FIELD_ACCESS_TRANSIENT);
 
   private static final String DEFAULT_INVALID_STRING_PATTERN =
-      "@" + simpleName(STRING_PATTERN) + "(exact = \"\")";
+      "@" + getUnqualifiedName(STRING_PATTERN) + "(exact = \"\")";
   private static final String DEFAULT_INVALID_TYPE_PATTERN =
-      "@" + simpleName(TYPE_PATTERN) + "(name = \"\")";
+      "@" + getUnqualifiedName(TYPE_PATTERN) + "(name = \"\")";
   private static final String DEFAULT_INVALID_CLASS_NAME_PATTERN =
-      "@" + simpleName(CLASS_NAME_PATTERN) + "(simpleName = \"\")";
+      "@" + getUnqualifiedName(CLASS_NAME_PATTERN) + "(unqualifiedName = \"\")";
   private static final String DEFAULT_ANY_INSTANCE_OF_PATTERN =
-      "@" + simpleName(INSTANCE_OF_PATTERN) + "()";
+      "@" + getUnqualifiedName(INSTANCE_OF_PATTERN) + "()";
 
-  private static ClassReference astClass(String simpleName) {
-    return classFromTypeName(AST_PKG + simpleName);
+  private static ClassReference astClass(String unqualifiedName) {
+    return classFromTypeName(AST_PKG + unqualifiedName);
   }
 
-  private static ClassReference annoClass(String simpleName) {
-    return classFromTypeName(ANNO_PKG + simpleName);
+  private static ClassReference annoClass(String unqualifiedName) {
+    return classFromTypeName(ANNO_PKG + unqualifiedName);
   }
 
   private static EnumReference enumRef(ClassReference enumClass, String valueName) {
@@ -223,7 +223,7 @@
     return "\"" + str + "\"";
   }
 
-  public static String simpleName(ClassReference clazz) {
+  public static String getUnqualifiedName(ClassReference clazz) {
     String binaryName = clazz.getBinaryName();
     return binaryName.substring(binaryName.lastIndexOf('/') + 1);
   }
@@ -271,12 +271,12 @@
 
     public GroupMember requiredValue(ClassReference type) {
       assert valueDefault == null;
-      return setType(simpleName(type));
+      return setType(getUnqualifiedName(type));
     }
 
     public GroupMember requiredArrayValue(ClassReference type) {
       assert valueDefault == null;
-      return setType(simpleName(type) + "[]");
+      return setType(getUnqualifiedName(type) + "[]");
     }
 
     public GroupMember requiredStringValue() {
@@ -289,12 +289,12 @@
     }
 
     public GroupMember defaultValue(ClassReference type, String value) {
-      setType(simpleName(type));
+      setType(getUnqualifiedName(type));
       return setValue(value);
     }
 
     public GroupMember defaultArrayValue(ClassReference type, String value) {
-      setType(simpleName(type) + "[]");
+      setType(getUnqualifiedName(type) + "[]");
       return setValue("{" + value + "}");
     }
 
@@ -640,21 +640,23 @@
                   .defaultObjectClass());
     }
 
-    private Group classNamePatternSimpleNameGroup() {
-      return new Group("class-simple-name")
+    private Group classNamePatternUnqualifiedNameGroup() {
+      return new Group("class-unqualified-name")
           .addMember(
-              new GroupMember("simpleName")
-                  .setDocTitle("Exact simple name of the class or interface.")
+              new GroupMember("unqualifiedName")
+                  .setDocTitle("Exact and unqualified name of the class or interface.")
                   .addParagraph(
-                      "For example, the simple name of {@code com.example.MyClass} is {@code"
-                          + " MyClass}.")
-                  .addParagraph("The default matches any simple name.")
+                      "For example, the unqualified name of {@code com.example.MyClass} is {@code"
+                          + " MyClass}.",
+                      "Note that for inner classes a `$` will appear in the unqualified name,"
+                          + "such as, {@code MyClass$MyInnerClass}.")
+                  .addParagraph("The default matches any unqualified name.")
                   .defaultEmptyString())
           .addMember(
-              new GroupMember("simpleNamePattern")
-                  .setDocTitle("Define the simple-name pattern by a string pattern.")
-                  .addParagraph("The default matches any simple name.")
-                  .setDocReturn("The string pattern of the class simple name.")
+              new GroupMember("unqualifiedNamePattern")
+                  .setDocTitle("Define the unqualified class-name pattern by a string pattern.")
+                  .setDocReturn("The string pattern of the unqualified class name.")
+                  .addParagraph("The default matches any unqualified name.")
                   .defaultValue(STRING_PATTERN, DEFAULT_INVALID_STRING_PATTERN));
     }
 
@@ -1246,7 +1248,7 @@
           .printDoc(this::println);
       println("@Target(ElementType.ANNOTATION_TYPE)");
       println("@Retention(RetentionPolicy.CLASS)");
-      println("public @interface " + simpleName(STRING_PATTERN) + " {");
+      println("public @interface " + getUnqualifiedName(STRING_PATTERN) + " {");
       println();
       withIndent(
           () -> {
@@ -1275,7 +1277,7 @@
           .printDoc(this::println);
       println("@Target(ElementType.ANNOTATION_TYPE)");
       println("@Retention(RetentionPolicy.CLASS)");
-      println("public @interface " + simpleName(TYPE_PATTERN) + " {");
+      println("public @interface " + getUnqualifiedName(TYPE_PATTERN) + " {");
       println();
       withIndent(() -> typePatternGroup().generate(this));
       println();
@@ -1294,18 +1296,18 @@
           .printDoc(this::println);
       println("@Target(ElementType.ANNOTATION_TYPE)");
       println("@Retention(RetentionPolicy.CLASS)");
-      println("public @interface " + simpleName(CLASS_NAME_PATTERN) + " {");
+      println("public @interface " + getUnqualifiedName(CLASS_NAME_PATTERN) + " {");
       println();
       withIndent(
           () -> {
             Group exactNameGroup = classNamePatternFullNameGroup();
-            Group simpleNameGroup = classNamePatternSimpleNameGroup();
+            Group unqualifiedNameGroup = classNamePatternUnqualifiedNameGroup();
             Group packageGroup = classNamePatternPackageGroup();
-            exactNameGroup.addMutuallyExclusiveGroups(simpleNameGroup, packageGroup);
+            exactNameGroup.addMutuallyExclusiveGroups(unqualifiedNameGroup, packageGroup);
 
             exactNameGroup.generate(this);
             println();
-            simpleNameGroup.generate(this);
+            unqualifiedNameGroup.generate(this);
             println();
             packageGroup.generate(this);
           });
@@ -1323,7 +1325,7 @@
           .printDoc(this::println);
       println("@Target(ElementType.ANNOTATION_TYPE)");
       println("@Retention(RetentionPolicy.CLASS)");
-      println("public @interface " + simpleName(INSTANCE_OF_PATTERN) + " {");
+      println("public @interface " + getUnqualifiedName(INSTANCE_OF_PATTERN) + " {");
       println();
       withIndent(
           () -> {
@@ -1347,7 +1349,7 @@
           .printDoc(this::println);
       println("@Target(ElementType.ANNOTATION_TYPE)");
       println("@Retention(RetentionPolicy.CLASS)");
-      println("public @interface " + simpleName(ANNOTATION_PATTERN) + " {");
+      println("public @interface " + getUnqualifiedName(ANNOTATION_PATTERN) + " {");
       println();
       withIndent(
           () -> {
@@ -1522,10 +1524,10 @@
               "Assume the item of the annotation is denoted by 'CTX' and referred to as its"
                   + " context.")
           .addCodeBlock(
-              annoSimpleName(USES_REFLECTION)
+              annoUnqualifiedName(USES_REFLECTION)
                   + "(value = targets, [additionalPreconditions = preconditions])",
               "==>",
-              annoSimpleName(KEEP_EDGE) + "(",
+              annoUnqualifiedName(KEEP_EDGE) + "(",
               "  consequences = targets,",
               "  preconditions = {createConditionFromContext(CTX)} + preconditions",
               ")",
@@ -1555,7 +1557,7 @@
           "@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD,"
               + " ElementType.CONSTRUCTOR})");
       println("@Retention(RetentionPolicy.CLASS)");
-      println("public @interface " + simpleName(USES_REFLECTION) + " {");
+      println("public @interface " + getUnqualifiedName(USES_REFLECTION) + " {");
       println();
       withIndent(
           () -> {
@@ -1642,12 +1644,12 @@
       println("}");
     }
 
-    private static String annoSimpleName(ClassReference clazz) {
-      return "@" + simpleName(clazz);
+    private static String annoUnqualifiedName(ClassReference clazz) {
+      return "@" + getUnqualifiedName(clazz);
     }
 
     private static String docLink(ClassReference clazz) {
-      return "{@link " + simpleName(clazz) + "}";
+      return "{@link " + getUnqualifiedName(clazz) + "}";
     }
 
     private static String docLink(GroupMember member) {
@@ -1655,7 +1657,7 @@
     }
 
     private static String docEnumLink(EnumReference enumRef) {
-      return "{@link " + simpleName(enumRef.enumClass) + "#" + enumRef.enumValue + "}";
+      return "{@link " + getUnqualifiedName(enumRef.enumClass) + "#" + enumRef.enumValue + "}";
     }
 
     private static String docEnumLinkList(EnumReference... values) {
@@ -1835,7 +1837,7 @@
       withIndent(
           () -> {
             generateAnnotationConstants(USED_BY_NATIVE);
-            println("// Content is the same as " + simpleName(USED_BY_REFLECTION) + ".");
+            println("// Content is the same as " + getUnqualifiedName(USED_BY_REFLECTION) + ".");
           });
       println("}");
       println();
@@ -2088,7 +2090,7 @@
           () -> {
             generateAnnotationConstants(CLASS_NAME_PATTERN);
             classNamePatternFullNameGroup().generateConstants(this);
-            classNamePatternSimpleNameGroup().generateConstants(this);
+            classNamePatternUnqualifiedNameGroup().generateConstants(this);
             classNamePatternPackageGroup().generateConstants(this);
           });
       println("}");