clang: lib/AST/QualTypeNames.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

13

15

17

18

19

20

21

22

23

24

25

27 const ASTContext &Ctx,

28 const NamespaceDecl *Namesp,

29 bool WithGlobalNsPrefix);

30

31

32

33

34

35

36

37

38

39

40

42 const ASTContext &Ctx, const TypeDecl *TD,

43 bool FullyQualify, bool WithGlobalNsPrefix);

44

46 const ASTContext &Ctx, const Decl *decl,

47 bool FullyQualified, bool WithGlobalNsPrefix);

48

50 const ASTContext &Ctx, NestedNameSpecifier *scope, bool WithGlobalNsPrefix);

51

54 bool WithGlobalNsPrefix) {

55 bool Changed = false;

57

59

60

61 assert(ArgTDecl != nullptr);

63

64 if (QTName &&

68 Ctx, NNS, WithGlobalNsPrefix);

69 if (QNNS != NNS) {

70 Changed = true;

71 NNS = QNNS;

72 } else {

73 NNS = nullptr;

74 }

75 } else {

77 Ctx, ArgTDecl, true, WithGlobalNsPrefix);

78 }

79 if (NNS) {

83 TName =

84 Ctx.getQualifiedTemplateName(NNS,

85 false, UnderlyingTN);

86 Changed = true;

87 }

88 return Changed;

89}

90

93 bool WithGlobalNsPrefix) {

94 bool Changed = false;

95

96

97

98

102 if (Changed) {

104 }

107

109 if (QTFQ != SubTy) {

111 Changed = true;

112 }

113 }

114 return Changed;

115}

116

118 const Type *TypePtr,

119 bool WithGlobalNsPrefix) {

120

121

122

123 assert(!isa(TypePtr));

124

125

126 if (const auto *TST = dyn_cast(TypePtr)) {

127 bool MightHaveChanged = false;

129

130

133 Ctx, Arg, WithGlobalNsPrefix);

134 FQArgs.push_back(Arg);

135 }

136

137

138

139 if (MightHaveChanged) {

140 QualType QT = Ctx.getTemplateSpecializationType(

141 TST->getTemplateName(), FQArgs,

142 TST->getCanonicalTypeInternal());

143

144

145

147 }

148 } else if (const auto *TSTRecord = dyn_cast(TypePtr)) {

149

150

151

152

153 if (const auto *TSTDecl =

154 dyn_cast(TSTRecord->getDecl())) {

156

157 bool MightHaveChanged = false;

159 for (unsigned int I = 0, E = TemplateArgs.size(); I != E; ++I) {

160

161

164 Ctx, Arg, WithGlobalNsPrefix);

165 FQArgs.push_back(Arg);

166 }

167

168

169

170 if (MightHaveChanged) {

171 TemplateName TN(TSTDecl->getSpecializedTemplate());

172 QualType QT = Ctx.getTemplateSpecializationType(

173 TN, FQArgs,

174 TSTRecord->getCanonicalTypeInternal());

175

176

177

179 }

180 }

181 }

182 return TypePtr;

183}

184

186 bool FullyQualify,

187 bool WithGlobalNsPrefix) {

189 if (const auto *NS = dyn_cast(DC)) {

190 while (NS && NS->isInline()) {

191

192 NS = dyn_cast(NS->getDeclContext());

193 }

194 if (NS && NS->getDeclName()) {

196 }

197 return nullptr;

198 } else if (const auto *TD = dyn_cast(DC)) {

200 } else if (const auto *TDD = dyn_cast(DC)) {

202 Ctx, TDD, FullyQualify, WithGlobalNsPrefix);

205 }

206 return nullptr;

207}

208

209

212 bool WithGlobalNsPrefix) {

213 switch (Scope->getKind()) {

215

219 Ctx, Scope->getAsNamespace(), WithGlobalNsPrefix);

221

222

223

224

226 Ctx,

227 Scope->getAsNamespaceAlias()->getNamespace()->getCanonicalDecl(),

228 WithGlobalNsPrefix);

230

231

232

234 Ctx, Scope->getPrefix(), WithGlobalNsPrefix);

239

240 const TagDecl *TD = nullptr;

242 TD = TagDeclType->getDecl();

243 } else {

245 }

246 if (TD) {

248 true ,

249 WithGlobalNsPrefix);

250 } else if (const auto *TDD = dyn_cast(Type)) {

252 true ,

253 WithGlobalNsPrefix);

254 }

256 }

257 }

258 llvm_unreachable("bad NNS kind");

259}

260

261

262

