2012-05-12 14 views
5

Tôi đang sử dụng lớp Objective-C bên dưới để lập chỉ mục tệp Objective-C. Tôi đã thử phân tích cú pháp các tệp sử dụng cả hai tệp #include#import, với cả hai tệp góc và tệp tiêu đề được trích dẫn. Trong mọi trường hợp, cuộc gọi lại ppIncludedFile của tôi bị trúng. Clang rõ ràng là bao gồm các tập tin như tôi nhận được callbacks index cho các biểu tượng được định nghĩa trong chúng. Nhưng về cấu trúc tổng thể, tôi nhận được enteredMainFile, sau đó tôi nhận được startedTranslationUnit cho tệp chính. Nhưng tôi không bao giờ tìm ra những tập tin tiêu đề nó đang tìm kiếm trongLập chỉ mục một tệp bằng clang-c không nhấn vào hàm ppIncludedFile của tôi

Theo tài liệu:.

/** * \ ngắn gọn gọi là khi một tập tin đượC# bao gồm/# nhập khẩu. */
CXIdxClientFile (* ppIncludedFile) (CXClientData client_data, const CXIdxIncludedFileInfo *);

điều này không xảy ra. Nó là một lỗi, hay tôi cần phải làm một cái gì đó để kích hoạt tính năng gọi lại này? Phiên bản của libclang Tôi đang sử dụng là từ svn trunk r156259.

// 
// FZAClassParser.m 
// ObjectiveBrowser 
// 
// Created by Graham Lee on 07/05/2012. 
// Copyright (c) 2012 Fuzzy Aliens Ltd.. All rights reserved. 
// 

#import "FZAClassParser.h" 
#import "FZAClassParserDelegate.h" 

int abortQuery(CXClientData client_data, void *reserved); 
void diagnostic(CXClientData client_data, 
       CXDiagnosticSet diagnostic_set, void *reserved); 
CXIdxClientFile enteredMainFile(CXClientData client_data, 
           CXFile mainFile, void *reserved); 
CXIdxClientFile ppIncludedFile(CXClientData client_data, 
           const CXIdxIncludedFileInfo *included_file); 
CXIdxClientASTFile importedASTFile(CXClientData client_data, 
            const CXIdxImportedASTFileInfo *imported_ast); 
CXIdxClientContainer startedTranslationUnit(CXClientData client_data, 
              void *reserved); 
void indexDeclaration(CXClientData client_data, 
         const CXIdxDeclInfo *declaration); 
void indexEntityReference(CXClientData client_data, 
          const CXIdxEntityRefInfo *entity_reference); 

static IndexerCallbacks indexerCallbacks = { 
    .abortQuery = abortQuery, 
    .diagnostic = diagnostic, 
    .enteredMainFile = enteredMainFile, 
    .ppIncludedFile = ppIncludedFile, 
    .importedASTFile = importedASTFile, 
    .startedTranslationUnit = startedTranslationUnit, 
    .indexDeclaration = indexDeclaration, 
    .indexEntityReference = indexEntityReference 
}; 

@interface FZAClassParser() 

- (void)realParse; 

@end 

@implementation FZAClassParser 
{ 
    NSString *sourceFile; 
    NSOperationQueue *queue; 
} 

@synthesize delegate; 

- (id)initWithSourceFile:(NSString *)implementation { 
    if ((self = [super init])) { 
     if(![[NSFileManager defaultManager] fileExistsAtPath: implementation]) { 
      return nil; 
     } 
     sourceFile = [implementation copy]; 
     queue = [[NSOperationQueue alloc] init]; 
    } 
    return self; 
} 

- (void)parse { 
    __weak id parser = self; 
    [queue addOperationWithBlock: ^{ [parser realParse]; }]; 
} 

- (void)realParse { 
#pragma warning Pass errors back to the app 
    @autoreleasepool { 
     CXIndex index = clang_createIndex(1, 1); 
     if (!index) { 
      NSLog(@"fail: couldn't create translation unit"); 
      return; 
     } 
     CXTranslationUnit translationUnit = clang_parseTranslationUnit(index, [sourceFile fileSystemRepresentation], NULL, 0, NULL, 0, CXTranslationUnit_None); 
     if (!translationUnit) { 
      NSLog(@"fail: couldn't compile %@", sourceFile); 
      return; 
     } 
     CXIndexAction action = clang_IndexAction_create(index); 
     if ([self.delegate respondsToSelector: @selector(classParser:willBeginParsingFile:)]) { 
      [self.delegate classParser: self willBeginParsingFile: sourceFile]; 
     } 
     int indexResult = clang_indexTranslationUnit(action, 
                (__bridge CXClientData)self, 
                &indexerCallbacks, 
                sizeof(indexerCallbacks), 
                CXIndexOpt_SuppressWarnings, 
                translationUnit); 
     if ([self.delegate respondsToSelector: @selector(classParser:didFinishParsingFile:)]) { 
      [self.delegate classParser: self didFinishParsingFile: sourceFile]; 
     } 
     clang_IndexAction_dispose(action); 
     clang_disposeTranslationUnit(translationUnit); 
     clang_disposeIndex(index); 
     (void) indexResult; 
    } 
} 

