2017-04-17 6 views

Antwort

2

Wie funktioniert die GetIncludedLoc-Funktion des Quellmanagers, die fileid als Parameter akzeptiert?

SourceManager.GetIncludedLoc (fileid)

0

@Hemant der Dank für Ihre Antwort, du hast Recht

Ich fand schon von mir, dass (in Klirren 3.8 es getIncludeLoc genannt wird) aber vergessen haben, hier zu schreiben . Ich habe dies verwendet, um den Ort zu finden, nachdem alle #includes, wo ich meine eigenen setzen kann. Hier ist die Funktion (Sicher nicht der beste Weg) Ich habe für diese schrieb, hoffen, dass es jemand

SourceLocation getIncludeLocation(FileID fileID, SourceManager &sm, unsigned carriages) { 
     return SourceLocation(); 
    set<unsigned> lines; 
    if (fileID.isInvalid()) 
    for (auto it = sm.fileinfo_begin(); it != sm.fileinfo_end(); it++) { 
     SourceLocation includeLoc = sm.getIncludeLoc(sm.translateFile(it->first)); 
     if (includeLoc.isValid() && sm.isInFileID(includeLoc, fileID)) { 
      lines.insert(sm.getSpellingLineNumber(includeLoc)); 
     } 
    } 
    unsigned pos(0); 
    if (!lines.empty()) { 
     bool first = true; 
     for (unsigned line :lines) { 
      if (first) 
       first = false; 
      else if ((line - pos) > carriages) 
       break; 
      pos = line; 
      //cout << "Include line:" << pos << endl; 
     } 
     //cout << console_hline('-') << endl; 
    } 
    cout << sm.getFileEntryForID(fileID)->getName() << endl; 
    return sm.translateFileLineCol(sm.getFileEntryForID(fileID), ++pos, 1); 
} 

hilft auch über einige Informationen enthält von

Preprocessor::GetIncludeFilenameSpelling(SourceLocation Loc, StringRef &Buffer) 

und

Lexer::ComputePreamble(StringRef Buffer, const LangOptions &LangOpts, unsigned MaxLines = 0)  
erhalten werden kann
+0

Danke, @Yuriy für zusätzliche Informationen. – Hemant

Verwandte Themen