@Nullable @Override protected TextRange surroundStatements(@NotNull Project project, @NotNull PsiElement container, @NotNull PsiElement[] statements) throws IncorrectOperationException { String text = StringUtil.join(statements, PsiElement::getText, "\n"); GoForStatement forStatement = GoElementFactory.createForStatement(project, text); PsiElement first = ArrayUtil.getFirstElement(statements); PsiElement last = ArrayUtil.getLastElement(statements); forStatement = (GoForStatement)container.addAfter(forStatement, last); container.deleteChildRange(first, last); int offset = getOffsetLBraceOfBlock(forStatement.getBlock()); return offset > -1 ? new TextRange(offset, offset) : null; } }
@Nullable protected TextRange surroundStatementsWithIfElse(@NotNull Project project, @NotNull PsiElement container, @NotNull PsiElement[] statements, boolean withElse) { PsiElement first = ArrayUtil.getFirstElement(statements); PsiElement last = ArrayUtil.getLastElement(statements); String block = StringUtil.join(statements, PsiElement::getText, "\n"); GoIfStatement ifStatement = GoElementFactory.createIfStatement(project, "", block, withElse ? "" : null); ifStatement = (GoIfStatement)container.addAfter(ifStatement, last); container.deleteChildRange(first, last); int offset = getOffsetLBraceOfBlock(ifStatement.getBlock()); return offset > -1 ? new TextRange(offset, offset) : null; }
@Nullable @Override protected TextRange surroundStatements(@NotNull Project project, @NotNull PsiElement container, @NotNull PsiElement[] statements) throws IncorrectOperationException { GoBlock block = GoElementFactory.createBlock(project); PsiElement first = ArrayUtil.getFirstElement(statements); PsiElement last = ArrayUtil.getLastElement(statements); block = (GoBlock)container.addAfter(block, last); block.addRangeAfter(first, last, block.getLbrace()); CodeEditUtil.markToReformat(block.getNode(), true); container.deleteChildRange(first, last); int offset = block.getTextRange().getEndOffset(); return new TextRange(offset, offset); } }
private static void deleteImportSpec(@Nullable GoImportSpec importSpec) { GoImportDeclaration importDeclaration = PsiTreeUtil.getParentOfType(importSpec, GoImportDeclaration.class); if (importSpec != null && importDeclaration != null) { PsiElement startElementToDelete = importSpec; PsiElement endElementToDelete = importSpec; if (importDeclaration.getImportSpecList().size() == 1) { startElementToDelete = importDeclaration; endElementToDelete = importDeclaration; PsiElement nextSibling = endElementToDelete.getNextSibling(); if (nextSibling != null && nextSibling.getNode().getElementType() == GoTypes.SEMICOLON) { endElementToDelete = nextSibling; } } // todo: delete after proper formatter implementation PsiElement nextSibling = endElementToDelete.getNextSibling(); if (nextSibling instanceof PsiWhiteSpace && nextSibling.textContains('\n')) { endElementToDelete = nextSibling; } startElementToDelete.getParent().deleteChildRange(startElementToDelete, endElementToDelete); } }
@Override public void deleteChildRange(PsiElement first, PsiElement last) throws IncorrectOperationException { getDelegate().deleteChildRange(first, last); }
private static void replaceExpression(Project project, BnfExpression[] oldExpression, PsiElement id) { PsiElement parent = oldExpression[0].getParent(); parent.addBefore(BnfElementFactory.createRuleFromText(project, "a::="+id.getText()).getExpression(), oldExpression[0]); parent.deleteChildRange(oldExpression[0], oldExpression[oldExpression.length - 1]); //BnfExpressionOptimizer.optimize(parent); }
@Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { PsiElement element = descriptor.getPsiElement(); if (!element.isValid()) return; PsiElement parent = element.getParent(); if (element instanceof BnfExpression && parent instanceof BnfChoice) { ASTNode node = element.getNode(); ASTNode nextOr = TreeUtil.findSibling(node, BnfTypes.BNF_OP_OR); ASTNode prevOr = TreeUtil.findSiblingBackward(node, BnfTypes.BNF_OP_OR); assert nextOr != null || prevOr != null: "'|' missing in choice"; if (nextOr != null && prevOr != null) { parent.deleteChildRange(prevOr.getTreeNext().getPsi(), nextOr.getPsi()); } else { parent.deleteChildRange(prevOr == null? element : prevOr.getPsi(), prevOr == null? nextOr.getPsi() : element); } } else { element.delete(); } BnfExpressionOptimizer.optimize(parent); } }