@end 

int abortQuery(CXClientData client_data, void *reserved) { 
    @autoreleasepool { 
     FZAClassParser *parser = (__bridge FZAClassParser *)client_data; 
     if ([parser.delegate respondsToSelector: @selector(classParserShouldAbort:)]) { 
      return [parser.delegate classParserShouldAbort: parser]; 
     } 
     return 0; 
    } 
} 

void diagnostic(CXClientData client_data, 
       CXDiagnosticSet diagnostic_set, void *reserved) { 
    @autoreleasepool { 
     FZAClassParser *parser = (__bridge FZAClassParser *)client_data; 
     if ([parser.delegate respondsToSelector: @selector(classParser:foundDiagnostics:)]) { 
      [parser.delegate classParser: parser foundDiagnostics: diagnostic_set]; 
     } 
    } 
} 

CXIdxClientFile enteredMainFile(CXClientData client_data, 
           CXFile mainFile, void *reserved) { 
    @autoreleasepool { 
     FZAClassParser *parser = (__bridge FZAClassParser *)client_data; 
     if ([parser.delegate respondsToSelector: @selector(classParser:enteredMainFile:)]) { 
      return [parser.delegate classParser: parser enteredMainFile: mainFile]; 
     } 
     return NULL; 
    } 
} 

CXIdxClientFile ppIncludedFile(CXClientData client_data, 
           const CXIdxIncludedFileInfo *included_file) { 
    @autoreleasepool { 
     FZAClassParser *parser = (__bridge FZAClassParser *)client_data; 
     if ([parser.delegate respondsToSelector: @selector(classParser:includedFile:)]) { 
      return [parser.delegate classParser: parser includedFile: included_file]; 
     } 
     return NULL; 
    } 
} 

CXIdxClientASTFile importedASTFile(CXClientData client_data, 
            const CXIdxImportedASTFileInfo *imported_ast) { 
    @autoreleasepool { 
     FZAClassParser *parser = (__bridge FZAClassParser *)client_data; 
     if ([parser.delegate respondsToSelector: @selector(classParser:importedPCH:)]) { 
      return [parser.delegate classParser: parser importedPCH: imported_ast]; 
     } 
     return NULL; 
    } 
} 

CXIdxClientContainer startedTranslationUnit(CXClientData client_data, 
              void *reserved) { 
    @autoreleasepool { 
     FZAClassParser *parser = (__bridge FZAClassParser *)client_data; 
     if ([parser.delegate respondsToSelector: @selector(classParserStartedTranslationUnit:)]) { 
      return [parser.delegate classParserStartedTranslationUnit: parser]; 
     } 
     return NULL; 
    } 
} 

void indexDeclaration(CXClientData client_data, 
         const CXIdxDeclInfo *declaration) { 
    @autoreleasepool { 
     FZAClassParser *parser = (__bridge FZAClassParser *)client_data; 
     if ([parser.delegate respondsToSelector: @selector(classParser:foundDeclaration:)]) { 
      [parser.delegate classParser: parser foundDeclaration: declaration]; 
     } 
    } 
} 

void indexEntityReference(CXClientData client_data, 
          const CXIdxEntityRefInfo *entity_reference) { 
    @autoreleasepool { 
     FZAClassParser *parser = (__bridge FZAClassParser *)client_data; 
     if ([parser.delegate respondsToSelector: @selector(classParser:foundEntityReference:)]) { 
      [parser.delegate classParser: parser foundEntityReference: entity_reference]; 
     } 
    } 
} 

Trả lời

3

Quá trình xử lý tại thời điểm #include có thể không được ghi vì có nhiều thông tin ở đó (và có thể không cần thiết trong trường hợp chung). Có chức năng createPreporcessingRecord không tạo dữ liệu nếu tùy chọn chưa được bật.

Tài liệu Clang mô tả CXTranslationUnit_DetailedPreprocessingRecord mà bạn có thể sử dụng làm cờ thay vì CXTranslationUnit_None có thể giúp ích.

Các vấn đề liên quan