blob: ea4b506e6405cc79c9886398af3217c5035c322c [file] [log] [blame]
Douglas Gregore4e5b052009-03-19 00:18:19 +00001//===--- NestedNameSpecifier.cpp - C++ nested name specifiers -----*- C++ -*-=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the NestedNameSpecifier class, which represents
11// a C++ nested-name-specifier.
12//
13//===----------------------------------------------------------------------===//
14#include "clang/AST/NestedNameSpecifier.h"
15#include "clang/AST/ASTContext.h"
16#include "clang/AST/Decl.h"
17#include "clang/AST/Type.h"
Douglas Gregorbad35182009-03-19 03:51:16 +000018#include "llvm/Support/raw_ostream.h"
19
Douglas Gregore4e5b052009-03-19 00:18:19 +000020using namespace clang;
21
22DeclContext *
23NestedNameSpecifier::computeDeclContext(ASTContext &Context) const {
24 // The simple case: we're storing a DeclContext
25 if ((Data & 0x01) == 0)
26 return reinterpret_cast<DeclContext *>(Data);
27
28 Type *T = getAsType();
29 if (!T)
30 return 0;
31
32 // Retrieve the DeclContext associated with this type.
33 const TagType *TagT = T->getAsTagType();
34 assert(TagT && "No DeclContext from a non-tag type");
35 return TagT->getDecl();
36}
Douglas Gregorbad35182009-03-19 03:51:16 +000037
38void NestedNameSpecifier::Print(llvm::raw_ostream &OS,
39 const NestedNameSpecifier *First,
40 const NestedNameSpecifier *Last) {
41 for (; First != Last; ++First) {
42 if (Type *T = First->getAsType()) {
43 std::string TypeStr;
44
45 // If this is a qualified name type, suppress the qualification:
46 // it's part of our nested-name-specifier sequence anyway.
47 if (const QualifiedNameType *QualT = dyn_cast<QualifiedNameType>(T))
48 T = QualT->getNamedType().getTypePtr();
49
50 if (const TagType *TagT = dyn_cast<TagType>(T))
51 TagT->getAsStringInternal(TypeStr, true);
52 else
53 T->getAsStringInternal(TypeStr);
54 OS << TypeStr;
55 } else if (NamedDecl *NamedDC
56 = dyn_cast_or_null<NamedDecl>(First->getAsDeclContext()))
57 OS << NamedDC->getNameAsString();
58
59 OS << "::";
60 }
61}