265 bool FullyQualified, bool WithGlobalNsPrefix) {

266 assert(Decl);

267

269 const auto *Outer = dyn_cast(DC);

270 const auto *OuterNS = dyn_cast(DC);

271 if (Outer && !(OuterNS && OuterNS->isAnonymousNamespace())) {

272 if (const auto *CxxDecl = dyn_cast(DC)) {

274 CxxDecl->getDescribedClassTemplate()) {

275

276

277

278

279

280

281

282

283

284

285 if (ClassTempl->spec_begin() != ClassTempl->spec_end()) {

286 Decl = *(ClassTempl->spec_begin());

287 Outer = dyn_cast(Decl);

288 OuterNS = dyn_cast(Decl);

289 }

290 }

291 }

292

293 if (OuterNS) {

295 } else if (const auto *TD = dyn_cast(Outer)) {

297 Ctx, TD, FullyQualified, WithGlobalNsPrefix);

298 } else if (isa(Outer)) {

299

300 return nullptr;

301 } else {

302

303

304

305 return nullptr;

306 }

309 }

310 return nullptr;

311}

312

313

314

317 bool FullyQualified, bool WithGlobalNsPrefix) {

318 if (!TypePtr) return nullptr;

319

321

322 if (const auto *TDT = dyn_cast(TypePtr)) {

323 Decl = TDT->getDecl();

324 } else if (const auto *TagDeclType = dyn_cast(TypePtr)) {

325 Decl = TagDeclType->getDecl();

326 } else if (const auto *TST = dyn_cast(TypePtr)) {

327 Decl = TST->getTemplateName().getAsTemplateDecl();

328 } else {

330 }

331

332 if (Decl) return nullptr;

333

335 Ctx, Decl, FullyQualified, WithGlobalNsPrefix);

336}

337

340 bool WithGlobalNsPrefix) {

341 while (Namespace && Namespace->isInline()) {

342

343 Namespace = dyn_cast(Namespace->getDeclContext());

344 }

345 if (!Namespace) return nullptr;

346

347 bool FullyQualified = true;

349 Ctx,

350 createOuterNNS(Ctx, Namespace, FullyQualified, WithGlobalNsPrefix),

351 Namespace);

352}

353

356 bool FullyQualify,

357 bool WithGlobalNsPrefix) {

359 if (isa(TypePtr) ||

360 isa(TypePtr)) {

361

362

363

364

366 }

367

369 Ctx, createOuterNNS(Ctx, TD, FullyQualify, WithGlobalNsPrefix),

370 false , TypePtr);

371}

372

373

374

376 bool WithGlobalNsPrefix) {

377

378

379 if (isa(QT.getTypePtr())) {

380

383 QT = Ctx.getPointerType(QT);

384

385 QT = Ctx.getQualifiedType(QT, Quals);

386 return QT;

387 }

388

389 if (auto *MPT = dyn_cast(QT.getTypePtr())) {

390

392

395 WithGlobalNsPrefix);

396 QT = Ctx.getMemberPointerType(QT, Class.getTypePtr());

397

398 QT = Ctx.getQualifiedType(QT, Quals);

399 return QT;

400 }

401

402

403

404 if (isa(QT.getTypePtr())) {

405

406 bool IsLValueRefTy = isa(QT.getTypePtr());

409

410

411 if (IsLValueRefTy)

412 QT = Ctx.getLValueReferenceType(QT);

413 else

414 QT = Ctx.getRValueReferenceType(QT);

415

416 QT = Ctx.getQualifiedType(QT, Quals);

417 return QT;

418 }

419

420

421

422

423

424 while (isa(QT.getTypePtr())) {

425

427

428 QT = cast(QT.getTypePtr())->desugar();

429

430

431 QT = Ctx.getQualifiedType(QT, Quals);

432 }

433

435

436

437

441 if (const auto *ETypeInput = dyn_cast(QT.getTypePtr())) {

442 QT = ETypeInput->getNamedType();

444 Keyword = ETypeInput->getKeyword();

445 }

446

447

448

450 QT = Ctx.getQualifiedType(UT->getUnderlyingType(), PrefixQualifiers);

452 }

453

454

456 true ,

457 WithGlobalNsPrefix);

458

459

460

461 if (isa(QT.getTypePtr()) ||

462 isa(QT.getTypePtr())) {

463

464

465

466

468 Ctx, QT.getTypePtr(), WithGlobalNsPrefix);

470 }

472 QT = Ctx.getElaboratedType(Keyword, Prefix, QT);

473 }

474 QT = Ctx.getQualifiedType(QT, PrefixQualifiers);

475 return QT;

476}

477

481 bool WithGlobalNsPrefix) {

484}

485

486}

487}

Defines the C++ template declaration subclasses.

Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...

Declaration of a class template.

DeclContext - This is used only as base class of specific decl types that can act as declaration cont...

bool isTranslationUnit() const

DeclContext * getRedeclContext()

getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...

Decl - This represents one declaration (or definition), e.g.

DeclContext * getDeclContext()

