From 799a74bf1cb3350cb0ab8ec55d23075524d4f240 Mon Sep 17 00:00:00 2001 From: mkersten Date: Wed, 10 Mar 2004 19:46:13 +0000 Subject: [PATCH] Port of ajdoc declaration hierarchy to ASM. --- ajdoc/.classpath | 2 + ajdoc/src/org/aspectj/tools/ajdoc/Main.java | 61 ++-- ajdoc/src/org/aspectj/tools/ajdoc/Phase1.java | 279 ++++++++++-------- .../aspectj/tools/ajdoc/StructureUtil.java | 74 +++++ .../aspectj/tools/ajdoc/SymbolManager.java | 68 +++-- ajdoc/testdata/simple/.cvsignore | 1 + ajdoc/testdata/simple/foo/ClassA.java | 14 + .../org/aspectj/tools/ajdoc/MainTest.java | 46 +++ 8 files changed, 363 insertions(+), 182 deletions(-) create mode 100644 ajdoc/src/org/aspectj/tools/ajdoc/StructureUtil.java create mode 100644 ajdoc/testdata/simple/.cvsignore create mode 100644 ajdoc/testdata/simple/foo/ClassA.java create mode 100644 ajdoc/testsrc/org/aspectj/tools/ajdoc/MainTest.java diff --git a/ajdoc/.classpath b/ajdoc/.classpath index bb44554db..7ceaa12f0 100644 --- a/ajdoc/.classpath +++ b/ajdoc/.classpath @@ -7,5 +7,7 @@ + + diff --git a/ajdoc/src/org/aspectj/tools/ajdoc/Main.java b/ajdoc/src/org/aspectj/tools/ajdoc/Main.java index 25612ff5c..558430543 100644 --- a/ajdoc/src/org/aspectj/tools/ajdoc/Main.java +++ b/ajdoc/src/org/aspectj/tools/ajdoc/Main.java @@ -14,19 +14,12 @@ package org.aspectj.tools.ajdoc; -import java.io.File; -import java.io.FileOutputStream; -import java.io.BufferedWriter; -import java.io.PrintWriter; -import java.io.IOException; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.StringReader; -import java.io.FilenameFilter; - +import java.io.*; import java.util.*; +import org.aspectj.asm.AsmManager; +import org.aspectj.asm.IProgramElement; + /** * This is an old implementation of ajdoc that does not use an OO style. However, it * does the job, and should serve to evolve a lightweight ajdoc implementation until @@ -96,7 +89,7 @@ public class Main implements Config { if ( !(new File( Config.WORKING_DIR ).isDirectory()) ) { File dir = new File( Config.WORKING_DIR ); dir.mkdir(); - dir.deleteOnExit(); +// dir.deleteOnExit(); } for (int i = 0; i < filenames.size(); i++) { @@ -191,8 +184,8 @@ public class Main implements Config { javadocargs[options.size() + k] = signatureFiles[k].getCanonicalPath(); } } + Phase2.callJavadoc(javadocargs); - //for ( int o = 0; o < inputFiles.length; o++ ) { // System.out.println( "file: " + inputFiles[o] ); //} @@ -203,19 +196,19 @@ public class Main implements Config { * into multiple .html files to handle inner classes or local classes. The html * file decorator picks that up. */ - System.out.println( "> Decorating html files..." ); - Phase3.decorateHTMLFromInputFiles(declIDTable, - rootDir, - symbolManager, - inputFiles, - docModifier); - removeDeclIDsFromFile("index-all.html"); - removeDeclIDsFromFile("serialized-form.html"); - for (int p = 0; p < packageList.size(); p++) { - removeDeclIDsFromFile(((String)packageList.elementAt(p)).replace('.','/') + - Config.DIR_SEP_CHAR + - "package-summary.html" ); - } +// System.out.println( "> Decorating html files..." ); +// Phase3.decorateHTMLFromInputFiles(declIDTable, +// rootDir, +// symbolManager, +// inputFiles, +// docModifier); +// removeDeclIDsFromFile("index-all.html"); +// removeDeclIDsFromFile("serialized-form.html"); +// for (int p = 0; p < packageList.size(); p++) { +// removeDeclIDsFromFile(((String)packageList.elementAt(p)).replace('.','/') + +// Config.DIR_SEP_CHAR + +// "package-summary.html" ); +// } } catch (Throwable e) { handleInternalError(e); exit(-2); @@ -339,18 +332,12 @@ public class Main implements Config { } static File createSignatureFile(File inputFile) throws IOException { - Declaration[] decls = symbolManager.getDeclarations(inputFile.getAbsolutePath()); - Declaration decl = null; - String packageName = null; - if ( decls != null && decls[0] != null ) { - decl = decls[0]; - packageName = decl.getPackageName(); - } + String packageName = StructureUtil.getPackageDeclarationFromFile(inputFile); + +// System.err.println(">>> package: " + packageName); String filename = ""; if ( packageName != null ) { - //System.err.println(">> creating: " + packageName); String pathName = Config.WORKING_DIR + '/' + packageName.replace('.', '/'); - //System.err.println(">> pathName: " + pathName); File packageDir = new File(pathName); if ( !packageDir.exists() ) { packageDir.mkdirs(); @@ -388,7 +375,7 @@ public class Main implements Config { File packageDir = new File( filePath ); if ( !packageDir.exists() ) { packageDir.mkdir(); - packageDir.deleteOnExit(); +// packageDir.deleteOnExit(); } if ( remainingPkg != "" ) { verifyPackageDirExists( remainingPkg, currPkgDir ); @@ -405,7 +392,7 @@ public class Main implements Config { File packageDir = new File( filePath ); if ( !packageDir.exists() ) { packageDir.mkdir(); - packageDir.deleteOnExit(); +// packageDir.deleteOnExit(); } } } diff --git a/ajdoc/src/org/aspectj/tools/ajdoc/Phase1.java b/ajdoc/src/org/aspectj/tools/ajdoc/Phase1.java index 2c36403a3..ed79ec86c 100644 --- a/ajdoc/src/org/aspectj/tools/ajdoc/Phase1.java +++ b/ajdoc/src/org/aspectj/tools/ajdoc/Phase1.java @@ -14,18 +14,13 @@ package org.aspectj.tools.ajdoc; -import java.io.File; -import java.io.FileOutputStream; -import java.io.BufferedWriter; -import java.io.PrintWriter; -import java.io.IOException; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.StringReader; -import java.util.StringTokenizer; - -import java.util.*; +import java.io.*; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; + +import org.aspectj.asm.AsmManager; +import org.aspectj.asm.IProgramElement; class Phase1 { @@ -37,136 +32,174 @@ class Phase1 { File[] signatureFiles) { declIDTable = table; for (int i = 0; i < inputFiles.length; i++) { - doFile(symbolManager, inputFiles[i], signatureFiles[i]); + processFile(symbolManager, inputFiles[i], signatureFiles[i]); } } - static void doFile(SymbolManager symbolManager, File inputFile, File signatureFile) { + static void processFile(SymbolManager symbolManager, File inputFile, File signatureFile) { try { - - Declaration[] decls = symbolManager.getDeclarations(inputFile.getCanonicalPath()); + // Declaration[] decls = symbolManager.getDeclarations(inputFile.getCanonicalPath()); PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(signatureFile.getCanonicalPath()))); - - // write the package info - if ( decls != null && decls[0] != null && decls[0].getPackageName() != null ) { - writer.println( "package " + decls[0].getPackageName() + ";" ); + + String packageName = StructureUtil.getPackageDeclarationFromFile(inputFile); + + if (packageName != null ) { + writer.println( "package " + packageName + ";" ); } - if (decls != null) { - doDecls(decls, writer, false); - } - writer.close(); //this isn't in a finally, because if we got an - //error we don't really want the contents anyways - } - catch (IOException e) { + IProgramElement fileNode = (IProgramElement)AsmManager.getDefault().getHierarchy().findElementForSourceFile(inputFile.getAbsolutePath()); + for (Iterator it = fileNode.getChildren().iterator(); it.hasNext(); ) { + IProgramElement node = (IProgramElement)it.next(); + if (!node.getKind().equals(IProgramElement.Kind.IMPORT_REFERENCE)) { + processTypeDeclaration(node, writer); + } + } + + // if we got an error we don't want the contents of the file + writer.close(); + } catch (IOException e) { System.err.println(e.getMessage()); e.printStackTrace(); - } + } } - static void doDecls (Declaration[] decls, - PrintWriter writer, - boolean declaringDeclIsInterface) throws IOException { - for (int i = 0; i < decls.length; i++) { - Declaration decl = decls[i]; - //System.out.println( ">> sig: " + decl.getSignature() ); - doDecl(decl, writer, declaringDeclIsInterface); - } - } - - static void doDecl(Declaration decl, - PrintWriter writer, - boolean declaringDeclIsInterface) throws IOException { - String formalComment = decl.getFormalComment(); - String fullSignature = decl.getFullSignature(); - System.err.println("> full: " + fullSignature); - Declaration[] ptbs = decl.getPointedToBy(); - Declaration[] subs = decl.getDeclarations(); - if (decl.hasSignature()) { - formalComment = addDeclID(decl, formalComment); - - writer.println(formalComment); - - // HACK: this should be in Declaration - int implementsClauseIndex = fullSignature.indexOf(" implements"); - if (implementsClauseIndex != -1) { - String newSignature = ""; - StringTokenizer st = new StringTokenizer(fullSignature.substring(implementsClauseIndex, fullSignature.length())); - for (String element = (String)st.nextElement(); st.hasMoreElements(); element = (String)st.nextElement()) { - if (element.indexOf("$MightHaveAspect") != -1 - && element.indexOf("implements") != -1) { - newSignature += element; - } - } - if (!newSignature.equals("")) { - writer.print(fullSignature.substring(0, implementsClauseIndex) - + " implements " + newSignature + " " ); - } else { - writer.print(fullSignature.substring(0, implementsClauseIndex) + " " ); - } - } else { - writer.print(fullSignature + " " ); - } +// static void processClassDeclarations(IProgramElement fileNode, +// PrintWriter writer, +// boolean declaringDeclIsInterface) throws IOException { +// for (Iterator it = fileNode.getChildren().iterator(); it.hasNext(); ) { +// IProgramElement node = (IProgramElement)it.next(); +// proc +// } +// for (int i = 0; i < decls.length; i++) { +// Declaration decl = decls[i]; +// +// //System.out.println( ">> sig: " + decl.getSignature() ); +// doDecl(decl, writer, declaringDeclIsInterface); +// } +// } - if ((!decl.hasBody() && !decl.getKind().equals( "interface" ) || - (decl.getKind().equals( "method" ) && declaringDeclIsInterface)) && // !!! bug in Jim's API? - !(decl.getKind().equals("initializer") && decl.getModifiers().indexOf("static") != -1 ) ) { - - System.err.println(">>>> kind: " + decl.getKind()); - - if (decl.getModifiers().indexOf("static final") != -1) { - String fullSig = decl.getFullSignature().trim(); - String stripped = fullSig.substring(0, fullSig.lastIndexOf(' ')); - //System.err.println(">>> " + fullSig); - String type = stripped.substring(stripped.lastIndexOf(' '), stripped.length()); - //System.err.println("> type: " + type); - - if (type.equals("boolean")) { - writer.println(" = false"); - } else if (type.equals("char")) { - writer.println(" = '0'"); - } else if (type.equals("byte")) { - writer.println(" = 0"); - } else if (type.equals("short")) { - writer.println(" = 0"); - } else if (type.equals("int")) { - writer.println(" = 0"); - } else if (type.equals("long")) { - writer.println(" = 0"); - } else if (type.equals("float")) { - writer.println(" = 0"); - } else if (type.equals("double")) { - writer.println(" = 0"); - } else if (type.equals("String")) { - writer.println(" = \"\""); - } else { - writer.println(" = null"); - } - } - writer.println(";"); -// } else if ((!decl.hasBody() && !decl.getKind().equals( "interface" ) || + private static void processTypeDeclaration(IProgramElement classNode, PrintWriter writer) throws IOException { + +// String formalComment = classNode.getFormalComment(); +// String fullSignature = classNode.getFullSignature(); +// Declaration[] ptbs = classNode.getPointedToBy(); +// Declaration[] subs = classNode.getDeclarations(); + + String formalComment = addDeclID(classNode, classNode.getFormalComment()); + writer.println(formalComment); + + String signature = StructureUtil.genSignature(classNode); + writer.println(signature + " {" ); + processMembers(classNode.getChildren(), writer, classNode.getKind().equals(IProgramElement.Kind.INTERFACE)); + writer.println(); + writer.println("}"); + } + + private static void processMembers(List/*IProgramElement*/ members, PrintWriter writer, boolean declaringTypeIsInterface) throws IOException { + for (Iterator it = members.iterator(); it.hasNext();) { + IProgramElement member = (IProgramElement) it.next(); + + if (member.getKind().isTypeKind()) { + processTypeDeclaration(member, writer); + } else { + + String formalComment = addDeclID(member, member.getFormalComment()); + writer.println(formalComment); + String signature = StructureUtil.genSignature(member); + writer.print(signature); + + if (member.getKind().equals(IProgramElement.Kind.METHOD)) { + writer.println(" { }"); + + } else if (member.getKind().equals(IProgramElement.Kind.FIELD)) { + writer.println(";"); + } + } + } + } + +// +// if (decl.hasSignature()) { +// formalComment = addDeclID(decl, formalComment); +// +// writer.println(formalComment); +// +// // HACK: this should be in Declaration +// int implementsClauseIndex = fullSignature.indexOf(" implements"); +// if (implementsClauseIndex != -1) { +// String newSignature = ""; +// StringTokenizer st = new StringTokenizer(fullSignature.substring(implementsClauseIndex, fullSignature.length())); +// for (String element = (String)st.nextElement(); st.hasMoreElements(); element = (String)st.nextElement()) { +// if (element.indexOf("$MightHaveAspect") != -1 +// && element.indexOf("implements") != -1) { +// newSignature += element; +// } +// } +// if (!newSignature.equals("")) { +// writer.print(fullSignature.substring(0, implementsClauseIndex) +// + " implements " + newSignature + " " ); +// } else { +// writer.print(fullSignature.substring(0, implementsClauseIndex) + " " ); +// } +// } else { +// writer.print(fullSignature + " " ); +// } +// +// +// if ((!decl.hasBody() && !decl.getKind().equals( "interface" ) || // (decl.getKind().equals( "method" ) && declaringDeclIsInterface)) && // !!! bug in Jim's API? // !(decl.getKind().equals("initializer") && decl.getModifiers().indexOf("static") != -1 ) ) { // +// if (decl.getModifiers().indexOf("static final") != -1) { +// String fullSig = decl.getFullSignature().trim(); +// String stripped = fullSig.substring(0, fullSig.lastIndexOf(' ')); +// String type = stripped.substring(stripped.lastIndexOf(' '), stripped.length()); +// +// if (type.equals("boolean")) { +// writer.println(" = false"); +// } else if (type.equals("char")) { +// writer.println(" = '0'"); +// } else if (type.equals("byte")) { +// writer.println(" = 0"); +// } else if (type.equals("short")) { +// writer.println(" = 0"); +// } else if (type.equals("int")) { +// writer.println(" = 0"); +// } else if (type.equals("long")) { +// writer.println(" = 0"); +// } else if (type.equals("float")) { +// writer.println(" = 0"); +// } else if (type.equals("double")) { +// writer.println(" = 0"); +// } else if (type.equals("String")) { +// writer.println(" = \"\""); +// } else { +// writer.println(" = null"); +// } +// } // writer.println(";"); - - } else { - if (subs != null) { - if ( decl.getKind().equals( "interface" ) ) { - declaringDeclIsInterface = true; - } - writer.println("{"); - doDecls(subs, writer, declaringDeclIsInterface); - writer.println("}"); - } - } - writer.println(); - } - } +//// } else if ((!decl.hasBody() && !decl.getKind().equals( "interface" ) || +//// (decl.getKind().equals( "method" ) && declaringDeclIsInterface)) && // !!! bug in Jim's API? +//// !(decl.getKind().equals("initializer") && decl.getModifiers().indexOf("static") != -1 ) ) { +//// +//// writer.println(";"); +// +// } else { +// if (subs != null) { +// if ( decl.getKind().equals( "interface" ) ) { +// declaringDeclIsInterface = true; +// } +// writer.println("{"); +// processDeclarations(subs, writer, declaringDeclIsInterface); +// writer.println("}"); +// } +// } +// writer.println(); +// } static int nextDeclID = 0; - static String addDeclID(Declaration decl, String formalComment) { + static String addDeclID(IProgramElement decl, String formalComment) { String declID = "" + ++nextDeclID; declIDTable.put(declID, decl); return addToFormal(formalComment, Config.DECL_ID_STRING + declID + Config.DECL_ID_TERMINATOR); diff --git a/ajdoc/src/org/aspectj/tools/ajdoc/StructureUtil.java b/ajdoc/src/org/aspectj/tools/ajdoc/StructureUtil.java new file mode 100644 index 000000000..ff46e3807 --- /dev/null +++ b/ajdoc/src/org/aspectj/tools/ajdoc/StructureUtil.java @@ -0,0 +1,74 @@ +/* ******************************************************************* + * Copyright (c) 2003 Contributors. + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Common Public License v1.0 + * which accompanies this distribution and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Mik Kersten initial implementation + * ******************************************************************/ + package org.aspectj.tools.ajdoc; + +import java.io.File; +import java.util.Iterator; + +import org.aspectj.asm.AsmManager; +import org.aspectj.asm.IProgramElement; + +/** + * @author Mik Kersten + */ +public class StructureUtil { + + public static String getPackageDeclarationFromFile(File file) { + IProgramElement fileNode = (IProgramElement)AsmManager.getDefault().getHierarchy().findElementForSourceFile(file.getAbsolutePath()); + String packageName = ((IProgramElement)fileNode.getChildren().get(0)).getPackageName(); + return packageName; + } + + public static String genSignature(IProgramElement node) { + StringBuffer sb = new StringBuffer(); + + String accessibility = node.getAccessibility().toString(); + if (!accessibility.equals("package")) { + sb.append(accessibility); + sb.append(' '); + } + + String modifiers = ""; + for (Iterator modIt = node.getModifiers().iterator(); modIt.hasNext(); ) { + modifiers += modIt.next() + " "; + } + + if (node.getKind().equals(IProgramElement.Kind.METHOD) || + node.getKind().equals(IProgramElement.Kind.FIELD)) { + sb.append(node.getCorrespondingType()); + sb.append(' '); + } + + if (node.getKind().equals(IProgramElement.Kind.CLASS)) { + sb.append("class "); + } else if (node.getKind().equals(IProgramElement.Kind.INTERFACE)) { + sb.append("interface "); + } + + sb.append(node.getName()); + + if (node.getParameterTypes() != null ) { + sb.append('('); + for (int i = 0; i < node.getParameterTypes().size(); i++) { + sb.append((String)node.getParameterTypes().get(i)); + sb.append(' '); + sb.append((String)node.getParameterNames().get(i)); + if (i < node.getParameterTypes().size()-1) { + sb.append(", "); + } + } + sb.append(')'); + } + + return sb.toString(); + } +} diff --git a/ajdoc/src/org/aspectj/tools/ajdoc/SymbolManager.java b/ajdoc/src/org/aspectj/tools/ajdoc/SymbolManager.java index 48fc339d5..6c1a0dcbb 100644 --- a/ajdoc/src/org/aspectj/tools/ajdoc/SymbolManager.java +++ b/ajdoc/src/org/aspectj/tools/ajdoc/SymbolManager.java @@ -118,6 +118,7 @@ public class SymbolManager { * TODO: only works for one class */ public Declaration[] getDeclarations(String filename) { + IProgramElement file = (IProgramElement)AsmManager.getDefault().getHierarchy().findElementForSourceFile(filename); IProgramElement node = (IProgramElement)file.getChildren().get(0); @@ -126,44 +127,67 @@ public class SymbolManager { HierarchyWalker walker = new HierarchyWalker() { public void preProcess(IProgramElement node) { IProgramElement p = (IProgramElement)node; - nodes.add(buildDecl(p)); + if (accept(node)) nodes.add(buildDecl(p)); } }; file.walk(walker); + System.err.println("> got: " + nodes); + return (Declaration[])nodes.toArray(new Declaration[nodes.size()]); // return lookupDeclarations(filename); } + + private boolean accept(IProgramElement node) { + return !node.getKind().equals(IProgramElement.Kind.IMPORT_REFERENCE); + } private Declaration buildDecl(IProgramElement node) { - System.err.println("> getting decs: " + node); - + + String signature = ""; + String accessibility = node.getAccessibility().toString(); + if (!accessibility.equals("package")) signature = accessibility + " "; + String modifiers = ""; for (Iterator modIt = node.getModifiers().iterator(); modIt.hasNext(); ) { modifiers += modIt.next() + " "; } -// Declaration dec = new Declaration( -// node.getSourceLocation().getLine(), -// node.getSourceLocation().getEndLine(), -// node.getSourceLocation().getColumn(), -// -1, -// modifiers, -// node.getName(), -// node.getFullSignature(), -// "", -// node.getDeclaringType(), -// node.getKind(), -// node.getSourceLocation().getSourceFile().getAbsolutePath(), -// node.getFormalComment(), -// node.getPackageName() -// ); -// return dec; - return null; + + if (node.getKind().equals(IProgramElement.Kind.METHOD) || + node.getKind().equals(IProgramElement.Kind.FIELD)) { + signature += node.getCorrespondingType() + " "; + } + + if (node.getKind().equals(IProgramElement.Kind.CLASS) || + node.getKind().equals(IProgramElement.Kind.METHOD)) { + signature += "class "; + } else if (node.getKind().equals(IProgramElement.Kind.INTERFACE) || + node.getKind().equals(IProgramElement.Kind.METHOD)) { + signature += "interface "; + } + + signature += node.toSignatureString(); +// System.err.println(">>>> " + signature); + + Declaration dec = new Declaration( + node.getSourceLocation().getLine(), + node.getSourceLocation().getEndLine(), + node.getSourceLocation().getColumn(), + -1, + modifiers, + node.getName(), + signature, + "", // crosscut designator + node.getDeclaringType(), + node.getKind().toString(), + node.getSourceLocation().getSourceFile().getAbsolutePath(), + node.getFormalComment(), + node.getPackageName() + ); + return dec; } - - // // In the unusual case that there are multiple declarations on a single line // // This will return a random one diff --git a/ajdoc/testdata/simple/.cvsignore b/ajdoc/testdata/simple/.cvsignore new file mode 100644 index 000000000..8e695ec83 --- /dev/null +++ b/ajdoc/testdata/simple/.cvsignore @@ -0,0 +1 @@ +doc diff --git a/ajdoc/testdata/simple/foo/ClassA.java b/ajdoc/testdata/simple/foo/ClassA.java new file mode 100644 index 000000000..458c76397 --- /dev/null +++ b/ajdoc/testdata/simple/foo/ClassA.java @@ -0,0 +1,14 @@ + +package foo; + +public class ClassA { + + public int pubfield; + private int privfield; + + void method1(int arg1) { + pubfield = arg1; + } + +} + \ No newline at end of file diff --git a/ajdoc/testsrc/org/aspectj/tools/ajdoc/MainTest.java b/ajdoc/testsrc/org/aspectj/tools/ajdoc/MainTest.java new file mode 100644 index 000000000..6404ae25b --- /dev/null +++ b/ajdoc/testsrc/org/aspectj/tools/ajdoc/MainTest.java @@ -0,0 +1,46 @@ +/* ******************************************************************* + * Copyright (c) 2003 Contributors. + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Common Public License v1.0 + * which accompanies this distribution and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Mik Kersten initial implementation + * ******************************************************************/ + package org.aspectj.tools.ajdoc; + +import java.io.File; + +import junit.framework.TestCase; + +/** + * @author Mik Kersten + */ +public class MainTest extends TestCase { + + + public void testRun() { + +// System.err.println(new File("testdata/figures-demo").exists()); + File sourcepath = new File("testdata/simple/foo/ClassA.java"); + File outdir = new File("testdata/simple/doc"); + + String[] args = { "-d", outdir.getAbsolutePath(), sourcepath.getAbsolutePath() }; + +// String[] args = { "-sourcepath", sourcepath.getAbsolutePath(), "figures" }; + org.aspectj.tools.ajdoc.Main.main(args); + + assertTrue(true); + } + + + protected void setUp() throws Exception { + super.setUp(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + } +} -- 2.39.5