Mail Archive Home | fractal-commits List | June 2008 Index
| <-- Date Index --> | <-- Thread Index --> |
Corrected the constructor, newJavaClass, and forName methods to support recursive generic parameters. Thanks to Denis Conan for pointing this bug out.
--- sandbox/merle/fractal-generics/java/src/main/java/org/objectweb/fractal/java/JavaClass.java 2008-06-30 15:43:51 UTC (rev 8002)
+++ sandbox/merle/fractal-generics/java/src/main/java/org/objectweb/fractal/java/JavaClass.java 2008-06-30 15:54:14 UTC (rev 8003)
@@ -80,7 +80,9 @@
genericParameterList = new JavaClass[classTypeParameters.length];
int i = 0;
for(TypeVariable ctp : classTypeParameters) {
- genericParameterList[i] = new JavaClass((Class)ctp.getBounds()[0], map);
+// Next line replaced to correct a bug reported by Denis Conan.
+// genericParameterList[i] = new JavaClass((Class)ctp.getBounds()[0], map);
+ genericParameterList[i] = newJavaClass(ctp.getBounds()[0], new HashMap<String, JavaClass>(), map);
i++;
}
initSuperTypes(map);
@@ -147,7 +149,7 @@
}
}
- private JavaClass newJavaClass (Type type, Map<String, JavaClass> parameters, final HashMap<Class, JavaClass> map) {
+ private static JavaClass newJavaClass (Type type, Map<String, JavaClass> parameters, final HashMap<Class, JavaClass> map) {
if(type instanceof Class) {
JavaClass jc = map.get((Class)type);
if(jc != null) return jc;
@@ -159,6 +161,7 @@
for(Type t: types) {
if(t instanceof TypeVariable) {
jcs[j] = parameters.get(((TypeVariable)t).getName());
+ if(jcs[j] == null) jcs[j] = new JavaClass(Object.class);
} else if(t instanceof Class) {
jcs[j] = map.get((Class)t);
if(jcs[j] == null) {
@@ -216,7 +219,7 @@
public String toString () {
StringBuffer sb = new StringBuffer();
toStringBuffer(sb);
- return sb.toString();
+ return sb.toString();
}
/**
@@ -285,7 +288,9 @@
public static JavaClass forName (final String name, final ClassLoader classLoader)
throws ClassNotFoundException
{
- // Search the first character before generic parameters.
+// System.out.println("JavaClass.forName(name=" + name + ")");
+
+ // Search the first character before generic parameters.
int index = name.indexOf(characterBeforeGenericParameters);
if(index == -1) {
// When name does not denote a class without generic parameters.
@@ -339,13 +344,20 @@
throw new ClassNotFoundException("Bad number of generic parameters for '" + name + "'");
}
for(int i=0, m=genericParameterList.size(); i<m; i++) {
+/*
+ * Next lines replaced to correct a bug reported by Denis Conan.
+ *
Class<?> c = (Class<?>)javaClass.getTypeParameters()[i].getBounds()[0];
-// TODO : Replace isAssignable by isFcSubTypeOf
+ // TODO : Replace isAssignable by isFcSubTypeOf
if(!c.isAssignableFrom(((JavaClass)genericParameterList.get(i)).getClazz())) {
throw new ClassNotFoundException("Bad generic parameter for '" + name + "'");
}
+*/
+ JavaClass c = newJavaClass(javaClass.getTypeParameters()[i].getBounds()[0], new HashMap<String, JavaClass>(), new HashMap<Class, JavaClass>());
+ if(!c.isFcSubTypeOf(genericParameterList.get(i))) {
+ throw new ClassNotFoundException("Bad generic parameter for '" + name + "'");
+ }
}
-
return new JavaClass(javaClass, genericParameterList.toArray(new JavaClass[genericParameterList.size()]));
}
| <-- Date Index --> | <-- Thread Index --> |
Powered by MHonArc.
Copyright © 2006-2007, OW2 Consortium | contact | webmaster.