# This patch file was generated by NetBeans IDE # This patch can be applied using context Tools: Apply Diff Patch action on respective folder. # It uses platform neutral UTF-8 encoding. # Above lines and this line are ignored by the patching process. Index: cnd/apt/src/org/netbeans/modules/cnd/apt/impl/support/APTBaseMacroMap.java --- cnd/apt/src/org/netbeans/modules/cnd/apt/impl/support/APTBaseMacroMap.java Base (1.11) +++ cnd/apt/src/org/netbeans/modules/cnd/apt/impl/support/APTBaseMacroMap.java Locally Modified (Based On 1.11) @@ -74,15 +74,6 @@ protected APTMacroMapSnapshot active; private static final String DEFINE_PREFIX="#define "; // NOI18N - private static final List DEF_MACRO_BODY; - static { - int type = APTTokenTypes.NUMBER; - APTToken token = APTUtils.createAPTToken(type); - token.setType(type); - token.setText("1"); // NOI18N - DEF_MACRO_BODY = new ArrayList(); - DEF_MACRO_BODY.add(token); - } /** * Creates a new instance of APTBaseMacroMap @@ -128,7 +119,7 @@ // special check for macros without values, we must set it to be 1 List body = defNode.getBody(); if (body == APTUtils.EMPTY_STREAM) { - body = DEF_MACRO_BODY; + body = APTUtils.DEF_MACRO_BODY; } defineImpl(defNode.getName(), defNode.getParams(), body); } catch (TokenStreamException ex) { Index: cnd/apt/src/org/netbeans/modules/cnd/apt/support/APTConditionResolver.java --- cnd/apt/src/org/netbeans/modules/cnd/apt/support/APTConditionResolver.java Base (1.3) +++ cnd/apt/src/org/netbeans/modules/cnd/apt/support/APTConditionResolver.java Locally Modified (Based On 1.3) @@ -135,7 +135,7 @@ private static TokenStream expandTokenStream(TokenStream orig, APTMacroCallback callback) { // need to generate expanded token stream to have all macro substituted - return new APTExpandedStream(orig, callback); + return new APTExpandedStream(orig, callback, true); } private static boolean isEmpty(AST ast) { Index: cnd/apt/src/org/netbeans/modules/cnd/apt/support/APTExpandedStream.java --- cnd/apt/src/org/netbeans/modules/cnd/apt/support/APTExpandedStream.java Base (1.3) +++ cnd/apt/src/org/netbeans/modules/cnd/apt/support/APTExpandedStream.java Locally Modified (Based On 1.3) @@ -79,13 +79,21 @@ */ private boolean extractingMacroParams = false; + // flag to specify that original stream is from preprocessor expression + private final boolean expandPPExpression; + + public APTExpandedStream(TokenStream stream, APTMacroCallback callback, boolean expandPPExpression) { + selector.select(stream); + this.callback = callback; + this.expandPPExpression = expandPPExpression; + assert (!(callback instanceof APTSystemMacroMap)):"system macro map can't be used as callback"; // NOI18N + } + /** * Creates a new instance of APTExpandedStream */ public APTExpandedStream(TokenStream stream, APTMacroCallback callback) { - selector.select(stream); - this.callback = callback; - assert (!(callback instanceof APTSystemMacroMap)):"system macro map can't be used as callback"; // NOI18N + this(stream, callback, false); } /** @@ -123,6 +131,10 @@ } } + private boolean isExpandingPPExpression() { + return expandPPExpression; + } + private boolean pushMacroExpanding(Token token, APTMacro macro) throws TokenStreamException { boolean res = true; try { @@ -167,7 +179,18 @@ // for object-like macro the body doesn't need any parameter expandings // use it as is in macro out = new APTCommentsFilter(macro.getBody()); + // in case of expanding stream in preprocessor directive expression + // all #define'ed macro without body must be considered as having default macro body + if (isExpandingPPExpression()) { + if (APTUtils.isEOF(out.nextToken())) { + // no body => use default + out = new ListBasedTokenStream(APTUtils.DEF_MACRO_BODY); } else { + // has body => restore original eaten by the nextToken call above + out = new APTCommentsFilter(macro.getBody()); + } + } + } else { // create wrapper for function-like macro: Token next = null; @@ -185,7 +208,7 @@ // - extract macro parameters List> params = extractParams(macro, token, next); // - subsitute all parameters in macro body - List substParamsList = subsituteParams(macro, params, callback); + List substParamsList = subsituteParams(macro, params, callback, isExpandingPPExpression()); // - put result list in TokenStream wrapper out = new ListBasedTokenStream(substParamsList); } @@ -296,7 +319,7 @@ // gcc consumes 2.5G and fails, // we are trying to prevent such experiments, especially in IDE private static final long MACRO_EXPANDING_THREASHOLD = 16*1024; - private static List subsituteParams(APTMacro macro, List> params, APTMacroCallback callback) throws TokenStreamException { + private static List subsituteParams(APTMacro macro, List> params, APTMacroCallback callback, boolean expandPPExpression) throws TokenStreamException { final Map> paramsMap = createParamsMap(macro, params);; final List expanded = new LinkedList(); final TokenStream body = new APTCommentsFilter(macro.getBody()); @@ -335,7 +358,7 @@ List paramValue = paramsMap.get(APTUtils.getTokenTextKey(token)); if (paramValue != null) { // found param, so expand it and skip current token - List expandedValue = expandParamValue(paramValue, callback); + List expandedValue = expandParamValue(paramValue, callback, expandPPExpression); if (expandedValue.size() > MACRO_EXPANDING_THREASHOLD) { if (DebugUtils.STANDALONE) { System.err.printf( @@ -504,9 +527,9 @@ return out.toString(); } - private static List expandParamValue(List paramValue, APTMacroCallback callback) { + private static List expandParamValue(List paramValue, APTMacroCallback callback, boolean expandPPExpression) { TokenStream valueStream = new ListBasedTokenStream(paramValue); - TokenStream expanedValue = new APTExpandedStream(valueStream, callback); + TokenStream expanedValue = new APTExpandedStream(valueStream, callback, expandPPExpression); List out = APTUtils.toList(expanedValue); return out; } Index: cnd/apt/src/org/netbeans/modules/cnd/apt/utils/APTUtils.java --- cnd/apt/src/org/netbeans/modules/cnd/apt/utils/APTUtils.java Base (1.15) +++ cnd/apt/src/org/netbeans/modules/cnd/apt/utils/APTUtils.java Locally Modified (Based On 1.15) @@ -438,6 +438,7 @@ public static final APTToken VA_ARGS_TOKEN; // support ELLIPSIS for IZ#83949 in macros public static final APTToken EMPTY_ID_TOKEN; // support ELLIPSIS for IZ#83949 in macros public static final APTToken COMMA_TOKEN; // support ELLIPSIS for IZ#83949 in macros + public static final List DEF_MACRO_BODY; //support "1" as content of #defined tokens without body IZ#122091 static { VA_ARGS_TOKEN = createAPTToken(); VA_ARGS_TOKEN.setType(APTTokenTypes.ID); @@ -450,6 +451,12 @@ COMMA_TOKEN = createAPTToken(); COMMA_TOKEN.setType(APTTokenTypes.COMMA); COMMA_TOKEN.setText(","); // NOI18N + + APTToken token = createAPTToken(); + token.setType(APTTokenTypes.NUMBER); + token.setText("1"); // NOI18N + DEF_MACRO_BODY = new ArrayList(); + DEF_MACRO_BODY.add(token); } public static final APTToken EOF_TOKEN = new APTEOFToken();