### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: dom/org/eclipse/jdt/core/dom/ASTParser.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java,v retrieving revision 1.87 diff -u -r1.87 ASTParser.java --- dom/org/eclipse/jdt/core/dom/ASTParser.java 31 Mar 2009 15:02:58 -0000 1.87 +++ dom/org/eclipse/jdt/core/dom/ASTParser.java 27 Apr 2009 08:25:18 -0000 @@ -1048,6 +1048,8 @@ converter.scanner = new RecoveryScanner(scanner, data.removeUnused()); converter.docParser.scanner = converter.scanner; converter.scanner.setSource(scanner.source); + + compilationUnit.setStatementsRecoveryData(data); } RecordedParsingInformation recordedParsingInformation = codeSnippetParsingUtil.recordedParsingInformation; int[][] comments = recordedParsingInformation.commentPositions; Index: dom/org/eclipse/jdt/core/dom/CompilationUnit.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnit.java,v retrieving revision 1.90 diff -u -r1.90 CompilationUnit.java --- dom/org/eclipse/jdt/core/dom/CompilationUnit.java 27 Jun 2008 16:03:46 -0000 1.90 +++ dom/org/eclipse/jdt/core/dom/CompilationUnit.java 27 Apr 2009 08:25:18 -0000 @@ -178,6 +178,11 @@ * Problems reported by the compiler during parsing or name resolution. */ private IProblem[] problems = EMPTY_PROBLEMS; + + /** + * Internal data used to perform statements recovery. + */ + private Object statementsRecoveryData; /** * The list of type declarations in textual order order; @@ -615,6 +620,20 @@ } /** + * Internal method + * + * This method return internal data used to perform statements recovery. + * + * @return internal data used to perform statements recovery. + * + * @noreference This method is not intended to be referenced by clients. + * @since 3.5 + */ + public Object getStatementsRecoveryData() { + return this.statementsRecoveryData; + } + + /** * The Java type root (a {@link org.eclipse.jdt.core.ICompilationUnit compilation unit} or a {@link org.eclipse.jdt.core.IClassFile class file}) * this compilation unit was created from, or null if it was not created from a Java type root. * @@ -1009,6 +1028,19 @@ } this.problems = problems; } + + /** + * Internal method + * + * Sets internal data used to perform statements recovery. + * @param data + * + * @noreference This method is not intended to be referenced by clients. + * @since 3.5 + */ + void setStatementsRecoveryData(Object data) { + this.statementsRecoveryData = data; + } /* (omit javadoc for this method) * Method declared on ASTNode. Index: dom/org/eclipse/jdt/core/dom/ASTConverter.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java,v retrieving revision 1.268 diff -u -r1.268 ASTConverter.java --- dom/org/eclipse/jdt/core/dom/ASTConverter.java 31 Mar 2009 15:06:38 -0000 1.268 +++ dom/org/eclipse/jdt/core/dom/ASTConverter.java 27 Apr 2009 08:25:18 -0000 @@ -1228,6 +1228,7 @@ this.compilationUnitSourceLength = source.length; this.scanner.setSource(source, unit.compilationResult); CompilationUnit compilationUnit = new CompilationUnit(this.ast); + compilationUnit.setStatementsRecoveryData(unit.compilationResult.recoveryScannerData); // Parse comments int[][] comments = unit.comments; Index: dom/org/eclipse/jdt/core/dom/InternalASTRewrite.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/InternalASTRewrite.java,v retrieving revision 1.13 diff -u -r1.13 InternalASTRewrite.java --- dom/org/eclipse/jdt/core/dom/InternalASTRewrite.java 7 Mar 2009 01:08:09 -0000 1.13 +++ dom/org/eclipse/jdt/core/dom/InternalASTRewrite.java 27 Apr 2009 08:25:18 -0000 @@ -22,6 +22,7 @@ import org.eclipse.jdt.core.dom.SimplePropertyDescriptor; import org.eclipse.jdt.core.dom.StructuralPropertyDescriptor; import org.eclipse.jdt.core.dom.rewrite.TargetSourceRangeComputer; +import org.eclipse.jdt.internal.compiler.parser.RecoveryScannerData; import org.eclipse.jdt.internal.core.dom.rewrite.ASTRewriteAnalyzer; import org.eclipse.jdt.internal.core.dom.rewrite.LineInformation; import org.eclipse.jdt.internal.core.dom.rewrite.ListRewriteEvent; @@ -89,7 +90,7 @@ String lineDelim= TextUtilities.getDefaultLineDelimiter(document); List comments= rootNode.getCommentList(); - ASTRewriteAnalyzer visitor = new ASTRewriteAnalyzer(content, lineInfo, lineDelim, result, this.eventStore, this.nodeStore, comments, options, xsrComputer); + ASTRewriteAnalyzer visitor = new ASTRewriteAnalyzer(content, lineInfo, lineDelim, result, this.eventStore, this.nodeStore, comments, options, xsrComputer, (RecoveryScannerData)rootNode.getStatementsRecoveryData()); rootNode.accept(visitor); } return result; Index: compiler/org/eclipse/jdt/internal/compiler/parser/RecoveryScanner.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/RecoveryScanner.java,v retrieving revision 1.11 diff -u -r1.11 RecoveryScanner.java --- compiler/org/eclipse/jdt/internal/compiler/parser/RecoveryScanner.java 7 Mar 2009 01:08:07 -0000 1.11 +++ compiler/org/eclipse/jdt/internal/compiler/parser/RecoveryScanner.java 27 Apr 2009 08:25:17 -0000 @@ -39,6 +39,26 @@ scanner.isTaskCaseSensitive); setData(data); } + + public RecoveryScanner( + boolean tokenizeWhiteSpace, + boolean checkNonExternalizedStringLiterals, + long sourceLevel, + long complianceLevel, + char[][] taskTags, + char[][] taskPriorities, + boolean isTaskCaseSensitive, + RecoveryScannerData data) { + super(false, + tokenizeWhiteSpace, + checkNonExternalizedStringLiterals, + sourceLevel, + complianceLevel, + taskTags, + taskPriorities, + isTaskCaseSensitive); + setData(data); + } public void insertToken(int token, int completedToken, int position) { insertTokens(new int []{token}, completedToken, position); Index: dom/org/eclipse/jdt/internal/core/dom/rewrite/TokenScanner.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/TokenScanner.java,v retrieving revision 1.11 diff -u -r1.11 TokenScanner.java --- dom/org/eclipse/jdt/internal/core/dom/rewrite/TokenScanner.java 7 Mar 2009 01:08:10 -0000 1.11 +++ dom/org/eclipse/jdt/internal/core/dom/rewrite/TokenScanner.java 27 Apr 2009 08:25:19 -0000 @@ -14,9 +14,9 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.JavaCore; -import org.eclipse.jdt.core.compiler.IScanner; -import org.eclipse.jdt.core.compiler.ITerminalSymbols; import org.eclipse.jdt.core.compiler.InvalidInputException; +import org.eclipse.jdt.internal.compiler.parser.Scanner; +import org.eclipse.jdt.internal.compiler.parser.TerminalTokens; /** * Wraps a scanner and offers convenient methods for finding tokens @@ -27,14 +27,14 @@ public static final int LEXICAL_ERROR= 20002; public static final int DOCUMENT_ERROR= 20003; - private final IScanner scanner; + private final Scanner scanner; private final int endPosition; /** * Creates a TokenScanner * @param scanner The scanner to be wrapped */ - public TokenScanner(IScanner scanner) { + public TokenScanner(Scanner scanner) { this.scanner= scanner; this.endPosition= this.scanner.getSource().length - 1; } @@ -43,7 +43,7 @@ * Returns the wrapped scanner * @return IScanner */ - public IScanner getScanner() { + public Scanner getScanner() { return this.scanner; } @@ -88,7 +88,7 @@ do { try { curr= this.scanner.getNextToken(); - if (curr == ITerminalSymbols.TokenNameEOF) { + if (curr == TerminalTokens.TokenNameEOF) { throw new CoreException(createError(END_OF_FILE, "End Of File", null)); //$NON-NLS-1$ } } catch (InvalidInputException e) { @@ -208,23 +208,23 @@ } public static boolean isComment(int token) { - return token == ITerminalSymbols.TokenNameCOMMENT_BLOCK || token == ITerminalSymbols.TokenNameCOMMENT_JAVADOC - || token == ITerminalSymbols.TokenNameCOMMENT_LINE; + return token == TerminalTokens.TokenNameCOMMENT_BLOCK || token == TerminalTokens.TokenNameCOMMENT_JAVADOC + || token == TerminalTokens.TokenNameCOMMENT_LINE; } public static boolean isModifier(int token) { switch (token) { - case ITerminalSymbols.TokenNamepublic: - case ITerminalSymbols.TokenNameprotected: - case ITerminalSymbols.TokenNameprivate: - case ITerminalSymbols.TokenNamestatic: - case ITerminalSymbols.TokenNamefinal: - case ITerminalSymbols.TokenNameabstract: - case ITerminalSymbols.TokenNamenative: - case ITerminalSymbols.TokenNamevolatile: - case ITerminalSymbols.TokenNamestrictfp: - case ITerminalSymbols.TokenNametransient: - case ITerminalSymbols.TokenNamesynchronized: + case TerminalTokens.TokenNamepublic: + case TerminalTokens.TokenNameprotected: + case TerminalTokens.TokenNameprivate: + case TerminalTokens.TokenNamestatic: + case TerminalTokens.TokenNamefinal: + case TerminalTokens.TokenNameabstract: + case TerminalTokens.TokenNamenative: + case TerminalTokens.TokenNamevolatile: + case TerminalTokens.TokenNamestrictfp: + case TerminalTokens.TokenNametransient: + case TerminalTokens.TokenNamesynchronized: return true; default: return false; Index: dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java,v retrieving revision 1.61 diff -u -r1.61 ASTRewriteAnalyzer.java --- dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java 7 Mar 2009 00:59:06 -0000 1.61 +++ dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java 27 Apr 2009 08:25:19 -0000 @@ -19,15 +19,17 @@ import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; -import org.eclipse.jdt.core.ToolFactory; -import org.eclipse.jdt.core.compiler.IScanner; -import org.eclipse.jdt.core.compiler.ITerminalSymbols; import org.eclipse.jdt.core.dom.*; import org.eclipse.jdt.core.dom.rewrite.TargetSourceRangeComputer; import org.eclipse.jdt.core.dom.rewrite.TargetSourceRangeComputer.SourceRange; import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants; import org.eclipse.jdt.core.formatter.IndentManipulation; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; +import org.eclipse.jdt.internal.compiler.parser.RecoveryScanner; +import org.eclipse.jdt.internal.compiler.parser.RecoveryScannerData; +import org.eclipse.jdt.internal.compiler.parser.Scanner; import org.eclipse.jdt.internal.compiler.parser.ScannerHelper; +import org.eclipse.jdt.internal.compiler.parser.TerminalTokens; import org.eclipse.jdt.internal.core.dom.rewrite.ASTRewriteFormatter.BlockContext; import org.eclipse.jdt.internal.core.dom.rewrite.ASTRewriteFormatter.NodeMarker; import org.eclipse.jdt.internal.core.dom.rewrite.ASTRewriteFormatter.Prefix; @@ -82,6 +84,8 @@ private int beforeRequiredSpaceIndex = -1; Map options; + + private RecoveryScannerData recoveryScannerData; /** * Constructor for ASTRewriteAnalyzer. @@ -91,10 +95,21 @@ * @param eventStore the event store containing the description of changes * @param nodeInfos annotations to nodes, such as if a node is a string placeholder or a copy target * @param comments list of comments of the compilation unit to rewrite (elements of type Comment) or null. - * @param options the current jdt.core options (formatting/compliance) or null. - * @param extendedSourceRangeComputer the source range computer to use - */ - public ASTRewriteAnalyzer(char[] content, LineInformation lineInfo, String lineDelim, TextEdit rootEdit, RewriteEventStore eventStore, NodeInfoStore nodeInfos, List comments, Map options, TargetSourceRangeComputer extendedSourceRangeComputer) { + * @param options the current jdt.core options (formatting/compliance) or null. + * @param extendedSourceRangeComputer the source range computer to use + * @param recoveryScannerData internal data used by {@link RecoveryScanner} + */ + public ASTRewriteAnalyzer( + char[] content, + LineInformation lineInfo, + String lineDelim, + TextEdit rootEdit, + RewriteEventStore eventStore, + NodeInfoStore nodeInfos, + List comments, + Map options, + TargetSourceRangeComputer extendedSourceRangeComputer, + RecoveryScannerData recoveryScannerData) { this.eventStore= eventStore; this.content= content; this.lineInfo= lineInfo; @@ -110,11 +125,37 @@ this.lineCommentEndOffsets= new LineCommentEndOffsets(comments); this.options = options; + + this.recoveryScannerData = recoveryScannerData; } final TokenScanner getScanner() { if (this.tokenScanner == null) { - IScanner scanner= ToolFactory.createScanner(true, false, false, false); + CompilerOptions compilerOptions = new CompilerOptions(this.options); + Scanner scanner; + if (this.recoveryScannerData == null) { + scanner = + new Scanner( + true,/*tokenizeComments*/ + false,/*tokenizeWhiteSpace*/ + false,/*checkNonExternalizedStringLiterals*/ + compilerOptions.sourceLevel, + compilerOptions.complianceLevel, + null/*taskTags*/, + null/*taskPriorities*/, + true/*taskCaseSensitive*/); + } else { + scanner = + new RecoveryScanner( + false,/*tokenizeWhiteSpace*/ + false,/*checkNonExternalizedStringLiterals*/ + compilerOptions.sourceLevel, + compilerOptions.complianceLevel, + null/*taskTags*/, + null/*taskPriorities*/, + true/*taskCaseSensitive*/, + this.recoveryScannerData); + } scanner.setSource(this.content); this.tokenScanner= new TokenScanner(scanner); } @@ -759,7 +800,7 @@ try { ASTNode node= (ASTNode) event.getOriginalValue(); TextEditGroup editGroup= getEditGroup(event); - int dotEnd= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameDOT, node.getStartPosition() + node.getLength()); + int dotEnd= getScanner().getTokenEndOffset(TerminalTokens.TokenNameDOT, node.getStartPosition() + node.getLength()); doTextRemoveAndVisit(startPos, dotEnd - startPos, node, editGroup); return dotEnd; } catch (CoreException e) { @@ -777,7 +818,7 @@ doTextRemoveAndVisit(offset, length, node, editGroup); doTextInsert(offset, (ASTNode) event.getNewValue(), getIndent(startPos), true, editGroup); try { - return getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameDOT, offset + length); + return getScanner().getTokenEndOffset(TerminalTokens.TokenNameDOT, offset + length); } catch (CoreException e) { handleException(e); } @@ -791,7 +832,7 @@ } int pos= doVisit((ASTNode) node); try { - return getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameDOT, pos); + return getScanner().getTokenEndOffset(TerminalTokens.TokenNameDOT, pos); } catch (CoreException e) { handleException(e); } @@ -923,7 +964,7 @@ } boolean isAllRemoved= !isAllInserted && isAllOfKind(children, RewriteEvent.REMOVED); if (isAllRemoved) { // all removed: set start to left bracket - int posBeforeOpenBracket= getScanner().getTokenStartOffset(ITerminalSymbols.TokenNameLESS, pos); + int posBeforeOpenBracket= getScanner().getTokenStartOffset(TerminalTokens.TokenNameLESS, pos); if (posBeforeOpenBracket != pos) { needsSpaceOnRemoveAll= false; } @@ -931,7 +972,7 @@ } pos= new ListRewriter().rewriteList(parent, property, pos, String.valueOf('<'), ", "); //$NON-NLS-1$ if (isAllRemoved) { // all removed: remove right and space up to next element - int endPos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameGREATER, pos); // set pos to '>' + int endPos= getScanner().getTokenEndOffset(TerminalTokens.TokenNameGREATER, pos); // set pos to '>' endPos= getScanner().getNextStartOffset(endPos, false); String replacement= needsSpaceOnRemoveAll ? String.valueOf(' ') : new String(); doTextReplace(pos, endPos - pos, replacement, getEditGroup(children[children.length - 1])); @@ -948,7 +989,7 @@ } if (pos != offset) { // list contained some type -> parse after closing bracket try { - return getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameGREATER, pos); + return getScanner().getTokenEndOffset(TerminalTokens.TokenNameGREATER, pos); } catch (CoreException e) { handleException(e); } @@ -1033,7 +1074,7 @@ try { getScanner().setOffset(pos); for (int i= newDim; i < oldDim; i++) { - getScanner().readToToken(ITerminalSymbols.TokenNameRBRACKET); + getScanner().readToToken(TerminalTokens.TokenNameRBRACKET); } doTextRemove(pos, getScanner().getCurrentEndOffset() - pos, editGroup); } catch (CoreException e) { @@ -1048,7 +1089,7 @@ private int getPosAfterLeftBrace(int pos) { try { int nextToken= getScanner().readNext(pos, true); - if (nextToken == ITerminalSymbols.TokenNameLBRACE) { + if (nextToken == TerminalTokens.TokenNameLBRACE) { return getScanner().getCurrentEndOffset(); } } catch (CoreException e) { @@ -1164,17 +1205,17 @@ } boolean keep= true; switch (tok) { - case ITerminalSymbols.TokenNamepublic: keep= Modifier.isPublic(newModifiers); break; - case ITerminalSymbols.TokenNameprotected: keep= Modifier.isProtected(newModifiers); break; - case ITerminalSymbols.TokenNameprivate: keep= Modifier.isPrivate(newModifiers); break; - case ITerminalSymbols.TokenNamestatic: keep= Modifier.isStatic(newModifiers); break; - case ITerminalSymbols.TokenNamefinal: keep= Modifier.isFinal(newModifiers); break; - case ITerminalSymbols.TokenNameabstract: keep= Modifier.isAbstract(newModifiers); break; - case ITerminalSymbols.TokenNamenative: keep= Modifier.isNative(newModifiers); break; - case ITerminalSymbols.TokenNamevolatile: keep= Modifier.isVolatile(newModifiers); break; - case ITerminalSymbols.TokenNamestrictfp: keep= Modifier.isStrictfp(newModifiers); break; - case ITerminalSymbols.TokenNametransient: keep= Modifier.isTransient(newModifiers); break; - case ITerminalSymbols.TokenNamesynchronized: keep= Modifier.isSynchronized(newModifiers); break; + case TerminalTokens.TokenNamepublic: keep= Modifier.isPublic(newModifiers); break; + case TerminalTokens.TokenNameprotected: keep= Modifier.isProtected(newModifiers); break; + case TerminalTokens.TokenNameprivate: keep= Modifier.isPrivate(newModifiers); break; + case TerminalTokens.TokenNamestatic: keep= Modifier.isStatic(newModifiers); break; + case TerminalTokens.TokenNamefinal: keep= Modifier.isFinal(newModifiers); break; + case TerminalTokens.TokenNameabstract: keep= Modifier.isAbstract(newModifiers); break; + case TerminalTokens.TokenNamenative: keep= Modifier.isNative(newModifiers); break; + case TerminalTokens.TokenNamevolatile: keep= Modifier.isVolatile(newModifiers); break; + case TerminalTokens.TokenNamestrictfp: keep= Modifier.isStrictfp(newModifiers); break; + case TerminalTokens.TokenNametransient: keep= Modifier.isTransient(newModifiers); break; + case TerminalTokens.TokenNamesynchronized: keep= Modifier.isSynchronized(newModifiers); break; default: break loop; } @@ -1395,7 +1436,7 @@ boolean invertType= isChanged(node, TypeDeclaration.INTERFACE_PROPERTY); if (invertType) { try { - int typeToken= isInterface ? ITerminalSymbols.TokenNameinterface : ITerminalSymbols.TokenNameclass; + int typeToken= isInterface ? TerminalTokens.TokenNameinterface : TerminalTokens.TokenNameclass; getScanner().readToToken(typeToken, node.getStartPosition()); String str= isInterface ? "class" : "interface"; //$NON-NLS-1$ //$NON-NLS-2$ @@ -1544,13 +1585,13 @@ // parameters try { if (isChanged(node, MethodDeclaration.PARAMETERS_PROPERTY)) { - pos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameLPAREN, pos); + pos= getScanner().getTokenEndOffset(TerminalTokens.TokenNameLPAREN, pos); pos= rewriteNodeList(node, MethodDeclaration.PARAMETERS_PROPERTY, pos, "", ", "); //$NON-NLS-1$ //$NON-NLS-2$ } else { pos= doVisit(node, MethodDeclaration.PARAMETERS_PROPERTY, pos); } - pos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameRPAREN, pos); + pos= getScanner().getTokenEndOffset(TerminalTokens.TokenNameRPAREN, pos); int extraDims= rewriteExtraDimensions(node, MethodDeclaration.EXTRA_DIMENSIONS_PROPERTY, pos); @@ -1561,7 +1602,7 @@ if ((extraDims > 0) && (hasExceptionChanges || bodyChangeKind == RewriteEvent.INSERTED || bodyChangeKind == RewriteEvent.REMOVED)) { int dim= ((Integer) getOriginalValue(node, MethodDeclaration.EXTRA_DIMENSIONS_PROPERTY)).intValue(); while (dim > 0) { - pos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameRBRACKET, pos); + pos= getScanner().getTokenEndOffset(TerminalTokens.TokenNameRBRACKET, pos); dim--; } } @@ -1598,7 +1639,7 @@ */ public boolean visit(ReturnStatement node) { try { - this.beforeRequiredSpaceIndex = getScanner().getTokenEndOffset(ITerminalSymbols.TokenNamereturn, node.getStartPosition()); + this.beforeRequiredSpaceIndex = getScanner().getTokenEndOffset(TerminalTokens.TokenNamereturn, node.getStartPosition()); if (!hasChildrenChanges(node)) { return doVisitUnchangedChildren(node); @@ -1673,7 +1714,7 @@ try { - int offset= getScanner().getTokenStartOffset(ITerminalSymbols.TokenNameLBRACKET, arrayType.getStartPosition()); + int offset= getScanner().getTokenStartOffset(TerminalTokens.TokenNameLBRACKET, arrayType.getStartPosition()); // dimension node with expressions RewriteEvent dimEvent= getEvent(node, ArrayCreation.DIMENSIONS_PROPERTY); boolean hasDimensionChanges= (dimEvent != null && dimEvent.getChangeKind() != RewriteEvent.UNCHANGED); @@ -1692,7 +1733,7 @@ } else { ASTNode elem= (ASTNode) event.getOriginalValue(); int elemEnd= elem.getStartPosition() + elem.getLength(); - int endPos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameRBRACKET, elemEnd); + int endPos= getScanner().getTokenEndOffset(TerminalTokens.TokenNameRBRACKET, elemEnd); if (changeKind == RewriteEvent.REMOVED) { editGroup= getEditGroup(event); doTextRemoveAndVisit(offset, endPos - offset, elem, editGroup); @@ -1717,14 +1758,14 @@ } if (nOldBrackets != nNewBrackets) { if (!hasDimensionChanges) { - offset= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameRBRACKET, offset); + offset= getScanner().getTokenEndOffset(TerminalTokens.TokenNameRBRACKET, offset); } rewriteExtraDimensions(nOldBrackets, nNewBrackets, offset, editGroup); } int kind= getChangeKind(node, ArrayCreation.INITIALIZER_PROPERTY); if (kind == RewriteEvent.REMOVED) { - offset= getScanner().getPreviousTokenEndOffset(ITerminalSymbols.TokenNameLBRACE, offset); + offset= getScanner().getPreviousTokenEndOffset(TerminalTokens.TokenNameLBRACE, offset); } else { offset= node.getStartPosition() + node.getLength(); // insert pos } @@ -1838,7 +1879,7 @@ } try { - int offset= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNamebreak, node.getStartPosition()); + int offset= getScanner().getTokenEndOffset(TerminalTokens.TokenNamebreak, node.getStartPosition()); rewriteNode(node, BreakStatement.LABEL_PROPERTY, offset, ASTRewriteFormatter.SPACE); // space between break and label } catch (CoreException e) { handleException(e); @@ -1900,7 +1941,7 @@ } else { if (isChanged(node, ClassInstanceCreation.TYPE_ARGUMENTS_PROPERTY)) { try { - pos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNamenew, pos); //after 'new' + pos= getScanner().getTokenEndOffset(TerminalTokens.TokenNamenew, pos); //after 'new' rewriteOptionalTypeParameters(node, ClassInstanceCreation.TYPE_ARGUMENTS_PROPERTY, pos, " ", true, true); //$NON-NLS-1$ } catch (CoreException e) { handleException(e); @@ -1913,7 +1954,7 @@ if (isChanged(node, ClassInstanceCreation.ARGUMENTS_PROPERTY)) { try { - int startpos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameLPAREN, pos); + int startpos= getScanner().getTokenEndOffset(TerminalTokens.TokenNameLPAREN, pos); rewriteNodeList(node, ClassInstanceCreation.ARGUMENTS_PROPERTY, startpos, "", ", "); //$NON-NLS-1$ //$NON-NLS-2$ } catch (CoreException e) { handleException(e); @@ -1925,7 +1966,7 @@ int kind= getChangeKind(node, ClassInstanceCreation.ANONYMOUS_CLASS_DECLARATION_PROPERTY); if (kind == RewriteEvent.REMOVED) { try { - pos= getScanner().getPreviousTokenEndOffset(ITerminalSymbols.TokenNameLBRACE, pos); + pos= getScanner().getPreviousTokenEndOffset(TerminalTokens.TokenNameLBRACE, pos); } catch (CoreException e) { handleException(e); } @@ -1962,7 +2003,7 @@ pos= rewriteOptionalTypeParameters(node, ConstructorInvocation.TYPE_ARGUMENTS_PROPERTY, pos, "", false, false); //$NON-NLS-1$ } try { - pos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameLPAREN, pos); + pos= getScanner().getTokenEndOffset(TerminalTokens.TokenNameLPAREN, pos); rewriteNodeList(node, ConstructorInvocation.ARGUMENTS_PROPERTY, pos, "", ", "); //$NON-NLS-1$ //$NON-NLS-2$ } catch (CoreException e) { handleException(e); @@ -1979,7 +2020,7 @@ } try { - int offset= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNamecontinue, node.getStartPosition()); + int offset= getScanner().getTokenEndOffset(TerminalTokens.TokenNamecontinue, node.getStartPosition()); rewriteNode(node, ContinueStatement.LABEL_PROPERTY, offset, ASTRewriteFormatter.SPACE); // space between continue and label } catch (CoreException e) { handleException(e); @@ -1999,10 +2040,10 @@ try { RewriteEvent event= getEvent(node, DoStatement.BODY_PROPERTY); if (event != null && event.getChangeKind() == RewriteEvent.REPLACED) { - int startOffset= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNamedo, pos); + int startOffset= getScanner().getTokenEndOffset(TerminalTokens.TokenNamedo, pos); ASTNode body= (ASTNode) event.getOriginalValue(); int bodyEnd= body.getStartPosition() + body.getLength(); - int endPos= getScanner().getTokenStartOffset(ITerminalSymbols.TokenNamewhile, bodyEnd); + int endPos= getScanner().getTokenStartOffset(TerminalTokens.TokenNamewhile, bodyEnd); rewriteBodyNode(node, DoStatement.BODY_PROPERTY, startOffset, endPos, getIndent(node.getStartPosition()), this.formatter.DO_BLOCK); // body } else { voidVisit(node, DoStatement.BODY_PROPERTY); @@ -2085,19 +2126,19 @@ if (isChanged(node, ForStatement.INITIALIZERS_PROPERTY)) { // position after opening parent - int startOffset= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameLPAREN, pos); + int startOffset= getScanner().getTokenEndOffset(TerminalTokens.TokenNameLPAREN, pos); pos= rewriteNodeList(node, ForStatement.INITIALIZERS_PROPERTY, startOffset, "", ", "); //$NON-NLS-1$ //$NON-NLS-2$ } else { pos= doVisit(node, ForStatement.INITIALIZERS_PROPERTY, pos); } // position after first semicolon - pos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameSEMICOLON, pos); + pos= getScanner().getTokenEndOffset(TerminalTokens.TokenNameSEMICOLON, pos); pos= rewriteNode(node, ForStatement.EXPRESSION_PROPERTY, pos, ASTRewriteFormatter.NONE); if (isChanged(node, ForStatement.UPDATERS_PROPERTY)) { - int startOffset= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameSEMICOLON, pos); + int startOffset= getScanner().getTokenEndOffset(TerminalTokens.TokenNameSEMICOLON, pos); pos= rewriteNodeList(node, ForStatement.UPDATERS_PROPERTY, startOffset, "", ", "); //$NON-NLS-1$ //$NON-NLS-2$ } else { pos= doVisit(node, ForStatement.UPDATERS_PROPERTY, pos); @@ -2105,7 +2146,7 @@ RewriteEvent bodyEvent= getEvent(node, ForStatement.BODY_PROPERTY); if (bodyEvent != null && bodyEvent.getChangeKind() == RewriteEvent.REPLACED) { - int startOffset= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameRPAREN, pos); + int startOffset= getScanner().getTokenEndOffset(TerminalTokens.TokenNameRPAREN, pos); rewriteBodyNode(node, ForStatement.BODY_PROPERTY, startOffset, -1, getIndent(node.getStartPosition()), this.formatter.FOR_BLOCK); // body } else { voidVisit(node, ForStatement.BODY_PROPERTY); @@ -2135,7 +2176,7 @@ if (thenEvent != null && thenEvent.getChangeKind() != RewriteEvent.UNCHANGED) { try { int tok= getScanner().readNext(pos, true); // after the closing parent - pos= (tok == ITerminalSymbols.TokenNameRPAREN) ? getScanner().getCurrentEndOffset() : getScanner().getCurrentStartOffset(); + pos= (tok == TerminalTokens.TokenNameRPAREN) ? getScanner().getCurrentEndOffset() : getScanner().getCurrentStartOffset(); int indent= getIndent(node.getStartPosition()); @@ -2143,7 +2184,7 @@ Object elseStatement= getOriginalValue(node, IfStatement.ELSE_STATEMENT_PROPERTY); if (elseStatement != null) { ASTNode thenStatement = (ASTNode) thenEvent.getOriginalValue(); - endPos= getScanner().getTokenStartOffset(ITerminalSymbols.TokenNameelse, thenStatement.getStartPosition() + thenStatement.getLength()); // else keyword + endPos= getScanner().getTokenStartOffset(TerminalTokens.TokenNameelse, thenStatement.getStartPosition() + thenStatement.getLength()); // else keyword } if (elseStatement == null || elseChange != RewriteEvent.UNCHANGED) { pos= rewriteBodyNode(node, IfStatement.THEN_STATEMENT_PROPERTY, pos, endPos, indent, this.formatter.IF_BLOCK_NO_ELSE); @@ -2182,10 +2223,10 @@ RewriteEvent event= getEvent(node, ImportDeclaration.STATIC_PROPERTY); if (event != null && event.getChangeKind() != RewriteEvent.UNCHANGED) { try { - int pos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameimport, node.getStartPosition()); + int pos= getScanner().getTokenEndOffset(TerminalTokens.TokenNameimport, node.getStartPosition()); boolean wasStatic= ((Boolean) event.getOriginalValue()).booleanValue(); if (wasStatic) { - int endPos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNamestatic, pos); + int endPos= getScanner().getTokenEndOffset(TerminalTokens.TokenNamestatic, pos); doTextRemove(pos, endPos - pos, getEditGroup(event)); } else { doTextInsert(pos, " static", getEditGroup(event)); //$NON-NLS-1$ @@ -2205,7 +2246,7 @@ doTextInsert(pos, ".*", getEditGroup(event)); //$NON-NLS-1$ } else { try { - int endPos= getScanner().getTokenStartOffset(ITerminalSymbols.TokenNameSEMICOLON, pos); + int endPos= getScanner().getTokenStartOffset(TerminalTokens.TokenNameSEMICOLON, pos); doTextRemove(pos, endPos - pos, getEditGroup(event)); } catch (CoreException e) { handleException(e); @@ -2380,7 +2421,7 @@ if (isChanged(node, MethodInvocation.ARGUMENTS_PROPERTY)) { // eval position after opening parent try { - int startOffset= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameLPAREN, pos); + int startOffset= getScanner().getTokenEndOffset(TerminalTokens.TokenNameLPAREN, pos); rewriteNodeList(node, MethodInvocation.ARGUMENTS_PROPERTY, startOffset, "", ", "); //$NON-NLS-1$ //$NON-NLS-2$ } catch (CoreException e) { handleException(e); @@ -2557,7 +2598,7 @@ int kind= getChangeKind(node, SingleVariableDeclaration.INITIALIZER_PROPERTY); if (kind == RewriteEvent.REMOVED) { try { - pos= getScanner().getPreviousTokenEndOffset(ITerminalSymbols.TokenNameEQUAL, pos); + pos= getScanner().getPreviousTokenEndOffset(TerminalTokens.TokenNameEQUAL, pos); } catch (CoreException e) { handleException(e); } @@ -2601,7 +2642,7 @@ if (isChanged(node, SuperConstructorInvocation.ARGUMENTS_PROPERTY)) { // eval position after opening parent try { - pos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameLPAREN, pos); + pos= getScanner().getTokenEndOffset(TerminalTokens.TokenNameLPAREN, pos); rewriteNodeList(node, SuperConstructorInvocation.ARGUMENTS_PROPERTY, pos, "", ", "); //$NON-NLS-1$ //$NON-NLS-2$ } catch (CoreException e) { handleException(e); @@ -2638,7 +2679,7 @@ if (node.getAST().apiLevel() >= AST.JLS3) { if (isChanged(node, SuperMethodInvocation.TYPE_ARGUMENTS_PROPERTY)) { try { - pos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameDOT, pos); + pos= getScanner().getTokenEndOffset(TerminalTokens.TokenNameDOT, pos); rewriteOptionalTypeParameters(node, SuperMethodInvocation.TYPE_ARGUMENTS_PROPERTY, pos, "", false, false); //$NON-NLS-1$ } catch (CoreException e) { handleException(e); @@ -2651,7 +2692,7 @@ if (isChanged(node, SuperMethodInvocation.ARGUMENTS_PROPERTY)) { // eval position after opening parent try { - pos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameLPAREN, pos); + pos= getScanner().getTokenEndOffset(TerminalTokens.TokenNameLPAREN, pos); rewriteNodeList(node, SuperMethodInvocation.ARGUMENTS_PROPERTY, pos, "", ", "); //$NON-NLS-1$ //$NON-NLS-2$ } catch (CoreException e) { handleException(e); @@ -2756,7 +2797,7 @@ ChildListPropertyDescriptor property= SwitchStatement.STATEMENTS_PROPERTY; if (getChangeKind(node, property) != RewriteEvent.UNCHANGED) { try { - pos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameLBRACE, pos); + 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++; @@ -2806,7 +2847,7 @@ */ public boolean visit(ThrowStatement node) { try { - this.beforeRequiredSpaceIndex = getScanner().getTokenEndOffset(ITerminalSymbols.TokenNamethrow, node.getStartPosition()); + this.beforeRequiredSpaceIndex = getScanner().getTokenEndOffset(TerminalTokens.TokenNamethrow, node.getStartPosition()); if (!hasChildrenChanges(node)) { return doVisitUnchangedChildren(node); @@ -2907,7 +2948,7 @@ int kind= getChangeKind(node, VariableDeclarationFragment.INITIALIZER_PROPERTY); if (kind == RewriteEvent.REMOVED) { try { - pos= getScanner().getPreviousTokenEndOffset(ITerminalSymbols.TokenNameEQUAL, pos); + pos= getScanner().getPreviousTokenEndOffset(TerminalTokens.TokenNameEQUAL, pos); } catch (CoreException e) { handleException(e); } @@ -2952,7 +2993,7 @@ try { if (isChanged(node, WhileStatement.BODY_PROPERTY)) { - int startOffset= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameRPAREN, pos); + int startOffset= getScanner().getTokenEndOffset(TerminalTokens.TokenNameRPAREN, pos); rewriteBodyNode(node, WhileStatement.BODY_PROPERTY, startOffset, -1, getIndent(node.getStartPosition()), this.formatter.WHILE_BLOCK); // body } else { voidVisit(node, WhileStatement.BODY_PROPERTY); @@ -2990,7 +3031,7 @@ if (isChanged(node, MethodRef.PARAMETERS_PROPERTY)) { // eval position after opening parent try { - int startOffset= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameLPAREN, pos); + int startOffset= getScanner().getTokenEndOffset(TerminalTokens.TokenNameLPAREN, pos); rewriteNodeList(node, MethodRef.PARAMETERS_PROPERTY, startOffset, "", ", "); //$NON-NLS-1$ //$NON-NLS-2$ } catch (CoreException e) { handleException(e); @@ -3123,7 +3164,7 @@ try { int changeKind= getChangeKind(node, AnnotationTypeMemberDeclaration.DEFAULT_PROPERTY); if (changeKind == RewriteEvent.INSERTED || changeKind == RewriteEvent.REMOVED) { - pos= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameRPAREN, pos); + pos= getScanner().getTokenEndOffset(TerminalTokens.TokenNameRPAREN, pos); } rewriteNode(node, AnnotationTypeMemberDeclaration.DEFAULT_PROPERTY, pos, this.formatter.ANNOT_MEMBER_DEFAULT); } catch (CoreException e) { @@ -3146,7 +3187,7 @@ if (bodyEvent != null && bodyEvent.getChangeKind() == RewriteEvent.REPLACED) { int startOffset; try { - startOffset= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameRPAREN, pos); + startOffset= getScanner().getTokenEndOffset(TerminalTokens.TokenNameRPAREN, pos); rewriteBodyNode(node, EnhancedForStatement.BODY_PROPERTY, startOffset, -1, getIndent(node.getStartPosition()), this.formatter.FOR_BLOCK); // body } catch (CoreException e) { handleException(e); @@ -3172,7 +3213,7 @@ RewriteEvent[] children= argsEvent.getChildren(); try { int nextTok= getScanner().readNext(pos, true); - boolean hasParents= (nextTok == ITerminalSymbols.TokenNameLPAREN); + boolean hasParents= (nextTok == TerminalTokens.TokenNameLPAREN); boolean isAllRemoved= hasParents && isAllOfKind(children, RewriteEvent.REMOVED); String prefix= ""; //$NON-NLS-1$ if (!hasParents) { @@ -3201,7 +3242,7 @@ if (kind == RewriteEvent.REMOVED) { try { // 'pos' can be before brace - pos= getScanner().getPreviousTokenEndOffset(ITerminalSymbols.TokenNameLBRACE, pos); + pos= getScanner().getPreviousTokenEndOffset(TerminalTokens.TokenNameLBRACE, pos); } catch (CoreException e) { handleException(e); } @@ -3250,7 +3291,7 @@ indent= getIndent(node.getStartPosition()) + 1; } int token= getScanner().readNext(pos, true); - boolean hasSemicolon= token == ITerminalSymbols.TokenNameSEMICOLON; + boolean hasSemicolon= token == TerminalTokens.TokenNameSEMICOLON; if (!hasSemicolon && isAllOfKind(children, RewriteEvent.INSERTED)) { if (!hasConstants) { String str= this.formatter.FIRST_ENUM_CONST.getPrefix(indent - 1); @@ -3316,7 +3357,7 @@ if (isChanged(node, NormalAnnotation.VALUES_PROPERTY)) { // eval position after opening parent try { - int startOffset= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameLPAREN, pos); + int startOffset= getScanner().getTokenEndOffset(TerminalTokens.TokenNameLPAREN, pos); rewriteNodeList(node, NormalAnnotation.VALUES_PROPERTY, startOffset, "", ", "); //$NON-NLS-1$ //$NON-NLS-2$ } catch (CoreException e) { handleException(e); @@ -3337,7 +3378,7 @@ if (isChanged(node, ParameterizedType.TYPE_ARGUMENTS_PROPERTY)) { // eval position after opening parent try { - int startOffset= getScanner().getTokenEndOffset(ITerminalSymbols.TokenNameLESS, pos); + int startOffset= getScanner().getTokenEndOffset(TerminalTokens.TokenNameLESS, pos); rewriteNodeList(node, ParameterizedType.TYPE_ARGUMENTS_PROPERTY, startOffset, "", ", "); //$NON-NLS-1$ //$NON-NLS-2$ } catch (CoreException e) { handleException(e); Index: dom/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.java,v retrieving revision 1.39 diff -u -r1.39 ASTRewrite.java --- dom/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.java 11 Aug 2008 18:09:36 -0000 1.39 +++ dom/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.java 27 Apr 2009 08:25:18 -0000 @@ -26,6 +26,7 @@ import org.eclipse.jdt.core.dom.ChildListPropertyDescriptor; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.StructuralPropertyDescriptor; +import org.eclipse.jdt.internal.compiler.parser.RecoveryScannerData; import org.eclipse.jdt.internal.core.dom.rewrite.ASTRewriteAnalyzer; import org.eclipse.jdt.internal.core.dom.rewrite.LineInformation; import org.eclipse.jdt.internal.core.dom.rewrite.NodeInfoStore; @@ -197,7 +198,7 @@ ASTNode astRoot= rootNode.getRoot(); List commentNodes= astRoot instanceof CompilationUnit ? ((CompilationUnit) astRoot).getCommentList() : null; - return internalRewriteAST(content, lineInfo, lineDelim, commentNodes, options, rootNode); + return internalRewriteAST(content, lineInfo, lineDelim, commentNodes, options, rootNode, (RecoveryScannerData)((CompilationUnit) astRoot).getStatementsRecoveryData()); } /** @@ -255,17 +256,17 @@ String lineDelim= typeRoot.findRecommendedLineSeparator(); Map options= typeRoot.getJavaProject().getOptions(true); - return internalRewriteAST(content, lineInfo, lineDelim, astRoot.getCommentList(), options, rootNode); + return internalRewriteAST(content, lineInfo, lineDelim, astRoot.getCommentList(), options, rootNode, (RecoveryScannerData)astRoot.getStatementsRecoveryData()); } - private TextEdit internalRewriteAST(char[] content, LineInformation lineInfo, String lineDelim, List commentNodes, Map options, ASTNode rootNode) { + private TextEdit internalRewriteAST(char[] content, LineInformation lineInfo, String lineDelim, List commentNodes, Map options, ASTNode rootNode, RecoveryScannerData recoveryScannerData) { TextEdit result= new MultiTextEdit(); //validateASTNotModified(rootNode); TargetSourceRangeComputer sourceRangeComputer= getExtendedSourceRangeComputer(); this.eventStore.prepareMovedNodes(sourceRangeComputer); - ASTRewriteAnalyzer visitor= new ASTRewriteAnalyzer(content, lineInfo, lineDelim, result, this.eventStore, this.nodeStore, commentNodes, options, sourceRangeComputer); + ASTRewriteAnalyzer visitor= new ASTRewriteAnalyzer(content, lineInfo, lineDelim, result, this.eventStore, this.nodeStore, commentNodes, options, sourceRangeComputer, recoveryScannerData); rootNode.accept(visitor); // throws IllegalArgumentException this.eventStore.revertMovedNodes(); #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTest.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTest.java,v retrieving revision 1.23 diff -u -r1.23 ASTRewritingTest.java --- src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTest.java 4 Feb 2009 13:55:18 -0000 1.23 +++ src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTest.java 27 Apr 2009 08:25:21 -0000 @@ -49,6 +49,7 @@ suite.addTest(SourceModifierTest.allTests()); suite.addTest(ImportRewriteTest.allTests()); suite.addTest(LineCommentOffsetsTest.allTests()); + suite.addTest(ASTRewritingWithStatementsRecoveryTest.allTests()); return suite; } @@ -97,9 +98,14 @@ } protected CompilationUnit createAST3(ICompilationUnit cu) { + return createAST3(cu, false); + } + + protected CompilationUnit createAST3(ICompilationUnit cu, boolean statementsRecovery) { ASTParser parser= ASTParser.newParser(AST.JLS3); parser.setSource(cu); parser.setResolveBindings(false); + parser.setStatementsRecovery(statementsRecovery); return (CompilationUnit) parser.createAST(null); } Index: src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingWithStatementsRecoveryTest.java =================================================================== RCS file: src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingWithStatementsRecoveryTest.java diff -N src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingWithStatementsRecoveryTest.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingWithStatementsRecoveryTest.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,175 @@ +/******************************************************************************* + * Copyright (c) 2009 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.core.tests.rewrite.describing; +import java.util.List; + +import junit.framework.Test; +import junit.framework.TestSuite; + +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IPackageFragment; + +import org.eclipse.jdt.core.dom.*; +import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; +import org.eclipse.jdt.core.dom.rewrite.ListRewrite; + +public class ASTRewritingWithStatementsRecoveryTest extends ASTRewritingTest { + private static final Class THIS= ASTRewritingWithStatementsRecoveryTest.class; + + public ASTRewritingWithStatementsRecoveryTest(String name) { + super(name); + } + + public static Test allTests() { + return new Suite(THIS); + } + + public static Test setUpTest(Test someTest) { + TestSuite suite= new Suite("one test"); + suite.addTest(someTest); + return suite; + } + + public static Test suite() { + return allTests(); + } + + //https://bugs.eclipse.org/bugs/show_bug.cgi?id=272711 + public void testBug272711_01() throws Exception { + IPackageFragment pack1= this.sourceFolder.createPackageFragment("test1", false, null); + StringBuffer buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("public class E {\n"); + buf.append(" public void foo() {\n"); + buf.append(" this.foo#3);\n"); + buf.append(" }\n"); + buf.append("}\n"); + ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null); + + CompilationUnit astRoot= createAST3(cu, true); + AST ast= astRoot.getAST(); + ASTRewrite rewrite= ASTRewrite.create(ast); + + assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0); + TypeDeclaration type= findTypeDeclaration(astRoot, "E"); + MethodDeclaration methodDecl= findMethodDeclaration(type, "foo"); + Block block= methodDecl.getBody(); + List statements= block.statements(); + assertTrue("Number of statements not 1", statements.size() == 1); + { // add type arguments + ExpressionStatement stmt= (ExpressionStatement) statements.get(0); + MethodInvocation invocation= (MethodInvocation) stmt.getExpression(); + ASTNode firstArgument = (ASTNode) invocation.arguments().get(0); + NumberLiteral newNumberLiteral = ast.newNumberLiteral("0"); + ListRewrite listRewriter= rewrite.getListRewrite(invocation, MethodInvocation.ARGUMENTS_PROPERTY); + listRewriter.replace(firstArgument, newNumberLiteral, null); + } + String preview= evaluateRewrite(cu, rewrite); + + buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("public class E {\n"); + buf.append(" public void foo() {\n"); + buf.append(" this.foo#0);\n"); + buf.append(" }\n"); + buf.append("}\n"); + assertEqualString(preview, buf.toString()); + + } + + //https://bugs.eclipse.org/bugs/show_bug.cgi?id=272711 + public void testBug272711_02() throws Exception { + IPackageFragment pack1= this.sourceFolder.createPackageFragment("test1", false, null); + StringBuffer buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("public class E {\n"); + buf.append(" public void foo() {\n"); + buf.append(" throws new UnsupportedOperationException();\n"); + buf.append(" }\n"); + buf.append("}\n"); + ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null); + + CompilationUnit astRoot= createAST3(cu, true); + AST ast= astRoot.getAST(); + ASTRewrite rewrite= ASTRewrite.create(ast); + + assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0); + TypeDeclaration type= findTypeDeclaration(astRoot, "E"); + List bodyDeclarations = type.bodyDeclarations(); + assertTrue("Number of body declarations not 1", bodyDeclarations.size() == 1); + { // add field declaration + MethodDeclaration methodDeclaration = (MethodDeclaration)bodyDeclarations.get(0); + VariableDeclarationFragment newFragment = ast.newVariableDeclarationFragment(); + newFragment.setName(ast.newSimpleName("field")); + FieldDeclaration newFieldDeclaration = ast.newFieldDeclaration(newFragment); + newFieldDeclaration.setType(ast.newSimpleType(ast.newName("Object"))); + ListRewrite listRewriter= rewrite.getListRewrite(type, TypeDeclaration.BODY_DECLARATIONS_PROPERTY); + listRewriter.insertBefore(newFieldDeclaration, methodDeclaration, null); + } + String preview= evaluateRewrite(cu, rewrite); + + buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("public class E {\n"); + buf.append(" Object field;\n"); + buf.append("\n"); + buf.append(" public void foo() {\n"); + buf.append(" throws new UnsupportedOperationException();\n"); + buf.append(" }\n"); + buf.append("}\n"); + assertEqualString(preview, buf.toString()); + + } + + //https://bugs.eclipse.org/bugs/show_bug.cgi?id=272711 + public void testBug272711_03() throws Exception { + IPackageFragment pack1= this.sourceFolder.createPackageFragment("test1", false, null); + StringBuffer buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("public class E {\n"); + buf.append(" public void foo() {\n"); + buf.append(" do {\n"); + buf.append(" } (a);\n"); + buf.append(" }\n"); + buf.append("}\n"); + ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null); + + CompilationUnit astRoot= createAST3(cu, true); + AST ast= astRoot.getAST(); + ASTRewrite rewrite= ASTRewrite.create(ast); + + assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0); + TypeDeclaration type= findTypeDeclaration(astRoot, "E"); + MethodDeclaration methodDecl= findMethodDeclaration(type, "foo"); + Block block= methodDecl.getBody(); + List statements= block.statements(); + assertTrue("Number of statements not 1", statements.size() == 1); + { // replace the 'a' simple name with another simple name + DoStatement stmt= (DoStatement) statements.get(0); + Statement body = stmt.getBody(); + EmptyStatement newEmptyStatement = ast.newEmptyStatement(); + rewrite.replace(body, newEmptyStatement, null); + } + String preview= evaluateRewrite(cu, rewrite); + + buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("public class E {\n"); + buf.append(" public void foo() {\n"); + buf.append(" do\n"); + buf.append(" ; (a);\n"); + buf.append(" }\n"); + buf.append("}\n"); + assertEqualString(preview, buf.toString()); + + } + +}