//===--- Action.cpp - Implement the Action class --------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file implements the Action interface. // //===----------------------------------------------------------------------===// #include "clang/Sema/Action.h" #include "clang/Sema/DeclSpec.h" #include "clang/Sema/Scope.h" #include "clang/Basic/TargetInfo.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/RecyclingAllocator.h" #include "llvm/Support/raw_ostream.h" using namespace clang; void PrettyStackTraceActionsDecl::print(llvm::raw_ostream &OS) const { if (Loc.isValid()) { Loc.print(OS, SM); OS << ": "; } OS << Message; std::string Name = Actions.getDeclName(TheDecl); if (!Name.empty()) OS << " '" << Name << '\''; OS << '\n'; } /// Out-of-line virtual destructor to provide home for ActionBase class. ActionBase::~ActionBase() {} /// Out-of-line virtual destructor to provide home for Action class. Action::~Action() {} Action::ObjCMessageKind Action::getObjCMessageKind(Scope *S, IdentifierInfo *Name, SourceLocation NameLoc, bool IsSuper, bool HasTrailingDot, TypeTy *&ReceiverType) { ReceiverType = 0; if (IsSuper && !HasTrailingDot && S->isInObjcMethodScope()) return ObjCSuperMessage; if (TypeTy *TyName = getTypeName(*Name, NameLoc, S)) { DeclSpec DS; const char *PrevSpec = 0; unsigned DiagID = 0; if (!DS.SetTypeSpecType(DeclSpec::TST_typename, NameLoc, PrevSpec, DiagID, TyName)) { DS.SetRangeEnd(NameLoc); Declarator DeclaratorInfo(DS, Declarator::TypeNameContext); TypeResult Ty = ActOnTypeName(S, DeclaratorInfo); if (!Ty.isInvalid()) ReceiverType = Ty.get(); } return ObjCClassMessage; } return ObjCInstanceMessage; } // Defined out-of-line here because of dependecy on AttributeList Decl *Action::ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc, SourceLocation NamespcLoc, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *NamespcName, AttributeList *AttrList) { // FIXME: Parser seems to assume that Action::ActOn* takes ownership over // passed AttributeList, however other actions don't free it, is it // temporary state or bug? delete AttrList; return 0; } // Defined out-of-line here because of dependency on AttributeList Decl *Action::ActOnUsingDeclaration(Scope *CurScope, AccessSpecifier AS, bool HasUsingKeyword, SourceLocation UsingLoc, CXXScopeSpec &SS, UnqualifiedId &Name, AttributeList *AttrList, bool IsTypeName, SourceLocation TypenameLoc) { // FIXME: Parser seems to assume that Action::ActOn* takes ownership over // passed AttributeList, however other actions don't free it, is it // temporary state or bug? delete AttrList; return 0; }