Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java')
-rw-r--r--org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java168
1 files changed, 164 insertions, 4 deletions
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
index ace31ede86..095bdacc70 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2018 IBM Corporation and others.
+ * Copyright (c) 2000, 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -117,6 +117,9 @@ public final class ASTRewriteAnalyzer extends ASTVisitor {
/** @deprecated using deprecated code */
private static final ChildListPropertyDescriptor INTERNAL_TRY_STATEMENT_RESOURCES_PROPERTY = TryStatement.RESOURCES_PROPERTY;
+
+ /** @deprecated using deprecated code */
+ private static final ChildPropertyDescriptor INTERNAL_SWITCH_EXPRESSION_PROPERTY = SwitchCase.EXPRESSION_PROPERTY;
/** @deprecated using deprecated code */
private static final int JLS2_INTERNAL = AST.JLS2;
@@ -132,6 +135,8 @@ public final class ASTRewriteAnalyzer extends ASTVisitor {
/** @deprecated using deprecated code */
private static final int JLS9_INTERNAL = AST.JLS9;
+
+ private static final int JLS12_INTERNAL = AST.JLS12;
TextEdit currentEdit;
@@ -1036,6 +1041,60 @@ public final class ASTRewriteAnalyzer extends ASTVisitor {
}
return pos;
}
+
+ private int rewriteExpressionOptionalQualifier(SwitchCase parent, StructuralPropertyDescriptor property, int startPos) {
+ RewriteEvent event= getEvent(parent, property);
+ if (event != null) {
+ switch (event.getChangeKind()) {
+ case RewriteEvent.INSERTED: {
+ ASTNode node= (ASTNode) event.getNewValue();
+ TextEditGroup editGroup= getEditGroup(event);
+ doTextInsert(startPos, node, getIndent(startPos), true, editGroup);
+ doTextInsert(startPos, ".", editGroup); //$NON-NLS-1$
+ return startPos;
+ }
+ case RewriteEvent.REMOVED: {
+ try {
+ ASTNode node= (ASTNode) event.getOriginalValue();
+ TextEditGroup editGroup= getEditGroup(event);
+ int dotEnd= getScanner().getTokenEndOffset(TerminalTokens.TokenNameCOLON, node.getStartPosition() + node.getLength());
+ doTextRemoveAndVisit(startPos, dotEnd - startPos, node, editGroup);
+ return dotEnd;
+ } catch (CoreException e) {
+ handleException(e);
+ }
+ break;
+ }
+ case RewriteEvent.REPLACED: {
+ ASTNode node= (ASTNode) event.getOriginalValue();
+ TextEditGroup editGroup= getEditGroup(event);
+ SourceRange range= getExtendedRange(node);
+ int offset= range.getStartPosition();
+ int length= range.getLength();
+
+ doTextRemoveAndVisit(offset, length, node, editGroup);
+ doTextInsert(offset, (ASTNode) event.getNewValue(), getIndent(startPos), true, editGroup);
+ try {
+ return getScanner().getTokenEndOffset(TerminalTokens.TokenNameCOLON, offset + length);
+ } catch (CoreException e) {
+ handleException(e);
+ }
+ break;
+ }
+ }
+ }
+ Object node= getOriginalValue(parent, property);
+ if (node == null) {
+ return startPos;
+ }
+ int pos= doVisit((ASTNode) node);
+ try {
+ return getScanner().getTokenEndOffset(TerminalTokens.TokenNameCOLON, pos);
+ } catch (CoreException e) {
+ handleException(e);
+ }
+ return pos;
+ }
class ParagraphListRewriter extends ListRewriter {
@@ -1543,7 +1602,48 @@ public final class ASTRewriteAnalyzer extends ASTVisitor {
}
}
-
+// private int rewriteExpression2(ASTNode node, ChildListPropertyDescriptor property, int pos) {
+// RewriteEvent event= getEvent(node, property);
+// if (event == null || event.getChangeKind() == RewriteEvent.UNCHANGED) {
+// return doVisit(node, property, pos);
+// }
+// RewriteEvent[] children= event.getChildren();
+// boolean isAllInsert= isAllOfKind(children, RewriteEvent.INSERTED);
+// boolean isAllRemove= isAllOfKind(children, RewriteEvent.REMOVED);
+// String keyword= Util.EMPTY_STRING;
+// if (((SwitchCase)node).isSwitchLabeledRule()) {
+// keyword = "->"; //$NON-NLS-1$
+// } else {
+// keyword = ":"; //$NON-NLS-1$
+// }
+//
+// Prefix formatterPrefix = this.formatter.CASE_SEPARATION;
+//
+// int endPos= new ModifierRewriter(formatterPrefix).rewriteList(node, property, pos, keyword, " "); //$NON-NLS-1$
+//
+// try {
+// int nextPos= getScanner().getNextStartOffset(endPos, false);
+// RewriteEvent lastChild = children[children.length - 1];
+// boolean lastUnchanged= lastChild.getChangeKind() != RewriteEvent.UNCHANGED;
+//
+// if (isAllRemove) {
+// doTextRemove(endPos, nextPos - endPos, getEditGroup(lastChild));
+// return nextPos;
+// } else if (isAllInsert || (nextPos == endPos && lastUnchanged)){
+// String separator;
+// if (lastChild.getNewValue() instanceof Annotation) {
+// separator= formatterPrefix.getPrefix(getIndent(pos));
+// } else {
+// separator= String.valueOf(' ');
+// }
+// doTextInsert(endPos, separator, getEditGroup(lastChild));
+// }
+// } catch (CoreException e) {
+// handleException(e);
+// }
+// return endPos;
+// }
+
private int rewriteModifiers2(ASTNode node, ChildListPropertyDescriptor property, int pos) {
RewriteEvent event= getEvent(node, property);
if (event == null || event.getChangeKind() == RewriteEvent.UNCHANGED) {
@@ -2473,6 +2573,9 @@ public final class ASTRewriteAnalyzer extends ASTVisitor {
try {
int offset= getScanner().getTokenEndOffset(TerminalTokens.TokenNamebreak, node.getStartPosition());
rewriteNode(node, BreakStatement.LABEL_PROPERTY, offset, ASTRewriteFormatter.SPACE); // space between break and label
+ if (node.getAST().apiLevel() >= JLS12_INTERNAL) {
+ rewriteNode(node, BreakStatement.EXPRESSION_PROPERTY, offset, ASTRewriteFormatter.SPACE); // space between break and label
+ }
} catch (CoreException e) {
handleException(e);
}
@@ -3413,12 +3516,38 @@ public final class ASTRewriteAnalyzer extends ASTVisitor {
}
// dont allow switching from case to default or back. New statements should be created.
- rewriteRequiredNode(node, SwitchCase.EXPRESSION_PROPERTY);
+ if (node.getAST().apiLevel() >= JLS12_INTERNAL) {
+ int pos = node.expressions().size() == 0 ? node.getStartPosition() :
+ rewriteNodeList(node, SwitchCase.EXPRESSIONS2_PROPERTY, node.getStartPosition(), Util.EMPTY_STRING, ", "); //$NON-NLS-1$
+ if (isChanged(node, SwitchCase.SWITCH_LABELED_RULE_PROPERTY)) {
+ TextEditGroup editGroup = getEditGroup(node, SwitchCase.SWITCH_LABELED_RULE_PROPERTY);
+ try {
+ int tokenEnd, oldToken;
+ String newVal;
+ if (getNewValue(node, SwitchCase.SWITCH_LABELED_RULE_PROPERTY).equals(Boolean.TRUE)) {
+ oldToken = TerminalTokens.TokenNameCOLON;
+ newVal = "->"; //$NON-NLS-1$
+ } else {
+ oldToken = TerminalTokens.TokenNameARROW;
+ newVal = ":"; //$NON-NLS-1$
+ }
+ pos = getScanner().getTokenStartOffset(oldToken, pos);
+ tokenEnd = getScanner().getTokenEndOffset(oldToken, pos);
+ doTextRemove(pos, tokenEnd - pos, editGroup);
+ doTextInsert(pos, newVal, editGroup);
+ pos = tokenEnd;
+ } catch (CoreException e) {
+ handleException(e);
+ }
+ }
+ } else {
+ rewriteExpressionOptionalQualifier(node, INTERNAL_SWITCH_EXPRESSION_PROPERTY, node.getStartPosition());
+ }
return false;
}
class SwitchListRewriter extends ParagraphListRewriter {
-
+
private boolean indentSwitchStatementsCompareToCases;
public SwitchListRewriter(int initialIndent) {
@@ -3512,6 +3641,37 @@ public final class ASTRewriteAnalyzer extends ASTVisitor {
}
@Override
+ public boolean visit(SwitchExpression node) {
+ if (!hasChildrenChanges(node)) {
+ return doVisitUnchangedChildren(node);
+ }
+
+ int pos= rewriteRequiredNode(node, SwitchExpression.EXPRESSION_PROPERTY);
+
+ ChildListPropertyDescriptor property= SwitchExpression.STATEMENTS_PROPERTY;
+ if (getChangeKind(node, property) != RewriteEvent.UNCHANGED) {
+ try {
+ pos= getScanner().getTokenEndOffset(TerminalTokens.TokenNameLBRACE, pos);
+ int insertIndent= getIndent(node.getStartPosition());
+ if (DefaultCodeFormatterConstants.TRUE.equals(this.options.get(DefaultCodeFormatterConstants.FORMATTER_INDENT_SWITCHSTATEMENTS_COMPARE_TO_SWITCH))) {
+ insertIndent++;
+ }
+
+ ParagraphListRewriter listRewriter= new SwitchListRewriter(insertIndent);
+ StringBuffer leadString= new StringBuffer();
+ leadString.append(getLineDelimiter());
+ leadString.append(createIndentString(insertIndent));
+ listRewriter.rewriteList(node, property, pos, leadString.toString());
+ } catch (CoreException e) {
+ handleException(e);
+ }
+ } else {
+ voidVisit(node, SwitchExpression.STATEMENTS_PROPERTY);
+ }
+ return false;
+ }
+
+ @Override
public boolean visit(SwitchStatement node) {
if (!hasChildrenChanges(node)) {
return doVisitUnchangedChildren(node);

Back to the top