forked from OSchip/llvm-project
Make CIndex and c-index-test a little bit more robust. The only
substantive change is that clang_getCursorSource() now returns the file in which a macro was instantiated when the cursor points into a macro instantiation, rather than crashing. llvm-svn: 84275
This commit is contained in:
parent
007ceb4603
commit
d3d923a0f2
|
@ -124,8 +124,8 @@ public:
|
||||||
return TypeLoc(QualType::getFromOpaquePtr(Ty.TyPtr), Ty.Data);
|
return TypeLoc(QualType::getFromOpaquePtr(Ty.TyPtr), Ty.Data);
|
||||||
}
|
}
|
||||||
|
|
||||||
Decl *dyn_AsDecl() const { return getKind() == N_Decl ? D : 0; }
|
Decl *dyn_AsDecl() const { return isValid() && getKind() == N_Decl ? D : 0; }
|
||||||
Stmt *dyn_AsStmt() const { return getKind() == N_Stmt ? Stm : 0; }
|
Stmt *dyn_AsStmt() const { return isValid() && getKind() == N_Stmt ? Stm : 0; }
|
||||||
NamedRef dyn_AsNamedRef() const {
|
NamedRef dyn_AsNamedRef() const {
|
||||||
return getKind() == N_Type ? AsNamedRef() : NamedRef();
|
return getKind() == N_Type ? AsNamedRef() : NamedRef();
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,11 +22,12 @@
|
||||||
#include "clang/Basic/FileManager.h"
|
#include "clang/Basic/FileManager.h"
|
||||||
#include "clang/Basic/SourceManager.h"
|
#include "clang/Basic/SourceManager.h"
|
||||||
#include "clang/Frontend/ASTUnit.h"
|
#include "clang/Frontend/ASTUnit.h"
|
||||||
|
#include "llvm/Support/MemoryBuffer.h"
|
||||||
|
#include "llvm/System/Path.h"
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "llvm/System/Path.h"
|
|
||||||
|
|
||||||
using namespace clang;
|
using namespace clang;
|
||||||
using namespace idx;
|
using namespace idx;
|
||||||
|
@ -823,7 +824,18 @@ const char *clang_getCursorSource(CXCursor C)
|
||||||
SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
|
SourceManager &SourceMgr = ND->getASTContext().getSourceManager();
|
||||||
|
|
||||||
SourceLocation SLoc = getLocationFromCursor(C, SourceMgr, ND);
|
SourceLocation SLoc = getLocationFromCursor(C, SourceMgr, ND);
|
||||||
return SourceMgr.getBufferName(SLoc);
|
if (SLoc.isFileID())
|
||||||
|
return SourceMgr.getBufferName(SLoc);
|
||||||
|
|
||||||
|
// Retrieve the file in which the macro was instantiated, then provide that
|
||||||
|
// buffer name.
|
||||||
|
// FIXME: Do we want to give specific macro-instantiation information?
|
||||||
|
const llvm::MemoryBuffer *Buffer
|
||||||
|
= SourceMgr.getBuffer(SourceMgr.getDecomposedSpellingLoc(SLoc).first);
|
||||||
|
if (!Buffer)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return Buffer->getBufferIdentifier();
|
||||||
}
|
}
|
||||||
|
|
||||||
void clang_getDefinitionSpellingAndExtent(CXCursor C,
|
void clang_getDefinitionSpellingAndExtent(CXCursor C,
|
||||||
|
|
|
@ -63,7 +63,9 @@ static void TranslationUnitVisitor(CXTranslationUnit Unit, CXCursor Cursor,
|
||||||
|
|
||||||
Ref = clang_getCursor(Unit, clang_getCursorSource(Cursor),
|
Ref = clang_getCursor(Unit, clang_getCursorSource(Cursor),
|
||||||
curLine, curColumn);
|
curLine, curColumn);
|
||||||
if (Ref.kind != CXCursor_FunctionDecl) {
|
if (Ref.kind == CXCursor_NoDeclFound) {
|
||||||
|
// Nothing found here; that's fine.
|
||||||
|
} else if (Ref.kind != CXCursor_FunctionDecl) {
|
||||||
printf("// CHECK: %s:%d:%d: ", basename(clang_getCursorSource(Ref)),
|
printf("// CHECK: %s:%d:%d: ", basename(clang_getCursorSource(Ref)),
|
||||||
curLine, curColumn);
|
curLine, curColumn);
|
||||||
PrintCursor(Ref);
|
PrintCursor(Ref);
|
||||||
|
|
Loading…
Reference in New Issue