2012-05-12 9 views
5

Estoy usando la clase Objective-C a continuación para indexar un archivo Objective-C. Intenté analizar archivos que usan #include y #import, con archivos de encabezado de ángulo y de encabezado entre comillas. En ningún caso se golpea mi devolución de llamada ppIncludedFile. Clang está incluyendo claramente los archivos a medida que obtengo devoluciones de índice para los símbolos definidos en ellos. Pero con respecto a la estructura general, obtengo enteredMainFile, luego obtengo startedTranslationUnit para el archivo principal también. Pero nunca me entero de lo que los archivos de cabecera que está buscando enLa indexación de un archivo con clang-c no afecta mi devolución de llamada ppIncludedFile

De acuerdo con la documentación:.

/** * \ breve llama cuando un archivo se incluye #/# importada. */
CXIdxClientFile (* ppIncludedFile) (CXClientData client_data, const CXIdxIncludedFileInfo *);

esto no está sucediendo. ¿Es un error o necesito hacer algo para habilitar esta devolución de llamada? La versión de libclang que estoy usando es de 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]; 
     } 
    } 
} 

Respuesta

3

El procesamiento en #include de tiempo no se registra ya que hay una gran cantidad de información allí (y no puede ser necesaria en el caso general). Hay una función createPreporcessingRecord que no genera datos si la opción no se ha habilitado.

La documentación de Clang describe CXTranslationUnit_DetailedPreprocessingRecord que puede utilizar como una marca en lugar del CXTranslationUnit_None que puede ayudar.

Cuestiones relacionadas