Pull TypeLocVisitor into its own header file.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83112 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Argyrios Kyrtzidis 2009-09-29 21:27:32 +00:00
Родитель b11688485a
Коммит 0c411806d5
7 изменённых файлов: 63 добавлений и 41 удалений

Просмотреть файл

@ -15,7 +15,6 @@
#define LLVM_CLANG_AST_TYPELOC_H #define LLVM_CLANG_AST_TYPELOC_H
#include "clang/AST/Type.h" #include "clang/AST/Type.h"
#include "clang/AST/TypeVisitor.h"
namespace clang { namespace clang {
class ParmVarDecl; class ParmVarDecl;
@ -534,41 +533,6 @@ public:
static bool classof(const ArrayLoc *TL) { return true; } static bool classof(const ArrayLoc *TL) { return true; }
}; };
#define DISPATCH(CLASS) \
return static_cast<ImplClass*>(this)->Visit ## CLASS(cast<CLASS>(TyLoc))
template<typename ImplClass, typename RetTy=void>
class TypeLocVisitor {
class TypeDispatch : public TypeVisitor<TypeDispatch, RetTy> {
ImplClass *Impl;
TypeLoc TyLoc;
public:
TypeDispatch(ImplClass *impl, TypeLoc &tyLoc) : Impl(impl), TyLoc(tyLoc) { }
#define ABSTRACT_TYPELOC(CLASS)
#define TYPELOC(CLASS, PARENT, TYPE) \
RetTy Visit##TYPE(TYPE *) { \
return Impl->Visit##CLASS(reinterpret_cast<CLASS&>(TyLoc)); \
}
#include "clang/AST/TypeLocNodes.def"
};
public:
RetTy Visit(TypeLoc TyLoc) {
TypeDispatch TD(static_cast<ImplClass*>(this), TyLoc);
return TD.Visit(TyLoc.getSourceType().getTypePtr());
}
#define TYPELOC(CLASS, PARENT, TYPE) RetTy Visit##CLASS(CLASS TyLoc) { \
DISPATCH(PARENT); \
}
#include "clang/AST/TypeLocNodes.def"
RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); }
};
#undef DISPATCH
} }
#endif #endif

Просмотреть файл

@ -0,0 +1,58 @@
//===--- TypeLocVisitor.h - Visitor for TypeLoc subclasses ------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines the TypeLocVisitor interface.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_AST_TYPELOCVISITOR_H
#define LLVM_CLANG_AST_TYPELOCVISITOR_H
#include "clang/AST/TypeLoc.h"
#include "clang/AST/TypeVisitor.h"
namespace clang {
#define DISPATCH(CLASS) \
return static_cast<ImplClass*>(this)->Visit ## CLASS(cast<CLASS>(TyLoc))
template<typename ImplClass, typename RetTy=void>
class TypeLocVisitor {
class TypeDispatch : public TypeVisitor<TypeDispatch, RetTy> {
ImplClass *Impl;
TypeLoc TyLoc;
public:
TypeDispatch(ImplClass *impl, TypeLoc &tyLoc) : Impl(impl), TyLoc(tyLoc) { }
#define ABSTRACT_TYPELOC(CLASS)
#define TYPELOC(CLASS, PARENT, TYPE) \
RetTy Visit##TYPE(TYPE *) { \
return Impl->Visit##CLASS(reinterpret_cast<CLASS&>(TyLoc)); \
}
#include "clang/AST/TypeLocNodes.def"
};
public:
RetTy Visit(TypeLoc TyLoc) {
TypeDispatch TD(static_cast<ImplClass*>(this), TyLoc);
return TD.Visit(TyLoc.getSourceType().getTypePtr());
}
#define TYPELOC(CLASS, PARENT, TYPE) RetTy Visit##CLASS(CLASS TyLoc) { \
DISPATCH(PARENT); \
}
#include "clang/AST/TypeLocNodes.def"
RetTy VisitTypeLoc(TypeLoc TyLoc) { return RetTy(); }
};
#undef DISPATCH
} // end namespace clang
#endif // LLVM_CLANG_AST_TYPELOCVISITOR_H

Просмотреть файл

@ -11,7 +11,7 @@
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#include "clang/AST/TypeLoc.h" #include "clang/AST/TypeLocVisitor.h"
using namespace clang; using namespace clang;
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//

Просмотреть файл

@ -18,7 +18,7 @@
#include "clang/AST/DeclVisitor.h" #include "clang/AST/DeclVisitor.h"
#include "clang/AST/DeclGroup.h" #include "clang/AST/DeclGroup.h"
#include "clang/AST/Expr.h" #include "clang/AST/Expr.h"
#include "clang/AST/TypeLoc.h" #include "clang/AST/TypeLocVisitor.h"
using namespace clang; using namespace clang;

Просмотреть файл

@ -14,7 +14,7 @@
#include "clang/Frontend/PCHWriter.h" #include "clang/Frontend/PCHWriter.h"
#include "clang/AST/DeclVisitor.h" #include "clang/AST/DeclVisitor.h"
#include "clang/AST/Expr.h" #include "clang/AST/Expr.h"
#include "clang/AST/TypeLoc.h" #include "clang/AST/TypeLocVisitor.h"
#include "llvm/Bitcode/BitstreamWriter.h" #include "llvm/Bitcode/BitstreamWriter.h"
#include <cstdio> #include <cstdio>

Просмотреть файл

@ -16,7 +16,7 @@
#include "clang/AST/DeclVisitor.h" #include "clang/AST/DeclVisitor.h"
#include "clang/AST/StmtVisitor.h" #include "clang/AST/StmtVisitor.h"
#include "clang/AST/TypeLoc.h" #include "clang/AST/TypeLocVisitor.h"
namespace clang { namespace clang {

Просмотреть файл

@ -14,7 +14,7 @@
#include "clang/Index/Utils.h" #include "clang/Index/Utils.h"
#include "clang/Index/ASTLocation.h" #include "clang/Index/ASTLocation.h"
#include "clang/AST/TypeLoc.h" #include "clang/AST/TypeLocVisitor.h"
#include "clang/AST/DeclVisitor.h" #include "clang/AST/DeclVisitor.h"
#include "clang/AST/StmtVisitor.h" #include "clang/AST/StmtVisitor.h"
#include "clang/Lex/Lexer.h" #include "clang/Lex/Lexer.h"