summaryrefslogtreecommitdiffstats
path: root/src/com/google/doclava/TypeInfo.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/google/doclava/TypeInfo.java')
-rw-r--r--src/com/google/doclava/TypeInfo.java73
1 files changed, 58 insertions, 15 deletions
diff --git a/src/com/google/doclava/TypeInfo.java b/src/com/google/doclava/TypeInfo.java
index 567415b..ad26def 100644
--- a/src/com/google/doclava/TypeInfo.java
+++ b/src/com/google/doclava/TypeInfo.java
@@ -39,42 +39,75 @@ public class TypeInfo implements Resolvable {
if (typeString.endsWith("...")) {
typeString = typeString.substring(0, typeString.length() - 3);
}
-
+
// Generic parameters
+ int extendsPos = typeString.indexOf(" extends ");
int paramStartPos = typeString.indexOf('<');
- if (paramStartPos > -1) {
+ if (paramStartPos > -1 && (extendsPos == -1 || paramStartPos < extendsPos)) {
ArrayList<TypeInfo> generics = new ArrayList<TypeInfo>();
- int paramEndPos = typeString.lastIndexOf('>');
-
+ int paramEndPos = 0;
+
int entryStartPos = paramStartPos + 1;
int bracketNesting = 0;
- for (int i = entryStartPos; i < paramEndPos; i++) {
+ for (int i = entryStartPos; i < typeString.length(); i++) {
char c = typeString.charAt(i);
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 == '<') {
bracketNesting++;
} else if (c == '>') {
bracketNesting--;
+ // Once bracketNesting goes negative, we've found the closing angle bracket
+ if (bracketNesting < 0) {
+ paramEndPos = i;
+ break;
+ }
}
}
-
+
TypeInfo info = new TypeInfo(typeString.substring(entryStartPos, paramEndPos).trim());
+ info.setIsTypeVariable(true);
generics.add(info);
-
+
mTypeArguments = generics;
-
+
if (paramEndPos < typeString.length() - 1) {
typeString = typeString.substring(0,paramStartPos) + typeString.substring(paramEndPos + 1);
} else {
typeString = typeString.substring(0,paramStartPos);
}
}
-
- // Dimensions
+
+ // The previous extends may have been within the generic type parameters which we don't
+ // actually care about and were removed from the type string above
+ extendsPos = typeString.indexOf(" extends ");
+ if (extendsPos > -1) {
+ ArrayList<TypeInfo> extendsBounds = new ArrayList<>();
+ int entryStartPos = extendsPos + 9;
+ int bracketNesting = 0;
+ for (int i = entryStartPos; i < typeString.length(); i++) {
+ char c = typeString.charAt(i);
+ if (c == '&' && bracketNesting == 0) {
+ String entry = typeString.substring(entryStartPos, i).trim();
+ TypeInfo info = new TypeInfo(entry);
+ extendsBounds.add(info);
+ entryStartPos = i + 1;
+ } else if (c == '<') {
+ bracketNesting++;
+ } else if (c == '>') {
+ bracketNesting--;
+ }
+ }
+ TypeInfo info = new TypeInfo(typeString.substring(entryStartPos, typeString.length()).trim());
+ extendsBounds.add(info);
+ mExtendsBounds = extendsBounds;
+ typeString = typeString.substring(0, extendsPos);
+ }
+
int pos = typeString.indexOf('[');
if (pos > -1) {
mDimension = typeString.substring(pos);
@@ -82,7 +115,7 @@ public class TypeInfo implements Resolvable {
} else {
mDimension = "";
}
-
+
if (PRIMITIVE_TYPES.contains(typeString)) {
mIsPrimitive = true;
mSimpleTypeName = typeString;
@@ -317,7 +350,7 @@ public class TypeInfo implements Resolvable {
mTypeArguments.add(arg);
}
- void setBounds(ArrayList<TypeInfo> superBounds, ArrayList<TypeInfo> extendsBounds) {
+ public void setBounds(ArrayList<TypeInfo> superBounds, ArrayList<TypeInfo> extendsBounds) {
mSuperBounds = superBounds;
mExtendsBounds = extendsBounds;
}
@@ -330,7 +363,7 @@ public class TypeInfo implements Resolvable {
return mExtendsBounds;
}
- void setIsTypeVariable(boolean b) {
+ public void setIsTypeVariable(boolean b) {
mIsTypeVariable = b;
}
@@ -342,7 +375,7 @@ public class TypeInfo implements Resolvable {
return mIsWildcard;
}
- static HashSet<String> typeVariables(ArrayList<TypeInfo> params) {
+ public static HashSet<String> typeVariables(ArrayList<TypeInfo> params) {
return typeVariables(params, new HashSet<String>());
}
@@ -362,6 +395,16 @@ public class TypeInfo implements Resolvable {
return mIsTypeVariable;
}
+ public void resolveTypeVariables(HashSet<String> variables) {
+ if (mExtendsBounds != null) {
+ for (TypeInfo bound : mExtendsBounds) {
+ if (variables.contains(bound.qualifiedTypeName())) {
+ bound.setIsTypeVariable(true);
+ }
+ }
+ }
+ }
+
public String defaultValue() {
if (mIsPrimitive) {
if ("boolean".equals(mSimpleTypeName)) {
@@ -477,7 +520,7 @@ public class TypeInfo implements Resolvable {
Map<String, TypeInfo> map = new HashMap<String, TypeInfo>();
for (int i = 0; i < generic.typeArguments().size(); i++) {
if (typed.typeArguments() != null && typed.typeArguments().size() > i) {
- map.put(generic.typeArguments().get(i).fullName(), typed.typeArguments().get(i));
+ map.put(generic.typeArguments().get(i).simpleTypeName(), typed.typeArguments().get(i));
}
}
return map;