private void executeScopeMarkers( TokenSource input, IdentityHashMap<PreprocessorMacro, PreprocessorMacro> forbidden) { Token t = input.removeFirst(); while (t != null) { if (t.getType() == ObjCPreprocessor.tSCOPE_MARKER) { ((ExpansionBoundary) t).execute(forbidden); } t = input.removeFirst(); } }
private TokenList expandAll( TokenSource input, IdentityHashMap<PreprocessorMacro, PreprocessorMacro> forbidden, boolean protectDefinedConstructs, MacroExpansionTracker tracker) throws OffsetLimitReachedException { final TokenList result = new TokenList(); boolean protect = false; Token l = null; Token t = input.removeFirst(); while (t != null) { switch (t.getType()) { case ObjCPreprocessor.tSCOPE_MARKER: ((ExpansionBoundary) t).execute(forbidden); break; case IToken.tIDENTIFIER: final char[] image = t.getCharImage(); PreprocessorMacro macro = fDictionary.get(image); if (protect || (tracker != null && tracker.isDone())) { result.append(t); } else if (protectDefinedConstructs && Arrays.equals(image, Keywords.cDEFINED)) { t.setType(ObjCPreprocessor.tDEFINED); result.append(t); protect = true; } // tricky: don't mark function-style macros if you don't // find the left parenthesis else if (macro == null || (macro.isFunctionStyle() && !input.findLParenthesis())) { result.append(t); } else if (forbidden.containsKey(macro)) { t.setType(ObjCPreprocessor.tEXPANDED_IDENTIFIER); // prevent // any // further // expansion result.append(t); } else { if (fLocationMap != null) { ImageLocationInfo info = null; if (fLexOptions.fCreateImageLocations) { info = createImageLocationInfo(t); } fImplicitMacroExpansions.add( fLocationMap.encounterImplicitMacroExpansion(macro, info)); } TokenList replacement = new TokenList(); addSpacemarker(l, t, replacement); // start expansion replacement.append(new ExpansionBoundary(macro, true)); Token last = expandOne(t, macro, forbidden, input, replacement, tracker); replacement.append(new ExpansionBoundary(macro, false)); addSpacemarker(last, input.first(), replacement); // end // expansion input.prepend(replacement); } break; case IToken.tLPAREN: case ObjCPreprocessor.tNOSPACE: case ObjCPreprocessor.tSPACE: result.append(t); break; default: protect = false; result.append(t); break; } l = t; t = input.removeFirst(); } return result; }