Example usage for org.objectweb.asm Opcodes ACC_INTERFACE

List of usage examples for org.objectweb.asm Opcodes ACC_INTERFACE

Introduction

In this page you can find the example usage for org.objectweb.asm Opcodes ACC_INTERFACE.

Prototype

int ACC_INTERFACE

To view the source code for org.objectweb.asm Opcodes ACC_INTERFACE.

Click Source Link

Usage

From source file:WebServiceAnnotationExtractor.java

License:Open Source License

public void visit(int version, int access, String name, String signature, String superName,
        String[] interfaces) {/* w w  w  . j ava  2  s  .co m*/
    isImplementation = (access & (Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT)) == 0;
    className = name.replace('/', '.');
}

From source file:Asm.java

License:Apache License

private static void modify(ClassNode classNode) throws Exception {
    int classFlagsOr = 0xFFFF;
    // Check whether classNode is an interface or class.
    if ((classNode.access & Opcodes.ACC_INTERFACE) == 0) {
        classFlagsOr ^= CLASS_DEFINED_BITS;
    } else {/*from ww w . j  av a2 s  .c  om*/
        classFlagsOr ^= INTERFACE_DEFINED_BITS;
    }
    classNode.access |= classFlagsOr;

    // Fields.
    int fieldFlagsOr = 0xFFFF ^ FIELD_DEFINED_BITS;
    for (FieldNode fieldNode : (List<FieldNode>) classNode.fields) {
        fieldNode.access |= fieldFlagsOr;
    }

    // Methods.
    int methodFlagsOr = 0xFFFF ^ METHOD_DEFINED_BITS;
    for (MethodNode methodNode : (List<MethodNode>) classNode.methods) {
        methodNode.access |= methodFlagsOr;
    }
}

From source file:asmlib.InfoClass.java

License:Open Source License

public boolean isInterface() {
    return (access() & Opcodes.ACC_INTERFACE) != 0;
}

From source file:blue.origami.asm.OAnno.java

License:Apache License

public void add(String spec) {
    String[] annos = spec.split(",");
    for (String s : annos) {
        s = s.toLowerCase();//from  w w w . j av  a  2  s  .co  m
        switch (s) {
        case "public":
            acc |= Opcodes.ACC_PUBLIC;
            acc &= ~Opcodes.ACC_PROTECTED;
            acc &= ~Opcodes.ACC_PRIVATE;
            break;
        case "protected":
            acc |= Opcodes.ACC_PROTECTED;
            acc &= ~Opcodes.ACC_PUBLIC;
            acc &= ~Opcodes.ACC_PRIVATE;
            break;
        case "private":
            acc |= Opcodes.ACC_PRIVATE;
            acc &= ~Opcodes.ACC_PUBLIC;
            acc &= ~Opcodes.ACC_PROTECTED;
            break;
        case "static":
            acc |= Opcodes.ACC_STATIC;
            break;
        case "abstract":
            acc |= Opcodes.ACC_ABSTRACT;
            break;
        case "interface":
            acc |= Opcodes.ACC_INTERFACE;
            break;
        case "final":
            acc |= Opcodes.ACC_FINAL;
            break;
        case "native":
            acc |= Opcodes.ACC_NATIVE;
            break;
        case "synchronized":
            acc |= Opcodes.ACC_SYNCHRONIZED;
            break;
        case "strictfp":
            acc |= Opcodes.ACC_STRICT;
            break;
        }
    }
}

From source file:blue.origami.asm.OAnno.java

License:Apache License

public final boolean isInterface() {
    return ((acc & Opcodes.ACC_INTERFACE) == Opcodes.ACC_INTERFACE);
}

From source file:br.usp.each.saeg.badua.cli.Report.java

License:Open Source License

private void analyze(final ClassNode cn) throws IOException {
    // do not analyze interfaces
    if ((cn.access & Opcodes.ACC_INTERFACE) != 0) {
        return;/*from  w ww  .  ja v a 2s .c  o m*/
    }

    // before analyze
    className = cn.name;
    classProbeCount = 0;
    classCoveredDuas = 0;
    classTotalDuas = 0;

    // iteration order is important!
    for (final MethodNode mn : cn.methods) {
        methodProbeCount = 0; // reset method probe counter
        analyze(mn);
    }

    if (showClasses) {
        System.out.println(String.format("%s\t(%d/%d)", className, classCoveredDuas, classTotalDuas));
    }
}

