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

More code formatter heuristics and stay Eclipse 3.2 compatible.

This commit is contained in:
Anton Leherbauer 2006-11-10 23:05:48 +00:00
parent b3495a8044
commit 67654f8f4f
3 changed files with 62 additions and 35 deletions

View file

@ -211,7 +211,15 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
private final TextEdit failedToFormat(AbortFormatting e) { private final TextEdit failedToFormat(AbortFormatting e) {
if (DEBUG) { if (DEBUG) {
CCorePlugin.log("Could not format: " + e.getMessage()); String errorMessage= e.getMessage();
if (errorMessage == null) {
if (e.nestedException != null) {
errorMessage= e.nestedException.getClass().getName();
} else {
errorMessage= "Unknown error";
}
}
CCorePlugin.log(CCorePlugin.createStatus("Could not format: " + errorMessage, e.nestedException));
System.out.println("COULD NOT FORMAT: " + e.getMessage()); System.out.println("COULD NOT FORMAT: " + e.getMessage());
System.out.println(scribe.scanner); //$NON-NLS-1$ System.out.println(scribe.scanner); //$NON-NLS-1$
System.out.println(scribe); System.out.println(scribe);
@ -930,6 +938,15 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
int i; int i;
for (i = 0; i < elementsLength; i++) { for (i = 0; i < elementsLength; i++) {
if (i > 0) { if (i > 0) {
// handle missing parameter
int token= peekNextToken();
if (token == Token.tIDENTIFIER) {
if (!scribe.skipToToken(Token.tCOMMA)) {
break;
}
} else if (token == Token.tRPAREN) {
break;
}
scribe.printNextToken(Token.tCOMMA, align.fSpaceBeforeComma); scribe.printNextToken(Token.tCOMMA, align.fSpaceBeforeComma);
scribe.printTrailingComment(); scribe.printTrailingComment();
} }
@ -956,12 +973,13 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
} }
} while (!ok); } while (!ok);
scribe.exitAlignment(listAlignment, true); scribe.exitAlignment(listAlignment, true);
}
if (encloseInParen) if (encloseInParen) {
scribe.printNextToken(Token.tRPAREN, align.fSpaceBeforeClosingParen); // handle missing parameter
} else { if (peekNextToken() == Token.tIDENTIFIER) {
if (encloseInParen) scribe.skipToToken(Token.tRPAREN);
scribe.printNextToken(Token.tRPAREN, align.fSpaceBeforeClosingParen); }
scribe.printNextToken(Token.tRPAREN, align.fSpaceBeforeClosingParen);
} }
} }
@ -1529,6 +1547,13 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
} }
private void formatBlock(IASTCompoundStatement block, String block_brace_position, boolean insertSpaceBeforeOpeningBrace, boolean indentStatements) { private void formatBlock(IASTCompoundStatement block, String block_brace_position, boolean insertSpaceBeforeOpeningBrace, boolean indentStatements) {
IASTNodeLocation[] locations= block.getNodeLocations();
if (locations.length == 0) {
return;
} else if (locations[0] instanceof IASTMacroExpansion) {
formatNode(block);
return;
}
formatOpeningBrace(block_brace_position, insertSpaceBeforeOpeningBrace); formatOpeningBrace(block_brace_position, insertSpaceBeforeOpeningBrace);
IASTStatement[] statements = block.getStatements(); IASTStatement[] statements = block.getStatements();
final int statementsLength = statements.length; final int statementsLength = statements.length;
@ -1648,7 +1673,7 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
} }
protected int peekNextToken() { protected int peekNextToken() {
localScanner.resetTo(scribe.scanner.startPosition, scribe.scannerEndPosition - 1); localScanner.resetTo(scribe.scanner.getCurrentPosition(), scribe.scannerEndPosition - 1);
return localScanner.getNextToken(); return localScanner.getNextToken();
} }
@ -1674,6 +1699,16 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
} }
private boolean isGuardClause(IASTCompoundStatement block, List statements) { private boolean isGuardClause(IASTCompoundStatement block, List statements) {
IASTNodeLocation[] locations= block.getNodeLocations();
if (locations.length == 0) {
return false;
} else if (locations[0] instanceof IASTMacroExpansion) {
return false;
}
IASTNodeLocation fileLocation= block.getFileLocation();
if (fileLocation == null) {
return false;
}
int blockStartPosition= block.getFileLocation().getNodeOffset(); int blockStartPosition= block.getFileLocation().getNodeOffset();
int blockLength= block.getFileLocation().getNodeLength(); int blockLength= block.getFileLocation().getNodeLength();
if (commentStartsBlock(blockStartPosition, blockLength)) return false; if (commentStartsBlock(blockStartPosition, blockLength)) return false;

View file

@ -629,9 +629,6 @@ public class Scribe {
indent(); indent();
} }
formatOpeningBrace(formatter.preferences.brace_position_for_block, hasWhitespace); formatOpeningBrace(formatter.preferences.brace_position_for_block, hasWhitespace);
// print(currentToken.getLength(), hasWhitespace);
// printNewLine();
// indent();
break; break;
case Token.tRBRACE: case Token.tRBRACE:
scanner.resetTo(scanner.getCurrentTokenStartPosition(), scannerEndPosition-1); scanner.resetTo(scanner.getCurrentTokenStartPosition(), scannerEndPosition-1);
@ -639,9 +636,6 @@ public class Scribe {
unIndent(); unIndent();
} }
formatClosingBrace(formatter.preferences.brace_position_for_block); formatClosingBrace(formatter.preferences.brace_position_for_block);
// printNewLine(scanner.getCurrentTokenStartPosition());
// unIndent();
// print(currentToken.getLength(), hasWhitespace);
break; break;
case Token.tLPAREN: case Token.tLPAREN:
print(currentToken.getLength(), hasWhitespace); print(currentToken.getLength(), hasWhitespace);
@ -1606,14 +1600,14 @@ public class Scribe {
} }
/** /**
* Skip to the next occurrence one of the given token types. * Skip to the next occurrence of the given token type.
* If successful, the next token will be one of the epxected tokens, * If successful, the next token will be the epxected token,
* otherwise the scanner position is left unchanged. * otherwise the scanner position is left unchanged.
* *
* @param expectedTokenTypes * @param expectedTokenType
* @return <code>true</code> if a matching token was skipped to * @return <code>true</code> if a matching token was skipped to
*/ */
public boolean skipToToken(int[] expectedTokenTypes) { public boolean skipToToken(int expectedTokenType) {
int skipStart= scanner.getCurrentPosition(); int skipStart= scanner.getCurrentPosition();
int braceLevel= 0; int braceLevel= 0;
int parenLevel= 0; int parenLevel= 0;
@ -1639,22 +1633,20 @@ public class Scribe {
case Token.tPREPROCESSOR_INCLUDE: case Token.tPREPROCESSOR_INCLUDE:
continue; continue;
} }
if (braceLevel <= 0 && parenLevel == 0) { if (braceLevel <= 0 && parenLevel <= 0) {
for (int i= 0; i < expectedTokenTypes.length; i++) { if (currentToken.type == expectedTokenType) {
if (currentToken.type == expectedTokenTypes[i]) { int tokenStart= scanner.getCurrentTokenStartPosition();
printRaw(skipStart, scanner.getCurrentTokenEndPosition() - skipStart + 1); printRaw(skipStart, tokenStart - skipStart);
scanner.resetTo(scanner.getCurrentTokenEndPosition() + 1, scannerEndPosition - 1); scanner.resetTo(tokenStart, scannerEndPosition - 1);
return true; return true;
}
} }
} }
if (braceLevel < 0 || parenLevel < 0) {
break;
}
} }
scanner.resetTo(skipStart, scannerEndPosition - 1); scanner.resetTo(skipStart, scannerEndPosition - 1);
return false; return false;
} }
public boolean skipToToken(int expectedTokenType) {
return skipToToken(new int[] { expectedTokenType });
}
} }

