Skip to content

Commit 5bce2fb

Browse files
committed
Reused parameters between functions and their types (as Clang does).
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent c61c989 commit 5bce2fb

File tree

4 files changed

+23
-8
lines changed

4 files changed

+23
-8
lines changed

src/CppParser/Parser.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2889,10 +2889,16 @@ static clang::TypeLoc DesugarTypeLoc(const clang::TypeLoc& Loc)
28892889
Parameter* Parser::WalkParameter(const clang::ParmVarDecl* PVD,
28902890
const clang::SourceLocation& ParamStartLoc)
28912891
{
2892-
auto P = new Parameter();
2892+
using namespace clang;
2893+
2894+
auto P = walkedParameters[PVD];
2895+
if (P)
2896+
return P;
2897+
2898+
P = new Parameter();
28932899
P->name = PVD->getNameAsString();
28942900

2895-
clang::TypeLoc PTL;
2901+
TypeLoc PTL;
28962902
if (auto TSI = PVD->getTypeSourceInfo())
28972903
PTL = PVD->getTypeSourceInfo()->getTypeLoc();
28982904

@@ -2912,6 +2918,9 @@ Parameter* Parser::WalkParameter(const clang::ParmVarDecl* PVD,
29122918
P->defaultArgument = WalkExpression(PVD->getDefaultArg());
29132919
}
29142920
HandleDeclaration(PVD, P);
2921+
walkedParameters[PVD] = P;
2922+
auto Context = cast<Decl>(PVD->getDeclContext());
2923+
P->_namespace = static_cast<DeclarationContext*>(WalkDeclaration(Context));
29152924

29162925
return P;
29172926
}
@@ -3028,7 +3037,6 @@ void Parser::WalkFunction(const clang::FunctionDecl* FD, Function* F,
30283037
for (const auto& VD : FD->parameters())
30293038
{
30303039
auto P = WalkParameter(VD, ParamStartLoc);
3031-
P->_namespace = F;
30323040
F->Parameters.push_back(P);
30333041

30343042
ParamStartLoc = VD->getLocEnd();
@@ -3093,11 +3101,11 @@ Function* Parser::WalkFunction(const clang::FunctionDecl* FD, bool IsDependent,
30933101
F = new Function();
30943102
HandleDeclaration(FD, F);
30953103

3096-
WalkFunction(FD, F, IsDependent);
3097-
30983104
if (AddToNamespace)
30993105
NS->Functions.push_back(F);
31003106

3107+
WalkFunction(FD, F, IsDependent);
3108+
31013109
return F;
31023110
}
31033111

@@ -3746,6 +3754,11 @@ Declaration* Parser::WalkDeclaration(const clang::Decl* D)
37463754
Decl = Existing;
37473755
break;
37483756
}
3757+
case Decl::TranslationUnit:
3758+
{
3759+
Decl = GetTranslationUnit(D);
3760+
break;
3761+
}
37493762
case Decl::Namespace:
37503763
{
37513764
auto ND = cast<NamespaceDecl>(D);

src/CppParser/Parser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ class Parser
162162
std::unordered_map<const clang::TemplateTypeParmDecl*, TypeTemplateParameter*> walkedTypeTemplateParameters;
163163
std::unordered_map<const clang::TemplateTemplateParmDecl*, TemplateTemplateParameter*> walkedTemplateTemplateParameters;
164164
std::unordered_map<const clang::NonTypeTemplateParmDecl*, NonTypeTemplateParameter*> walkedNonTypeTemplateParameters;
165+
std::unordered_map<const clang::ParmVarDecl*, Parameter*> walkedParameters;
165166
std::unordered_set<std::string> supportedStdTypes;
166167
};
167168

src/Generator.Tests/AST/TestAST.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -500,8 +500,9 @@ public void TestFunctionSpecifications()
500500
[Test]
501501
public void TestFunctionSpecializationInfo()
502502
{
503-
var functionWithSpecInfo = AstContext.FindFunction(
504-
"functionWithSpecInfo").First(f => !f.IsDependent);
503+
var functionWithSpecInfo = AstContext.TranslationUnits.Find(
504+
t => t.IsValid && t.FileName == "AST.h").Functions.First(
505+
f => f.Name == "functionWithSpecInfo" && !f.IsDependent);
505506
var @float = new QualifiedType(new BuiltinType(PrimitiveType.Float));
506507
Assert.That(functionWithSpecInfo.SpecializationInfo.Arguments.Count, Is.EqualTo(2));
507508
foreach (var arg in functionWithSpecInfo.SpecializationInfo.Arguments)

src/Generator/Generators/CLI/CLITypeReferences.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ private void GenerateInclude(ASTRecord<Declaration> record)
114114

115115
var translationUnit = decl.Namespace.TranslationUnit;
116116

117-
if (translationUnit.IsSystemHeader)
117+
if (translationUnit.IsSystemHeader || !translationUnit.IsValid)
118118
return;
119119

120120
if (!decl.IsGenerated)

0 commit comments

Comments
 (0)