private static void deleteIfEmpty()

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);
        }
      }
    }
  }