@Nullable private ClassOrInterfaceType getReferencedType(@Nonnull Type type) { final Type nestedType; if (ReferenceType.class.isInstance(type)) { nestedType = ReferenceType.class.cast(type).getType(); } else if (WildcardType.class.isInstance(type)) { WildcardType wildcardType = WildcardType.class.cast(type); ReferenceType referenceType = wildcardType.getExtends(); if (referenceType == null) { referenceType = wildcardType.getSuper(); } if (referenceType == null) { // unbounded wildcard - nothing ro refer to return null; } nestedType = referenceType.getType(); } else { logger.warn("Encountered unexpected Type [{}:{}]; please create an issue at https://github.com/ImmobilienScout24/deadcode4j.", type.getClass(), type); return null; } if (PrimitiveType.class.isInstance(nestedType)) { // references to primitives won't be reported return null; } if (!ClassOrInterfaceType.class.isInstance(nestedType)) { logger.warn("[{}:{}] is no ClassOrInterfaceType; please create an issue at https://github.com/ImmobilienScout24/deadcode4j.", type.getClass(), type); return null; } return ClassOrInterfaceType.class.cast(nestedType); }
@Override public Type visit(final ReferenceType n, final Context ctx) { return n.getType().accept(new TypeCollector(), ctx); }
@Override public ReferenceType doMerge(ReferenceType first, ReferenceType second) { ReferenceType rf = new ReferenceType(); rf.setArrayCount(first.getArrayCount()); rf.setType(first.getType()); rf.setAnnotations(mergeCollections(first.getAnnotations(), second.getAnnotations())); List<List<AnnotationExpr>> lists = null; if (first.getArraysAnnotations() == null) lists = second.getArraysAnnotations(); if (second.getArraysAnnotations() == null) lists = first.getArraysAnnotations(); if (lists == null && (first.getArraysAnnotations() != null && second.getArraysAnnotations() != null)) { lists = new ArrayList<>(); List<List<AnnotationExpr>> faas = first.getArraysAnnotations(); List<List<AnnotationExpr>> saas = second.getArraysAnnotations(); int size = faas.size() > saas.size() ? faas.size() : saas.size(); for (int i = 0; i < size; i++) { List<AnnotationExpr> faa = i < faas.size() ? faas.get(i) : null; List<AnnotationExpr> saa = i < saas.size() ? saas.get(i) : null; if (isAllNotNull(faa, saa)) { lists.add(mergeCollections(faa, saa)); } else { lists.add(faa == null ? saa : faa); } } } rf.setArraysAnnotations(lists); return rf; }
@Nullable Class<?> typeOf( Type type ) { if ( type instanceof ReferenceType ) { ReferenceType referenceType = ( ReferenceType ) type; if ( referenceType.getArrayCount() > 0 ) { return Array.class; } // unwrap the reference type and try again return typeOf( referenceType.getType() ); } if ( type instanceof PrimitiveType ) { String typeName = ( ( PrimitiveType ) type ).getType().name(); return primitiveType( typeName ); } else if ( type instanceof ClassOrInterfaceType ) try { return classForName( ( ( ClassOrInterfaceType ) type ).getName() ); } catch ( ClassNotFoundException e ) { // class not found, ignore } return null; }
public void visit(final BlockStmt n, final RoutingDefineContext arg) { if (arg.isInRoutingDefine()) { MethodCallExpr call = new MethodCallExpr( ASTHelper.createNameExpr(arg.getRoutingParameter().getId().getName()), "resource"); ReferenceType rt = ASTHelper.createReferenceType(controllerClassName, 0); ASTHelper.addArgument(call, new ClassExpr(rt.getType())); ASTHelper.addStmt(n, call); } else { super.visit(n, arg); } }