Example usage for org.objectweb.asm Type toString

List of usage examples for org.objectweb.asm Type toString

Introduction

In this page you can find the example usage for org.objectweb.asm Type toString.

Prototype

@Override
public String toString() 

Source Link

Document

Returns a string representation of this type.

Usage

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());
        }/*from  w  ww  .  j  a  v a 2s .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:com.getperka.cli.classpath.Search.java

License:Apache License

/**
 * Convert an ASM Type into a Class. If it is a object type, the class will not be initialized.
 *//*from w ww . j a v  a  2 s.c  om*/
protected Class<?> load(Type type) {
    try {
        switch (type.getSort()) {
        case Type.BOOLEAN:
            return boolean.class;
        case Type.BYTE:
            return byte.class;
        case Type.CHAR:
            return char.class;
        case Type.DOUBLE:
            return double.class;
        case Type.FLOAT:
            return float.class;
        case Type.INT:
            return int.class;
        case Type.LONG:
            return long.class;
        case Type.SHORT:
            return short.class;
        case Type.VOID:
            return void.class;
        case Type.ARRAY:
            return Array.newInstance(load(type.getElementType()), 0).getClass();
        case Type.OBJECT:
            return Class.forName(type.getClassName(), false, loader);
        default:
            throw new RuntimeException("Unhandled sort " + type.toString());
        }
    } catch (Throwable e) {
        return fail(e);
    }
}

From source file:com.google.classyshark.silverghost.translator.java.clazz.asm.ClassDetailsFiller.java

License:Apache License

public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
    if (name.equals("<init>")) {
        fillConstructor(access, desc);//from www  .  j  av a  2s  .co m
        return null;
    }

    MetaObject.MethodInfo mi = new MetaObject.MethodInfo();
    mi.modifiers = access;
    mi.annotations = new MetaObject.AnnotationInfo[0];
    mi.parameterTypes = new MetaObject.ParameterInfo[0];

    // TODO fill exceptions
    mi.exceptionTypes = new MetaObject.ExceptionInfo[0];

    mi.name = name.replaceAll("/", "\\.");
    mi.returnType = DexlibAdapter.getTypeName(getReturnType(desc).toString());

    org.objectweb.asm.Type[] arguments = getArgumentTypes(desc);
    mi.parameterTypes = new MetaObject.ParameterInfo[arguments.length];

    int i = 0;
    for (org.objectweb.asm.Type t : arguments) {
        mi.parameterTypes[i] = new MetaObject.ParameterInfo();
        mi.parameterTypes[i].parameterStr = DexlibAdapter.getTypeName(t.toString());
        i++;
    }

    declaredMethods.add(mi);
    return null;
}

From source file:com.google.classyshark.silverghost.translator.java.clazz.asm.ClassDetailsFiller.java

License:Apache License

private void fillConstructor(int access, String desc) {
    MetaObject.ConstructorInfo ci = new MetaObject.ConstructorInfo();
    ci.modifiers = access;//from   ww w  . j a  va2 s.  co m
    ci.annotations = new MetaObject.AnnotationInfo[0];
    ci.parameterTypes = new MetaObject.ParameterInfo[0];

    org.objectweb.asm.Type[] arguments = getArgumentTypes(desc);
    ci.parameterTypes = new MetaObject.ParameterInfo[arguments.length];

    int i = 0;
    for (org.objectweb.asm.Type t : arguments) {
        ci.parameterTypes[i] = new MetaObject.ParameterInfo();
        ci.parameterTypes[i].parameterStr = DexlibAdapter.getTypeName(t.toString());
        i++;
    }

    declaredConstructors.add(ci);
}

From source file:com.google.devtools.depan.java.bytecode.impl.TypeNameUtil.java

License:Apache License

/**
 * Convert class and field {@link Type} references to it's fully-qualified
 * name.  The class's implemented interfaces should get the fully-qualified
 * name via {@link #getFullyQualifiedInterfaceName(Type)}.
 * //from w  w w . java 2  s .c  om
 * @param type {@code Type} used in a reference
 * @return fully qualified name for {@code Type} 
 */
public static String getFullyQualifiedTypeName(Type type) {
    if (type.getSort() == Type.ARRAY) {
        return Type.getType(type.toString().replaceAll("^\\[*", "")).getClassName();
    }
    return type.getClassName();
}

From source file:com.insightfullogic.stripper.ArgumentTypeName.java

License:Open Source License

@Override
public boolean apply(final MethodNode input) {
    final Type[] args = Type.getArgumentTypes(input.desc);
    if (args.length <= argNumber) {
        return false;
    }//  ww w.j  a v  a 2s . c om

    final Type argumentType = args[argNumber];
    return typeName.equals(argumentType.toString());
}

From source file:com.insightfullogic.stripper.ReturnTypeName.java

License:Open Source License

@Override
public boolean apply(final MethodNode input) {
    final Type argumentType = Type.getReturnType(input.desc);
    return typeName.equals(argumentType.toString());
}

From source file:de.enough.polish.postcompile.java5.CloneMethodVisitor.java

License:Open Source License

public CloneMethodVisitor(MethodVisitor mv, int access, String name, String desc, Type enumType) {
    super(mv, access, name, desc);

    this.enumArrayDesc = Type.getType("[" + enumType.toString());
}

From source file:gnu.classpath.tools.javah.CniPrintStream.java

License:Open Source License

public String getClassName(Type type) {
    String name = type.toString();
    name = name.substring(1, name.length() - 1);
    // Add the plain class name; we'll handle it when
    // we process namespaces.
    allClasses.add(name);/*from  w  w  w.  j a v  a2 s.com*/
    return "::" + name.replaceAll("/", "::") + " *";
}

From source file:jp.co.dgic.testing.common.virtualmock.asm.AbstractAsmMethodVisitor.java

License:Open Source License

protected String getReturnTypeClassName(Type type, String className, String methodName) {
    if (isConstructor(methodName))
        return className;
    if (isPrimitive(type)) {
        return toWrapperType(type);
    }/*from   w w  w.  j a  v  a2 s  .c  om*/
    if (isArrayType(type))
        return type.toString();
    return type.getClassName().replace('.', '/');
}