boolean (@NotNull String name, @NotNull PsiElement startElement, @Nullable PsiElement call) { PsiElement child = startElement.getFirstChild(); while (child != null) { // Do not check defined classes, methods, closures and blocks before if (child instanceof GrTypeDefinition || child instanceof GrMethod || call != null && GroovyRefactoringUtil.isAppropriateContainerForIntroduceVariable(child) && child.getTextRange().getEndOffset() < call.getTextRange().getStartOffset()) { child = child.getNextSibling(); continue; } if (child instanceof GrAssignmentExpression) { GrExpression lValue = ((GrAssignmentExpression) child).getLValue(); if (lValue instanceof GrReferenceExpression expr) { if (expr.getQualifierExpression() == null && name.equals(expr.getReferenceName())) { return false; } } } if (child instanceof GrVariable && name.equals(((GrVariable) child).getName())) { return false; } else { boolean inner = isValidNameDown(name, child, call); if (!inner) return false; } child = child.getNextSibling(); } return true; }