From source file:br.usp.each.saeg.badua.core.internal.instr.ClassInstrumenter.java

License:Open Source License

@Override
public void visit(final int version, final int access, final String name, final String signature,
        final String superName, final String[] interfaces) {

    classProbeCount = 0;/*  w  w  w . j a v a2 s .co m*/
    className = name;
    withFrames = (version & 0xff) >= Opcodes.V1_6;
    interfaceType = (access & Opcodes.ACC_INTERFACE) != 0;

    super.visit(version, access, name, signature, superName, interfaces);
}

From source file:ca.weblite.asm.JavaExtendedStubCompiler.java

License:Apache License

public Map<String, byte[]> compile(List<Type> types, File sourceFile) throws IOException {
    final Map<String, byte[]> outMap = new HashMap<>();
    final Set<String> typeNames = (types == null) ? null : new HashSet<String>();
    if (types != null) {
        for (Type type : types) {
            typeNames.add(type.getInternalName());
        }/*  w  ww.j  ava 2  s  .c o m*/
    }
    JavaCompiler compiler = JavacTool.create();
    MyFileObject[] fos = new MyFileObject[] { new MyFileObject(sourceFile) };

    JavacTask task = (JavacTask) compiler.getTask(null, null, null, null, null, Arrays.asList(fos));
    Iterable<? extends CompilationUnitTree> asts = task.parse();
    TreePathScanner scanner;

    final LinkedList<ClassFinder> scopeStack = new LinkedList<>();
    scanner = new TreePathScanner() {

        String packageName;
        ClassNode superClass;
        LinkedList<String> stack = new LinkedList<>();
        LinkedList<ClassInfo> classInfoStack = new LinkedList<>();
        LinkedList<ClassWriter> cwStack = new LinkedList<>();
        LinkedList<List<? extends TypeParameterTree>> typeParametersStack = new LinkedList<>();

        @Override
        public Object visitCompilationUnit(CompilationUnitTree cut, Object p) {

            packageName = cut.getPackageName().toString();
            ClassFinder scope = new ClassFinder(context.get(ClassLoader.class), null);
            scopeStack.push(scope);
            scope.addImport(packageName + ".*");
            return super.visitCompilationUnit(cut, p);
        }

        private String getThisInternalName(String simpleName) {
            simpleName = simpleName.replaceAll("\\.", "$");
            StringBuilder sb = new StringBuilder();
            Iterator<String> it = stack.descendingIterator();
            sb.append(packageName.replaceAll("\\.", "/"));
            sb.append("/");

            while (it.hasNext()) {
                sb.append(it.next()).append("$");
            }
            sb.append(simpleName);
            return sb.toString();
        }

        @Override
        public Object visitImport(ImportTree it, Object p) {
            if (!it.isStatic()) {
                String path = it.getQualifiedIdentifier().toString();
                scopeStack.peek().addImport(path);
            }
            return super.visitImport(it, p);
        }

        Object visitConstructor(final MethodTree mt, Object p) {
            ClassWriter classWriter = cwStack.peek();
            List<Type> argTypes = new ArrayList<Type>();
            boolean isVarArgs = false;
            for (VariableTree v : mt.getParameters()) {

                if (v.toString().endsWith("... " + v.getName())) {
                    isVarArgs = true;
                }
                String type = v.getType().toString();
                String fullType = type;
                String signature = null;
                try {
                    signature = TypeUtil.getTypeSignature(type, scopeStack.peek());
                } catch (Throwable t) {
                    System.out.println("Failed to find signature for type");
                }
                if (type.indexOf("<") != -1) {
                    type = type.substring(0, type.indexOf("<"));
                }
                int dim = 0;
                if (TypeUtil.isArrayType(type)) {
                    dim = TypeUtil.getArrayTypeDimension(type);
                    type = TypeUtil.getArrayElementType(type);
                }
                if (TypeUtil.isPrimitiveType(type)) {
                    String descriptor = TypeUtil.getDescriptor(type);
                    argTypes.add(Type.getType(TypeUtil.getArrayDescriptor(descriptor, dim)));
                } else {
                    ClassNode stub = scopeStack.peek().findStub(type);
                    assert stub != null;
                    argTypes.add(Type.getObjectType(stub.name));
                }

            }

            String methodDescriptor = null;
            String methodSignature = null;
            if (argTypes.isEmpty()) {
                methodDescriptor = Type.getMethodDescriptor(Type.getType("V"));
            } else {
                methodDescriptor = Type.getMethodDescriptor(Type.getType("V"), argTypes.toArray(new Type[0]));

            }

            int flags = getFlags(mt.getModifiers().getFlags());
            if (isVarArgs) {
                flags |= Opcodes.ACC_VARARGS;

            }
            classWriter.visitMethod(flags, mt.getName().toString(), methodDescriptor, null, null);
            classInfoStack.peek().numConstructors++;
            return null;
        }

        @Override
        public Object visitMethod(MethodTree mt, Object p) {
            if (mt.getReturnType() == null) {
                // It's a constructor
                return visitConstructor(mt, p);
            } else {
                boolean isVarArgs = false;
                ClassWriter classWriter = cwStack.peek();

                List<Type> argTypes = new ArrayList<>();
                List<String> sigArgTypes = new ArrayList<>();
                for (VariableTree v : mt.getParameters()) {
                    String type = v.getType().toString();
                    if (v.toString().endsWith("... " + v.getName())) {
                        isVarArgs = true;
                    }
                    sigArgTypes.add(type);
                    int dim = 0;
                    if (TypeUtil.isArrayType(type)) {
                        dim = TypeUtil.getArrayTypeDimension(type);
                        type = TypeUtil.getArrayElementType(type);
                    }
                    if (TypeUtil.isPrimitiveType(type)) {
                        String descriptor = TypeUtil.getDescriptor(type);
                        argTypes.add(Type.getType(TypeUtil.getArrayDescriptor(descriptor, dim)));
                    } else {

                        if (isGenericType(type)) {
                            type = "Object";
                        }

                        int arrowPos = type.indexOf("<");
                        if (arrowPos != -1) {
                            type = type.substring(0, arrowPos);
                        }
                        ClassNode stub = scopeStack.peek().findStub(type);
                        if (stub == null) {
                            throw new RuntimeException("Could not find class for " + type);
                        }
                        Type argType = Type.getObjectType(stub.name);
                        argType = Type.getType(TypeUtil.getArrayDescriptor(argType.getInternalName(), dim));
                        argTypes.add(argType);
                    }

                }

                String returnType = mt.getReturnType().toString();
                if (isGenericType(returnType)) {
                    returnType = "Object";
                }

                String methodSignature = null;
                try {
                    methodSignature = TypeUtil.getMethodSignature(scopeStack.peek(), returnType,
                            sigArgTypes.toArray(new String[0]));
                } catch (Exception ex) {
                    System.out.println(
                            "Failed to get signature for method " + mt + " message: " + ex.getMessage());
                }
                int dim = 0;

                Type returnTypeType = null;
                if (TypeUtil.isArrayType(returnType)) {
                    dim = TypeUtil.getArrayTypeDimension(returnType);
                    returnType = TypeUtil.getArrayElementType(returnType);
                    if (isGenericType(returnType)) {
                        returnType = "Object";
                    }

                }
                if (TypeUtil.isPrimitiveType(returnType)) {
                    String descriptor = TypeUtil.getDescriptor(returnType);
                    returnTypeType = Type.getType(TypeUtil.getArrayDescriptor(descriptor, dim));

                } else {
                    int arrowPos = returnType.indexOf("<");
                    if (arrowPos != -1) {
                        returnType = returnType.substring(0, arrowPos);
                    }
                    ClassNode stub = scopeStack.peek().findStub(returnType);
                    if (stub == null) {
                        System.out.println("Type params is " + mt.getTypeParameters());
                        System.out.println("Type kind is " + mt.getReturnType().getKind());
                        throw new RuntimeException("Could not find class for " + returnType);
                    }

                    returnTypeType = Type.getObjectType(stub.name);
                    returnTypeType = Type
                            .getType(TypeUtil.getArrayDescriptor(returnTypeType.getInternalName(), dim));

                }

                String methodDescriptor = null;
                if (argTypes.isEmpty()) {
                    methodDescriptor = Type.getMethodDescriptor(returnTypeType);
                } else {
                    methodDescriptor = Type.getMethodDescriptor(returnTypeType, argTypes.toArray(new Type[0]));
                }

                int flags = getFlags(mt.getModifiers().getFlags());
                if (isVarArgs) {
                    flags |= Opcodes.ACC_VARARGS;
                    //System.out.println("VarArgs "+flags);
                }
                classWriter.visitMethod(flags, mt.getName().toString(), methodDescriptor, methodSignature,
                        null);

            }
            //methodStack.push(mt);
            //Object out= super.visitMethod(mt, p); 
            //methodStack.pop();
            return null;
        }

        //private boolean LinkedList<MethodTree> methodStack  =new LinkedList<>();
        @Override
        public Object visitVariable(VariableTree vt, Object p) {

            ClassWriter classWriter = cwStack.peek();

            String varType = vt.getType().toString();
            if (isGenericType(varType)) {
                varType = "Object";
            }
            String signature = null;
            try {
                signature = TypeUtil.getTypeSignature(varType, scopeStack.peek());
            } catch (Exception ex) {
                System.out.println("Failed to generate signature for type " + varType);
            }
            int dim = 0;

            Type varTypeType = null;
            if (TypeUtil.isArrayType(varType)) {
                dim = TypeUtil.getArrayTypeDimension(varType);
                varType = TypeUtil.getArrayElementType(varType);

            }
            if (TypeUtil.isPrimitiveType(varType)) {
                String descriptor = TypeUtil.getDescriptor(varType);
                varTypeType = Type.getType(TypeUtil.getArrayDescriptor(descriptor, dim));

            } else {
                int arrowPos = varType.indexOf("<");
                if (arrowPos != -1) {
                    varType = varType.substring(0, arrowPos);
                }
                ClassNode stub = scopeStack.peek().findStub(varType);
                if (stub == null) {
                    throw new RuntimeException("Could not find class for " + varType);
                }

                varTypeType = Type.getObjectType(stub.name);
                varTypeType = Type.getType(TypeUtil.getArrayDescriptor(varTypeType.getInternalName(), dim));

            }

            classWriter.visitField(getFlags(vt.getModifiers().getFlags()), vt.getName().toString(),
                    varTypeType.toString(), signature, null);

            return super.visitVariable(vt, p); //To change body of generated methods, choose Tools | Templates.
        }

        boolean isGenericType(String type) {
            for (List<? extends TypeParameterTree> types : typeParametersStack) {
                for (TypeParameterTree tree : types) {
                    if (type.equals(tree.getName().toString())) {
                        return true;
                    }
                }
            }
            return false;
        }

        /**
         * Converts modifier flags from Javac Tree into int flags usable in 
         * TypeMirror
         * @param mods
         * @return 
         */
        int getFlags(Set<Modifier> mods) {
            int flags = 0;
            for (Modifier m : mods) {
                switch (m) {
                case ABSTRACT:
                    flags |= Opcodes.ACC_ABSTRACT;
                    break;
                case FINAL:
                    flags |= Opcodes.ACC_FINAL;
                    break;
                case PRIVATE:
                    flags |= Opcodes.ACC_PRIVATE;
                    break;
                case PROTECTED:
                    flags |= Opcodes.ACC_PROTECTED;
                    break;
                case PUBLIC:

                    flags |= Opcodes.ACC_PUBLIC;
                    break;
                case STATIC:
                    flags |= Opcodes.ACC_STATIC;
                    break;

                }
            }

            return flags;
        }

        @Override
        public Object visitClass(ClassTree ct, Object p) {
            //System.out.println("Visiting class "+ct);
            //System.out.println("Type parameters: "+ct.getTypeParameters());
            typeParametersStack.push(ct.getTypeParameters());
            String simpleName = ct.getSimpleName().toString();
            String internalName = getThisInternalName(simpleName);
            int lastDollar = internalName.lastIndexOf("$");
            String externalName = lastDollar == -1 ? null : internalName.substring(0, lastDollar);
            String supername = "java.lang.Object";
            String[] interfaces = null;
            boolean targetClass = false;
            if (!cwStack.isEmpty()) {
                cwStack.peek().visitInnerClass(internalName, externalName, simpleName,
                        getFlags(ct.getModifiers().getFlags()));
            }

            targetClass = true;
            // This is the one that we'
            //String supername = "java.lang.Object";
            if (ct.getExtendsClause() != null) {
                supername = ct.getExtendsClause().toString().trim();
            }
            String unresolvedSuperName = supername;

            int bracketPos = supername.indexOf("<");
            supername = bracketPos == -1 ? supername : supername.substring(0, bracketPos);
            ClassNode node = scopeStack.peek().findStub(supername);
            if (node == null) {
                throw new RuntimeException("Could not find super stub " + supername);
            }
            supername = node.name;

            String impl = ct.getImplementsClause().toString();
            String[] unresolvedInterfaces = null;
            if (impl != null && !"".equals(impl)) {
                interfaces = impl.split(",");
                unresolvedInterfaces = new String[interfaces.length];
                for (int i = 0; i < interfaces.length; i++) {

                    String iface = interfaces[i];
                    unresolvedInterfaces[i] = interfaces[i];
                    iface = iface.trim();
                    ClassNode inode = scopeStack.peek().findStub(iface);
                    assert inode != null;
                    if (inode == null) {
                        throw new RuntimeException("Could not find stub for interface " + iface);
                    }
                    System.out.println("interface " + iface);
                    interfaces[i] = inode.name;
                }
            }
            String signature = TypeUtil.getClassSignature(scopeStack.peek(), null, unresolvedSuperName,
                    unresolvedInterfaces);
            int flags = getFlags(ct.getModifiers().getFlags());

            switch (ct.getKind()) {
            case INTERFACE:
                flags |= Opcodes.ACC_INTERFACE;
                break;

            case ENUM:
                flags |= Opcodes.ACC_ENUM;
                break;

            }

            ClassWriter classWriter = new ClassWriter(49);
            classWriter.visit(49, flags, internalName, signature, supername, interfaces

            );
            cwStack.push(classWriter);
            classInfoStack.push(new ClassInfo());
            stack.push(simpleName);
            ClassFinder scope = new ClassFinder(context.get(ClassLoader.class), scopeStack.peek());

            scope.addImport(internalName.replaceAll("/", ".").replaceAll("\\$", ".") + ".*"

            );
            scope.addImport(internalName.replaceAll("/", ".").replaceAll("\\$", "."));
            scope.addImport(supername.replaceAll("/", ".").replaceAll("\\$", ".") + ".*"

            );
            scope.addImport(supername.replaceAll("/", ".").replaceAll("\\$", "."));

            if (interfaces != null) {
                for (int i = 0; i < interfaces.length; i++) {
                    scope.addImport(interfaces[i].replaceAll("/", ".").replaceAll("\\$", ".") + ".*"

                    );
                    scope.addImport(interfaces[i].replaceAll("/", ".").replaceAll("\\$", "."));
                }
            }
            for (TypeParameterTree tpTree : ct.getTypeParameters()) {
                //System.out.println("Name: "+tpTree.getName());
                //System.out.println("Kind: "+tpTree.getKind().name());
                //System.out.println("Bounds: "+tpTree.getBounds());
                String bounds = (tpTree.getBounds() != null && !tpTree.getBounds().isEmpty())
                        ? tpTree.getBounds().get(0).toString()
                        : "java.lang.Object";
                scope.addTypeParameter(tpTree.getName().toString(), bounds);
            }
            scopeStack.push(scope);
            Object out = super.visitClass(ct, p);
            stack.pop();
            scopeStack.pop();
            ClassInfo classInfo = classInfoStack.pop();
            if (classInfo.numConstructors == 0) {
                // there are no declared constructors in this class 
                // we need to add a default constructor.
                cwStack.peek().visitMethod(Opcodes.ACC_PUBLIC, "<init>",
                        Type.getMethodDescriptor(Type.getType("V")), null, null);
                classInfo.numConstructors++;
            }

            if (targetClass) {
                byte[] bytes = cwStack.peek().toByteArray();
                outMap.put(internalName, bytes);
                cwStack.pop();
            }

            typeParametersStack.pop();

            return out;
        }

    };
    scanner.scan(asts, null);
    return outMap;
}

