@Override
  public IASTCompletionNode getCompletionNode(
      FileContent reader,
      IScannerInfo scanInfo,
      IncludeFileContentProvider fileCreator,
      IIndex index,
      IParserLogService log,
      int offset)
      throws CoreException {

    IScanner scanner = createScanner(reader, scanInfo, fileCreator, log);
    scanner.setContentAssistMode(offset);

    ISourceCodeParser parser = createParser(scanner, log, index, true, 0);

    // Run the parse and return the completion node
    parser.parse();
    IASTCompletionNode node = parser.getCompletionNode();
    return node;
  }
  @Override
  public IASTTranslationUnit getASTTranslationUnit(
      FileContent reader,
      IScannerInfo scanInfo,
      IncludeFileContentProvider fileCreator,
      IIndex index,
      int options,
      IParserLogService log)
      throws CoreException {
    final IScanner scanner = createScanner(reader, scanInfo, fileCreator, log);
    scanner.setComputeImageLocations((options & OPTION_NO_IMAGE_LOCATIONS) == 0);
    scanner.setProcessInactiveCode((options & OPTION_PARSE_INACTIVE_CODE) != 0);

    final ISourceCodeParser parser = createParser(scanner, log, index, false, options);

    // make it possible to cancel parser by reconciler - http://bugs.eclipse.org/226682
    ICanceler canceler = null;
    if (log instanceof ICanceler) {
      canceler = (ICanceler) log;
      canceler.setCancelable(
          new ICancelable() {
            public void cancel() {
              scanner.cancel();
              parser.cancel();
            }
          });
    }

    try {
      // Parse
      IASTTranslationUnit ast = parser.parse();
      ast.setIsHeaderUnit((options & OPTION_IS_SOURCE_UNIT) == 0);
      return ast;
    } finally {
      if (canceler != null) {
        canceler.setCancelable(null);
      }
    }
  }