diff options
author | Sarika Sinha | 2019-07-17 10:47:24 +0000 |
---|---|---|
committer | Sarika Sinha | 2019-07-22 03:47:29 +0000 |
commit | 6c3ba26774291fed943945b0bb938660e887a8b7 (patch) | |
tree | c8c24b0c28f0dc8fd92adc8b99144996cc968764 | |
parent | 50a1e318609e40977fdde51f75bedd3bb7e8a17d (diff) | |
download | eclipse.jdt.core-6c3ba26774291fed943945b0bb938660e887a8b7.tar.gz eclipse.jdt.core-6c3ba26774291fed943945b0bb938660e887a8b7.tar.xz eclipse.jdt.core-6c3ba26774291fed943945b0bb938660e887a8b7.zip |
Change-Id: I266dacf87c8c8d993643a5f7567f25e970ece3ac
Signed-off-by: Sarika Sinha <sarika.sinha@in.ibm.com>
12 files changed, 419 insertions, 16 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTStructuralPropertyTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTStructuralPropertyTest.java index 3ed0c55983..32ffb13813 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTStructuralPropertyTest.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTStructuralPropertyTest.java @@ -8,6 +8,10 @@ * * SPDX-License-Identifier: EPL-2.0 * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -372,7 +376,7 @@ public class ASTStructuralPropertyTest extends org.eclipse.jdt.core.tests.junit. // oops - guess that's not valid } } - assertEquals("Wrong last known type", 100, hi); // last known one + assertEquals("Wrong last known type", 101, hi); // last known one assertEquals("Wrong number of distinct types", hi, classes.size()); // all classes are distinct } } diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTTest.java index 79d7bddbfa..21c199a13e 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTTest.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTTest.java @@ -8,6 +8,10 @@ * * SPDX-License-Identifier: EPL-2.0 * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -8869,6 +8873,7 @@ public class ASTTest extends org.eclipse.jdt.core.tests.junit.extension.TestCase ASTNode.PROVIDES_DIRECTIVE, ASTNode.MODULE_MODIFIER, ASTNode.SWITCH_EXPRESSION, + ASTNode.TEXT_BLOCK }; diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java index 9a70f85085..a9fa1aafd6 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java @@ -2712,6 +2712,18 @@ public final class AST { }
/**
+ * Creates an unparented yield statement node owned by this AST.
+ * The yield statement has no label/identifier/expression and is not implicit.
+ *
+ * @return a new unparented yield statement node
+ * @since 3.18 BETA_JAVA13
+ * @noreference This method is not intended to be referenced by clients.
+ */
+ public TextBlock newTextBlock() {
+ return new TextBlock(this);
+ }
+
+ /**
* Creates and returns a new text element node.
* Initially the new node has an empty text string.
* <p>
@@ -3017,6 +3029,7 @@ public final class AST { *
* @return a new unparented yield statement node
* @since 3.18 BETA_JAVA13
+ * @noreference This method is not intended to be referenced by clients.
*/
public YieldStatement newYieldStatement() {
return new YieldStatement(this);
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java index 4997b34759..c0d83c9fab 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java @@ -1833,12 +1833,12 @@ class ASTConverter { if (expression instanceof org.eclipse.jdt.internal.compiler.ast.ExtendedStringLiteral) { return convert((org.eclipse.jdt.internal.compiler.ast.ExtendedStringLiteral) expression); } - if (expression instanceof org.eclipse.jdt.internal.compiler.ast.StringLiteral) { - return convert((org.eclipse.jdt.internal.compiler.ast.StringLiteral) expression); - } if (expression instanceof org.eclipse.jdt.internal.compiler.ast.TextBlock) { return convert((org.eclipse.jdt.internal.compiler.ast.TextBlock) expression); } + if (expression instanceof org.eclipse.jdt.internal.compiler.ast.StringLiteral) { + return convert((org.eclipse.jdt.internal.compiler.ast.StringLiteral) expression); + } if (expression instanceof org.eclipse.jdt.internal.compiler.ast.AND_AND_Expression) { return convert((org.eclipse.jdt.internal.compiler.ast.AND_AND_Expression) expression); } @@ -2868,18 +2868,7 @@ class ASTConverter { literal.setSourceRange(expression.sourceStart, expression.sourceEnd - expression.sourceStart + 1); return literal; } - public Expression convert(org.eclipse.jdt.internal.compiler.ast.TextBlock expression) { - int length = expression.sourceEnd - expression.sourceStart + 1; - int sourceStart = expression.sourceStart; - StringLiteral literal = new StringLiteral(this.ast); - if (this.resolveBindings) { - this.recordNodes(literal, expression); - } - literal.internalSetEscapedValue(new String(this.compilationUnitSource, sourceStart, length)); - literal.setSourceRange(expression.sourceStart, expression.sourceEnd - expression.sourceStart + 1); - return literal; - } - + public Expression convert(org.eclipse.jdt.internal.compiler.ast.SwitchExpression expression) { if (this.ast.apiLevel != AST.JLS13_INTERNAL) { return createFakeNullLiteral(expression); @@ -2936,6 +2925,18 @@ class ASTConverter { return synchronizedStatement; } + public Expression convert(org.eclipse.jdt.internal.compiler.ast.TextBlock expression) { + int length = expression.sourceEnd - expression.sourceStart + 1; + int sourceStart = expression.sourceStart; + TextBlock literal = new TextBlock(this.ast); + if (this.resolveBindings) { + this.recordNodes(literal, expression); + } + literal.internalSetEscapedValue(new String(this.compilationUnitSource, sourceStart, length)); + literal.setSourceRange(expression.sourceStart, expression.sourceEnd - expression.sourceStart + 1); + return literal; + } + public Expression convert(org.eclipse.jdt.internal.compiler.ast.ThisReference reference) { if (reference.isImplicitThis()) { // There is no source associated with an implicit this diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTMatcher.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTMatcher.java index 04c84ef6ab..b67aca1b46 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTMatcher.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTMatcher.java @@ -2396,6 +2396,31 @@ public class ASTMatcher { * @return <code>true</code> if the subtree matches, or * <code>false</code> if they do not match or the other object has a * different node type or is <code>null</code> + * @noreference This method is not intended to be referenced by clients as it is a part of Java preview feature. + * @nooverride This method is not intended to be re-implemented or extended by clients as it is a part of Java preview feature. + * @since 3.18 BETA_JAVA13 + */ + public boolean match(TextBlock node, Object other) { + if (!(other instanceof TextBlock)) { + return false; + } + TextBlock o = (TextBlock) other; + return safeEquals(node.getEscapedValue(), o.getEscapedValue()); + } + + /** + * Returns whether the given node and the other object match. + * <p> + * The default implementation provided by this class tests whether the + * other object is a node of the same type with structurally isomorphic + * child subtrees. Subclasses may override this method as needed. + * </p> + * + * @param node the node + * @param other the other object, or <code>null</code> + * @return <code>true</code> if the subtree matches, or + * <code>false</code> if they do not match or the other object has a + * different node type or is <code>null</code> * @since 3.0 */ public boolean match(TextElement node, Object other) { @@ -2832,6 +2857,8 @@ public class ASTMatcher { * @return <code>true</code> if the subtree matches, or * <code>false</code> if they do not match or the other object has a * different node type or is <code>null</code> + * @noreference This method is not intended to be referenced by clients as it is a part of Java preview feature. + * @nooverride This method is not intended to be re-implemented or extended by clients as it is a part of Java preview feature. * @since 3.18 BETA_JAVA13 */ public boolean match(YieldStatement node, Object other) { diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTNode.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTNode.java index e53779cd27..cec78e4e74 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTNode.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTNode.java @@ -973,6 +973,14 @@ public abstract class ASTNode { * @since 3.18 BETA_JAVA13 */ public static final int YIELD_STATEMENT = 10; + + /** + * Node type constant indicating a node of type + * <code>TextBlock</code>. + * @see TextBlock + * @since 3.18 BETA_JAVA13 + */ + public static final int TEXT_BLOCK = 101; /** * Returns the node class for the corresponding node type. @@ -1154,6 +1162,8 @@ public abstract class ASTNode { return SynchronizedStatement.class; case TAG_ELEMENT : return TagElement.class; + case TEXT_BLOCK : + return TextBlock.class; case TEXT_ELEMENT : return TextElement.class; case THIS_EXPRESSION : diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTVisitor.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTVisitor.java index 7e10325598..fa4812c6c4 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTVisitor.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTVisitor.java @@ -1599,6 +1599,25 @@ public abstract class ASTVisitor { /** * Visits the given type-specific AST node. * <p> + * The default implementation does nothing and returns true. + * Subclasses may reimplement. + * </p> + * + * @param node the node to visit + * @return <code>true</code> if the children of this node should be + * visited, and <code>false</code> if the children of this node should + * be skipped + * @noreference This method is not intended to be referenced by clients as it is a part of Java preview feature. + * @nooverride This method is not intended to be re-implemented or extended by clients as it is a part of Java preview feature. + * @since 3.18 BETA_JAVA13 + */ + public boolean visit(TextBlock node) { + return true; + } + + /** + * Visits the given type-specific AST node. + * <p> * The default implementation does nothing and return true. * Subclasses may reimplement. * </p> @@ -1877,6 +1896,7 @@ public abstract class ASTVisitor { public boolean visit(YieldStatement node) { return true; } + /** * End of visit the given type-specific AST node. * <p> @@ -2921,6 +2941,21 @@ public abstract class ASTVisitor { * </p> * * @param node the node to visit + * @noreference This method is not intended to be referenced by clients as it is a part of Java preview feature. + * @nooverride This method is not intended to be re-implemented or extended by clients as it is a part of Java preview feature. + * @since 3.18 BETA_JAVA13 + */ + public void endVisit(TextBlock node) { + // default implementation: do nothing + } + + /** + * End of visit the given type-specific AST node. + * <p> + * The default implementation does nothing. Subclasses may reimplement. + * </p> + * + * @param node the node to visit * @since 3.0 */ public void endVisit(TextElement node) { diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultASTVisitor.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultASTVisitor.java index f7d0af6ec9..5b78c57ed8 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultASTVisitor.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultASTVisitor.java @@ -357,6 +357,10 @@ class DefaultASTVisitor extends ASTVisitor { endVisitNode(node); } @Override + public void endVisit(TextBlock node) { + endVisitNode(node); + } + @Override public void endVisit(TextElement node) { endVisitNode(node); } @@ -764,6 +768,11 @@ class DefaultASTVisitor extends ASTVisitor { } @Override + public boolean visit(TextBlock node) { + return visitNode(node); + } + + @Override public boolean visit(TextElement node) { return visitNode(node); } diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TextBlock.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TextBlock.java new file mode 100644 index 0000000000..1c6ffec36f --- /dev/null +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TextBlock.java @@ -0,0 +1,275 @@ +/******************************************************************************* + * Copyright (c) 2019 IBM Corporation and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * This is an implementation of an early-draft specification developed under the Java + * Community Process (JCP) and is made available for testing and evaluation purposes + * only. The code is not compatible with any specification of the JCP. + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ + +package org.eclipse.jdt.core.dom; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jdt.core.compiler.InvalidInputException; +import org.eclipse.jdt.internal.compiler.parser.Scanner; +import org.eclipse.jdt.internal.compiler.parser.ScannerHelper; +import org.eclipse.jdt.internal.compiler.parser.TerminalTokens; + +/** + * TextBolck AST node type. + * + * These are block of String literal nodes. + * + * @since 3.18 BETA_JAVA13 + * @noinstantiate This class is not intended to be instantiated by clients. + * @noreference This class is not intended to be referenced by clients as it is a part of Java preview feature. + */ +@SuppressWarnings("rawtypes") +public class TextBlock extends Expression { + + /** + * The "escapedValue" structural property of this node type (type: {@link String}). + * @since 3.0 + */ + public static final SimplePropertyDescriptor ESCAPED_VALUE_PROPERTY = + new SimplePropertyDescriptor(TextBlock.class, "escapedValue", String.class, MANDATORY); //$NON-NLS-1$ + + /** + * A list of property descriptors (element type: + * {@link StructuralPropertyDescriptor}), + * or null if uninitialized. + */ + private static final List PROPERTY_DESCRIPTORS; + + static { + List propertyList = new ArrayList(2); + createPropertyList(TextBlock.class, propertyList); + addProperty(ESCAPED_VALUE_PROPERTY, propertyList); + PROPERTY_DESCRIPTORS = reapPropertyList(propertyList); + } + + /** + * Returns a list of structural property descriptors for this node type. + * Clients must not modify the result. + * + * @param apiLevel the API level; one of the + * <code>AST.JLS*</code> constants + + * @return a list of property descriptors (element type: + * {@link StructuralPropertyDescriptor}) + * @since 3.0 + */ + public static List propertyDescriptors(int apiLevel) { + return PROPERTY_DESCRIPTORS; + } + + /** + * The literal string, including quotes and escapes; defaults to the + * literal for the empty string. + */ + private String escapedValue = "\"\"";//$NON-NLS-1$ + + /** + * Creates a new unparented TextBlock node owned by the given AST. + * By default, the TextBlock denotes the empty string. + * <p> + * N.B. This constructor is package-private. + * </p> + * + * @param ast the AST that is to own this node + * @exception UnsupportedOperationException if this operation is used other than JLS13 + */ + TextBlock(AST ast) { + super(ast); + supportedOnlyIn13(); + } + + @Override + final List internalStructuralPropertiesForType(int apiLevel) { + return propertyDescriptors(apiLevel); + } + + @Override + final Object internalGetSetObjectProperty(SimplePropertyDescriptor property, boolean get, Object value) { + if (property == ESCAPED_VALUE_PROPERTY) { + if (get) { + return getEscapedValue(); + } else { + setEscapedValue((String) value); + return null; + } + } + // allow default implementation to flag the error + return super.internalGetSetObjectProperty(property, get, value); + } + + @Override + final int getNodeType0() { + return TEXT_BLOCK; + } + + @Override + ASTNode clone0(AST target) { + TextBlock result = new TextBlock(target); + result.setSourceRange(getStartPosition(), getLength()); + result.setEscapedValue(getEscapedValue()); + return result; + } + + @Override + final boolean subtreeMatch0(ASTMatcher matcher, Object other) { + // dispatch to correct overloaded match method + return matcher.match(this, other); + } + + @Override + void accept0(ASTVisitor visitor) { + visitor.visit(this); + visitor.endVisit(this); + } + + /** + * Returns the string value of this literal node to the given string + * literal token. The token is the sequence of characters that would appear + * in the source program, including enclosing double quotes and embedded + * escapes. + * + * @return the string literal token, including enclosing double + * quotes and embedded escapes + */ + public String getEscapedValue() { + return this.escapedValue; + } + + /** + * Sets the string value of this literal node to the given string literal + * token. The token is the sequence of characters that would appear in the + * source program, including enclosing double quotes and embedded escapes. + * For example, + * <ul> + * <li><code>""</code> <code>setLiteral("\"\"")</code></li> + * <li><code>"hello world"</code> <code>setLiteral("\"hello world\"")</code></li> + * <li><code>"boo\nhoo"</code> <code>setLiteral("\"boo\\nhoo\"")</code></li> + * </ul> + * + * @param token the string literal token, including enclosing double + * quotes and embedded escapes + * @exception IllegalArgumentException if the argument is incorrect + */ + public void setEscapedValue(String token) { + // update internalSetEscapedValue(String) if this is changed + if (token == null) { + throw new IllegalArgumentException("Token cannot be null"); //$NON-NLS-1$ + } + Scanner scanner = this.ast.scanner; + char[] source = token.toCharArray(); + scanner.setSource(source); + scanner.resetTo(0, source.length); + try { + int tokenType = scanner.getNextToken(); + switch(tokenType) { + case TerminalTokens.TokenNameTextBlock: + break; + default: + throw new IllegalArgumentException("Invalid Text Block : >" + token + "<"); //$NON-NLS-1$//$NON-NLS-2$ + } + } catch(InvalidInputException e) { + throw new IllegalArgumentException("Invalid Text Block : >" + token + "<");//$NON-NLS-1$//$NON-NLS-2$ + } + preValueChange(ESCAPED_VALUE_PROPERTY); + this.escapedValue = token; + postValueChange(ESCAPED_VALUE_PROPERTY); + } + + /* (omit javadoc for this method) + * This method is a copy of setEscapedValue(String) that doesn't do any validation. + */ + void internalSetEscapedValue(String token) { + preValueChange(ESCAPED_VALUE_PROPERTY); + this.escapedValue = token; + postValueChange(ESCAPED_VALUE_PROPERTY); + } + + /** + * Returns the value of this literal node. + * <p> + * For example, + * <pre> + * TextBlock s; + * s.setEscapedValue("\"\"\" \n hello\\n world\""); + * assert s.getLiteralValue().equals("hello\n world"); + * </pre> + * <p> + * Note that this is a convenience method that converts from the stored + * TextBlock token returned by <code>getEscapedLiteral</code>. + * </p> + * + * @return the string value without enclosing triple quotes + * @exception IllegalArgumentException if the literal value cannot be converted + */ + public String getLiteralValue() { + String s = getEscapedValue(); + int len = s.length(); + if (len < 2 || s.indexOf("\"\"\"") != 0 || !s.substring(len-3, len).equals("\"\"\"") ) { //$NON-NLS-1$ //$NON-NLS-2$ + throw new IllegalArgumentException(); + } + + boolean newLineFound = false; + for (int i = 3; i < s.length(); i++) { + char c = s.charAt(i); + while (ScannerHelper.isWhitespace(c)) { + switch (c) { + case 10 : /* \ u000a: LINE FEED */ + case 13 : /* \ u000d: CARRIAGE RETURN */ + newLineFound = true; + break; + default: + break; + } + } + } + if (!newLineFound) { + throw new IllegalArgumentException(); + } + + Scanner scanner = this.ast.scanner; + char[] source = s.toCharArray(); + scanner.setSource(source); + scanner.resetTo(0, source.length); + try { + int tokenType = scanner.getNextToken(); + switch(tokenType) { + case TerminalTokens.TokenNameTextBlock: + return scanner.getCurrentStringLiteral(); + default: + throw new IllegalArgumentException(); + } + } catch(InvalidInputException e) { + throw new IllegalArgumentException(); + } + } + + + @Override + int memSize() { + int size = BASE_NODE_SIZE + 1 * 4 + stringSize(this.escapedValue); + return size; + } + + @Override + int treeSize() { + return memSize(); + } +} + diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java index 2330893a8a..e84643afa9 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/NaiveASTFlattener.java @@ -1625,6 +1625,12 @@ public class NaiveASTFlattener extends ASTVisitor { } @Override + public boolean visit(TextBlock node) { + this.buffer.append(node.getEscapedValue()); + return false; + } + + @Override public boolean visit(TextElement node) { this.buffer.append(node.getText()); return false; 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 542e5b1fec..30a216b56f 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 @@ -4067,6 +4067,18 @@ public final class ASTRewriteAnalyzer extends ASTVisitor { } @Override + public boolean visit(TextBlock node) { + if (!hasChildrenChanges(node)) { + return doVisitUnchangedChildren(node); + } + String escapedSeq= (String) getNewValue(node, TextBlock.ESCAPED_VALUE_PROPERTY); + TextEditGroup group = getEditGroup(node, TextBlock.ESCAPED_VALUE_PROPERTY); + doTextReplace(node.getStartPosition(), node.getLength(), escapedSeq, group); + + return false; + } + + @Override public boolean visit(TextElement node) { if (!hasChildrenChanges(node)) { return doVisitUnchangedChildren(node); diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java index ff5bb31a2e..275066f33b 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteFlattener.java @@ -1274,6 +1274,12 @@ public class ASTRewriteFlattener extends ASTVisitor { } @Override + public boolean visit(TextBlock node) { + this.result.append(getAttribute(node, TextBlock.ESCAPED_VALUE_PROPERTY)); + return false; + } + + @Override public boolean visit(TextElement node) { this.result.append(getAttribute(node, TextElement.TEXT_PROPERTY)); return false; |