1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Fixed two code formatter bugs.

This commit is contained in:
Sergey Prigogin 2011-11-07 10:55:36 -08:00
parent c5bdc34618
commit a3dd649914
3 changed files with 55 additions and 32 deletions

View file

@ -790,17 +790,18 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
} }
} }
IASTName name= node.getName(); IASTName name= node.getName();
if (name != null && name.getSimpleID().length != 0) { IASTDeclarator nestedDecl= node.getNestedDeclarator();
if (name != null && name.getSimpleID().length != 0 || nestedDecl != null) {
if (node.getPropertyInParent() != IASTDeclarator.NESTED_DECLARATOR && if (node.getPropertyInParent() != IASTDeclarator.NESTED_DECLARATOR &&
isFirstDeclarator(node)) { isFirstDeclarator(node)) {
// Preserve non-space between pointer operator and name // Preserve non-space between pointer operator and name or nested declarator.
if (pointerOperators.length == 0 || scribe.printComment()) { if (pointerOperators.length == 0 || scribe.printComment()) {
scribe.space(); scribe.space();
} }
} }
name.accept(this); if (name != null)
name.accept(this);
} }
IASTDeclarator nestedDecl= node.getNestedDeclarator();
if (nestedDecl != null) { if (nestedDecl != null) {
scribe.printNextToken(Token.tLPAREN, false); scribe.printNextToken(Token.tLPAREN, false);
nestedDecl.accept(this); nestedDecl.accept(this);

View file

@ -132,22 +132,29 @@ public class Scribe {
} }
private final void addDeleteEdit(int start, int end) { private final void addDeleteEdit(int start, int end) {
if (edits.length == editsIndex) {
resize();
}
addOptimizedReplaceEdit(start, end - start + 1, EMPTY_STRING); addOptimizedReplaceEdit(start, end - start + 1, EMPTY_STRING);
} }
public final void addInsertEdit(int insertPosition, CharSequence insertedString) { public final void addInsertEdit(int insertPosition, CharSequence insertedString) {
if (edits.length == editsIndex) {
resize();
}
addOptimizedReplaceEdit(insertPosition, 0, insertedString); addOptimizedReplaceEdit(insertPosition, 0, insertedString);
} }
/**
* Adds a replace edit.
* @param start start offset (inclusive)
* @param end end offset (inclusive)
* @param replacement the replacement string
*/
public final void addReplaceEdit(int start, int end, CharSequence replacement) {
addOptimizedReplaceEdit(start, end - start + 1, replacement);
}
private final void addOptimizedReplaceEdit(int offset, int length, CharSequence replacement) { private final void addOptimizedReplaceEdit(int offset, int length, CharSequence replacement) {
if (edits.length == editsIndex) {
resize();
}
if (editsIndex > 0) { if (editsIndex > 0) {
// try to merge last two edits // Try to merge last two edits
final OptimizedReplaceEdit previous= edits[editsIndex - 1]; final OptimizedReplaceEdit previous= edits[editsIndex - 1];
final int previousOffset= previous.offset; final int previousOffset= previous.offset;
final int previousLength= previous.length; final int previousLength= previous.length;
@ -170,7 +177,8 @@ public class Scribe {
if (endOffsetOfPreviousEdit == offset) { if (endOffsetOfPreviousEdit == offset) {
if (length != 0) { if (length != 0) {
if (replacementLength != 0) { if (replacementLength != 0) {
edits[editsIndex - 1]= new OptimizedReplaceEdit(previousOffset, previousLength + length, editsIndex--;
appendOptimizedReplaceEdit(previousOffset, previousLength + length,
previousReplacement + replacement); previousReplacement + replacement);
} else if (previousLength + length == previousReplacementLength) { } else if (previousLength + length == previousReplacementLength) {
// Check the characters. If they are identical, // Check the characters. If they are identical,
@ -178,8 +186,9 @@ public class Scribe {
boolean canBeRemoved= true; boolean canBeRemoved= true;
loop: for (int i= previousOffset; i < previousOffset + previousReplacementLength; i++) { loop: for (int i= previousOffset; i < previousOffset + previousReplacementLength; i++) {
if (scanner.source[i] != previousReplacement.charAt(i - previousOffset)) { if (scanner.source[i] != previousReplacement.charAt(i - previousOffset)) {
edits[editsIndex - 1]= new OptimizedReplaceEdit(previousOffset, editsIndex--;
previousReplacementLength, previousReplacement); appendOptimizedReplaceEdit(previousOffset, previousReplacementLength,
previousReplacement);
canBeRemoved= false; canBeRemoved= false;
break loop; break loop;
} }
@ -195,35 +204,45 @@ public class Scribe {
editsIndex--; editsIndex--;
} }
} else { } else {
edits[editsIndex - 1]= new OptimizedReplaceEdit(previousOffset, previousLength + length, editsIndex--;
appendOptimizedReplaceEdit(previousOffset, previousLength + length,
previousReplacement); previousReplacement);
} }
} else { } else {
if (replacementLength != 0) { if (replacementLength != 0) {
edits[editsIndex - 1]= new OptimizedReplaceEdit(previousOffset, previousLength, editsIndex--;
appendOptimizedReplaceEdit(previousOffset, previousLength,
previousReplacement + replacement); previousReplacement + replacement);
} }
} }
} else { } else {
assert endOffsetOfPreviousEdit < offset; assert endOffsetOfPreviousEdit < offset;
edits[editsIndex++]= new OptimizedReplaceEdit(offset, length, replacement); appendOptimizedReplaceEdit(offset, length, replacement);
} }
} else { } else {
edits[editsIndex++]= new OptimizedReplaceEdit(offset, length, replacement); appendOptimizedReplaceEdit(offset, length, replacement);
} }
} }
/** /**
* Add a replace edit. * Trims redundant prefix from a replacement edit and, if there is anything left, appends
* @param start start offset (inclusive) * the replacement edit to the edits array.
* @param end end offset (inclusive)
* @param replacement the replacement string
*/ */
public final void addReplaceEdit(int start, int end, String replacement) { private void appendOptimizedReplaceEdit(int offset, int length, CharSequence replacement) {
if (edits.length == editsIndex) { int replacementLength = replacement.length();
resize(); int i;
for (i = 0; i < length && i < replacementLength; i++, offset++) {
if (scanner.source[offset] != replacement.charAt(i))
break;
}
length -= i;
if (i > 0) {
replacement = i == replacementLength ?
EMPTY_STRING : replacement.subSequence(i, replacementLength);
}
if (length > 0 || replacement.length() > 0) {
edits[editsIndex++]= new OptimizedReplaceEdit(offset, length, replacement);
} }
addOptimizedReplaceEdit(start, end - start + 1, replacement);
} }
public void alignFragment(Alignment alignment, int fragmentIndex) { public void alignFragment(Alignment alignment, int fragmentIndex) {
@ -562,7 +581,7 @@ public class Scribe {
edit= new MultiTextEdit(0, textRegionEnd + 1); edit= new MultiTextEdit(0, textRegionEnd + 1);
} }
} else { } else {
edit= new MultiTextEdit(textRegionStart, textRegionEnd - textRegionStart + 1); edit= new MultiTextEdit(textRegionStart, length);
} }
for (int i= 0, max= editsIndex; i < max; i++) { for (int i= 0, max= editsIndex; i < max; i++) {
OptimizedReplaceEdit currentEdit= edits[i]; OptimizedReplaceEdit currentEdit= edits[i];
@ -1452,17 +1471,18 @@ public class Scribe {
private void printEmptyLines(int linesNumber, int insertPosition) { private void printEmptyLines(int linesNumber, int insertPosition) {
final String buffer= getEmptyLines(linesNumber); final String buffer= getEmptyLines(linesNumber);
if (EMPTY_STRING == buffer) if (!buffer.isEmpty()) {
return; addInsertEdit(insertPosition, buffer);
}
addInsertEdit(insertPosition, buffer);
} }
void printIndentationIfNecessary() { void printIndentationIfNecessary() {
if (column > indentationLevel)
return;
StringBuilder buffer= new StringBuilder(); StringBuilder buffer= new StringBuilder();
printIndentationIfNecessary(buffer); printIndentationIfNecessary(buffer);
if (buffer.length() > 0) { if (buffer.length() > 0) {
addInsertEdit(scanner.getCurrentTokenStartPosition(), buffer.toString()); addInsertEdit(scanner.getCurrentTokenStartPosition(), buffer);
pendingSpace= false; pendingSpace= false;
} }
} }

View file

@ -535,11 +535,13 @@ public class CodeFormatterTest extends BaseUITestCase {
//static void *f(){} //static void *f(){}
//static void * g(); //static void * g();
//static void* h(); //static void* h();
//int* (*a) [2];
//static void *f() { //static void *f() {
//} //}
//static void * g(); //static void * g();
//static void* h(); //static void* h();
//int* (*a)[2];
public void testSpaceBetweenDeclSpecAndDeclarator() throws Exception { public void testSpaceBetweenDeclSpecAndDeclarator() throws Exception {
assertFormatterResult(); assertFormatterResult();
} }