diff options
author | Marco Stornelli | 2019-02-24 09:04:03 +0000 |
---|---|---|
committer | William Riley | 2019-03-04 10:41:56 +0000 |
commit | 04cc77cf2a7439451f6bb6660f4ca3369e7bee13 (patch) | |
tree | 93eeff84dfd5669b49494d657068a75655213462 /core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal | |
parent | 2d29c1683ec9c1f7e79e6b9b3ea92e6ccbcc7f2d (diff) | |
download | org.eclipse.cdt-04cc77cf2a7439451f6bb6660f4ca3369e7bee13.tar.gz org.eclipse.cdt-04cc77cf2a7439451f6bb6660f4ca3369e7bee13.tar.xz org.eclipse.cdt-04cc77cf2a7439451f6bb6660f4ca3369e7bee13.zip |
Bug 278903 - Do not format any code in inactive regions
Not active regions of code may not be formatted.
Change-Id: I3796bd84bf4101cec55ef9f35f9703e8bc46092e
Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com>
Diffstat (limited to 'core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal')
-rw-r--r-- | core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java | 7 | ||||
-rw-r--r-- | core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java | 56 |
2 files changed, 29 insertions, 34 deletions
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java index e0f9ae3b494..55a12ef1096 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java @@ -439,8 +439,9 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, localScanner.setSource(compilationUnitSource); scribe.initializeScanner(compilationUnitSource); - scribe.setSkipInactivePositions(collectInactiveCodePositions(unit)); - scribe.setSkipForbiddenPositions(collectNoFormatCodePositions(unit)); + List<Position> inactive = collectInactiveCodePositions(unit); + inactive.addAll(collectNoFormatCodePositions(unit)); + scribe.setSkipInactivePositions(inactive); fStatus = new MultiStatus(CCorePlugin.PLUGIN_ID, 0, "Formatting problem(s) in '" + unit.getFilePath() + "'", //$NON-NLS-1$//$NON-NLS-2$ null); @@ -4513,7 +4514,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, int onPos = comment.lastIndexOf(this.preferences.comment_formatter_on_tag); if (offPos != -1 && offPos > onPos) { if (!inInactiveCode) { - inactiveCodeStart = nodeLocation.getNodeOffset(); + inactiveCodeStart = nodeLocation.getNodeOffset() + nodeLocation.getNodeLength(); inInactiveCode = true; } } else if (onPos != -1 && onPos > offPos) { diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java index 4bdc4a57ebb..62b8da53543 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java @@ -93,10 +93,9 @@ public class Scribe { */ private List<Position> fSkipInactivePositions = Collections.emptyList(); /** - * It keeps the list of no-format region. + * When scribe is in inactive state, source edits are not allowed. */ - private List<Position> fSkipForbiddenPositions = Collections.emptyList(); - + private boolean inactiveState = false; private boolean skipOverInactive; private int fSkipStartOffset = Integer.MAX_VALUE; @@ -144,11 +143,13 @@ public class Scribe { } private final void addDeleteEdit(int start, int end) { - addOptimizedReplaceEdit(start, end - start + 1, EMPTY_STRING); + if (!inactiveState) + addOptimizedReplaceEdit(start, end - start + 1, EMPTY_STRING); } public final void addInsertEdit(int insertPosition, CharSequence insertedString) { - addOptimizedReplaceEdit(insertPosition, 0, insertedString); + if (!inactiveState) + addOptimizedReplaceEdit(insertPosition, 0, insertedString); } /** @@ -158,7 +159,8 @@ public class Scribe { * @param replacement the replacement string */ public final void addReplaceEdit(int start, int end, CharSequence replacement) { - addOptimizedReplaceEdit(start, end - start + 1, replacement); + if (!inactiveState) + addOptimizedReplaceEdit(start, end - start + 1, replacement); } private final void addOptimizedReplaceEdit(int offset, int length, CharSequence replacement) { @@ -675,15 +677,6 @@ public class Scribe { } /** - * Set the positions where we don't want to perform any check - * @param list The list of positions - */ - public void setSkipForbiddenPositions(List<Position> list) { - if (list != null) - fSkipForbiddenPositions = list; - } - - /** * @param list */ public void setSkipInactivePositions(List<Position> list) { @@ -770,6 +763,10 @@ public class Scribe { } public void printRaw(int startOffset, int length) { + printRaw(startOffset, length, true); + } + + private void printRaw(int startOffset, int length, boolean skipInactive) { if (length <= 0) { return; } @@ -788,7 +785,8 @@ public class Scribe { boolean savedSkipOverInactive = skipOverInactive; int savedScannerEndPos = scannerEndPosition; preserveNewLines = true; - skipOverInactive = false; + if (skipInactive) + skipOverInactive = false; scannerEndPosition = startOffset + length; try { scanner.resetTo(Math.max(startOffset, currentPosition), startOffset + length); @@ -1061,7 +1059,7 @@ public class Scribe { public void printEndOfTranslationUnit() { int currentTokenStartPosition = scanner.getCurrentPosition(); if (currentTokenStartPosition <= scannerEndPosition) { - printRaw(currentTokenStartPosition, scannerEndPosition - currentTokenStartPosition + 1); + printRaw(currentTokenStartPosition, scannerEndPosition - currentTokenStartPosition + 1, false); } } @@ -1095,7 +1093,16 @@ public class Scribe { if (startOffset < endOffset) { int savedIndentLevel = indentationLevel; scanner.resetTo(scanner.getCurrentTokenStartPosition(), scanner.eofPosition); + inactiveState = true; + /** + * We are entering in inactive state so if we added a new line previously, + * starting a new line, we need to remove it. + */ + if (editsIndex > 0 && lineSeparator.equals(edits[editsIndex - 1].replacement)) { + editsIndex--; + } printRaw(startOffset, endOffset - startOffset); + inactiveState = false; while (indentationLevel > savedIndentLevel) { unIndent(); } @@ -1297,20 +1304,7 @@ public class Scribe { } scanner.resetTo(currentTokenStartPosition, scannerEndPosition); return hasWhitespace; - } - /** - * @param offset - * @return - */ - private boolean isForbidden(int offset) { - for (Iterator<Position> iter = fSkipForbiddenPositions.iterator(); iter.hasNext();) { - Position pos = iter.next(); - if (pos.includes(offset)) { - return true; - } - } - return false; } /** @@ -2067,7 +2061,7 @@ public class Scribe { } boolean shouldSkip(int offset) { - return ((offset >= fSkipStartOffset && offset < fSkipEndOffset) || isForbidden(offset)); + return offset >= fSkipStartOffset && offset < fSkipEndOffset; } void skipRange(int offset, int endOffset) { |