@@ -576,7 +576,6 @@ extractInfo(
576
576
Info& I,
577
577
const NamedDecl* D)
578
578
{
579
- getParentNamespaces (I.Namespace , D);
580
579
if (! shouldSerializeInfo (D))
581
580
return false ;
582
581
if (! extractSymbolID (D, I.id ))
@@ -597,51 +596,67 @@ getParentNamespaces(
597
596
const DeclContext* DC = D->getDeclContext ();
598
597
do
599
598
{
600
- // KRYSTIAN TODO: this can be a switch using DeclContext::getDeclKind
601
- if ( const auto * N = dyn_cast<NamespaceDecl>(DC ))
599
+ SymbolID id = SymbolID::zero;
600
+ switch (DC-> getDeclKind ( ))
602
601
{
603
-
604
- Namespaces.emplace_back (
605
- extractSymbolID (N));
606
- }
607
- else if (const auto * N = dyn_cast<ClassTemplateSpecializationDecl>(DC);
608
- N && N->getSpecializationKind () == TSK_ImplicitInstantiation)
602
+ default :
603
+ // we consider all other DeclContexts to be "transparent"
604
+ // and do not include them in the list of parents.
605
+ continue ;
606
+ // the TranslationUnit DeclContext
607
+ // is the global namespace; use SymbolID::zero
608
+ case Decl::TranslationUnit:
609
+ break ;
610
+ // special case for an explicit specializations of
611
+ // a member of an implicit instantiation.
612
+ case Decl::ClassTemplateSpecialization:
613
+ case Decl::ClassTemplatePartialSpecialization:
614
+ if (const auto * S = dyn_cast<ClassTemplateSpecializationDecl>(DC);
615
+ S && S->getSpecializationKind () == TSK_ImplicitInstantiation)
609
616
{
617
+ // KRYSTIAN FIXME: i'm pretty sure DeclContext::getDeclKind()
618
+ // will never be Decl::ClassTemplatePartialSpecialization for
619
+ // implicit instantiations; instead, the ClassTemplatePartialSpecializationDecl
620
+ // is accessible through S->getSpecializedTemplateOrPartial
621
+ // if the implicit instantiation used a partially specialized template,
622
+ Assert (DC->getDeclKind () != Decl::ClassTemplatePartialSpecialization);
610
623
// if the containing context is an implicit specialization,
611
624
// get the template from which it was instantiated
612
- const CXXRecordDecl* RD = N ->getTemplateInstantiationPattern ();
625
+ const CXXRecordDecl* RD = S ->getTemplateInstantiationPattern ();
613
626
#if 0
614
627
std::vector<TArg> args;
615
- buildTemplateArgs(args, N ->getTemplateArgs().asArray());
628
+ buildTemplateArgs(args, S ->getTemplateArgs().asArray());
616
629
SymbolID primary = extractSymbolID(RD);
617
630
#endif
618
-
619
- Namespaces.emplace_back (
620
- // extractSymbolID(N));
621
- extractSymbolID (RD));
622
- }
623
- else if (const auto * N = dyn_cast<CXXRecordDecl>(DC))
624
- {
625
- Namespaces.emplace_back (
626
- extractSymbolID (N));
627
- }
628
- else if (const auto * N = dyn_cast<FunctionDecl>(DC))
629
- {
630
- Namespaces.emplace_back (
631
- extractSymbolID (N));
631
+ Assert (RD);
632
+ extractSymbolID (RD, id);
633
+ break ;
632
634
}
633
- else if (const auto * N = dyn_cast<EnumDecl>(DC))
635
+ // we should never encounter a Record
636
+ // that is not a CXXRecord
637
+ // case Decl::Record:
638
+ case Decl::Namespace:
639
+ case Decl::CXXRecord:
640
+ case Decl::Enum:
641
+ // we currently don't handle local classes,
642
+ // but will at some point. only functions that may
643
+ // be declared to return a placeholder for a deduced type
644
+ // can return local classes, so ignore other function DeclContexts.
645
+ // deduction guides, constructors, and destructors do not have
646
+ // declared return types, so we do not need to consider them.
647
+ case Decl::Function:
648
+ case Decl::CXXMethod:
649
+ case Decl::CXXConversion:
634
650
{
635
- Namespaces.emplace_back (
636
- extractSymbolID (N));
651
+ Assert (isa<Decl>(DC));
652
+ extractSymbolID (cast<Decl>(DC), id);
653
+ break ;
637
654
}
638
- else if (isa<TranslationUnitDecl>(DC))
639
- {
640
- Namespaces.emplace_back (
641
- SymbolID::zero);
642
655
}
656
+ Namespaces.emplace_back (id);
643
657
}
644
658
while ((DC = DC->getParent ()));
659
+ // print_debug("\n");
645
660
}
646
661
647
662
// ------------------------------------------------
@@ -746,6 +761,8 @@ buildRecord(
746
761
747
762
extractBases (I, D);
748
763
764
+ getParentNamespaces (I.Namespace , D);
765
+
749
766
insertBitcode (ex_, writeBitcode (I));
750
767
insertBitcode (ex_, writeParent (I, A));
751
768
}
@@ -893,6 +910,9 @@ buildNamespace(
893
910
return ;
894
911
if (D->isAnonymousNamespace ())
895
912
I.Name = " @nonymous_namespace" ; // VFALCO BAD!
913
+
914
+ getParentNamespaces (I.Namespace , D);
915
+
896
916
insertBitcode (ex_, writeBitcode (I));
897
917
insertBitcode (ex_, writeParent (I));
898
918
}
@@ -935,6 +955,7 @@ buildFriend(
935
955
getParentNamespaces(P.Namespace, ND, isInAnonymous);
936
956
Assert(isInAnonymous == ND->isInAnonymousNamespace());
937
957
#else
958
+ getParentNamespaces (I.Namespace , FD);
938
959
getParentNamespaces (P.Namespace , ND);
939
960
#endif
940
961
insertBitcode (ex_, writeBitcode (I));
@@ -992,6 +1013,9 @@ buildEnum(
992
1013
I.BaseType = TypeInfo (Name);
993
1014
}
994
1015
parseEnumerators (I, D);
1016
+
1017
+ getParentNamespaces (I.Namespace , D);
1018
+
995
1019
insertBitcode (ex_, writeBitcode (I));
996
1020
insertBitcode (ex_, writeParent (I, A));
997
1021
}
@@ -1016,6 +1040,8 @@ buildField(
1016
1040
// KRYSTIAN FIXME: isNodiscard should be isMaybeUnused
1017
1041
I.specs .isNodiscard = D->hasAttr <UnusedAttr>();
1018
1042
1043
+ getParentNamespaces (I.Namespace , D);
1044
+
1019
1045
insertBitcode (ex_, writeBitcode (I));
1020
1046
insertBitcode (ex_, writeParent (I, A));
1021
1047
}
@@ -1037,6 +1063,9 @@ buildVar(
1037
1063
I.Type = getTypeInfoForType (
1038
1064
D->getTypeSourceInfo ()->getType ());
1039
1065
I.specs .storageClass = D->getStorageClass ();
1066
+
1067
+ getParentNamespaces (I.Namespace , D);
1068
+
1040
1069
insertBitcode (ex_, writeBitcode (I));
1041
1070
insertBitcode (ex_, writeParent (I, A));
1042
1071
}
@@ -1052,6 +1081,8 @@ buildFunction(
1052
1081
if (! constructFunction (I, A, D))
1053
1082
return ;
1054
1083
1084
+ getParentNamespaces (I.Namespace , D);
1085
+
1055
1086
insertBitcode (ex_, writeBitcode (I));
1056
1087
insertBitcode (ex_, writeParent (I, A));
1057
1088
}
@@ -1083,6 +1114,9 @@ buildTypedef(
1083
1114
I.DefLoc .emplace (line, File_.str (), IsFileInRootDir_);
1084
1115
// KRYSTIAN NOTE: IsUsing is set by TraverseTypeAlias
1085
1116
// I.IsUsing = std::is_same_v<DeclTy, TypeAliasDecl>;
1117
+
1118
+ getParentNamespaces (I.Namespace , D);
1119
+
1086
1120
insertBitcode (ex_, writeBitcode (I));
1087
1121
insertBitcode (ex_, writeParent (I, D->getAccess ()));
1088
1122
}
@@ -1195,6 +1229,7 @@ Traverse(
1195
1229
1196
1230
FunctionInfo I (std::move (Template));
1197
1231
buildFunction (I, A, D);
1232
+
1198
1233
return true ;
1199
1234
}
1200
1235
0 commit comments