private <T extends TypeDescriptor> CachedType<T> getCachedType(String fullQualifiedName, TypeDescriptor typeDescriptor) { CachedType<T> cachedType = new CachedType(typeDescriptor); typeCache.put(fullQualifiedName, cachedType); return cachedType; }
/** * Return the type descriptor created by visiting the class. * * @return The type descriptor. */ public ClassFileDescriptor getTypeDescriptor() { return cachedType != null ? cachedType.getTypeDescriptor() : null; }
/** * Constructor. */ protected AbstractTypeResolver() { this.typeCache = new TypeCache(); }
TypeCache.CachedType resolveType(String fullQualifiedName, TypeCache.CachedType<? extends ClassFileDescriptor> dependentType) { TypeCache.CachedType cachedType = getTypeResolver().resolve(fullQualifiedName, scannerContext); if (!dependentType.equals(cachedType)) { dependentType.addDependency(cachedType.getTypeDescriptor()); } return cachedType; }
private TypeDescriptor getTypeDescriptor(String fqn, ScannerContext scannerContext) { TypeResolver typeResolver = scannerContext.peek(TypeResolver.class); return typeResolver.resolve(fqn, scannerContext).getTypeDescriptor(); }
@Override public void visitClassType(String name) { resolvedTypeDescriptor = visitorHelper.resolveType(SignatureHelper.getObjectType(name), containingType).getTypeDescriptor(); }
@Override public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) { AnnotationValueDescriptor annotationDescriptor = visitorHelper.addAnnotation(cachedType, cachedType.getTypeDescriptor(), SignatureHelper.getType(desc)); return new AnnotationVisitor(cachedType, annotationDescriptor, visitorHelper); }
@Override protected Scope createScope(Scope currentScope, JarArchiveDescriptor archiveDescriptor, ScannerContext scannerContext) { scannerContext.push(TypeResolver.class, new ArtifactScopedTypeResolver(archiveDescriptor)); return JavaScope.CLASSPATH; }
@Override public boolean accepts(Class<?> item, String path, Scope scope) throws IOException { return CLASSPATH.equals(scope); }
@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); }
/** * Returns the Java type name type corresponding to the given type * descriptor. * * @param desc * The type descriptor. * @return The type name. */ public static String getType(String desc) { return getType(Type.getType(desc)); }
@Override public String getName() { return name(); }
public void addDependency(TypeDescriptor dependency) { Map<TypeDescriptor, Integer> dependencies = getDependencies(); Integer weight = dependencies.get(dependency); if (weight == null) { weight = 0; } weight++; getDependencies().put(dependency, weight); }
@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); } }
protected AbstractArtifactScopedTypeResolver(JavaArtifactFileDescriptor artifact) { this.artifact = artifact; this.hasDependencies = artifact.getNumberOfDependencies() > 0; addToCache(artifact.getContains()); addToCache(artifact.getRequires()); }
private void addTypes(List<String> typeNames, List<TypeDescriptor> types, ScannerContext scannerContext) { for (String typeName : typeNames) { TypeDescriptor type = scannerContext.peek(TypeResolver.class).resolve(typeName, scannerContext).getTypeDescriptor(); types.add(type); } } }
@Override protected Scope createScope(Scope currentScope, WebApplicationArchiveDescriptor archiveDescriptor, ScannerContext scannerContext) { TypeResolver typeResolver = new ArtifactScopedTypeResolver(archiveDescriptor, AbstractWarClassesResourceScannerPlugin.CLASSES_DIRECTORY); scannerContext.push(TypeResolver.class, typeResolver); return WebApplicationScope.WAR; }
/** * Returns the Java type name corresponding to the given internal name. * * @param desc * The internal name. * @return The type name. */ public static String getObjectType(String desc) { return getType(Type.getObjectType(desc)); }
@Override protected Scope createScope(Scope currentScope, WebApplicationArchiveDescriptor archiveDescriptor, ScannerContext scannerContext) { TypeResolver typeResolver = new ArtifactScopedTypeResolver(archiveDescriptor, AbstractWarClassesResourceScannerPlugin.CLASSES_DIRECTORY); scannerContext.push(TypeResolver.class, typeResolver); return WebApplicationScope.WAR; }
@Override public void visitLdcInsn(final Object cst) { if (cst instanceof Type) { visitorHelper.resolveType(SignatureHelper.getType((Type) cst), containingType); } }