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:
parent
c5bdc34618
commit
a3dd649914
3 changed files with 55 additions and 32 deletions
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue