[cfe-commits] r98929 - in /cfe/trunk: test/Index/c-index-getCursor-pp.c tools/CIndex/CIndex.cpp
Bob Wilson
bob.wilson at apple.com
Thu Mar 18 20:57:57 PDT 2010
Author: bwilson
Date: Thu Mar 18 22:57:57 2010
New Revision: 98929
URL: http://llvm.org/viewvc/llvm-project?rev=98929&view=rev
Log:
Revert 98907 since it is breaking buildbots.
--- Reverse-merging r98907 into '.':
D test/Index/c-index-getCursor-pp.c
U tools/CIndex/CIndex.cpp
Removed:
cfe/trunk/test/Index/c-index-getCursor-pp.c
Modified:
cfe/trunk/tools/CIndex/CIndex.cpp
Removed: cfe/trunk/test/Index/c-index-getCursor-pp.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/c-index-getCursor-pp.c?rev=98928&view=auto
==============================================================================
--- cfe/trunk/test/Index/c-index-getCursor-pp.c (original)
+++ cfe/trunk/test/Index/c-index-getCursor-pp.c (removed)
@@ -1,18 +0,0 @@
-#define OBSCURE(X) X
-#define DECORATION
-
-typedef int T;
-void OBSCURE(func)(int x) {
- OBSCURE(T) DECORATION value;
-}
-
-// RUN: c-index-test -cursor-at=%s:1:11 %s | FileCheck -check-prefix=CHECK-1 %s
-// CHECK-1: macro definition=OBSCURE
-// RUN: c-index-test -cursor-at=%s:2:14 %s | FileCheck -check-prefix=CHECK-2 %s
-// CHECK-2: macro definition=DECORATION
-// RUN: c-index-test -cursor-at=%s:5:7 %s | FileCheck -check-prefix=CHECK-3 %s
-// CHECK-3: macro instantiation=OBSCURE:1:9
-// RUN: c-index-test -cursor-at=%s:6:6 %s | FileCheck -check-prefix=CHECK-4 %s
-// CHECK-4: macro instantiation=OBSCURE:1:9
-// RUN: c-index-test -cursor-at=%s:6:19 %s | FileCheck -check-prefix=CHECK-5 %s
-// CHECK-5: macro instantiation=DECORATION:2:9
Modified: cfe/trunk/tools/CIndex/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CIndex/CIndex.cpp?rev=98929&r1=98928&r2=98929&view=diff
==============================================================================
--- cfe/trunk/tools/CIndex/CIndex.cpp (original)
+++ cfe/trunk/tools/CIndex/CIndex.cpp Thu Mar 18 22:57:57 2010
@@ -425,31 +425,11 @@
if (Visit(MakeCXCursor(*it, CXXUnit), true))
return true;
}
- } else if (VisitDeclContext(
- CXXUnit->getASTContext().getTranslationUnitDecl()))
- return true;
-
- // Walk the preprocessing record.
- if (CXXUnit->hasPreprocessingRecord()) {
- // FIXME: Once we have the ability to deserialize a preprocessing record,
- // do so.
- PreprocessingRecord &PPRec = CXXUnit->getPreprocessingRecord();
- for (PreprocessingRecord::iterator E = PPRec.begin(), EEnd = PPRec.end();
- E != EEnd; ++E) {
- if (MacroInstantiation *MI = dyn_cast<MacroInstantiation>(*E)) {
- if (Visit(MakeMacroInstantiationCursor(MI, CXXUnit)))
- return true;
- continue;
- }
-
- if (MacroDefinition *MD = dyn_cast<MacroDefinition>(*E)) {
- if (Visit(MakeMacroDefinitionCursor(MD, CXXUnit)))
- return true;
-
- continue;
- }
- }
+ } else {
+ return VisitDeclContext(
+ CXXUnit->getASTContext().getTranslationUnitDecl());
}
+
return false;
}
@@ -2079,6 +2059,51 @@
// Token-based Operations.
//===----------------------------------------------------------------------===//
+namespace {
+ class ComparePreprocessedEntityLocation {
+ SourceManager &SM;
+
+ public:
+ explicit ComparePreprocessedEntityLocation(SourceManager &SM) : SM(SM) { }
+
+ bool operator()(const PreprocessedEntity *Entity, SourceLocation Loc) const{
+ return SM.isBeforeInTranslationUnit(Entity->getSourceRange().getEnd(),
+ Loc);
+ }
+
+ bool operator()(SourceLocation Loc, const PreprocessedEntity *Entity) const{
+ return SM.isBeforeInTranslationUnit(Loc,
+ Entity->getSourceRange().getBegin());
+ }
+
+ bool operator()(const PreprocessedEntity *Entity, SourceRange R) const {
+ return SM.isBeforeInTranslationUnit(Entity->getSourceRange().getEnd(),
+ R.getBegin());
+ }
+
+ bool operator()(SourceRange R, const PreprocessedEntity *Entity) const {
+ return SM.isBeforeInTranslationUnit(R.getEnd(),
+ Entity->getSourceRange().getBegin());
+ }
+
+ bool operator()(const PreprocessedEntity *Entity1,
+ const PreprocessedEntity *Entity2) const {
+ return SM.isBeforeInTranslationUnit(Entity1->getSourceRange().getEnd(),
+ Entity2->getSourceRange().getBegin());
+ }
+
+ bool operator()(SourceRange R1, SourceRange R2) const {
+ return SM.isBeforeInTranslationUnit(R1.getEnd(), R2.getBegin());
+ }
+
+ bool operator()(SourceLocation Loc1, SourceLocation Loc2) const {
+ return SM.isBeforeInTranslationUnit(Loc1, Loc2);
+ }
+ };
+}
+
+
+
/* CXToken layout:
* int_data[0]: a CXTokenKind
* int_data[1]: starting token location
@@ -2268,8 +2293,6 @@
return CXChildVisit_Recurse;
// Okay: we can annotate the location of this expression
- } else if (clang_isPreprocessing(cursor.kind)) {
- // We can always annotate a preprocessing directive/macro instantiation.
} else {
// Nothing to annotate
return CXChildVisit_Recurse;
@@ -2296,32 +2319,47 @@
ASTUnit::ConcurrencyCheck Check(*CXXUnit);
- // Determine the region of interest, which contains all of the tokens.
+ // Annotate all of the source locations in the region of interest that map to
+ // a specific cursor.
SourceRange RegionOfInterest;
RegionOfInterest.setBegin(
cxloc::translateSourceLocation(clang_getTokenLocation(TU, Tokens[0])));
SourceLocation End
- = cxloc::translateSourceLocation(clang_getTokenLocation(TU,
- Tokens[NumTokens - 1]));
+ = cxloc::translateSourceLocation(clang_getTokenLocation(TU,
+ Tokens[NumTokens - 1]));
RegionOfInterest.setEnd(CXXUnit->getPreprocessor().getLocForEndOfToken(End));
-
- // A mapping from the source locations found when re-lexing or traversing the
- // region of interest to the corresponding cursors.
+
AnnotateTokensData Annotated;
+ CXCursor Parent = clang_getTranslationUnitCursor(CXXUnit);
+ CursorVisitor AnnotateVis(CXXUnit, AnnotateTokensVisitor, &Annotated,
+ Decl::MaxPCHLevel, RegionOfInterest);
+ AnnotateVis.VisitChildren(Parent);
- // Relex the tokens within the source range to look for preprocessing
- // directives.
+ // Look for macro instantiations and preprocessing directives in the
+ // source range containing the annotated tokens. We do this by re-lexing the
+ // tokens in the source range.
SourceManager &SourceMgr = CXXUnit->getSourceManager();
std::pair<FileID, unsigned> BeginLocInfo
= SourceMgr.getDecomposedLoc(RegionOfInterest.getBegin());
std::pair<FileID, unsigned> EndLocInfo
= SourceMgr.getDecomposedLoc(RegionOfInterest.getEnd());
+ bool RelexOkay = true;
+
+ // Cannot re-tokenize across files.
+ if (BeginLocInfo.first != EndLocInfo.first)
+ RelexOkay = false;
+
llvm::StringRef Buffer;
- bool Invalid = false;
- if (BeginLocInfo.first == EndLocInfo.first &&
- ((Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid)),true) &&
- !Invalid) {
+ if (RelexOkay) {
+ // Create a lexer
+ bool Invalid = false;
+ Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
+ if (Invalid)
+ RelexOkay = false;
+ }
+
+ if (RelexOkay) {
Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
CXXUnit->getASTContext().getLangOptions(),
Buffer.begin(), Buffer.data() + BeginLocInfo.second,
@@ -2330,6 +2368,7 @@
// Lex tokens in raw mode until we hit the end of the range, to avoid
// entering #includes or expanding macros.
+ std::vector<Token> TokenStream;
while (true) {
Token Tok;
Lex.LexFromRawLexer(Tok);
@@ -2368,13 +2407,35 @@
break;
}
}
-
- // Annotate all of the source locations in the region of interest that map to
- // a specific cursor.
- CXCursor Parent = clang_getTranslationUnitCursor(CXXUnit);
- CursorVisitor AnnotateVis(CXXUnit, AnnotateTokensVisitor, &Annotated,
- Decl::MaxPCHLevel, RegionOfInterest);
- AnnotateVis.VisitChildren(Parent);
+
+ if (CXXUnit->hasPreprocessingRecord()) {
+ PreprocessingRecord &PPRec = CXXUnit->getPreprocessingRecord();
+ std::pair<PreprocessingRecord::iterator, PreprocessingRecord::iterator>
+ Entities = std::equal_range(PPRec.begin(), PPRec.end(), RegionOfInterest,
+ ComparePreprocessedEntityLocation(SourceMgr));
+ for (; Entities.first != Entities.second; ++Entities.first) {
+ PreprocessedEntity *Entity = *Entities.first;
+ if (MacroInstantiation *MI = dyn_cast<MacroInstantiation>(Entity)) {
+ SourceLocation Loc = MI->getSourceRange().getBegin();
+ if (Loc.isFileID()) {
+ Annotated[Loc.getRawEncoding()]
+ = MakeMacroInstantiationCursor(MI, CXXUnit);
+ }
+
+ continue;
+ }
+
+ if (MacroDefinition *MD = dyn_cast<MacroDefinition>(Entity)) {
+ SourceLocation Loc = MD->getLocation();
+ if (Loc.isFileID()) {
+ Annotated[Loc.getRawEncoding()]
+ = MakeMacroDefinitionCursor(MD, CXXUnit);
+ }
+
+ continue;
+ }
+ }
+ }
for (unsigned I = 0; I != NumTokens; ++I) {
// Determine whether we saw a cursor at this token's location.
More information about the cfe-commits
mailing list