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

Improve formatter heuristic

This commit is contained in:
Anton Leherbauer 2006-12-07 21:01:46 +00:00
parent d5061c1162
commit b11cd377d4
3 changed files with 44 additions and 129 deletions

View file

@ -253,6 +253,9 @@ public class CodeFormatterVisitor extends CPPASTVisitor {
if (i < decls.length - 1) {
exitAlignments();
skipToNode(decls[i+1]);
while (scribe.indentationLevel < indentLevel) {
scribe.indent();
}
while (scribe.indentationLevel > indentLevel) {
scribe.unIndent();
}

View file

@ -615,24 +615,31 @@ public class Scribe {
preserveNewlines= true;
skipOverInactive= false;
scannerEndPosition= startOffset + length;
int parenLevel= 0;
try {
scanner.resetTo(startOffset, startOffset + length - 1);
while (true) {
boolean hasWhitespace= printComment();
if (currentToken == null) {
if (hasWhitespace) {
space();
}
break;
}
currentToken= scanner.nextToken();
if (currentToken == null) {
if (hasWhitespace) {
space();
}
break;
}
switch (currentToken.type) {
case Token.tLBRACE:
scanner.resetTo(scanner.getCurrentTokenStartPosition(), scannerEndPosition-1);
formatOpeningBrace(formatter.preferences.brace_position_for_block, hasWhitespace);
if (formatter.preferences.indent_statements_compare_to_block) {
indent();
}
formatOpeningBrace(formatter.preferences.brace_position_for_block, hasWhitespace);
break;
case Token.tRBRACE:
scanner.resetTo(scanner.getCurrentTokenStartPosition(), scannerEndPosition-1);
@ -642,22 +649,37 @@ public class Scribe {
formatClosingBrace(formatter.preferences.brace_position_for_block);
break;
case Token.tLPAREN:
++parenLevel;
print(currentToken.getLength(), hasWhitespace);
for (int i= 0; i < formatter.preferences.continuation_indentation; i++) {
indent();
if (parenLevel > 0) {
for (int i= 0; i < formatter.preferences.continuation_indentation; i++) {
indent();
}
// HACK: avoid indent in same line
column= indentationLevel + 1;
}
// HACK: avoid indent in same line
column= indentationLevel + 1;
break;
case Token.tRPAREN:
for (int i= 0; i < formatter.preferences.continuation_indentation; i++) {
unIndent();
--parenLevel;
if (parenLevel >= 0) {
for (int i= 0; i < formatter.preferences.continuation_indentation; i++) {
unIndent();
}
}
print(currentToken.getLength(), hasWhitespace);
break;
case Token.tSEMI:
print(currentToken.getLength(), formatter.preferences.insert_space_before_semicolon);
break;
case Token.t_else:
case Token.t_catch:
if (formatter.preferences.insert_new_line_before_else_in_if_statement) {
printNewLine(currentToken.offset);
} else {
hasWhitespace= true;
}
print(currentToken.getLength(), hasWhitespace);
break;
default:
if (currentToken.isVisibilityModifier()
&& !formatter.preferences.indent_access_specifier_compare_to_type_header) {
@ -838,119 +860,9 @@ public class Scribe {
}
public void printEndOfTranslationUnit() {
// if we have a space between two tokens we ensure it will be dumped in
// the formatted string
int currentTokenStartPosition= scanner.getCurrentPosition();
boolean hasComment= false;
boolean hasLineComment= false;
boolean hasWhitespace= false;
int count= 0;
while (true) {
currentToken= scanner.nextToken();
if (currentToken == null) {
if (count >= 1 || formatter.preferences.insert_new_line_at_end_of_file_if_missing) {
printNewLine(scannerEndPosition);
}
return;
}
switch (currentToken.type) {
case Token.tWHITESPACE:
char[] whiteSpaces= scanner.getCurrentTokenSource();
count= 0;
for (int i= 0, max= whiteSpaces.length; i < max; i++) {
switch (whiteSpaces[i]) {
case '\r':
if ((i + 1) < max) {
if (whiteSpaces[i + 1] == '\n') {
i++;
}
}
count++;
break;
case '\n':
count++;
}
}
if (count == 0) {
hasWhitespace= true;
addDeleteEdit(scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition());
} else if (hasComment) {
if (count == 1) {
printNewLine(scanner.getCurrentTokenStartPosition());
} else {
preserveEmptyLines(count - 1, scanner.getCurrentTokenStartPosition());
}
addDeleteEdit(scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition());
} else if (hasLineComment) {
preserveEmptyLines(count - 1, scanner.getCurrentTokenStartPosition());
addDeleteEdit(scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition());
} else {
addDeleteEdit(scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition());
}
currentTokenStartPosition= scanner.getCurrentPosition();
break;
case Token.tLINECOMMENT:
if (count >= 1) {
if (count > 1) {
preserveEmptyLines(count - 1, scanner.getCurrentTokenStartPosition());
} else if (count == 1) {
printNewLine(scanner.getCurrentTokenStartPosition());
}
} else if (hasWhitespace) {
space();
}
hasWhitespace= false;
printCommentLine();
currentTokenStartPosition= scanner.getCurrentPosition();
hasLineComment= true;
count= 0;
break;
case Token.tBLOCKCOMMENT:
if (count >= 1) {
if (count > 1) {
preserveEmptyLines(count - 1, scanner.getCurrentTokenStartPosition());
} else if (count == 1) {
printNewLine(scanner.getCurrentTokenStartPosition());
}
} else if (hasWhitespace) {
space();
}
hasWhitespace= false;
printBlockComment(false);
currentTokenStartPosition= scanner.getCurrentPosition();
hasLineComment= false;
hasComment= true;
count= 0;
break;
case Token.tPREPROCESSOR:
case Token.tPREPROCESSOR_DEFINE:
case Token.tPREPROCESSOR_INCLUDE:
if (column != 1)
printNewLine(scanner.getCurrentTokenStartPosition());
if (count >= 1) {
if (count > 1) {
preserveEmptyLines(count - 1, scanner.getCurrentTokenStartPosition());
} else if (count == 1) {
// printNewLine(scanner.getCurrentTokenStartPosition());
}
}
hasWhitespace= false;
printPreprocessorDirective();
printNewLine();
currentTokenStartPosition= scanner.getCurrentPosition();
hasLineComment= false;
hasComment= false;
count= 0;
break;
case Token.tSEMI:
print(currentToken.getLength(), formatter.preferences.insert_space_before_semicolon);
break;
default:
// step back one token
scanner.resetTo(currentTokenStartPosition, scannerEndPosition - 1);
return;
}
}
printRaw(currentTokenStartPosition, scannerEndPosition - currentTokenStartPosition + 1);
return;
}
public boolean printComment() {

View file

@ -1,7 +1,7 @@
#include <Simple.h>
const SimpleStruct simpleStruct =
{
{
1
, "mySimple"
, 0.1232
@ -16,8 +16,8 @@ const SimpleStruct simpleStruct =
}
const OtherStruct array[] =
{
{
{
#if FOO
"foo"
# else
@ -27,7 +27,7 @@ const OtherStruct array[] =
, &t_int
, 0
}
, {
, {
"name"
, SIZEOF( simpleStruct, floatnum )
, &t_float
@ -39,17 +39,17 @@ const OtherStruct array[] =
void SimpleStruct_construct(
struct SimpleStruct * const this )
{
{
// single line
this->num = 1;
this->name = "boo";
this->floatNum = 1.5;
}
int ConnectParams_doSomething(const struct SimpleStruct * const this )
{
/*
* multiline
*/
int ConnectParams_doSomething( const struct SimpleStruct * const this )
{
/*
* multiline
*/
return 1;
}
}