@@ -120,8 +120,9 @@ TypeRepr *TypeRepr::getWithoutParens() const {
120120}
121121
122122bool TypeRepr::isSimpleUnqualifiedIdentifier (Identifier identifier) const {
123- if (auto *identTR = dyn_cast<SimpleIdentTypeRepr>(this )) {
124- if (identTR->getNameRef ().getBaseIdentifier () == identifier) {
123+ if (auto *unqualIdentTR = dyn_cast<UnqualifiedIdentTypeRepr>(this )) {
124+ if (!unqualIdentTR->hasGenericArgList () &&
125+ unqualIdentTR->getNameRef ().getBaseIdentifier () == identifier) {
125126 return true ;
126127 }
127128 }
@@ -130,8 +131,9 @@ bool TypeRepr::isSimpleUnqualifiedIdentifier(Identifier identifier) const {
130131}
131132
132133bool TypeRepr::isSimpleUnqualifiedIdentifier (StringRef str) const {
133- if (auto *identTR = dyn_cast<SimpleIdentTypeRepr>(this )) {
134- if (identTR->getNameRef ().getBaseIdentifier ().is (str)) {
134+ if (auto *unqualIdentTR = dyn_cast<UnqualifiedIdentTypeRepr>(this )) {
135+ if (!unqualIdentTR->hasGenericArgList () &&
136+ unqualIdentTR->getNameRef ().getBaseIdentifier ().is (str)) {
135137 return true ;
136138 }
137139 }
@@ -241,17 +243,16 @@ unsigned DeclRefTypeRepr::getNumGenericArgs() const {
241243}
242244
243245bool DeclRefTypeRepr::hasGenericArgList () const {
244- return Bits.DeclRefTypeRepr .NumGenericArgs ||
245- Bits.DeclRefTypeRepr .HasAngleBrackets ;
246+ return (getNumGenericArgs () != 0 ) || hasAngleBrackets ();
246247}
247248
248249ArrayRef<TypeRepr *> DeclRefTypeRepr::getGenericArgs () const {
249250 if (getNumGenericArgs () == 0 ) {
250251 return {};
251252 }
252253
253- if (auto *genericITR = dyn_cast<GenericIdentTypeRepr >(this )) {
254- return genericITR ->getGenericArgs ();
254+ if (auto *unqualIdentTR = dyn_cast<UnqualifiedIdentTypeRepr >(this )) {
255+ return unqualIdentTR ->getGenericArgs ();
255256 }
256257
257258 return cast<MemberTypeRepr>(this )->getGenericArgs ();
@@ -266,8 +267,8 @@ SourceRange DeclRefTypeRepr::getAngleBrackets() const {
266267 return SourceRange ();
267268 }
268269
269- if (auto *genericITR = dyn_cast<GenericIdentTypeRepr >(this )) {
270- return genericITR ->getAngleBrackets ();
270+ if (auto *unqualIdentTR = dyn_cast<UnqualifiedIdentTypeRepr >(this )) {
271+ return unqualIdentTR ->getAngleBrackets ();
271272 }
272273
273274 return cast<MemberTypeRepr>(this )->getAngleBrackets ();
@@ -277,6 +278,15 @@ SourceLoc DeclRefTypeRepr::getLocImpl() const {
277278 return NameLoc.getBaseNameLoc ();
278279}
279280
281+ SourceLoc DeclRefTypeRepr::getEndLocImpl () const {
282+ const auto range = getAngleBrackets ();
283+ if (range.isValid ()) {
284+ return range.End ;
285+ }
286+
287+ return getNameLoc ().getEndLoc ();
288+ }
289+
280290static void printTypeRepr (const TypeRepr *TyR, ASTPrinter &Printer,
281291 const PrintOptions &Opts) {
282292 if (TyR == nullptr )
@@ -476,46 +486,60 @@ TupleTypeRepr *TupleTypeRepr::createEmpty(const ASTContext &C,
476486 return create (C, {}, Parens);
477487}
478488
489+ UnqualifiedIdentTypeRepr::UnqualifiedIdentTypeRepr (DeclNameRef Name,
490+ DeclNameLoc NameLoc)
491+ : DeclRefTypeRepr(TypeReprKind::UnqualifiedIdent, Name, NameLoc,
492+ /* NumGenericArgs=*/ 0 ,
493+ /* HasAngleBrackets=*/ false ) {}
494+
495+ UnqualifiedIdentTypeRepr::UnqualifiedIdentTypeRepr (
496+ DeclNameRef Name, DeclNameLoc NameLoc, ArrayRef<TypeRepr *> GenericArgs,
497+ SourceRange AngleBrackets)
498+ : DeclRefTypeRepr(TypeReprKind::UnqualifiedIdent, Name, NameLoc,
499+ /* NumGenericArgs=*/ GenericArgs.size(),
500+ /* HasAngleBrackets=*/ AngleBrackets.isValid()) {
501+ if (AngleBrackets.isValid ()) {
502+ *getTrailingObjects<SourceRange>() = AngleBrackets;
503+ }
504+
505+ #ifndef NDEBUG
506+ for (auto *repr : GenericArgs) {
507+ assert (repr);
508+ }
509+ #endif
510+
511+ if (!GenericArgs.empty ()) {
512+ std::uninitialized_copy (GenericArgs.begin (), GenericArgs.end (),
513+ getTrailingObjects<TypeRepr *>());
514+ }
515+ }
516+
479517UnqualifiedIdentTypeRepr *UnqualifiedIdentTypeRepr::create (const ASTContext &C,
480518 DeclNameLoc NameLoc,
481519 DeclNameRef Name) {
482- return new (C) SimpleIdentTypeRepr (NameLoc, Name );
520+ return new (C) UnqualifiedIdentTypeRepr (Name, NameLoc );
483521}
484522
485523UnqualifiedIdentTypeRepr *UnqualifiedIdentTypeRepr::create (
486524 const ASTContext &C, DeclNameLoc NameLoc, DeclNameRef Name,
487525 ArrayRef<TypeRepr *> GenericArgs, SourceRange AngleBrackets) {
488- if (AngleBrackets.isInvalid () && GenericArgs.empty ()) {
489- return new (C) SimpleIdentTypeRepr (NameLoc, Name);
490- }
491-
492- return GenericIdentTypeRepr::create (C, NameLoc, Name, GenericArgs,
493- AngleBrackets);
526+ const auto size = totalSizeToAlloc<TypeRepr *, SourceRange>(
527+ GenericArgs.size (), AngleBrackets.isValid () ? 1 : 0 );
528+ auto *mem = C.Allocate (size, alignof (UnqualifiedIdentTypeRepr));
529+ return new (mem)
530+ UnqualifiedIdentTypeRepr (Name, NameLoc, GenericArgs, AngleBrackets);
494531}
495532
496- GenericIdentTypeRepr::GenericIdentTypeRepr (DeclNameLoc Loc, DeclNameRef Id,
497- ArrayRef<TypeRepr *> GenericArgs,
498- SourceRange AngleBrackets)
499- : UnqualifiedIdentTypeRepr(TypeReprKind::GenericIdent, Loc, Id,
500- /* NumGenericArgs=*/ GenericArgs.size(),
501- /* HasAngleBrackets=*/ AngleBrackets.isValid()),
502- AngleBrackets(AngleBrackets) {
503- #ifndef NDEBUG
504- for (auto arg : GenericArgs)
505- assert (arg != nullptr );
506- #endif
507- std::uninitialized_copy (GenericArgs.begin (), GenericArgs.end (),
508- getTrailingObjects<TypeRepr *>());
533+ ArrayRef<TypeRepr *> UnqualifiedIdentTypeRepr::getGenericArgs () const {
534+ return {getTrailingObjects<TypeRepr *>(), getNumGenericArgs ()};
509535}
510536
511- GenericIdentTypeRepr *GenericIdentTypeRepr::create (const ASTContext &C,
512- DeclNameLoc Loc,
513- DeclNameRef Id,
514- ArrayRef<TypeRepr*> GenericArgs,
515- SourceRange AngleBrackets) {
516- auto size = totalSizeToAlloc<TypeRepr*>(GenericArgs.size ());
517- auto mem = C.Allocate (size, alignof (GenericIdentTypeRepr));
518- return new (mem) GenericIdentTypeRepr (Loc, Id, GenericArgs, AngleBrackets);
537+ SourceRange UnqualifiedIdentTypeRepr::getAngleBrackets () const {
538+ if (hasAngleBrackets ()) {
539+ return *getTrailingObjects<SourceRange>();
540+ }
541+
542+ return SourceRange ();
519543}
520544
521545MemberTypeRepr::MemberTypeRepr (TypeRepr *Base, DeclNameRef Name,
@@ -532,6 +556,12 @@ MemberTypeRepr::MemberTypeRepr(TypeRepr *Base, DeclNameRef Name,
532556 *getTrailingObjects<SourceRange>() = AngleBrackets;
533557 }
534558
559+ #ifndef NDEBUG
560+ for (auto *repr : GenericArgs) {
561+ assert (repr);
562+ }
563+ #endif
564+
535565 if (!GenericArgs.empty ()) {
536566 std::uninitialized_copy (GenericArgs.begin (), GenericArgs.end (),
537567 getTrailingObjects<TypeRepr *>());
@@ -589,15 +619,6 @@ SourceLoc MemberTypeRepr::getStartLocImpl() const {
589619 return getBase ()->getStartLoc ();
590620}
591621
592- SourceLoc MemberTypeRepr::getEndLocImpl () const {
593- const auto range = getAngleBrackets ();
594- if (range.isValid ()) {
595- return range.End ;
596- }
597-
598- return getNameLoc ().getEndLoc ();
599- }
600-
601622PackTypeRepr::PackTypeRepr (SourceLoc keywordLoc, SourceRange braceLocs,
602623 ArrayRef<TypeRepr*> elements)
603624 : TypeRepr(TypeReprKind::Pack),
0 commit comments