Resolve whether parameter types are actually type variables.

Parameters can either be a declaration of a generic type, or a
statement about the concrete type the parameter is taking for a
particular instance. These are difficult to determine at initial
parse, so resolve whether the class exists once parsing is finished
and assume that the parameter is a type variable if it does not.

Bug: 31858628
Test: run update-api, android.signature.cts.SignatureTest#testSignature
Change-Id: I88d316cece8640fd5d356482ebbe0426d918d8f4
diff --git a/src/com/google/doclava/TypeInfo.java b/src/com/google/doclava/TypeInfo.java
index ad26def..689ff88 100644
--- a/src/com/google/doclava/TypeInfo.java
+++ b/src/com/google/doclava/TypeInfo.java
@@ -54,7 +54,6 @@
         if (c == ',' && bracketNesting == 0) {
           String entry = typeString.substring(entryStartPos, i).trim();
           TypeInfo info = new TypeInfo(entry);
-          info.setIsTypeVariable(true);
           generics.add(info);
           entryStartPos = i + 1;
         } else if (c == '<') {
@@ -70,8 +69,8 @@
       }
 
       TypeInfo info = new TypeInfo(typeString.substring(entryStartPos, paramEndPos).trim());
-      info.setIsTypeVariable(true);
       generics.add(info);
+      addResolution(new Resolution("variability", "", null));
 
       mTypeArguments = generics;
 
@@ -483,6 +482,13 @@
               } else {
                   mClass = InfoBuilder.Caches.obtainClass(qualifiedClassName.toString());
               }
+          } else if ("variability".equals(resolution.getVariable())) {
+              StringBuilder qualifiedClassName = new StringBuilder();
+              for (TypeInfo arg : mTypeArguments) {
+                InfoBuilder.resolveQualifiedName(arg.simpleTypeName(), qualifiedClassName,
+                        resolution.getInfoBuilder());
+                arg.setIsTypeVariable(!("".equals(qualifiedClassName.toString())));
+              }
           }
       }