in gradle-dsl-groovy/src/com/android/tools/idea/gradle/dsl/parser/groovy/GroovyDslUtil.java [183:294]
private static void deleteIfEmpty(@Nullable PsiElement element, @NotNull GradleDslElement containingDslElement) {
if (element == null) {
return;
}
PsiElement parent = element.getParent();
GradleDslElement dslParent = getNextValidParent(containingDslElement);
if (!element.isValid()) {
// Skip deleting
}
else if (element instanceof GrAssignmentExpression) {
if (((GrAssignmentExpression)element).getRValue() == null) {
element.delete();
}
}
else if (element instanceof GrApplicationStatement) {
if (((GrApplicationStatement)element).getArgumentList() == null) {
element.delete();
}
}
else if (element instanceof GrClosableBlock) {
if (dslParent == null || dslParent.isInsignificantIfEmpty()) {
final Boolean[] isEmpty = new Boolean[]{true};
((GrClosableBlock)element).acceptChildren(new GroovyElementVisitor() {
@Override
public void visitElement(@NotNull GroovyPsiElement child) {
if (child instanceof GrParameterList) {
if (((GrParameterList)child).getParameters().length == 0) {
return; // Ignore the empty parameter list.
}
}
isEmpty[0] = false;
}
});
if (isEmpty[0]) {
element.delete();
}
}
}
else if (element instanceof GrMethodCallExpression) {
GrMethodCallExpression call = ((GrMethodCallExpression)element);
// getArgumentList() logs an error if the argument list has already been deleted.
GrArgumentList argumentList = null;
for (PsiElement curr = call.getFirstChild(); curr != null; curr = curr.getNextSibling()) {
if (curr instanceof GrArgumentList) {
argumentList = (GrArgumentList)curr;
break;
}
}
GrClosableBlock[] closureArguments = call.getClosureArguments();
if ((argumentList == null || argumentList.getAllArguments().length == 0)
&& closureArguments.length == 0) {
element.delete();
}
}
else if (element instanceof GrArgumentList) {
GrArgumentList argumentList = (GrArgumentList)element;
if (argumentList.getAllArguments().length == 0) {
if (!(parent instanceof GrMethodCallExpression) || !((GrMethodCallExpression)parent).hasClosureArguments()) {
argumentList.delete();
}
}
}
else if (element instanceof GrNamedArgument) {
GrNamedArgument namedArgument = (GrNamedArgument)element;
if (namedArgument.getExpression() == null) {
namedArgument.delete();
}
}
else if (element instanceof GrVariableDeclaration) {
GrVariableDeclaration variableDeclaration = (GrVariableDeclaration)element;
for (GrVariable grVariable : variableDeclaration.getVariables()) {
if (grVariable.getInitializerGroovy() == null) {
grVariable.delete();
}
}
// If we have no more variables, delete the declaration.
if (variableDeclaration.getVariables().length == 0) {
variableDeclaration.delete();
}
}
else if (element instanceof GrVariable) {
GrVariable variable = (GrVariable)element;
if (variable.getInitializerGroovy() == null) {
variable.delete();
}
}
else if (element instanceof GrListOrMap) {
GrListOrMap listOrMap = (GrListOrMap)element;
if (listOrMap.isMap() && listOrMap.getNamedArguments().length == 0) {
listOrMap.delete();
}
else if (!listOrMap.isMap() && listOrMap.getInitializers().length == 0) {
listOrMap.delete();
}
}
if (!element.isValid()) {
// Give the parent a chance to adapt to the missing child.
handleElementRemoved(parent, element);
// If this element is deleted, also delete the parent if it is empty.
if (dslParent != null) {
if (element == dslParent.getPsiElement() && dslParent.isInsignificantIfEmpty()) {
maybeDeleteIfEmpty(parent, dslParent);
}
else {
maybeDeleteIfEmpty(parent, containingDslElement);
}
}
}
}