Represent a C++ namespace.

Represents a C++ nested name specifier, such as "\::std::vector::".

static NestedNameSpecifier * Create(const ASTContext &Context, NestedNameSpecifier *Prefix, const IdentifierInfo *II)

Builds a specifier combining a prefix and an identifier.

static NestedNameSpecifier * GlobalSpecifier(const ASTContext &Context)

Returns the nested name specifier representing the global scope.

@ NamespaceAlias

A namespace alias, stored as a NamespaceAliasDecl*.

@ TypeSpec

A type, stored as a Type*.

@ TypeSpecWithTemplate

A type that was preceded by the 'template' keyword, stored as a Type*.

@ Super

Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.

@ Identifier

An identifier, stored as an IdentifierInfo*.

@ Global

The global specifier '::'. There is no stored value.

@ Namespace

A namespace, stored as a NamespaceDecl*.

A (possibly-)qualified type.

bool hasLocalQualifiers() const

Determine whether this particular QualType instance has any qualifiers, without looking through any t...

const Type * getTypePtr() const

Retrieves a pointer to the underlying (unqualified) type.

Qualifiers getQualifiers() const

Retrieve the set of qualifiers applied to this type.

static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)

Qualifiers getLocalQualifiers() const

Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...

Represents a template name as written in source code.

NestedNameSpecifier * getQualifier() const

Return the nested name specifier that qualifies this name.

bool hasTemplateKeyword() const

Whether the template name was prefixed by the "template" keyword.

The collection of all-type qualifiers we support.

Scope - A scope is a transient data structure that is used while parsing the program.

Represents the declaration of a struct/union/class/enum.

A template argument list.

unsigned size() const

Retrieve the number of template arguments in this template argument list.

Represents a template argument.

QualType getAsType() const

Retrieve the type for a type template argument.

TemplateName getAsTemplate() const

Retrieve the template name for a template name argument.

@ Template

The template argument is a template name that was provided for a template template parameter.

@ Type

The template argument is a type.

ArgKind getKind() const

Return the kind of stored template argument.

The base class of all kinds of template declarations (e.g., class, function, etc.).

Represents a C++ template name within the type system.

TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const

Retrieve the underlying template declaration that this template name refers to, if known.

QualifiedTemplateName * getAsQualifiedTemplateName() const

Retrieve the underlying qualified template name structure, if any.

UsingShadowDecl * getAsUsingShadowDecl() const

Retrieve the using shadow declaration through which the underlying template declaration is introduced...

Represents a declaration of a type.

const Type * getTypeForDecl() const

The base class of the type hierarchy.

CXXRecordDecl * getAsCXXRecordDecl() const

Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...

QualType getPointeeType() const

If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.

const T * getAs() const

Member-template getAs'.

Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...

static NestedNameSpecifier * createOuterNNS(const ASTContext &Ctx, const Decl *D, bool FullyQualify, bool WithGlobalNsPrefix)

static bool getFullyQualifiedTemplateName(const ASTContext &Ctx, TemplateName &TName, bool WithGlobalNsPrefix)

static const Type * getFullyQualifiedTemplateType(const ASTContext &Ctx, const Type *TypePtr, bool WithGlobalNsPrefix)

static NestedNameSpecifier * getFullyQualifiedNestedNameSpecifier(const ASTContext &Ctx, NestedNameSpecifier *scope, bool WithGlobalNsPrefix)

Return a fully qualified version of this name specifier.

static bool getFullyQualifiedTemplateArgument(const ASTContext &Ctx, TemplateArgument &Arg, bool WithGlobalNsPrefix)

static NestedNameSpecifier * createNestedNameSpecifierForScopeOf(const ASTContext &Ctx, const Decl *decl, bool FullyQualified, bool WithGlobalNsPrefix)

Create a nested name specifier for the declaring context of the type.

std::string getFullyQualifiedName(QualType QT, const ASTContext &Ctx, const PrintingPolicy &Policy, bool WithGlobalNsPrefix=false)

Get the fully qualified name for a type.

static NestedNameSpecifier * createNestedNameSpecifier(const ASTContext &Ctx, const NamespaceDecl *Namesp, bool WithGlobalNsPrefix)

Create a NestedNameSpecifier for Namesp and its enclosing scopes.

QualType getFullyQualifiedType(QualType QT, const ASTContext &Ctx, bool WithGlobalNsPrefix=false)

Generates a QualType that can be used to name the same type if used at the end of the current transla...

const internal::VariadicAllOfMatcher< Decl > decl

Matches declarations.

The JSON file list parser is used to communicate input to InstallAPI.

ElaboratedTypeKeyword

The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...

@ None

No keyword precedes the qualified type name.

@ Class

The "class" keyword introduces the elaborated-type-specifier.

Describes how types, statements, expressions, and declarations should be printed.