From source file:ca.weblite.mirah.ant.JavaSourceParser.java

/**
 * def visitType(elem, arg)//from ww w . j  a  v  a  2  s  .co  m
  return anno_visitType(elem, arg) if elem.kind_of?(TypeMirror)
  if elem.annotation_mirrors.any? {|a| a.toString == '@org.mirah.infer.FakeClass'}
    return
  end
  superclass = internal_type_name(elem.superclass) || 'java/lang/Object'
  interfaces = elem.interfaces.map {|i| internal_type_name(i)}
  flags = flags_from_modifiers(elem)
  builder = BiteScript::ASM::ClassMirror::Builder.new
  builder.visit(0, flags, internal_name(elem), nil, superclass, interfaces)
  with(builder) do
    elem.annotation_mirrors.each {|anno| visitAnnotation(anno)}
    super(elem, arg)
  end
  @mirrors << builder.mirror
  builder.mirror
end
        
 * @param e
 * @param p
 * @return 
 */
@Override
public Object visitType(final TypeElement e, Object p) {
    //System.out.println(e);
    Name className = e.getQualifiedName();
    int flags = 0;
    Type type = null;

    switch (e.getKind()) {
    case INTERFACE:
        flags |= Opcodes.ACC_INTERFACE;
        type = Type.getType(className.toString());
        break;
    case CLASS:
        type = Type.getType(className.toString());
        break;
    }

    return super.visitType(e, p); //To change body of generated methods, choose Tools | Templates.
}