View file

@ -334,7 +334,7 @@ public abstract class ModifyDialog extends StatusDialog {
private void doValidate() { private void doValidate() {
if (!hasChanges()) { if (!hasChanges()) {
updateStatus(new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, "")); //$NON-NLS-1$ updateStatus(new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, 0, "", null)); //$NON-NLS-1$
return; return;
} }
@ -346,12 +346,12 @@ public abstract class ModifyDialog extends StatusDialog {
String name= fProfileNameField.getText().trim(); String name= fProfileNameField.getText().trim();
if (!name.equals(fProfile.getName()) && fProfileManager.containsName(name)) { if (!name.equals(fProfile.getName()) && fProfileManager.containsName(name)) {
updateStatus(new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, FormatterMessages.ModifyDialog_Duplicate_Status)); updateStatus(new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, 0, FormatterMessages.ModifyDialog_Duplicate_Status, null));
return; return;
} }
if (fProfile.isBuiltInProfile() || fProfile.isSharedProfile()) { if (fProfile.isBuiltInProfile() || fProfile.isSharedProfile()) {
updateStatus(new Status(IStatus.INFO, CUIPlugin.PLUGIN_ID, FormatterMessages.ModifyDialog_NewCreated_Status)); updateStatus(new Status(IStatus.INFO, CUIPlugin.PLUGIN_ID, 0, FormatterMessages.ModifyDialog_NewCreated_Status, null));
return; return;
} }
@ -363,18 +363,18 @@ public abstract class ModifyDialog extends StatusDialog {
if (fProfile.isBuiltInProfile()) { if (fProfile.isBuiltInProfile()) {
if (fProfile.getName().equals(name)) { if (fProfile.getName().equals(name)) {
return new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, FormatterMessages.ModifyDialog_BuiltIn_Status); return new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, 0, FormatterMessages.ModifyDialog_BuiltIn_Status, null);
} }
} }
if (fProfile.isSharedProfile()) { if (fProfile.isSharedProfile()) {
if (fProfile.getName().equals(name)) { if (fProfile.getName().equals(name)) {
return new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, FormatterMessages.ModifyDialog_Shared_Status); return new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, 0, FormatterMessages.ModifyDialog_Shared_Status, null);
} }
} }
if (name.length() == 0) { if (name.length() == 0) {
return new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, FormatterMessages.ModifyDialog_EmptyName_Status); return new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, 0, FormatterMessages.ModifyDialog_EmptyName_Status, null);
} }
return StatusInfo.OK_STATUS; return StatusInfo.OK_STATUS;