/** * JDT doesn't support <code>new Foo<K>.Bar()</code>. To avoid reprinting this kind of type reference, * we check that the reference has a declaring type with generics. * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=474593 * * @param reference Type reference concerned by the bug. * @return true if a declaring type has generic types. */ private <T> boolean hasDeclaringTypeWithGenerics(CtTypeReference<T> reference) { // We don't have a declaring type, it can't have generics. if (reference == null) { return false; } // If the declaring type isn't a type, we don't need this hack. if (reference.getDeclaringType() == null) { return false; } // If current reference is a class declared in a method, we don't need this hack. if (reference.isLocalType()) { return false; } // If declaring type have generics, we return true. if (!reference.getDeclaringType().getActualTypeArguments().isEmpty()) { return true; } // Checks if the declaring type has generic types. return hasDeclaringTypeWithGenerics(reference.getDeclaringType()); }
private <T> void printConstructorCall(CtConstructorCall<T> ctConstructorCall) { try (Writable _context = context.modify()) { if (ctConstructorCall.getTarget() != null) { scan(ctConstructorCall.getTarget()); printer.writeSeparator("."); _context.ignoreEnclosingClass(true); } if (hasDeclaringTypeWithGenerics(ctConstructorCall.getType())) { _context.ignoreEnclosingClass(true); } printer.writeKeyword("new").writeSpace(); if (!ctConstructorCall.getActualTypeArguments().isEmpty()) { elementPrinterHelper.writeActualTypeArguments(ctConstructorCall); } scan(ctConstructorCall.getType()); } elementPrinterHelper.printList(ctConstructorCall.getArguments(), null, false, "(", false, false, ",", true, false, ")", exp -> scan(exp)); }
public void visitCtTypeReferenceWithoutGenerics(CtTypeReference<?> ref) { if (ref.isPrimitive()) { write(ref.getSimpleName()); return; } if (importsContext.isImported(ref) && ref.getPackage() != null) { printTypeAnnotations(ref); write(ref.getSimpleName()); } else { if (ref.getDeclaringType() != null) { if (!context.currentThis.contains(ref.getDeclaringType()) || ref.getModifiers().contains(ModifierKind.STATIC) || hasDeclaringTypeWithGenerics(ref)) { if (!context.ignoreEnclosingClass) { boolean ign = context.ignoreGenerics; context.ignoreGenerics = true; scan(ref.getDeclaringType()); write("."); context.ignoreGenerics = ign; } } write(ref.getSimpleName()); } else { write(ref.getQualifiedName()); } } }
public <T> void visitCtTypeReference(CtTypeReference<T> ref) { if (ref.isPrimitive()) { write(ref.getSimpleName()); return; } if (importsContext.isImported(ref) && ref.getPackage() != null) { printTypeAnnotations(ref); write(ref.getSimpleName()); } else { if (ref.getDeclaringType() != null) { if (!context.currentThis.contains(ref.getDeclaringType()) || ref.getModifiers().contains(ModifierKind.STATIC) || hasDeclaringTypeWithGenerics(ref)) { if (!context.ignoreEnclosingClass) { boolean ign = context.ignoreGenerics; context.ignoreGenerics = false; scan(ref.getDeclaringType()); write("."); context.ignoreGenerics = ign; } } write(ref.getSimpleName()); } else { write(ref.getQualifiedName()); } } if (!context.ignoreGenerics) { writeActualTypeArguments(ref); } }