From source file:ca.weblite.mirah.ant.mirrors.ClassReader.java

/**
 * Generates the the mirah mirrors for a specific java source file.  This 
 * file must be a .java file.  It cannot be a directory.
 * //from   w  w w.  java2  s.c o  m
 * @param javaSourceFile
 * @throws IOException 
 */
public void parse() throws IOException {

    File javaSourceFile = sourceFile;
    JavaCompiler compiler = JavacTool.create();
    MyFileObject[] fos = new MyFileObject[] { new MyFileObject(javaSourceFile) };

    JavacTask task = (JavacTask) compiler.getTask(null, null, null, null, null, Arrays.asList(fos));
    Iterable<? extends CompilationUnitTree> asts = task.parse();
    final Stack<Set<String>> typeParams = new Stack<Set<String>>();
    TreePathScanner scanner;
    scanner = new TreePathScanner() {

        private boolean isGenericType(String type) {
            Stack<Set> desk = new Stack<Set>();
            boolean found = false;
            while (!typeParams.empty()) {
                Set params = typeParams.pop();
                desk.push(params);
                if (params.contains(type)) {
                    found = true;

                    break;
                }

            }
            while (!desk.empty()) {
                typeParams.push(desk.pop());
            }
            return found;
        }

        String formatType(String type) {
            int pos = type.indexOf("<");
            if (pos >= 0) {
                type = type.substring(0, pos);
            }
            if (isGenericType(type)) {
                return "Object";
            }
            return type;
        }

        @Override
        public Object visitCompilationUnit(CompilationUnitTree cut, Object p) {
            PackageScope scope = new PackageScope(scopeStack.peek(), cut.getPackageName().toString());
            scope.addImport(scope.getPackageName() + ".*");
            scope.addImport("java.lang.*");
            scope.addImport("*");
            packageScope = scope;
            scopeStack.push(scope);
            return super.visitCompilationUnit(cut, p);

        }

        @Override
        public Object visitImport(ImportTree it, Object p) {

            String path = it.getQualifiedIdentifier().toString();
            packageScope.addImport(path);

            return super.visitImport(it, p);
        }

        private void decorateClassNode(ClassTree ct, ClassNode classNode) {
            int flags = getFlags(ct.getModifiers().getFlags());
            switch (ct.getKind()) {
            case INTERFACE:
                flags |= Opcodes.ACC_INTERFACE;
                break;

            case ENUM:
                flags |= Opcodes.ACC_ENUM;
                break;

            }
            classNode.access = flags;
            classNode.sourceFile = sourceFile.getPath();
            String extendsClause = "java.lang.Object";
            if (ct.getExtendsClause() != null) {
                extendsClause = ct.getExtendsClause().toString();
            }

            String superPath = scopeStack.peek().resolveName(extendsClause, false);

            ClassIndex.Node superNode = scopeStack.peek().getLoader().find(superPath);

            if (superNode == null) {
                throw new RuntimeException("Failed to find super class " + superPath);
            }

            classNode.superName = superNode.internalName;

            classNode.interfaces = new ArrayList<String>();
            String impl = ct.getImplementsClause().toString();
            if (!"".equals(impl)) {
                String[] interfaces = impl.split(",");
                for (String iface : interfaces) {
                    iface = iface.trim();
                    String ipath = scopeStack.peek().resolveName(iface, false);
                    ClassIndex.Node iNode = scopeStack.peek().getLoader().find(ipath);
                    if (iNode == null) {
                        throw new RuntimeException("Failed to load " + "interface " + ipath);
                    }

                    classNode.interfaces.add(iNode.internalName);
                }
            }
        }

        @Override
        public Object visitClass(ClassTree ct, Object p) {
            ClassScope clsScope = null;
            ClassNode currClassNode = null;
            if (scopeStack.peek() == packageScope) {
                String path = packageScope.getPackageName() + "." + ct.getSimpleName();
                ClassIndex.Node n = packageScope.getLoader().find(path);
                if (n == null) {
                    throw new RuntimeException("Failed to find class " + path);
                }
                node.name = n.internalName;
                currClassNode = node;
                decorateClassNode(ct, node);

                clsScope = new ClassScope(scopeStack.peek(), n);

            } else {
                // This must be an internal class
                ClassNode parentClass = classNodeStack.peek();
                if (parentClass.innerClasses == null) {
                    parentClass.innerClasses = new ArrayList<>();
                }
                String path = scopeStack.peek().resolveName(ct.getSimpleName().toString(), false);

                ClassIndex.Node n = packageScope.getLoader().find(path);
                if (n == null) {
                    throw new RuntimeException("Failed to find class " + path);
                }
                InnerClassNode innerNode = new InnerClassNode(n.internalName, parentClass.name, n.simpleName,
                        getFlags(ct.getModifiers().getFlags()));
                parentClass.innerClasses.add(innerNode);

                ClassNode cls = new ClassNode();
                cls.name = n.internalName;
                cls.outerClass = parentClass.name;

                decorateClassNode(ct, cls);
                clsScope = new ClassScope(scopeStack.peek(), n);
                currClassNode = cls;
            }

            scopeStack.push(clsScope);
            classNodeStack.push(currClassNode);
            Object out = super.visitClass(ct, p);
            classNodeStack.pop();
            scopeStack.pop();

            return out;

        }

        /**
         * Converts modifier flags from Javac Tree into int flags usable in 
         * TypeMirror
         * @param mods
         * @return 
         */
        int getFlags(Set<Modifier> mods) {
            int flags = 0;
            for (Modifier m : mods) {
                switch (m) {
                case ABSTRACT:
                    flags |= Opcodes.ACC_ABSTRACT;
                    break;
                case FINAL:
                    flags |= Opcodes.ACC_FINAL;
                    break;
                case PRIVATE:
                    flags |= Opcodes.ACC_PRIVATE;
                    break;
                case PROTECTED:
                    flags |= Opcodes.ACC_PROTECTED;
                    break;
                case PUBLIC:

                    flags |= Opcodes.ACC_PUBLIC;
                    break;
                case STATIC:
                    flags |= Opcodes.ACC_STATIC;
                    break;
                }
            }

            return flags;
        }

        @Override
        public Object visitVariable(final VariableTree vt, Object p) {
            String typeName = vt.getType().toString();
            String typePath = scopeStack.peek().resolveName(vt.getType().toString(), false);
            String typeDescriptor = scopeStack.peek().resolveName(vt.getType().toString(), true);
            String name = vt.getName().toString();
            int flags = getFlags(vt.getModifiers().getFlags());

            FieldNode fieldNode = new FieldNode(flags, name, typeDescriptor, null, null);

            ClassNode cls = classNodeStack.peek();
            if (cls.fields == null) {
                cls.fields = new ArrayList<FieldNode>();

            }
            cls.fields.add(fieldNode);

            return super.visitVariable(vt, p);
        }

        String generateMethodDescriptor(MethodTree mt) {
            StringBuilder sb = new StringBuilder();
            sb.append("(");
            for (VariableTree v : mt.getParameters()) {
                String type = scopeStack.peek().resolveName(v.getType().toString(), true);
                sb.append(type);

            }
            sb.append(")");
            String returnType = scopeStack.peek().resolveName(mt.getReturnType().toString(), true);
            sb.append(returnType);

            return sb.toString();
        }

        @Override
        public Object visitMethod(final MethodTree mt, Object p) {

            MethodNode m = new MethodNode();

            int flags = getFlags(mt.getModifiers().getFlags());
            m.access = flags;
            m.desc = generateMethodDescriptor(mt);
            m.name = mt.getName().toString();
            ClassNode cls = classNodeStack.peek();
            if (cls.methods == null) {
                cls.methods = new ArrayList<MethodNode>();
            }
            cls.methods.add(m);

            return mt;
        }
    };
    scanner.scan(asts, null);

}