@Override public void visitTypeInsn(final int opcode, final String type) { visitorHelper.resolveType(SignatureHelper.getObjectType(type), containingType); }
@Override public void visitTryCatchBlock(final Label start, final Label end, final Label handler, final String type) { if (type != null) { String fullQualifiedName = SignatureHelper.getObjectType(type); visitorHelper.resolveType(fullQualifiedName, containingType); } }
@Override public void visitClassType(String name) { resolvedTypeDescriptor = visitorHelper.resolveType(SignatureHelper.getObjectType(name), containingType).getTypeDescriptor(); }
@Override public void visitInnerClass(final String name, final String outerName, final String innerName, final int access) { String fullQualifiedName = cachedType.getTypeDescriptor().getFullQualifiedName(); // innerName always represents the name of the inner class String innerTypeName = SignatureHelper.getObjectType(name); TypeDescriptor innerType = visitorHelper.resolveType(innerTypeName, cachedType).getTypeDescriptor(); // set relation only if outerName is current class if (outerName != null) { String outerTypeName = SignatureHelper.getObjectType(outerName); if (fullQualifiedName.equals(outerTypeName)) { cachedType.getTypeDescriptor().getDeclaredInnerClasses().add(innerType); } } }
@Override public void visitMethodInsn(final int opcode, final String owner, final String name, final String desc, boolean itf) { String methodSignature = SignatureHelper.getMethodSignature(name, desc); TypeCache.CachedType targetType = visitorHelper.resolveType(SignatureHelper.getObjectType(owner), containingType); MethodDescriptor invokedMethodDescriptor = visitorHelper.getMethodDescriptor(targetType, methodSignature); visitorHelper.addInvokes(methodDescriptor, lineNumber, invokedMethodDescriptor); }
@Override public void visitOuterClass(final String owner, final String name, final String desc) { String outerTypeName = SignatureHelper.getObjectType(owner); TypeCache.CachedType cachedOuterType = visitorHelper.resolveType(outerTypeName, this.cachedType); TypeDescriptor innerType = this.cachedType.getTypeDescriptor(); cachedOuterType.getTypeDescriptor().getDeclaredInnerClasses().add(innerType); if (name != null) { String methodSignature = SignatureHelper.getMethodSignature(name, desc); MethodDescriptor methodDescriptor = visitorHelper.getMethodDescriptor(cachedOuterType, methodSignature); methodDescriptor.getDeclaredInnerClasses().add(innerType); } }
@Override public void visitFieldInsn(final int opcode, final String owner, final String name, final String desc) { String fieldSignature = SignatureHelper.getFieldSignature(name, desc); TypeCache.CachedType targetType = visitorHelper.resolveType(SignatureHelper.getObjectType(owner), containingType); FieldDescriptor fieldDescriptor = visitorHelper.getFieldDescriptor(targetType, fieldSignature); switch (opcode) { case Opcodes.GETFIELD: case Opcodes.GETSTATIC: visitorHelper.addReads(methodDescriptor, lineNumber, fieldDescriptor); break; case Opcodes.PUTFIELD: case Opcodes.PUTSTATIC: visitorHelper.addWrites(methodDescriptor, lineNumber, fieldDescriptor); break; } }
@Override public void visit(final int version, final int access, final String name, final String signature, final String superName, final String[] interfaces) { Class<? extends ClassFileDescriptor> javaType = getJavaType(access); String fullQualifiedName = SignatureHelper.getObjectType(name); cachedType = visitorHelper.createType(fullQualifiedName, fileDescriptor, javaType); dependentTypeSignatureVisitor = new DependentTypeSignatureVisitor(cachedType, visitorHelper); ClassFileDescriptor classFileDescriptor = cachedType.getTypeDescriptor(); classFileDescriptor.setByteCodeVersion(version); if (hasFlag(access, Opcodes.ACC_ABSTRACT) && !hasFlag(access, Opcodes.ACC_INTERFACE)) { classFileDescriptor.setAbstract(Boolean.TRUE); } setModifiers(access, classFileDescriptor); if (signature == null) { if (superName != null) { TypeDescriptor superClassType = visitorHelper.resolveType(SignatureHelper.getObjectType(superName), cachedType).getTypeDescriptor(); classFileDescriptor.setSuperClass(superClassType); } for (int i = 0; interfaces != null && i < interfaces.length; i++) { TypeDescriptor interfaceType = visitorHelper.resolveType(SignatureHelper.getObjectType(interfaces[i]), cachedType).getTypeDescriptor(); classFileDescriptor.getInterfaces().add(interfaceType); } } else { new SignatureReader(signature).accept(new ClassSignatureVisitor(cachedType, visitorHelper, dependentTypeSignatureVisitor)); } }
@Override public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature, final String[] exceptions) { MethodDescriptor methodDescriptor = visitorHelper.getMethodDescriptor(cachedType, SignatureHelper.getMethodSignature(name, desc)); methodDescriptor.setName(name); setModifiers(access, methodDescriptor); if (hasFlag(access, Opcodes.ACC_ABSTRACT)) { methodDescriptor.setAbstract(Boolean.TRUE); } if (hasFlag(access, Opcodes.ACC_NATIVE)) { methodDescriptor.setNative(Boolean.TRUE); } if (signature == null) { String returnType = SignatureHelper.getType(org.objectweb.asm.Type.getReturnType(desc)); methodDescriptor.setReturns(visitorHelper.resolveType(returnType, cachedType).getTypeDescriptor()); org.objectweb.asm.Type[] types = org.objectweb.asm.Type.getArgumentTypes(desc); for (int i = 0; i < types.length; i++) { String parameterType = SignatureHelper.getType(types[i]); TypeDescriptor typeDescriptor = visitorHelper.resolveType(parameterType, cachedType).getTypeDescriptor(); ParameterDescriptor parameterDescriptor = visitorHelper.addParameterDescriptor(methodDescriptor, i); parameterDescriptor.setType(typeDescriptor); } } else { new SignatureReader(signature).accept(new MethodSignatureVisitor(cachedType, methodDescriptor, visitorHelper, dependentTypeSignatureVisitor)); } for (int i = 0; exceptions != null && i < exceptions.length; i++) { TypeDescriptor exceptionType = visitorHelper.resolveType(SignatureHelper.getObjectType(exceptions[i]), cachedType).getTypeDescriptor(); methodDescriptor.getDeclaredThrowables().add(exceptionType); } return new MethodVisitor(cachedType, methodDescriptor, visitorHelper, dependentTypeSignatureVisitor); }