1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-25 17:23:56 +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

@ -333,6 +333,20 @@ public class ExpansionExplorerTests extends BaseTestCase {
performTest(3); 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 func2(x,y) (x,y)
// #define _p p // #define _p p

View file

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