1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 08:55:25 +02:00

Whitespace for gcc-extension in macro-explorer, bug 23540.

This commit is contained in:
Markus Schorn 2008-01-22 10:32:46 +00:00
parent c2cd6626e3
commit a29fa7f20c
2 changed files with 79 additions and 43 deletions

View file

@ -332,7 +332,21 @@ public class ExpansionExplorerTests extends BaseTestCase {
public void testVararg2() throws Exception {
performTest(3);
}
// #define vararg(x, y...) bla(x, ## y)
// #define _p p
// vararg( _p , _p );
// vararg( p , _p );
// vararg( p , p );
// bla(p, p);
public void testVararg2x() throws Exception {
performTest(3);
}
// #define func2(x,y) (x,y)
// #define _p p

View file

@ -523,15 +523,14 @@ public class MacroExpander {
Token pasteArg1= null;
for (Token t= replacement.first(); t != null; l=t, t=n) {
n= (Token) t.getNext();
boolean pasteNext= n != null && n.getType() == IToken.tPOUNDPOUND;
switch(t.getType()) {
case CPreprocessor.tMACRO_PARAMETER:
int idx= ((TokenParameterReference) t).getIndex();
if (idx < args.length) { // be defensive
addSpacemarker(l, t, result); // start argument replacement
TokenList arg= clone(pasteNext ? args[idx] : expandedArgs[idx]);
if (pasteNext) {
if (isKind(n, IToken.tPOUNDPOUND)) {
TokenList arg= clone(args[idx]);
pasteArg1= arg.last();
if (pasteArg1 != null) {
result.appendAllButLast(arg);
@ -539,6 +538,7 @@ public class MacroExpander {
}
}
else {
TokenList arg= clone(expandedArgs[idx]);
result.appendAll(arg);
addSpacemarker(t, n, result); // end argument replacement
}
@ -549,14 +549,13 @@ public class MacroExpander {
addSpacemarker(l, t, result); // start stringify
StringBuilder buf= new StringBuilder();
buf.append('"');
if (n != null && n.getType() == CPreprocessor.tMACRO_PARAMETER) {
if (isKind(n, CPreprocessor.tMACRO_PARAMETER)) {
idx= ((TokenParameterReference) n).getIndex();
if (idx < args.length) { // be defensive
stringify(args[idx], buf);
}
t= n;
n= (Token) n.getNext();
pasteNext= n != null && n.getType() == IToken.tPOUNDPOUND;
}
buf.append('"');
final int length= buf.length();
@ -564,7 +563,7 @@ public class MacroExpander {
buf.getChars(0, length, image, 0);
Token generated= new TokenWithImage(IToken.tSTRING, null, 0, 0, image);
if (pasteNext) { // start token paste, same as start stringify
if (isKind(n, IToken.tPOUNDPOUND)) { // start token paste, same as start stringify
pasteArg1= generated;
}
else {
@ -581,23 +580,11 @@ public class MacroExpander {
TokenList arg;
idx= ((TokenParameterReference) n).getIndex();
if (idx < args.length) { // be defensive
// gcc-extension
if (idx == args.length-1 && macro.hasVarArgs() != FunctionStyleMacro.NO_VAARGS &&
pasteArg1 != null && pasteArg1.getType() == IToken.tCOMMA) { // no paste operation
arg= clone(expandedArgs[idx]);
if (arg.first() != null) {
result.append(pasteArg1);
rest= arg;
}
pasteArg1= pasteArg2= null;
}
else {
arg= clone(args[idx]);
pasteArg2= arg.first();
if (pasteArg2 != null && arg.first() != arg.last()) {
rest= arg;
rest.removeFirst();
}
arg= clone(args[idx]);
pasteArg2= arg.first();
if (pasteArg2 != null && arg.first() != arg.last()) {
rest= arg;
rest.removeFirst();
}
}
}
@ -605,9 +592,10 @@ public class MacroExpander {
idx= -1;
pasteArg2= n;
}
t= n;
n= (Token) n.getNext();
pasteNext= n != null && n.getType() == IToken.tPOUNDPOUND;
final boolean pasteNext= isKind(n, IToken.tPOUNDPOUND);
generated= tokenpaste(pasteArg1, pasteArg2, macro);
pasteArg1= null;
@ -639,8 +627,43 @@ public class MacroExpander {
}
break;
case IToken.tCOMMA:
if (isKind(n, IToken.tPOUNDPOUND)) {
final Token nn= (Token) n.getNext();
if (isKind(nn, CPreprocessor.tMACRO_PARAMETER)) {
idx= ((TokenParameterReference) nn).getIndex();
// check for gcc-extension preventing the paste operation
if (idx == args.length-1 && macro.hasVarArgs() != FunctionStyleMacro.NO_VAARGS &&
!isKind(nn.getNext(), IToken.tPOUNDPOUND)) {
final Token nnn= (Token) nn.getNext();
TokenList arg= clone(expandedArgs[idx]);
if (arg.isEmpty()) {
addSpacemarker(l, t, result);
addSpacemarker(nn, nnn, result);
}
else {
result.append(t);
addSpacemarker(t, n, result);
result.appendAll(arg);
addSpacemarker(nn, nnn, result);
}
t= nn;
n= nnn;
break;
}
}
addSpacemarker(l, t, result);
pasteArg1= t;
}
else {
result.append(t);
}
break;
default:
if (pasteNext) {
if (isKind(n, IToken.tPOUNDPOUND)) {
addSpacemarker(l, t, result); // start token paste
pasteArg1= t;
}
@ -651,6 +674,10 @@ public class MacroExpander {
}
}
}
private boolean isKind(final IToken t, final int kind) {
return t!=null && t.getType() == kind;
}
private BitSet getParamUsage(PreprocessorMacro macro) {
final BitSet result= new BitSet();
@ -663,14 +690,14 @@ public class MacroExpander {
switch(t.getType()) {
case CPreprocessor.tMACRO_PARAMETER:
int idx= 2*((TokenParameterReference) t).getIndex();
if (n == null || n.getType() != IToken.tPOUNDPOUND) {
if (!isKind(n, IToken.tPOUNDPOUND)) {
idx++;
}
result.set(idx);
break;
case IToken.tPOUND:
if (n != null && n.getType() == CPreprocessor.tMACRO_PARAMETER) {
if (isKind(n, CPreprocessor.tMACRO_PARAMETER)) {
idx= ((TokenParameterReference) n).getIndex();
result.set(2*idx);
t= n; n= (Token) n.getNext();
@ -678,18 +705,15 @@ public class MacroExpander {
break;
case IToken.tPOUNDPOUND:
if (n != null) {
if (n.getType() == CPreprocessor.tMACRO_PARAMETER) {
idx= ((TokenParameterReference) n).getIndex();
// gcc-extension
if (l != null && l.getType() == IToken.tCOMMA && macro.hasVarArgs() != FunctionStyleMacro.NO_VAARGS
&& idx == macro.getParameterPlaceholderList().length-1) {
result.set(2*idx+1);
}
else {
result.set(2*idx);
}
if (isKind(n, CPreprocessor.tMACRO_PARAMETER)) {
idx= ((TokenParameterReference) n).getIndex();
// gcc-extension
if (isKind(l, IToken.tCOMMA) && macro.hasVarArgs() != FunctionStyleMacro.NO_VAARGS &&
idx == macro.getParameterPlaceholderList().length-1 && !isKind(n.getNext(), IToken.tPOUNDPOUND)) {
result.set(2*idx+1);
}
else {
result.set(2*idx);
}
t= n; n= (Token) n.getNext();
}
@ -707,7 +731,6 @@ public class MacroExpander {
Token pasteArg1= null;
for (Token t= replacement.first(); t != null; l=t, t=n) {
n= (Token) t.getNext();
boolean pasteNext= n != null && n.getType() == IToken.tPOUNDPOUND;
switch(t.getType()) {
case IToken.tPOUNDPOUND:
@ -716,12 +739,11 @@ public class MacroExpander {
if (n != null) {
pasteArg2= n;
n= (Token) n.getNext();
pasteNext= n != null && n.getType() == IToken.tPOUNDPOUND;
}
t= tokenpaste(pasteArg1, pasteArg2, macro);
if (t != null) {
if (pasteNext) {
if (isKind(n, IToken.tPOUNDPOUND)) {
pasteArg1= t;
}
else {
@ -733,7 +755,7 @@ public class MacroExpander {
break;
default:
if (pasteNext) {
if (isKind(n, IToken.tPOUNDPOUND)) {
addSpacemarker(l, t, result); // start token paste
pasteArg1= t;
}