示例#1
0
 private ImageLocationInfo createImageLocationInfo(Token t) {
   if (fLocationMap != null) {
     final Object s = t.fSource;
     if (s instanceof ObjectStyleMacro) {
       return new MacroImageLocationInfo((ObjectStyleMacro) s, t.getOffset(), t.getEndOffset());
     } else if (s instanceof ObjCPreprocessor) {
       int sequenceNumber = fLocationMap.getSequenceNumberForOffset(t.getOffset());
       int sequenceEndNumber = fLocationMap.getSequenceNumberForOffset(t.getEndOffset());
       return new ParameterImageLocationInfo(sequenceNumber, sequenceEndNumber);
     }
   }
   return null;
 }
示例#2
0
 int getCurrentLineNumber() {
   if (fFixedInput != null) {
     return fFixedLineNumber + countNewlines(fFixedInput);
   }
   if (fLocationMap != null) {
     return fLocationMap.getCurrentLineNumber(fEndOffset);
   }
   return 0;
 }
示例#3
0
 String getCurrentFilename() {
   if (fFixedCurrentFilename != null) {
     return fFixedCurrentFilename;
   }
   if (fLocationMap != null) {
     return fLocationMap.getCurrentFilePath();
   }
   return ""; //$NON-NLS-1$
 }
示例#4
0
  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;
  }