Skip to content

Commit c5bd179

Browse files
committed
parent namespaces are extracted last
1 parent e1d8c7f commit c5bd179

File tree

1 file changed

+67
-32
lines changed

1 file changed

+67
-32
lines changed

source/AST/ASTVisitor.cpp

Lines changed: 67 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,6 @@ extractInfo(
576576
Info& I,
577577
const NamedDecl* D)
578578
{
579-
getParentNamespaces(I.Namespace, D);
580579
if(! shouldSerializeInfo(D))
581580
return false;
582581
if(! extractSymbolID(D, I.id))
@@ -597,51 +596,67 @@ getParentNamespaces(
597596
const DeclContext* DC = D->getDeclContext();
598597
do
599598
{
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())
602601
{
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)
609616
{
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);
610623
// if the containing context is an implicit specialization,
611624
// get the template from which it was instantiated
612-
const CXXRecordDecl* RD = N->getTemplateInstantiationPattern();
625+
const CXXRecordDecl* RD = S->getTemplateInstantiationPattern();
613626
#if 0
614627
std::vector<TArg> args;
615-
buildTemplateArgs(args, N->getTemplateArgs().asArray());
628+
buildTemplateArgs(args, S->getTemplateArgs().asArray());
616629
SymbolID primary = extractSymbolID(RD);
617630
#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;
632634
}
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:
634650
{
635-
Namespaces.emplace_back(
636-
extractSymbolID(N));
651+
Assert(isa<Decl>(DC));
652+
extractSymbolID(cast<Decl>(DC), id);
653+
break;
637654
}
638-
else if(isa<TranslationUnitDecl>(DC))
639-
{
640-
Namespaces.emplace_back(
641-
SymbolID::zero);
642655
}
656+
Namespaces.emplace_back(id);
643657
}
644658
while((DC = DC->getParent()));
659+
// print_debug("\n");
645660
}
646661

647662
//------------------------------------------------
@@ -746,6 +761,8 @@ buildRecord(
746761

747762
extractBases(I, D);
748763

764+
getParentNamespaces(I.Namespace, D);
765+
749766
insertBitcode(ex_, writeBitcode(I));
750767
insertBitcode(ex_, writeParent(I, A));
751768
}
@@ -893,6 +910,9 @@ buildNamespace(
893910
return;
894911
if(D->isAnonymousNamespace())
895912
I.Name = "@nonymous_namespace"; // VFALCO BAD!
913+
914+
getParentNamespaces(I.Namespace, D);
915+
896916
insertBitcode(ex_, writeBitcode(I));
897917
insertBitcode(ex_, writeParent(I));
898918
}
@@ -935,6 +955,7 @@ buildFriend(
935955
getParentNamespaces(P.Namespace, ND, isInAnonymous);
936956
Assert(isInAnonymous == ND->isInAnonymousNamespace());
937957
#else
958+
getParentNamespaces(I.Namespace, FD);
938959
getParentNamespaces(P.Namespace, ND);
939960
#endif
940961
insertBitcode(ex_, writeBitcode(I));
@@ -992,6 +1013,9 @@ buildEnum(
9921013
I.BaseType = TypeInfo(Name);
9931014
}
9941015
parseEnumerators(I, D);
1016+
1017+
getParentNamespaces(I.Namespace, D);
1018+
9951019
insertBitcode(ex_, writeBitcode(I));
9961020
insertBitcode(ex_, writeParent(I, A));
9971021
}
@@ -1016,6 +1040,8 @@ buildField(
10161040
// KRYSTIAN FIXME: isNodiscard should be isMaybeUnused
10171041
I.specs.isNodiscard = D->hasAttr<UnusedAttr>();
10181042

1043+
getParentNamespaces(I.Namespace, D);
1044+
10191045
insertBitcode(ex_, writeBitcode(I));
10201046
insertBitcode(ex_, writeParent(I, A));
10211047
}
@@ -1037,6 +1063,9 @@ buildVar(
10371063
I.Type = getTypeInfoForType(
10381064
D->getTypeSourceInfo()->getType());
10391065
I.specs.storageClass = D->getStorageClass();
1066+
1067+
getParentNamespaces(I.Namespace, D);
1068+
10401069
insertBitcode(ex_, writeBitcode(I));
10411070
insertBitcode(ex_, writeParent(I, A));
10421071
}
@@ -1052,6 +1081,8 @@ buildFunction(
10521081
if(! constructFunction(I, A, D))
10531082
return;
10541083

1084+
getParentNamespaces(I.Namespace, D);
1085+
10551086
insertBitcode(ex_, writeBitcode(I));
10561087
insertBitcode(ex_, writeParent(I, A));
10571088
}
@@ -1083,6 +1114,9 @@ buildTypedef(
10831114
I.DefLoc.emplace(line, File_.str(), IsFileInRootDir_);
10841115
// KRYSTIAN NOTE: IsUsing is set by TraverseTypeAlias
10851116
// I.IsUsing = std::is_same_v<DeclTy, TypeAliasDecl>;
1117+
1118+
getParentNamespaces(I.Namespace, D);
1119+
10861120
insertBitcode(ex_, writeBitcode(I));
10871121
insertBitcode(ex_, writeParent(I, D->getAccess()));
10881122
}
@@ -1195,6 +1229,7 @@ Traverse(
11951229

11961230
FunctionInfo I(std::move(Template));
11971231
buildFunction(I, A, D);
1232+
11981233
return true;
11991234
}
12001235

0 commit comments

Comments
 (0)