Index: src/test/org/codehaus/groovy/tools/groovydoc/testfiles/JavaClassWithMultipleInterfaces.java =================================================================== --- src/test/org/codehaus/groovy/tools/groovydoc/testfiles/JavaClassWithMultipleInterfaces.java (revision 0) +++ src/test/org/codehaus/groovy/tools/groovydoc/testfiles/JavaClassWithMultipleInterfaces.java (revision 0) @@ -0,0 +1,4 @@ +package org.codehaus.groovy.tools.groovydoc.testfiles; + +public class JavaClassWithMultipleInterfaces implements GroovyInterface1, JavaInterface1 { +} Index: src/test/org/codehaus/groovy/tools/groovydoc/testfiles/JavaInterface1.java =================================================================== --- src/test/org/codehaus/groovy/tools/groovydoc/testfiles/JavaInterface1.java (revision 0) +++ src/test/org/codehaus/groovy/tools/groovydoc/testfiles/JavaInterface1.java (revision 0) @@ -0,0 +1,4 @@ +package org.codehaus.groovy.tools.groovydoc.testfiles; + +public interface JavaInterface1 { +} Index: src/test/org/codehaus/groovy/tools/groovydoc/testfiles/GroovyInterfaceWithMultipleInterfaces.groovy =================================================================== --- src/test/org/codehaus/groovy/tools/groovydoc/testfiles/GroovyInterfaceWithMultipleInterfaces.groovy (revision 0) +++ src/test/org/codehaus/groovy/tools/groovydoc/testfiles/GroovyInterfaceWithMultipleInterfaces.groovy (revision 0) @@ -0,0 +1,5 @@ +package org.codehaus.groovy.tools.groovydoc.testfiles + +public interface GroovyInterfaceWithMultipleInterfaces extends GroovyInterface1, JavaInterface1, Runnable { + +} \ No newline at end of file Index: src/test/org/codehaus/groovy/tools/groovydoc/testfiles/GroovyClassWithMultipleInterfaces.groovy =================================================================== --- src/test/org/codehaus/groovy/tools/groovydoc/testfiles/GroovyClassWithMultipleInterfaces.groovy (revision 0) +++ src/test/org/codehaus/groovy/tools/groovydoc/testfiles/GroovyClassWithMultipleInterfaces.groovy (revision 0) @@ -0,0 +1,4 @@ +package org.codehaus.groovy.tools.groovydoc.testfiles + +class GroovyClassWithMultipleInterfaces implements GroovyInterface1, JavaInterface1 { +} Index: src/test/org/codehaus/groovy/tools/groovydoc/testfiles/GroovyInterface1.groovy =================================================================== --- src/test/org/codehaus/groovy/tools/groovydoc/testfiles/GroovyInterface1.groovy (revision 0) +++ src/test/org/codehaus/groovy/tools/groovydoc/testfiles/GroovyInterface1.groovy (revision 0) @@ -0,0 +1,5 @@ +package org.codehaus.groovy.tools.groovydoc.testfiles + +public interface GroovyInterface1 { + +} \ No newline at end of file Index: src/test/org/codehaus/groovy/tools/groovydoc/testfiles/JavaInterfaceWithMultipleInterfaces.java =================================================================== --- src/test/org/codehaus/groovy/tools/groovydoc/testfiles/JavaInterfaceWithMultipleInterfaces.java (revision 0) +++ src/test/org/codehaus/groovy/tools/groovydoc/testfiles/JavaInterfaceWithMultipleInterfaces.java (revision 0) @@ -0,0 +1,4 @@ +package org.codehaus.groovy.tools.groovydoc.testfiles; + +public interface JavaInterfaceWithMultipleInterfaces extends GroovyInterface1, JavaInterface1, Runnable { +} Index: src/test/org/codehaus/groovy/tools/groovydoc/GroovyDocToolTest.java =================================================================== --- src/test/org/codehaus/groovy/tools/groovydoc/GroovyDocToolTest.java (revision 21075) +++ src/test/org/codehaus/groovy/tools/groovydoc/GroovyDocToolTest.java (working copy) @@ -176,9 +176,7 @@ xmlTool.renderToOutput(output, MOCK_DIR); String domBuilderDoc = output.getText(MOCK_DIR + "/groovy/xml/DOMBuilder.html"); - // TODO reinstate -// assertTrue(domBuilderDoc.indexOf("BuilderSupport") > 0); - assertTrue(domBuilderDoc.indexOf("null") > 0); + assertTrue(domBuilderDoc.indexOf("BuilderSupport") > 0); } public void testExtendsClauseWithSuperClassInTree() throws Exception { @@ -192,6 +190,44 @@ assertTrue(domBuilderDoc.indexOf("BuilderSupport") > 0); } + public void testInterfaceExtendsClauseWithMultipleInterfaces() throws Exception { + List srcList = new ArrayList(); + srcList.add("org/codehaus/groovy/tools/groovydoc/testfiles/GroovyInterfaceWithMultipleInterfaces.groovy"); + srcList.add("org/codehaus/groovy/tools/groovydoc/testfiles/JavaInterfaceWithMultipleInterfaces.java"); + srcList.add("org/codehaus/groovy/tools/groovydoc/testfiles/GroovyInterface1.groovy"); + srcList.add("org/codehaus/groovy/tools/groovydoc/testfiles/JavaInterface1.java"); + xmlToolForTests.add(srcList); + MockOutputTool output = new MockOutputTool(); + xmlToolForTests.renderToOutput(output, MOCK_DIR); + + String groovyClassDoc = output.getText(MOCK_DIR + "/org/codehaus/groovy/tools/groovydoc/testfiles/GroovyInterfaceWithMultipleInterfaces.html"); + assertTrue(groovyClassDoc.indexOf("JavaInterface1") > 0); + assertTrue(groovyClassDoc.indexOf("GroovyInterface1") > 0); + + String javaClassDoc = output.getText(MOCK_DIR + "/org/codehaus/groovy/tools/groovydoc/testfiles/JavaInterfaceWithMultipleInterfaces.html"); + assertTrue(javaClassDoc.indexOf("JavaInterface1") > 0); + assertTrue(javaClassDoc.indexOf("GroovyInterface1") > 0); + } + + public void testImplementsClauseWithMultipleInterfaces() throws Exception { + List srcList = new ArrayList(); + srcList.add("org/codehaus/groovy/tools/groovydoc/testfiles/GroovyClassWithMultipleInterfaces.groovy"); + srcList.add("org/codehaus/groovy/tools/groovydoc/testfiles/JavaClassWithMultipleInterfaces.java"); + srcList.add("org/codehaus/groovy/tools/groovydoc/testfiles/GroovyInterface1.groovy"); + srcList.add("org/codehaus/groovy/tools/groovydoc/testfiles/JavaInterface1.java"); + xmlToolForTests.add(srcList); + MockOutputTool output = new MockOutputTool(); + xmlToolForTests.renderToOutput(output, MOCK_DIR); + + String groovyClassDoc = output.getText(MOCK_DIR + "/org/codehaus/groovy/tools/groovydoc/testfiles/GroovyClassWithMultipleInterfaces.html"); + assertTrue(groovyClassDoc.indexOf("JavaInterface1") > 0); + assertTrue(groovyClassDoc.indexOf("GroovyInterface1") > 0); + + String javaClassDoc = output.getText(MOCK_DIR + "/org/codehaus/groovy/tools/groovydoc/testfiles/JavaClassWithMultipleInterfaces.html"); + assertTrue(javaClassDoc.indexOf("JavaInterface1") > 0); + assertTrue(javaClassDoc.indexOf("GroovyInterface1") > 0); + } + public void testDefaultPackage() throws Exception { List srcList = new ArrayList(); srcList.add("UberTestCaseBugs.java"); @@ -199,9 +235,7 @@ MockOutputTool output = new MockOutputTool(); xmlToolForTests.renderToOutput(output, MOCK_DIR); String domBuilderDoc = output.getText(MOCK_DIR + "/DefaultPackage/UberTestCaseBugs.html"); - // TODO reinstate -// assertTrue(domBuilderDoc.indexOf("TestCase") > 0); - assertTrue(domBuilderDoc.indexOf("null") > 0); + assertTrue(domBuilderDoc.indexOf("TestCase") > 0); } public void testStaticModifier() throws Exception { Index: src/main/org/codehaus/groovy/tools/groovydoc/ExternalGroovyClassDoc.java =================================================================== --- src/main/org/codehaus/groovy/tools/groovydoc/ExternalGroovyClassDoc.java (revision 21075) +++ src/main/org/codehaus/groovy/tools/groovydoc/ExternalGroovyClassDoc.java (working copy) @@ -290,7 +290,7 @@ } public String name() { - return null; + return externalClass.getSimpleName(); } public void setRawCommentText(String arg0) { Index: src/main/org/codehaus/groovy/tools/groovydoc/SimpleGroovyClassDocAssembler.java =================================================================== --- src/main/org/codehaus/groovy/tools/groovydoc/SimpleGroovyClassDocAssembler.java (revision 21075) +++ src/main/org/codehaus/groovy/tools/groovydoc/SimpleGroovyClassDocAssembler.java (working copy) @@ -167,8 +167,7 @@ public void visitExtendsClause(GroovySourceAST t, int visit) { SimpleGroovyClassDoc currentClassDoc = getCurrentClassDoc(); if (visit == OPENING_VISIT) { - GroovySourceAST superClassNode = t.childOfType(IDENT); - if (superClassNode != null) { + for (GroovySourceAST superClassNode : findTypeNames(t)) { String superClassName = extractName(superClassNode); if (currentClassDoc.isInterface()) { currentClassDoc.addInterfaceName(superClassName); @@ -182,13 +181,25 @@ @Override public void visitImplementsClause(GroovySourceAST t, int visit) { if (visit == OPENING_VISIT) { - GroovySourceAST classNode = t.childOfType(IDENT); - if (classNode != null) { + for (GroovySourceAST classNode : findTypeNames(t)) { getCurrentClassDoc().addInterfaceName(extractName(classNode)); } } } + private List findTypeNames(GroovySourceAST t) { + List types = new ArrayList(); + for (AST child = t.getFirstChild(); child != null; child = child.getNextSibling()) { + GroovySourceAST groovySourceAST = (GroovySourceAST) child; + if (groovySourceAST.getType() == IDENT) { + types.add(groovySourceAST); + }else if (groovySourceAST.getType() == TYPE) { + types.add(groovySourceAST.childOfType(IDENT)); + } + } + return types; + } + @Override public void visitCtorIdent(GroovySourceAST t, int visit) { if (visit == OPENING_VISIT && !insideEnum && !insideAnonymousInnerClass()) { Index: src/main/org/codehaus/groovy/tools/groovydoc/gstringTemplates/classLevel/classDocStructuredData.xml =================================================================== --- src/main/org/codehaus/groovy/tools/groovydoc/gstringTemplates/classLevel/classDocStructuredData.xml (revision 21075) +++ src/main/org/codehaus/groovy/tools/groovydoc/gstringTemplates/classLevel/classDocStructuredData.xml (working copy) @@ -1,6 +1,10 @@ ${classDoc.containingPackage().nameWithDots()} ${classDoc.superclass()?.name()} + <% for (interfaceDoc in classDoc.interfaces()) { %> + ${interfaceDoc.name()} +<% } %> + ${classDoc.commentText()} <% for (constructor in classDoc.constructors()) { %> Index: src/main/org/codehaus/groovy/tools/groovydoc/SimpleGroovyDoc.java =================================================================== --- src/main/org/codehaus/groovy/tools/groovydoc/SimpleGroovyDoc.java (revision 21075) +++ src/main/org/codehaus/groovy/tools/groovydoc/SimpleGroovyDoc.java (working copy) @@ -169,10 +169,10 @@ // Methods from Comparable public int compareTo(Object that) { - if (that instanceof SimpleGroovyDoc) { - return name.compareTo(((SimpleGroovyDoc) that).name); + if (that instanceof GroovyDoc) { + return name.compareTo(((GroovyDoc) that).name()); } else { - throw new ClassCastException(); + throw new ClassCastException(String.format("Cannot compare object of type %s.", that.getClass())); } }