diff --git a/src/main/java/spoon/reflect/visitor/DefaultJavaPrettyPrinter.java b/src/main/java/spoon/reflect/visitor/DefaultJavaPrettyPrinter.java index 48fa8901331..481cfad6e33 100644 --- a/src/main/java/spoon/reflect/visitor/DefaultJavaPrettyPrinter.java +++ b/src/main/java/spoon/reflect/visitor/DefaultJavaPrettyPrinter.java @@ -797,8 +797,14 @@ public <T> void visitCtClass(CtClass<T> ctClass) { lst.addAll(ctClass.getMethods()); lst.addAll(getComments(ctClass, CommentOffset.INSIDE)); - if ((ctClass.getSimpleName() == null || ctClass.getSimpleName().isEmpty()) && ctClass.getParent() != null && ctClass.getParent() instanceof CtNewClass) { - context.currentThis.push(((CtNewClass<?>) ctClass.getParent()).getType()); + CtElement parent; + try { + parent = ctClass.getParent(); + } catch (ParentNotInitializedException e) { + parent = null; + } + if ((ctClass.getSimpleName() == null || ctClass.getSimpleName().isEmpty()) && parent != null && parent instanceof CtNewClass) { + context.currentThis.push(((CtNewClass<?>) parent).getType()); } else { context.currentThis.push(ctClass.getReference()); } @@ -1052,9 +1058,17 @@ private <T> void printCtFieldAccess(CtFieldAccess<T> f) { * Check if the target expression is a static final field initialized in a static anonymous block. */ private <T> boolean isInitializeStaticFinalField(CtExpression<T> targetExp) { - final CtElement parent = targetExp.getParent(); - if (parent instanceof CtFieldWrite && targetExp.equals(((CtFieldWrite) parent).getTarget()) - && targetExp.getParent(CtAnonymousExecutable.class) != null + final CtElement parent; + final CtAnonymousExecutable anonymousParent; + try { + parent = targetExp.getParent(); + anonymousParent = targetExp.getParent(CtAnonymousExecutable.class); + } catch (ParentNotInitializedException e) { + return false; + } + if (parent instanceof CtFieldWrite + && targetExp.equals(((CtFieldWrite) parent).getTarget()) + && anonymousParent != null && ((CtFieldWrite) parent).getVariable() != null && ((CtFieldWrite) parent).getVariable().getModifiers().contains(ModifierKind.STATIC)) { return true; @@ -1087,19 +1101,23 @@ public <T> void visitCtThisAccess(CtThisAccess<T> thisAccess) { * Check if the this access expression is a target of a private final field in a constructor. */ private <T> boolean tryToInitializeFinalFieldInConstructor(CtThisAccess<T> thisAccess) { - final CtElement parent = thisAccess.getParent(); - if (!(parent instanceof CtFieldWrite) || !thisAccess.equals(((CtFieldWrite) parent).getTarget()) || thisAccess.getParent(CtConstructor.class) == null) { - return false; - } - final CtFieldReference variable = ((CtFieldWrite) parent).getVariable(); - if (variable == null) { + try { + final CtElement parent = thisAccess.getParent(); + if (!(parent instanceof CtFieldWrite) || !thisAccess.equals(((CtFieldWrite) parent).getTarget()) || thisAccess.getParent(CtConstructor.class) == null) { + return false; + } + final CtFieldReference variable = ((CtFieldWrite) parent).getVariable(); + if (variable == null) { + return false; + } + final CtField declaration = variable.getDeclaration(); + if (declaration == null) { + return true; + } + return variable.getDeclaration().getModifiers().contains(ModifierKind.FINAL); + } catch (ParentNotInitializedException e) { return false; } - final CtField declaration = variable.getDeclaration(); - if (declaration == null) { - return true; - } - return variable.getDeclaration().getModifiers().contains(ModifierKind.FINAL); } @Override @@ -1361,7 +1379,12 @@ public <T> void visitCtInvocation(CtInvocation<T> invocation) { if (invocation.getExecutable().isConstructor()) { // It's a constructor (super or this) writeActualTypeArguments(invocation.getExecutable()); - CtType<?> parentType = invocation.getParent(CtType.class); + CtType<?> parentType; + try { + parentType = invocation.getParent(CtType.class); + } catch (ParentNotInitializedException e) { + parentType = null; + } if (parentType != null && parentType.getQualifiedName() != null && parentType.getQualifiedName().equals(invocation.getExecutable().getDeclaringType().getQualifiedName())) { write("this"); } else { @@ -1722,7 +1745,14 @@ public void visitCtNamedElement(CtNamedElement e) { public <T> void visitCtNewArray(CtNewArray<T> newArray) { enterCtExpression(newArray); - if ((newArray.getParent(CtAnnotationType.class) == null) && (newArray.getParent(CtAnnotation.class) == null)) { + boolean isNotInAnnotation; + try { + isNotInAnnotation = (newArray.getParent(CtAnnotationType.class) == null) && (newArray.getParent(CtAnnotation.class) == null); + } catch (ParentNotInitializedException e) { + isNotInAnnotation = true; + } + + if (isNotInAnnotation) { CtTypeReference<?> ref = newArray.getType(); if (ref != null) { diff --git a/src/main/java/spoon/support/reflect/declaration/CtElementImpl.java b/src/main/java/spoon/support/reflect/declaration/CtElementImpl.java index 20167fabf31..e2d78f9c508 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtElementImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtElementImpl.java @@ -257,6 +257,7 @@ public String toString() { printer.computeImports(this); printer.scan(this); } catch (ParentNotInitializedException ignore) { + LOGGER.error(ERROR_MESSAGE_TO_STRING, ignore); errorMessage = ERROR_MESSAGE_TO_STRING; } return printer.toString() + errorMessage;