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

Bug 350689 - [formatter] Problems formatting Lua source code

This commit is contained in:
Anton Leherbauer 2011-08-08 16:15:39 +02:00
parent 3796041aa8
commit 24d603a178
3 changed files with 70 additions and 17 deletions

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2000, 2009 QNX Software Systems and others. * Copyright (c) 2000, 2011 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -178,6 +178,10 @@ public class CCodeFormatter extends CodeFormatter {
ParserUtil.getParserLogService()); ParserUtil.getParserLogService());
CodeFormatterVisitor codeFormatter = new CodeFormatterVisitor(preferences, offset, length); CodeFormatterVisitor codeFormatter = new CodeFormatterVisitor(preferences, offset, length);
edit= codeFormatter.format(source, ast); edit= codeFormatter.format(source, ast);
IStatus status= codeFormatter.getStatus();
if (!status.isOK()) {
CCorePlugin.log(status);
}
} catch (CoreException e) { } catch (CoreException e) {
throw new AbortFormatting(e); throw new AbortFormatting(e);
} }

View file

@ -1774,7 +1774,9 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
// Consider macro expansion // Consider macro expansion
if (withinMacroExpansion(node, scribe.scanner.getCurrentPosition())) { if (withinMacroExpansion(node, scribe.scanner.getCurrentPosition())) {
scribe.printNextToken(peekNextToken());
continueNode(node); continueNode(node);
if (scribe.printComment()) scribe.space();
} }
switch (node.getKey()) { switch (node.getKey()) {
@ -1825,7 +1827,9 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
// Consider macro expansion // Consider macro expansion
if (withinMacroExpansion(node, scribe.scanner.getCurrentPosition())) { if (withinMacroExpansion(node, scribe.scanner.getCurrentPosition())) {
scribe.printNextToken(peekNextToken());
continueNode(node); continueNode(node);
if (scribe.printComment()) scribe.space();
} }
switch (node.getKey()) { switch (node.getKey()) {
@ -2080,7 +2084,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
int i; int i;
for (i = 0; i < elementsLength; i++) { for (i = 0; i < elementsLength; i++) {
final IASTNode node= elements.get(i); final IASTNode node= elements.get(i);
if (i < alignment.fragmentCount - 1) { if (i < elementsLength - 1) {
scribe.setTailFormatter( scribe.setTailFormatter(
new TrailingTokenFormatter(options.fSeparatorToken, new TrailingTokenFormatter(options.fSeparatorToken,
options.fSpaceBeforeSeparator, options.fSpaceBeforeSeparator,
@ -2095,7 +2099,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
} else { } else {
node.accept(this); node.accept(this);
} }
if (i < alignment.fragmentCount - 1) { if (i < elementsLength - 1) {
scribe.runTailFormatter(); scribe.runTailFormatter();
} }
} }
@ -3314,7 +3318,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
} }
} }
if (elseStatement instanceof IASTCompoundStatement) { if (elseStatement instanceof IASTCompoundStatement && !enclosedInMacroExpansion(elseStatement)) {
elseStatement.accept(this); elseStatement.accept(this);
} else if (elseStatement instanceof IASTIfStatement) { } else if (elseStatement instanceof IASTIfStatement) {
if (!preferences.compact_else_if) { if (!preferences.compact_else_if) {
@ -3819,8 +3823,13 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
if (preferences.insert_space_after_opening_paren_in_parenthesized_expression ) { if (preferences.insert_space_after_opening_paren_in_parenthesized_expression ) {
scribe.space(); scribe.space();
} }
if (operand != null) { Runnable tailFormatter = scribe.takeTailFormatter();
operand.accept(this); try {
if (operand != null) {
operand.accept(this);
}
} finally {
scribe.setTailFormatter(tailFormatter);
} }
if (peekNextToken() != Token.tRPAREN) { if (peekNextToken() != Token.tRPAREN) {
if (!enclosedInMacroExpansion(operand)) { if (!enclosedInMacroExpansion(operand)) {
@ -3897,22 +3906,22 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
} }
private static boolean withinMacroExpansion(IASTNode node, int offset) { private static boolean withinMacroExpansion(IASTNode node, int offset) {
IASTFileLocation loc = node.getFileLocation();
if (loc == null || offset < loc.getNodeOffset() || offset >= loc.getNodeOffset() + loc.getNodeLength()) {
return false;
}
IASTNodeLocation[] locations= node.getNodeLocations(); IASTNodeLocation[] locations= node.getNodeLocations();
for (IASTNodeLocation location : locations) { for (IASTNodeLocation location : locations) {
if (location instanceof IASTMacroExpansionLocation) { IASTFileLocation fileLocation = location.asFileLocation();
IASTFileLocation fileLocation = location.asFileLocation(); if (fileLocation != null) {
if (fileLocation != null) { final int nodeOffset = fileLocation.getNodeOffset();
final int nodeOffset = fileLocation.getNodeOffset(); final int endOffset = nodeOffset + fileLocation.getNodeLength();
final int endOffset = nodeOffset + fileLocation.getNodeLength(); if (offset >= nodeOffset && offset < endOffset) {
if (offset >= nodeOffset && offset < endOffset) { return location instanceof IASTMacroExpansionLocation;
return true;
} else if (offset < nodeOffset) {
return false;
}
} }
} }
} }
return false; return true;
} }
private static boolean doNodeLocationsOverlap(IASTNode node1, IASTNode node2) { private static boolean doNodeLocationsOverlap(IASTNode node1, IASTNode node2) {

View file

@ -2537,4 +2537,44 @@ public class CodeFormatterTest extends BaseUITestCase {
public void testExpressionInArrayDeclarator_Bug350816() throws Exception { public void testExpressionInArrayDeclarator_Bug350816() throws Exception {
assertFormatterResult(); assertFormatterResult();
} }
//void f(int p0 ,... ){}
//void f(int p0, ...) {
//}
public void testEllipsisInFunctionDefinition_Bug350689() throws Exception {
assertFormatterResult();
}
//struct{int n;}* l;
//void f(int p0, int p1) { f((p0 + 2), l->n); }
//struct {
// int n;
//}* l;
//void f(int p0, int p1) {
// f((p0 + 2), l->n);
//}
public void testParenthesizedExpressionInArgumentList_Bug350689() throws Exception {
assertFormatterResult();
}
//#define m(x) { x=1; }
//void f() {
// int i;
// if (1) i=1;
// else m(i);
//}
//#define m(x) { x=1; }
//void f() {
// int i;
// if (1)
// i = 1;
// else
// m(i);
//}
public void testMacroInElseBranch_Bug350689() throws Exception {
assertFormatterResult();
}
} }