summaryrefslogtreecommitdiffstats
path: root/src/java/net/sf/antcontrib/design/VisitorImpl.java
diff options
context:
space:
mode:
authormattinger <[email protected]>2006-07-06 21:53:00 +0000
committermattinger <[email protected]>2006-07-06 21:53:00 +0000
commit1159111b7a71b72eb04326df33211e1733f7e742 (patch)
treef0a80c384f633e521649654ab78e6239cf5e0d6f /src/java/net/sf/antcontrib/design/VisitorImpl.java
Initial addition into subversion with build script changes
git-svn-id: file:///home/sven/projects/JOGL/temp/ant-contrib/svn/ant-contrib-code/trunk/ant-contrib@5 32d7a393-a5a9-423c-abd3-5d954feb1f2f
Diffstat (limited to 'src/java/net/sf/antcontrib/design/VisitorImpl.java')
-rw-r--r--src/java/net/sf/antcontrib/design/VisitorImpl.java211
1 files changed, 211 insertions, 0 deletions
diff --git a/src/java/net/sf/antcontrib/design/VisitorImpl.java b/src/java/net/sf/antcontrib/design/VisitorImpl.java
new file mode 100644
index 0000000..84aefee
--- /dev/null
+++ b/src/java/net/sf/antcontrib/design/VisitorImpl.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2001-2004 Ant-Contrib project. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * Created on Jan 9, 2005
+ */
+package net.sf.antcontrib.design;
+
+import java.io.File;
+
+import org.apache.bcel.Constants;
+import org.apache.bcel.classfile.Code;
+import org.apache.bcel.classfile.CodeException;
+import org.apache.bcel.classfile.ConstantPool;
+import org.apache.bcel.classfile.EmptyVisitor;
+import org.apache.bcel.classfile.ExceptionTable;
+import org.apache.bcel.classfile.Field;
+import org.apache.bcel.classfile.JavaClass;
+import org.apache.bcel.classfile.LineNumberTable;
+import org.apache.bcel.classfile.LocalVariable;
+import org.apache.bcel.classfile.Method;
+import org.apache.bcel.classfile.Utility;
+import org.apache.bcel.generic.ConstantPoolGen;
+import org.apache.bcel.generic.Instruction;
+import org.apache.bcel.generic.InstructionHandle;
+import org.apache.bcel.generic.MethodGen;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Location;
+import org.apache.tools.ant.Project;
+
+class VisitorImpl extends EmptyVisitor {
+
+ private ConstantPool pool;
+ private Log log;
+ private Design design;
+ private ConstantPoolGen poolGen;
+ private InstructionVisitor visitor;
+ private Location location;
+
+ public VisitorImpl(ConstantPool pool, Log log, Design d, Location loc) {
+ this.pool = pool;
+ this.log = log;
+ this.design = d;
+ this.location = loc;
+ this.poolGen = new ConstantPoolGen(pool);
+ visitor = new InstructionVisitor(poolGen, log, d);
+ }
+
+ private void log(String s, int level) {
+ log.log(s, level);
+ }
+
+ public void visitJavaClass(JavaClass c) {
+ log(" super=" + c.getSuperclassName(), Project.MSG_VERBOSE);
+ String[] names = c.getInterfaceNames();
+
+ String superClass = c.getSuperclassName();
+
+ design.checkClass(superClass);
+
+ for (int i = 0; i < names.length; i++) {
+ log(" interfaces=" + names[i], Project.MSG_VERBOSE);
+ design.checkClass(names[i]);
+ }
+ }
+
+ /**
+ * @see org.apache.bcel.classfile.Visitor#visitField(org.apache.bcel.classfile.Field)
+ */
+ public void visitField(Field f) {
+ String type = Utility.methodSignatureReturnType(f.getSignature());
+ log(" field type=" + type, Project.MSG_VERBOSE);
+ design.checkClass(type);
+
+ }
+
+ /**
+ * @see org.apache.bcel.classfile.Visitor#visitLocalVariable(org.apache.bcel.classfile.LocalVariable)
+ */
+ public void visitLocalVariable(LocalVariable v) {
+ String type = Utility.methodSignatureReturnType(v.getSignature());
+ log(" localVar type=" + type, Project.MSG_VERBOSE);
+ design.checkClass(type);
+ }
+
+ /**
+ * @see org.apache.bcel.classfile.Visitor#visitMethod(org.apache.bcel.classfile.Method)
+ */
+ public void visitMethod(Method m) {
+ log(" method=" + m.getName(), Project.MSG_VERBOSE);
+ String retType = Utility.methodSignatureReturnType(m.getSignature());
+ log(" method ret type=" + retType, Project.MSG_VERBOSE);
+ if (!"void".equals(retType))
+ design.checkClass(retType);
+
+ String[] types = Utility.methodSignatureArgumentTypes(m.getSignature());
+ for (int i = 0; i < types.length; i++) {
+ log(" method param[" + i + "]=" + types[i],
+ Project.MSG_VERBOSE);
+ design.checkClass(types[i]);
+ }
+
+ ExceptionTable excs = m.getExceptionTable();
+ if (excs != null) {
+ types = excs.getExceptionNames();
+ for (int i = 0; i < types.length; i++) {
+ log(" exc=" + types[i], Project.MSG_VERBOSE);
+ design.checkClass(types[i]);
+ }
+ }
+
+ processInstructions(m);
+ }
+
+ private void processInstructions(Method m) {
+ MethodGen mg = new MethodGen(m, design.getCurrentClass(), poolGen);
+
+ if (!mg.isAbstract() && !mg.isNative()) {
+ InstructionHandle ih = mg.getInstructionList().getStart();
+ for (; ih != null; ih = ih.getNext()) {
+ Instruction i = ih.getInstruction();
+ log(" instr=" + i, Project.MSG_DEBUG);
+ // if (i instanceof BranchInstruction) {
+ // branch_map.put(i, ih); // memorize container
+ // }
+
+ // if (ih.hasTargeters()) {
+ // if (i instanceof BranchInstruction) {
+ // _out.println(" InstructionHandle ih_"
+ // + ih.getPosition() + ";");
+ // } else {
+ // _out.print(" InstructionHandle ih_"
+ // + ih.getPosition() + " = ");
+ // }
+ // } else {
+ // _out.print(" ");
+ // }
+
+ // if (!visitInstruction(i))
+ i.accept(visitor);
+ }
+
+ // CodeExceptionGen[] handlers = mg.getExceptionHandlers();
+ //
+ // log("handlers len="+handlers.length, Project.MSG_DEBUG);
+ // for (int i = 0; i < handlers.length; i++) {
+ // CodeExceptionGen h = handlers[i];
+ // ObjectType t = h.getCatchType();
+ // log("type="+t, Project.MSG_DEBUG);
+ // if(t != null) {
+ // log("type="+t.getClassName(), Project.MSG_DEBUG);
+ // }
+ // }
+ // updateExceptionHandlers();
+ }
+ }
+
+ public void visitCodeException(CodeException c) {
+ String s = c.toString(pool, false);
+
+ int catch_type = c.getCatchType();
+
+ if (catch_type == 0)
+ return;
+
+ String temp = pool.getConstantString(catch_type,
+ Constants.CONSTANT_Class);
+ String str = Utility.compactClassName(temp, false);
+
+ log(" catch=" + str, Project.MSG_DEBUG);
+ design.checkClass(str);
+ }
+
+ //
+ public void visitCode(Code c) {
+ LineNumberTable table = c.getLineNumberTable();
+ // LocalVariableTable table = c.getLocalVariableTable();
+ if (table == null)
+ throw new BuildException(getNoDebugMsg(design.getCurrentClass()), location);
+ }
+
+ public static String getNoDebugMsg(String className) {
+ String s = "Class="+className+" was not compiled with the debug option(-g) and\n" +
+ "therefore verifydesign cannot be used on this jar. Please compile your code\n"+
+ "with -g option in javac or debug=\"true\" in the ant build.xml file";
+ return s;
+ }
+
+ /**
+ * @param jarName
+ * @return
+ */
+ public static String getNoFileMsg(File jarName) {
+ String s = "File you specified in your path(or jar attribute)='"+jarName.getAbsolutePath()+"' does not exist";
+ return s;
+ }
+
+
+} \ No newline at end of file