[libclang] Resolve a cursor that points to a macro name inside a #ifdef/#ifndef
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sat, 8 Dec 2012 02:21:17 +0000 (02:21 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sat, 8 Dec 2012 02:21:17 +0000 (02:21 +0000)
directive as a macro expansion.

This is more of a "macro reference" than a macro expansion but it's close enough
for libclang's purposes. If it causes issues we can revisit and introduce a new
kind of cursor.

llvm-svn: 169666

clang/include/clang/Lex/PreprocessingRecord.h
clang/lib/Lex/PreprocessingRecord.cpp
clang/test/Index/c-index-getCursor-pp.c

index ae50d48..74a430c 100644 (file)
@@ -570,6 +570,15 @@ namespace clang {
                                     StringRef SearchPath,
                                     StringRef RelativePath,
                                     const Module *Imported);
+    virtual void Ifdef(SourceLocation Loc, const Token &MacroNameTok,
+                       const MacroInfo *MI);
+    virtual void Ifndef(SourceLocation Loc, const Token &MacroNameTok,
+                        const MacroInfo *MI);
+    /// \brief Hook called whenever the 'defined' operator is seen.
+    virtual void Defined(const Token &MacroNameTok, const MacroInfo *MI);
+
+    void addMacroExpansion(const Token &Id, const MacroInfo *MI,
+                           SourceRange Range);
 
     /// \brief Cached result of the last \see getPreprocessedEntitiesInRange
     /// query.
index a78fbe7..497af0b 100644 (file)
@@ -357,8 +357,9 @@ MacroDefinition *PreprocessingRecord::findMacroDefinition(const MacroInfo *MI) {
   return cast<MacroDefinition>(Entity);
 }
 
-void PreprocessingRecord::MacroExpands(const Token &Id, const MacroInfo* MI,
-                                       SourceRange Range) {
+void PreprocessingRecord::addMacroExpansion(const Token &Id,
+                                            const MacroInfo *MI,
+                                            SourceRange Range) {
   // We don't record nested macro expansions.
   if (Id.getLocation().isMacroID())
     return;
@@ -371,6 +372,32 @@ void PreprocessingRecord::MacroExpands(const Token &Id, const MacroInfo* MI,
                        new (*this) MacroExpansion(Def, Range));
 }
 
+void PreprocessingRecord::Ifdef(SourceLocation Loc, const Token &MacroNameTok,
+                                const MacroInfo *MI) {
+  // This is not actually a macro expansion but record it as a macro reference.
+  if (MI)
+    addMacroExpansion(MacroNameTok, MI, MacroNameTok.getLocation());
+}
+
+void PreprocessingRecord::Ifndef(SourceLocation Loc, const Token &MacroNameTok,
+                                 const MacroInfo *MI) {
+  // This is not actually a macro expansion but record it as a macro reference.
+  if (MI)
+    addMacroExpansion(MacroNameTok, MI, MacroNameTok.getLocation());
+}
+
+void PreprocessingRecord::Defined(const Token &MacroNameTok,
+                                  const MacroInfo *MI) {
+  // This is not actually a macro expansion but record it as a macro reference.
+  if (MI)
+    addMacroExpansion(MacroNameTok, MI, MacroNameTok.getLocation());
+}
+
+void PreprocessingRecord::MacroExpands(const Token &Id, const MacroInfo* MI,
+                                       SourceRange Range) {
+  addMacroExpansion(Id, MI, Range);
+}
+
 void PreprocessingRecord::MacroDefined(const Token &Id,
                                        const MacroInfo *MI) {
   SourceRange R(MI->getDefinitionLoc(), MI->getDefinitionEndLoc());
index 01b0a69..48d07ad 100644 (file)
@@ -17,6 +17,12 @@ const char *fname = __FILE__;
 
 #include <a.h>
 
+#ifdef OBSCURE
+#endif
+
+#if defined(OBSCURE)
+#endif
+
 // RUN: c-index-test -cursor-at=%s:1:11 -I%S/Inputs %s | FileCheck -check-prefix=CHECK-1 %s
 // CHECK-1: macro definition=OBSCURE
 // RUN: c-index-test -cursor-at=%s:2:14 -I%S/Inputs %s | FileCheck -check-prefix=CHECK-2 %s
@@ -35,6 +41,9 @@ const char *fname = __FILE__;
 // CHECK-8: macro expansion=__FILE__
 // RUN: c-index-test -cursor-at=%s:18:12 -I%S/Inputs %s | FileCheck -check-prefix=CHECK-9 %s
 // CHECK-9: inclusion directive=a.h
+// RUN: c-index-test -cursor-at=%s:20:10 -cursor-at=%s:23:15 -I%S/Inputs %s | FileCheck -check-prefix=CHECK-10 %s
+// CHECK-10: 20:8 macro expansion=OBSCURE
+// CHECK-10: 23:13 macro expansion=OBSCURE
 
 // Same tests, but with "editing" optimizations
 // RUN: env CINDEXTEST_EDITING=1 c-index-test -cursor-at=%s:1:11 -I%S/Inputs %s | FileCheck -check-prefix=CHECK-1 %s