Author: scabanovich
Date: 2011-09-22 20:33:05 -0400 (Thu, 22 Sep 2011)
New Revision: 34988
Modified:
trunk/common/plugins/org.jboss.tools.common/src/org/jboss/tools/common/java/ParametedType.java
trunk/common/plugins/org.jboss.tools.common/src/org/jboss/tools/common/java/ParametedTypeFactory.java
Log:
JBIDE-9763
https://issues.jboss.org/browse/JBIDE-9763
When building inheritance for parameted types, resolved parameters are reused from base
types.
Modified:
trunk/common/plugins/org.jboss.tools.common/src/org/jboss/tools/common/java/ParametedType.java
===================================================================
---
trunk/common/plugins/org.jboss.tools.common/src/org/jboss/tools/common/java/ParametedType.java 2011-09-23
00:31:25 UTC (rev 34987)
+++
trunk/common/plugins/org.jboss.tools.common/src/org/jboss/tools/common/java/ParametedType.java 2011-09-23
00:33:05 UTC (rev 34988)
@@ -29,11 +29,11 @@
* @author Viacheslav Kabanovich
*
*/
-@SuppressWarnings("nls")
+//@SuppressWarnings("nls")
public class ParametedType implements IParametedType {
protected ParametedTypeFactory typeFactory = null;
protected IType type;
- protected String arrayPrefix = "";
+ protected String arrayPrefix = ""; //$NON-NLS-1$
protected String signature;
protected List<ParametedType> parameterTypes = new
ArrayList<ParametedType>();
protected boolean primitive;
@@ -117,10 +117,10 @@
public void setSignature(String signature) {
this.signature = signature;
- arrayPrefix = "";
+ arrayPrefix = ""; //$NON-NLS-1$
if(signature != null) {
for (int i = 0; i < signature.length(); i++) {
- if(signature.charAt(i) == '[') arrayPrefix += "["; else break;
+ if(signature.charAt(i) == Signature.C_ARRAY) arrayPrefix += Signature.C_ARRAY; else
break;
}
}
}
@@ -235,16 +235,18 @@
if(typeSignature == null) {
return typeSignature;
}
- int i = typeSignature.indexOf('<');
+ int i = typeSignature.indexOf(Signature.C_GENERIC_START);
if(i < 0) {
- if(( typeSignature.startsWith("T") ||
typeSignature.startsWith("Q") || typeSignature.startsWith("L"))
&& typeSignature.endsWith(";")) {
+ char c = typeSignature.length() == 0 ? '\0' : typeSignature.charAt(0);
+ char e = typeSignature.length() == 0 ? '\0' :
typeSignature.charAt(typeSignature.length() - 1);
+ if((c == Signature.C_TYPE_VARIABLE || c == Signature.C_UNRESOLVED || c ==
Signature.C_RESOLVED) && e == Signature.C_SEMICOLON) {
String param = typeSignature.substring(1, typeSignature.length() - 1);
String s = findParameterSignature(param);
return s == null ? typeSignature : s;
}
return typeSignature;
}
- int j = typeSignature.lastIndexOf('>');
+ int j = typeSignature.lastIndexOf(Signature.C_GENERIC_END);
if(j < i) {
return typeSignature;
}
@@ -257,7 +259,11 @@
newParams.append(newParam);
}
if(replaced) {
- typeSignature = typeSignature.substring(0, i) + '<' + newParams.toString()
+ '>' + ';';
+ typeSignature = typeSignature.substring(0, i)
+ + Signature.C_GENERIC_START
+ + newParams.toString()
+ + Signature.C_GENERIC_END
+ + Signature.C_SEMICOLON;
}
return typeSignature;
}
@@ -325,7 +331,12 @@
public boolean isAssignableTo(ParametedType other, boolean checkInheritance) {
if(equals(other)) return true;
- if(this.type == null) return false;
+ if("*".equals(other.getSignature())) {
+ return true;
+ }
+ if(this.type == null) {
+ return (isVariable && other.isVariable && other.type == null);
+ }
if(other.isVariable && other.type == null) return true;
if(this.type.equals(other.type)) {
if(areTypeParametersAssignableTo(other)) return true;
@@ -344,7 +355,7 @@
for (int i = 0; i < parameterTypes.size(); i++) {
ParametedType p1 = parameterTypes.get(i);
ParametedType p2 = other.parameterTypes.get(i);
- if(p1.isLower() || p1.isUpper()) return false;
+ if(p1.isLower() || (p1.isUpper() && !p1.isVariable)) return false;
if(p1.isVariable()) {
if(p2.isVariable()) {
if(p2.isAssignableTo(p1, true)) continue;
@@ -391,7 +402,7 @@
StringBuilder result = new
StringBuilder(primitives.get(Signature.getSignatureSimpleName(getSignature().substring(array))));
if(array > 0) {
for (int i = 0; i < array; i++) {
- result.append("[]");
+ result.append("[]"); //$NON-NLS-1$
}
}
return result.toString();
Modified:
trunk/common/plugins/org.jboss.tools.common/src/org/jboss/tools/common/java/ParametedTypeFactory.java
===================================================================
---
trunk/common/plugins/org.jboss.tools.common/src/org/jboss/tools/common/java/ParametedTypeFactory.java 2011-09-23
00:31:25 UTC (rev 34987)
+++
trunk/common/plugins/org.jboss.tools.common/src/org/jboss/tools/common/java/ParametedTypeFactory.java 2011-09-23
00:33:05 UTC (rev 34988)
@@ -12,7 +12,6 @@
import java.util.HashMap;
import java.util.Map;
-import java.util.StringTokenizer;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IMember;
@@ -26,18 +25,19 @@
public class ParametedTypeFactory {
// I S J C F D Z
- static HashMap<String,String> primitives = new HashMap<String, String>();
+ static HashMap<Character,String> primitives = new HashMap<Character,
String>();
static {
- primitives.put("I", "Ljava.lang.Integer;");
- primitives.put("S", "Ljava.lang.Short;");
- primitives.put("J", "Ljava.lang.Long;");
- primitives.put("C", "Ljava.lang.Character;");
- primitives.put("F", "Ljava.lang.Float;");
- primitives.put("D", "Ljava.lang.Double;");
- primitives.put("Z", "Ljava.lang.Boolean;");
+ primitives.put(Signature.C_INT, "Ljava.lang.Integer;");
+ primitives.put(Signature.C_SHORT, "Ljava.lang.Short;");
+ primitives.put(Signature.C_LONG, "Ljava.lang.Long;");
+ primitives.put(Signature.C_CHAR, "Ljava.lang.Character;");
+ primitives.put(Signature.C_FLOAT, "Ljava.lang.Float;");
+ primitives.put(Signature.C_DOUBLE, "Ljava.lang.Double;");
+ primitives.put(Signature.C_BOOLEAN, "Ljava.lang.Boolean;");
+ primitives.put(Signature.C_BYTE, "Ljava.lang.Boolean;");
}
//unresolved Object signature
- public static String OBJECT = "QObject;";
+ public static String OBJECT = "QObject;"; //$NON-NLS-1$
Map<String, ParametedType> cache = new HashMap<String, ParametedType>();
public ParametedType newParametedType(IType type) {
@@ -55,7 +55,7 @@
}
parametedType.setFactory(this);
parametedType.setType(type);
- if(type != null) parametedType.setSignature("L" +
type.getFullyQualifiedName() + ";");
+ if(type != null) parametedType.setSignature(Signature.C_RESOLVED +
type.getFullyQualifiedName() + Signature.C_SEMICOLON);
String[] ps = null;
try {
ps = type.getTypeParameterSignatures();
@@ -96,28 +96,32 @@
typeSignature = typeSignature.substring(result.getArrayPrefix().length());
- if(primitives.containsKey(typeSignature)) {
- typeSignature = primitives.get(typeSignature);
+ char c = typeSignature.length() == 0 ? '\0' : typeSignature.charAt(0);
+ if(primitives.containsKey(c) && typeSignature.length() == 1) {
+ typeSignature = primitives.get(c);
result.setSignature(result.getArrayPrefix() + typeSignature);
result.setPrimitive(true);
- } else if(typeSignature.startsWith("+")) {
+ } else if(c == Signature.C_EXTENDS) {
typeSignature = typeSignature.substring(1);
result.setUpper(true);
- } else if(typeSignature.startsWith("-")) {
+ } else if(c == Signature.C_SUPER) {
typeSignature = typeSignature.substring(1);
result.setLower(true);
- }
+ } else if(c == Signature.C_STAR && typeSignature.length() == 1) {
+ result.setUpper(true);
+ return result;
+ }
- int startToken = typeSignature.indexOf('<');
+ int startToken = typeSignature.indexOf(Signature.C_GENERIC_START);
if(startToken < 0) {
String resovedTypeName = EclipseJavaUtil.resolveTypeAsString(contextType,
typeSignature);
if(resovedTypeName == null) return null;
- if(!context.isBinary()) {
+ if(!context.isBinary() || typeSignature.charAt(0) == Signature.C_TYPE_VARIABLE) {
StringBuffer ns = new StringBuffer();
ns.append(result.getArrayPrefix());
- if(result.isLower()) ns.append('-');
- if(result.isUpper()) ns.append('+');
- ns.append('L').append(resovedTypeName).append(";");
+ if(result.isLower()) ns.append(Signature.C_SUPER);
+ if(result.isUpper()) ns.append(Signature.C_EXTENDS);
+ ns.append(Signature.C_RESOLVED).append(resovedTypeName).append(Signature.C_SEMICOLON);
result.setSignature(ns.toString());
}
IType type = EclipseJavaUtil.findType(context.getJavaProject(), resovedTypeName);
@@ -131,7 +135,7 @@
for (int i = 0; i < ps.length; i++) {
ParametedType st = getParametedTypeForParameter(context, ps[i], result);
if(st != null) {
- if(st.getSignature().indexOf(':') >= 0) {
+ if(st.getSignature().indexOf(Signature.C_COLON) >= 0) {
CommonPlugin.getDefault().logWarning("Wrong signature=" +
st.getSignature());
}
return st;
@@ -144,7 +148,7 @@
if(st != null) return st;
}
} else {
- int endToken = typeSignature.lastIndexOf('>');
+ int endToken = typeSignature.lastIndexOf(Signature.C_GENERIC_END);
if(endToken < startToken) return null;
String typeName = typeSignature.substring(0, startToken) +
typeSignature.substring(endToken + 1);
String resovedTypeName = EclipseJavaUtil.resolveTypeAsString(contextType, typeName);
@@ -172,9 +176,14 @@
if(!context.isBinary()) {
StringBuffer ns = new StringBuffer();
ns.append(result.getArrayPrefix());
- if(result.isLower()) ns.append('-');
- if(result.isUpper()) ns.append('+');
- ns.append('L').append(resovedTypeName).append('<').append(newParams).append(">;");
+ if(result.isLower()) ns.append(Signature.C_SUPER);
+ if(result.isUpper()) ns.append(Signature.C_EXTENDS);
+ ns.append(Signature.C_RESOLVED)
+ .append(resovedTypeName)
+ .append(Signature.C_GENERIC_START)
+ .append(newParams)
+ .append(Signature.C_GENERIC_END)
+ .append(Signature.C_SEMICOLON);
result.setSignature(ns.toString());
}
return result;
@@ -190,13 +199,13 @@
String t = Signature.getTypeVariable(typeParameterSignature);
String[] bounds = Signature.getTypeParameterBounds(typeParameterSignature);
- t = "L" + t + ";";
+ t = Signature.C_RESOLVED + t + Signature.C_SEMICOLON;
if(result == null || t.equals(result.getSignature())) {
- String sts = bounds.length > 0 ? bounds[0] : "";
- if(sts.length() > 0) {
- ParametedType st = getParametedType(contextType, sts);
+ if(bounds.length > 0 && bounds[0].length() > 0) {
+ ParametedType st = getParametedType(contextType, bounds[0]);
if(st != null) {
result = new TypeDeclaration(st, context.getResource(), 0, 0);
+ result.setUpper(true);
}
} else if(result != null) {
result.setSignature(t);