? xjavadoc-patch.txt Index: javacc/Java1.5x.jjt =================================================================== RCS file: /cvsroot/xdoclet/xjavadoc/javacc/Java1.5x.jjt,v retrieving revision 1.5 diff -u -r1.5 Java1.5x.jjt --- javacc/Java1.5x.jjt 19 Aug 2005 05:43:07 -0000 1.5 +++ javacc/Java1.5x.jjt 8 Feb 2007 21:58:59 -0000 @@ -1810,19 +1810,41 @@ PrimitiveType() } -void ReferenceType(): -{} +String ReferenceType(): +{ + Token primitive; + StringBuffer sb = new StringBuffer(); + String clazz = ""; +} { - PrimitiveType() ( LOOKAHEAD(2) "[" "]" )+ + (primitive=PrimitiveType() { + sb.append(primitive.image); + } + ( LOOKAHEAD(2) "[" "]" + { + sb.append("[]"); + } + )+ | - ( ClassOrInterfaceType() ) ( LOOKAHEAD(2) "[" "]" )* + ( clazz = ClassOrInterfaceType() + { sb.append(clazz); } + ) + ( LOOKAHEAD(2) "[" "]" + { + sb.append("[]"); + } + )* + ) + { + return sb.toString(); + } } String ClassOrInterfaceType(): { - //todo - include generics StringBuffer sb = new StringBuffer(); Token t = null; + String generics = ""; } { t= @@ -1830,39 +1852,74 @@ sb.append(t.image); } - [ LOOKAHEAD(2) TypeArguments() ] + [ LOOKAHEAD(2) generics = TypeArguments() + { + sb.append(generics); + } + ] ( LOOKAHEAD(2) "." t= { sb.append(".").append(t.image); } - [ LOOKAHEAD(2) TypeArguments() ] )* + [ LOOKAHEAD(2) generics = TypeArguments() ] + { + sb.append(generics); + } + + )* { return sb.length() > 0 ? sb.toString() : null; } } -void TypeArguments(): -{} +String TypeArguments(): { - "<" TypeArgument() ( "," TypeArgument() )* ">" + String ret = ""; + StringBuffer sb = new StringBuffer(); +} +{ + "<" ret = TypeArgument() { + sb.append("<").append(ret); + } + ( "," ret = TypeArgument() + { + sb.append(","); + sb.append(ret); + } + )* ">" + { + sb.append(">"); + } + { + return sb.toString(); + } + } -void TypeArgument(): -{} +String TypeArgument(): { - (ReferenceType() [ WildcardBounds() ]) + String ret = ""; +} +{ + (ret = ReferenceType() [ WildcardBounds() ]) + { + return ret; + } | ("?" [ WildcardBounds() ]) - + { + return ret; + } } void WildcardBounds(): -{} { - "extends" ReferenceType() +} +{ + "extends" ReferenceType() | "super" ReferenceType() } Index: src/xjavadoc/SourceClass.java =================================================================== RCS file: /cvsroot/xdoclet/xjavadoc/src/xjavadoc/SourceClass.java,v retrieving revision 1.66 diff -u -r1.66 SourceClass.java --- src/xjavadoc/SourceClass.java 1 Oct 2004 23:07:21 -0000 1.66 +++ src/xjavadoc/SourceClass.java 8 Feb 2007 21:59:01 -0000 @@ -10,7 +10,7 @@ import java.util.*; import java.io.*; - +import java.util.regex.*; /** * This class represents a class for which the source code is available *XJavaDocFil @@ -360,6 +360,8 @@ XClass result = null; result = ( XClass ) _qualifiedClasses.get( unqualifiedClassName ); + if(unqualifiedClassName.indexOf("<") != -1) + System.err.println("UnqualifiedClassName [" + unqualifiedClassName + "]"); if( result == null ) { @@ -387,40 +389,10 @@ } else { - String qualifiedName; + String qualifiedName = getQualifiedName(unqualifiedClassName); + if (qualifiedName != null) + result = getXJavaDoc().getXClass( qualifiedName ); - if( ( qualifiedName = unqualifiedNameInTheSameClassAsAnInnerClass( unqualifiedClassName ) ) != null ) - { - result = getXJavaDoc().getXClass( qualifiedName ); - } - else if( ( qualifiedName = unqualifiedNameInInnerClasses( unqualifiedClassName ) ) != null ) - { - result = getXJavaDoc().getXClass( qualifiedName ); - } - else if( ( qualifiedName = unqualifiedNameInJavaDotLang( unqualifiedClassName ) ) != null ) - { - result = getXJavaDoc().getXClass( qualifiedName ); - } - else if( ( qualifiedName = unqualifiedNameInImportedClasses( unqualifiedClassName ) ) != null ) - { - result = getXJavaDoc().getXClass( qualifiedName ); - } - else if( ( qualifiedName = unqualifiedNameInImportedPackages( unqualifiedClassName ) ) != null ) - { - result = getXJavaDoc().getXClass( qualifiedName ); - } - else if( ( qualifiedName = unqualifiedNameInTheSamePackage( unqualifiedClassName ) ) != null ) - { - result = getXJavaDoc().getXClass( qualifiedName ); - } - else if( ( qualifiedName = unqualifiedNameInInnerClassesOfSuperClass( unqualifiedClassName ) ) != null ) - { - result = getXJavaDoc().getXClass( qualifiedName ); - } - else if( ( qualifiedName = unqualifiedNameInInnerInterface( unqualifiedClassName ) ) != null ) - { - result = getXJavaDoc().getXClass( qualifiedName ); - } else { String unknownClassName; @@ -453,6 +425,9 @@ } result = unknownClass; } + if(qualifiedName.indexOf("<") != -1) + System.err.println("qualifiedClassName [" + qualifiedName + "]"); + } } } @@ -463,7 +438,7 @@ _qualifiedClasses.put( unqualifiedClassName, result ); } - return result; + return result ; } public void reset() @@ -476,12 +451,21 @@ _qualifiedClasses.clear(); } - private final String unqualifiedNameInImportedClasses( final String unqualifiedClassName ) + private final String unqualifiedNameInImportedClasses( String unqualifiedClassName ) { if( !hasImportedClasses() ) { return null; } + + // Look out for the generics !! + // Remove them before searching + String[] results = removeGenerics(unqualifiedClassName); + unqualifiedClassName = results[0]; + String generics = results[1]; + + if (generics != null) + System.err.println("generics [" + generics + "]"); final String suffix = "." + unqualifiedClassName; String candidate = null; @@ -505,10 +489,10 @@ } } } - return candidate; + return candidate == null ? candidate : (candidate + (generics == null ? "" : "<" + getQualifiedName(generics) + ">")); } - private final XClass unqualifiedNameInImportedClassesInnerClasses( final String unqualifiedClassName ) + private final XClass unqualifiedNameInImportedClassesInnerClasses( String unqualifiedClassName ) { if( !hasImportedClasses() ) { @@ -516,7 +500,6 @@ } XClass candidate = null; - for( Iterator i = getImportedClasses().iterator(); i.hasNext(); ) { XClass clazz = ( XClass ) i.next(); @@ -550,7 +533,7 @@ * @param unqualifiedClassName Describe what the parameter does * @return Describe the return value */ - private final String unqualifiedNameInInnerClasses( final String unqualifiedClassName ) + private final String unqualifiedNameInInnerClasses( String unqualifiedClassName ) { if( !hasInnerClasses() ) { @@ -560,7 +543,11 @@ final String innerClassName = getQualifiedName() + '.' + unqualifiedClassName; String candidate = null; - + String[] results = removeGenerics(unqualifiedClassName); + unqualifiedClassName = results[0]; + String generics = results[1]; + + for( Iterator i = getInnerClasses().iterator(); i.hasNext(); ) { XClass innerClass = ( XClass ) i.next(); @@ -572,7 +559,7 @@ break; } } - return candidate; + return candidate == null ? candidate : (candidate + (generics == null ? "" : "<" + getQualifiedName(generics) + ">")); } /** @@ -603,10 +590,13 @@ * @param unqualifiedClassName Name of the class to resolve * @return The qualified name of the inner class. */ - private final String unqualifiedNameInInnerClassesOfSuperClass( final String unqualifiedClassName ) + private final String unqualifiedNameInInnerClassesOfSuperClass( String unqualifiedClassName ) { - XClass clazz = getXJavaDoc().getXClass(getQualifiedName()); - XClass superClazz = clazz.getSuperclass(); + XClass clazz = getXJavaDoc().getXClass(getQualifiedName()); + XClass superClazz = clazz.getSuperclass(); + String[] results = removeGenerics(unqualifiedClassName); + unqualifiedClassName = results[0]; + String generics = results[1]; while (superClazz != null && ! superClazz.getQualifiedName().equals("java.lang.Object")) { String innerClassName = superClazz.getQualifiedName() + '.' + unqualifiedClassName; for( Iterator i = superClazz.getInnerClasses().iterator(); i.hasNext(); ) @@ -615,7 +605,7 @@ String qualifiedClassName = innerClass.getQualifiedName(); if( innerClassName.equals( qualifiedClassName ) ) { - return qualifiedClassName; + return qualifiedClassName + (generics == null ? "" : "<" + getQualifiedName(generics) + ">"); } } superClazz = superClazz.getSuperclass(); @@ -629,16 +619,23 @@ * @param unqualifiedClassName Describe what the parameter does * @return Describe the return value */ - private final String unqualifiedNameInImportedPackages( final String unqualifiedClassName ) + private final String unqualifiedNameInImportedPackages( String unqualifiedClassName ) { if( !hasImportedPackages() ) { return null; } - final String suffix = "." + unqualifiedClassName; + String[] results = removeGenerics(unqualifiedClassName); + unqualifiedClassName = results[0]; + String generics = results[1]; + + if (generics != null) + System.err.println("unqualifiedNameInImportedPackages: generics [" + generics + "]"); + + + final String suffix = "." + unqualifiedClassName ; String candidate = null; - for( Iterator i = getImportedPackages().iterator(); i.hasNext(); ) { String importedPackageName = ( ( XPackage ) i.next() ).getName(); @@ -657,7 +654,7 @@ } } } - return candidate; + return candidate == null ? candidate : (candidate + (generics == null ? "" : "<" + getQualifiedName(generics) + ">")); } /** @@ -667,13 +664,16 @@ * @param unqualifiedClassName * @return fully qualified class name, or null */ - private final String unqualifiedNameInJavaDotLang( final String unqualifiedClassName ) + private final String unqualifiedNameInJavaDotLang( String unqualifiedClassName ) { + String[] results = removeGenerics(unqualifiedClassName); + unqualifiedClassName = results[0]; + String generics = results[1]; + String qualifiedClassName = "java.lang." + unqualifiedClassName; - if( getXJavaDoc().classExists( qualifiedClassName ) ) { - return qualifiedClassName; + return qualifiedClassName + (generics == null ? "" : "<" + getQualifiedName(generics) + ">"); } else { @@ -687,10 +687,13 @@ * @param unqualifiedClassName Describe what the parameter does * @return Describe the return value */ - private final String unqualifiedNameInTheSamePackage( final String unqualifiedClassName ) + private final String unqualifiedNameInTheSamePackage( String unqualifiedClassName ) { String qualifiedClassName; - + String[] results = removeGenerics(unqualifiedClassName); + unqualifiedClassName = results[0]; + String generics = results[1]; + if( getContainingPackage().getName().equals( "" ) ) { qualifiedClassName = unqualifiedClassName; @@ -702,7 +705,7 @@ if( getXJavaDoc().classExists( qualifiedClassName ) ) { - return qualifiedClassName; + return qualifiedClassName + (generics == null ? "" : "<" + getQualifiedName(generics) + ">"); } else { @@ -711,13 +714,17 @@ } - private final String unqualifiedNameInTheSameClassAsAnInnerClass( final String unqualifiedClassName ) + private final String unqualifiedNameInTheSameClassAsAnInnerClass( String unqualifiedClassName ) { + String[] results = removeGenerics(unqualifiedClassName); + unqualifiedClassName = results[0]; + String generics = results[1]; + //containing class=com.p.A, inner-reference=B ->com.p.A.B String qualifiedClassName = getQualifiedName() + '.' + unqualifiedClassName; if( getXJavaDoc().classExists( qualifiedClassName ) ) - return qualifiedClassName; + return qualifiedClassName + (generics == null ? "" : "<" + getQualifiedName(generics) + ">"); //containing class=com.p.A, inner-reference=A.B ->com.p.A.B if( getContainingPackage().getName().equals( "" ) ) @@ -730,7 +737,7 @@ } if( getXJavaDoc().classExists( qualifiedClassName ) ) - return qualifiedClassName; + return qualifiedClassName + (generics == null ? "" : "<" + getQualifiedName(generics) + ">" ); return null; } @@ -771,4 +778,46 @@ System.err.println( "Error parsing " + cls + ':' + e.getMessage() ); } } + + /** + * Remove the generics annotation if there is one from the + * unqualifiedClassName and return it as first element of the String array. + * Return the generics as 2snd element of the String array if there is one. + * If there is none, return an empty string. + */ + private String[] removeGenerics(String unqualifiedClassName) { + int index; + String generics = null; + if ((index = unqualifiedClassName.indexOf("<")) != -1) { + generics = unqualifiedClassName.substring(index + 1); + generics = generics.substring(0, generics.length() - 1); + unqualifiedClassName = unqualifiedClassName.substring(0, index); + } + return new String[] { unqualifiedClassName, generics }; + } + + + private String getQualifiedName(String unqualifiedClassName) + { + String qualifiedName = null; + if((qualifiedName = unqualifiedNameInTheSameClassAsAnInnerClass(unqualifiedClassName)) != null) + return qualifiedName; + if((qualifiedName = unqualifiedNameInInnerClasses(unqualifiedClassName)) != null) + return qualifiedName; + if((qualifiedName = unqualifiedNameInJavaDotLang(unqualifiedClassName)) != null) + return qualifiedName; + if((qualifiedName = unqualifiedNameInImportedClasses(unqualifiedClassName)) != null) + return qualifiedName; + if((qualifiedName = unqualifiedNameInImportedPackages(unqualifiedClassName)) != null) + return qualifiedName; + if((qualifiedName = unqualifiedNameInTheSamePackage(unqualifiedClassName)) != null) + return qualifiedName; + if((qualifiedName = unqualifiedNameInInnerClassesOfSuperClass(unqualifiedClassName)) != null) + return qualifiedName; + if((qualifiedName = unqualifiedNameInInnerInterface(unqualifiedClassName)) != null) + return qualifiedName; + else + return unqualifiedClassName; + } + }