ASTNode parentNode= node.getParent();
ASTNode parentNode= getUnparenthesizedParent(node);
	private boolean hasIndirectProblems(ASTNode node, Collection nodesToRemove, IProgressMonitor pm) throws JavaModelException {		try{			ASTNode parentNode= node.getParent();			if (parentNode instanceof VariableDeclarationStatement){				VariableDeclarationStatement vds= (VariableDeclarationStatement)parentNode;				if (vds.getType() != node)					return false; 				VariableDeclarationFragment[] vdfs= getVariableDeclarationFragments(vds);					pm.beginTask("", vdfs.length); //$NON-NLS-1$				for (int i= 0; i < vdfs.length; i++) {					if (hasIndirectProblems(vdfs[i], nodesToRemove, new SubProgressMonitor(pm, 1)))						return true;					}			} else if (parentNode instanceof FieldDeclaration){				FieldDeclaration fd= (FieldDeclaration)parentNode;				if (fd.getType() != node)					return false; 				VariableDeclarationFragment[] vdfs= getVariableDeclarationFragments(fd);					pm.beginTask("", vdfs.length); //$NON-NLS-1$				for (int i= 0; i < vdfs.length; i++) {					if (hasIndirectProblems(vdfs[i], nodesToRemove, new SubProgressMonitor(pm, 1)))						return true;					}								} else if (parentNode instanceof VariableDeclaration){				pm.beginTask("", 1); //$NON-NLS-1$				if (isMethodParameter(parentNode)){					MethodDeclaration methodDeclaration= (MethodDeclaration)parentNode.getParent();						int parameterIndex= methodDeclaration.parameters().indexOf(parentNode);					IMethod[] methods= getAllRippleMethods(methodDeclaration, new SubProgressMonitor(pm, 1));					if (methods == null){ //XXX this can be null because of bug 22883						SingleVariableDeclaration svd= getParameterDeclarationNode(parameterIndex, methodDeclaration);						nodesToRemove.add(svd.getType());						addToBadVarSet(svd);						return true;					}					if (isAnyParameterDeclarationExcluded(methods, parameterIndex, nodesToRemove)){						for (int i= 0; i < methods.length; i++) {							SingleVariableDeclaration svd= getParameterDeclarationNode(parameterIndex, methods[i]);							if (svd != null){								nodesToRemove.add(svd.getType());								addToBadVarSet(svd);							}							}						return true;					}				} 				if (hasIndirectProblems((VariableDeclaration)parentNode, nodesToRemove, new SubProgressMonitor(pm, 1)))					return true;			} else if (parentNode instanceof CastExpression){				pm.beginTask("", 1); //$NON-NLS-1$				if (! isReferenceUpdatable(parentNode, nodesToRemove))					return true;				} else if (parentNode instanceof MethodDeclaration){				pm.beginTask("", 3); //$NON-NLS-1$				MethodDeclaration methodDeclaration= (MethodDeclaration)parentNode;				if (methodDeclaration.getReturnType() == node){					IMethod[] methods= getAllRippleMethods(methodDeclaration, new SubProgressMonitor(pm, 1));					if (methods == null){ //XXX this can be null because of bug 22883						nodesToRemove.add(methodDeclaration.getReturnType());						return true;					}						if (isAnyMethodReturnTypeNodeExcluded(methods, nodesToRemove)){						nodesToRemove.addAll(getAllReturnTypeNodes(methods));						return true;					}						ASTNode[] referenceNodes= getReferenceNodes(methods, new SubProgressMonitor(pm, 1));					for (int i= 0; i < referenceNodes.length; i++) {						if (! isReferenceUpdatable(referenceNodes[i], nodesToRemove)){							nodesToRemove.addAll(getAllReturnTypeNodes(methods));							return true;						}					}				}					} else if (parentNode instanceof ArrayType){				return hasIndirectProblems(parentNode, nodesToRemove, pm);			} 			return false;		} finally{			pm.done();		}		}