Skip to content

Commit bbf1ea3

Browse files
committed
Translate lambda expressions
1 parent acc601f commit bbf1ea3

8 files changed

Lines changed: 160 additions & 57 deletions

File tree

‎src/cppconv/cppsemantic.d‎

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ void collectParameters(Tree tree, ref IteratePPVersions ppVersion,
418418
if (tree.content == "...")
419419
info.isVariadic = true;
420420
}
421-
else if (tree.nonterminalID == ParserWrapper.nonterminalIDFor!"ParametersAndQualifiers")
421+
else if (tree.nonterminalID.nonterminalIDAmong!("ParametersAndQualifiers", "LambdaParametersAndQualifiers"))
422422
{
423423
iteratePPVersions!collectParameters(tree.childs[0], ppVersion, semantic, info, hasDefault);
424424
iteratePPVersions!collectParameters(tree.childs[1], ppVersion, semantic, info, hasDefault);
@@ -505,7 +505,7 @@ void analyzeDeclarator(Tree tree, ref IteratePPVersions ppVersion,
505505
iteratePPVersions!analyzeDeclarator(tree.childs[ppVersion.combination.next(cast(uint)$)],
506506
ppVersion, semantic, info, type);
507507
}
508-
else if (tree.nonterminalID == ParserWrapper.nonterminalIDFor!"ParametersAndQualifiers")
508+
else if (tree.nonterminalID.nonterminalIDAmong!("ParametersAndQualifiers", "LambdaParametersAndQualifiers"))
509509
{
510510
info.anyIsFunction = true;
511511
info.parameterScope = semantic.currentScope.childScopeByTree[tree];
@@ -642,7 +642,7 @@ void analyzeDeclarator(Tree tree, ref IteratePPVersions ppVersion,
642642
else if (tree.nonterminalID == ParserWrapper.nonterminalIDFor!"NameIdentifier")
643643
{
644644
assert(info.name.length == 0, text(locationStr(tree.location), " ",
645-
info.name, " ", tree.childs[0].name));
645+
info.name, " ", tree.childs[0].content));
646646
assert(tree.childs.length == 1);
647647
assert(tree.childs[0].nodeType == NodeType.token);
648648
if (info.inNestedNameSpecifier)
@@ -1079,7 +1079,7 @@ void analyzeSimpleDeclaration(Tree tree, immutable(Formula)* condition,
10791079
{
10801080
assert(false);
10811081
}
1082-
else if (tree.name.endsWith("FunctionBody"))
1082+
else if (tree.nonterminalID.nonterminalIDAmong!("FunctionBody", "LambdaBody"))
10831083
{
10841084
if (ppVersion.combination.prefixDone)
10851085
return;
@@ -1286,6 +1286,7 @@ void checkValidParam(Tree tree, ref IteratePPVersions ppVersion,
12861286
else if (tree.name.startsWith("NoptrDeclarator") || tree.name.startsWith("PtrDeclarator")
12871287
|| tree.name.startsWith("FunctionDeclarator")
12881288
|| tree.nonterminalID == ParserWrapper.nonterminalIDFor!"ParametersAndQualifiers"
1289+
|| tree.nonterminalID == ParserWrapper.nonterminalIDFor!"LambdaParametersAndQualifiers"
12891290
|| tree.nonterminalID == ParserWrapper.nonterminalIDFor!"Parameters"
12901291
|| tree.nonterminalID == ParserWrapper.nonterminalIDFor!"ParameterDeclaration"
12911292
|| tree.nonterminalID == ParserWrapper.nonterminalIDFor!"ParameterDeclarationAbstract"
@@ -1413,7 +1414,7 @@ Tree getRealParent(Tree tree, Semantic semantic, size_t* indexInParent = null)
14131414
return realParent;
14141415
}
14151416

1416-
string normalizeBuiltinTypeParts(string[] parts)
1417+
string normalizeBuiltinTypeParts(string[] parts, LocationX start)
14171418
{
14181419
bool isUnsigned;
14191420
bool isSigned;
@@ -1424,13 +1425,13 @@ string normalizeBuiltinTypeParts(string[] parts)
14241425
if (part == "unsigned")
14251426
{
14261427
isUnsigned = true;
1427-
assert(!isSigned);
1428+
assert(!isSigned, locationStr(start));
14281429
//isSigned = false;
14291430
}
14301431
else if (part == "signed")
14311432
{
14321433
//isUnsigned = false;
1433-
assert(!isUnsigned);
1434+
assert(!isUnsigned, locationStr(start));
14341435
isSigned = true;
14351436
}
14361437
else if (part == "short")
@@ -1451,7 +1452,7 @@ string normalizeBuiltinTypeParts(string[] parts)
14511452
part = part[0 .. $ - 2];
14521453
if (baseType.length && baseType == part)
14531454
continue;
1454-
assert(baseType.length == 0, text(parts));
1455+
assert(baseType.length == 0, text(parts, " ", locationStr(start)));
14551456
baseType = part;
14561457
}
14571458
}
@@ -1461,25 +1462,25 @@ string normalizeBuiltinTypeParts(string[] parts)
14611462
t ~= "unsigned_";
14621463
if (isSigned && baseType == "char")
14631464
t ~= "signed_";
1464-
assert(numShort == 0 || numLong == 0);
1465+
assert(numShort == 0 || numLong == 0, locationStr(start));
14651466
foreach (k; 0 .. numShort)
14661467
t ~= "short_";
14671468
foreach (k; 0 .. numLong)
14681469
t ~= "long_";
14691470
if (baseType.length == 0 || baseType == "int")
14701471
{
14711472
if (baseType.length == 0)
1472-
assert(numShort > 0 || numLong > 0 || isSigned || isUnsigned);
1473+
assert(numShort > 0 || numLong > 0 || isSigned || isUnsigned, locationStr(start));
14731474
if (t.length == 0)
14741475
t = "int";
14751476
else
14761477
t = t[0 .. $ - 1];
14771478
}
14781479
else
14791480
{
1480-
assert(numShort == 0);
1481+
assert(numShort == 0, locationStr(start));
14811482
assert(numLong == 0 || baseType == "double",
1482-
text(parts));
1483+
text(parts, " ", locationStr(start)));
14831484
t ~= baseType;
14841485
}
14851486
return t;
@@ -1495,7 +1496,7 @@ QualType getDeclSpecType(Semantic semantic, ref SimpleDeclarationInfo info)
14951496
}
14961497
else if (info.builtinTypeParts.length)
14971498
{
1498-
string t = normalizeBuiltinTypeParts(info.builtinTypeParts);
1499+
string t = normalizeBuiltinTypeParts(info.builtinTypeParts, info.start);
14991500
type = QualType(semantic.getBuiltinType(t), info.qualifiers);
15001501
}
15011502
return type;
@@ -2472,7 +2473,7 @@ string fullyQualifiedName(Semantic semantic, Declaration d)
24722473
app.put(name2 ~ "::");
24732474
else if(s.tree.nonterminalID == nonterminalIDFor!"TemplateDeclaration")
24742475
app.put("template param::");
2475-
else if(s.tree.nonterminalID == nonterminalIDFor!"ParametersAndQualifiers")
2476+
else if(s.tree.nonterminalID.nonterminalIDAmong!("ParametersAndQualifiers", "LambdaParametersAndQualifiers"))
24762477
app.put("function param::");
24772478
}
24782479
else if (s.parentScope is null)

‎src/cppconv/cppsemantic1.d‎

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ void runSemantic(ref SemanticRunInfo semantic, ref Tree tree, Tree parent,
372372
{
373373
runSemantic(semantic, c, tree, condition);
374374
}
375-
}, (MatchNonterminals!("ParametersAndQualifiers")) {
375+
}, (MatchNonterminals!("ParametersAndQualifiers", "LambdaParametersAndQualifiers")) {
376376
SemanticRunInfo semanticRun = semantic;
377377
Scope parameterScope;
378378
if (tree !in semantic.currentScope.childScopeByTree)
@@ -392,7 +392,7 @@ void runSemantic(ref SemanticRunInfo semantic, ref Tree tree, Tree parent,
392392
IteratePPVersions ppVersion = IteratePPVersions(combination, semantic.logicSystem,
393393
condition, semantic.instanceCondition, semantic.mergedTreeDatas);
394394

395-
if (!realParent.isValid || realParent.name != "FunctionDeclarator")
395+
if (!realParent.isValid || !realParent.nonterminalID.nonterminalIDAmong!("FunctionDeclarator", "FunctionDeclaratorTrailing"))
396396
continue;
397397
Tree declarator = realParent;
398398
while (declarator.isValid && declarator.hasChildWithName("innerDeclarator"))
@@ -473,7 +473,7 @@ void runSemantic(ref SemanticRunInfo semantic, ref Tree tree, Tree parent,
473473
MatchRealParentNonterminals!("SimpleDeclaration*",
474474
"MemberDeclaration*", "FunctionDefinitionHead",
475475
"ParameterDeclaration", "ParameterDeclarationAbstract", "Condition",
476-
"ForRangeDeclaration", "ExceptionDeclaration")) {
476+
"ForRangeDeclaration", "ExceptionDeclaration", "LambdaExpression")) {
477477
foreach (k, ref c; tree.childs)
478478
{
479479
if (tree.nonterminalID == ParserWrapper.nonterminalIDFor!"InitDeclarator" && k == 1)
@@ -722,10 +722,14 @@ void runSemantic(ref SemanticRunInfo semantic, ref Tree tree, Tree parent,
722722
}
723723
}
724724

725-
if (realParent.nonterminalID == nonterminalIDFor!"FunctionDefinitionHead")
725+
if (realParent.nonterminalID.nonterminalIDAmong!("FunctionDefinitionHead", "LambdaExpression"))
726726
{
727-
Tree functionDefinition = getRealParent(realParent, semantic);
728-
assert(functionDefinition.name.startsWith("FunctionDefinition"));
727+
Tree functionDefinition = realParent;
728+
if (realParent.nonterminalID.nonterminalIDAmong!("FunctionDefinitionHead"))
729+
{
730+
functionDefinition = getRealParent(realParent, semantic);
731+
assert(functionDefinition.name.startsWith("FunctionDefinition"));
732+
}
729733
Scope functionScope;
730734
if (functionDefinition !in targetScope.childScopeByTree)
731735
{
@@ -1230,7 +1234,7 @@ void runSemantic(ref SemanticRunInfo semantic, ref Tree tree, Tree parent,
12301234
runSemantic(semantic, c, tree, condition);
12311235
}
12321236
}
1233-
}, (MatchNonterminals!("FunctionBody")) {
1237+
}, (MatchNonterminals!("FunctionBody", "LambdaBody")) {
12341238
/*foreach (i;0..indent)
12351239
write(" ");
12361240
writeln("init func scope ", cast(void*)tree, " ", cast(void*)semantic.scopeByTree[tree]);*/

‎src/cppconv/dtypecode.d‎

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -483,31 +483,36 @@ DeclaratorData[] declaratorList(Tree declarator, immutable(Formula)* condition,
483483
codeBefore.write("]");
484484
}
485485
else if (declarator.nonterminalID.nonterminalIDAmong!("FunctionDeclarator",
486-
"FunctionAbstractDeclarator"))
486+
"FunctionDeclaratorTrailing", "FunctionAbstractDeclarator",
487+
"LambdaDeclarator"))
487488
{
488-
Tree c = declarator.childByName("innerDeclarator");
489-
if (c.isValid)
489+
if (declarator.hasChildWithName("innerDeclarator"))
490490
{
491-
if (data.sourceTokenManager.tokensLeft.data.length > 0)
492-
writeComments(codeBefore, data,
493-
data.sourceTokenManager.collectTokens(c.start));
494-
visitDeclarator(c);
491+
Tree c = declarator.childByName("innerDeclarator");
492+
if (c.isValid)
493+
{
494+
if (data.sourceTokenManager.tokensLeft.data.length > 0)
495+
writeComments(codeBefore, data,
496+
data.sourceTokenManager.collectTokens(c.start));
497+
visitDeclarator(c);
498+
}
495499
}
496-
if (declarator.childs[1].nonterminalID == CONDITION_TREE_NONTERMINAL_ID
497-
|| declarator.childs[1].childs[0].nonterminalID == CONDITION_TREE_NONTERMINAL_ID)
500+
Tree parameters = declarator.childByName("parameters");
501+
if (parameters.isValid && (parameters.nonterminalID == CONDITION_TREE_NONTERMINAL_ID
502+
|| parameters.childs[0].nonterminalID == CONDITION_TREE_NONTERMINAL_ID))
498503
{
499504
codeAfter.write("/+TODO: ParametersAndQualifiers ConditionTree+/");
500505
}
501-
else
506+
else if (parameters.isValid)
502507
{
503-
assert(declarator.childs[1].nonterminalID == nonterminalIDFor!"ParametersAndQualifiers",
508+
assert(parameters.nonterminalID.nonterminalIDAmong!("ParametersAndQualifiers", "LambdaParametersAndQualifiers"),
504509
locationStr(declarator.location));
505-
assert(declarator.childs[1].childs[0].nonterminalID == nonterminalIDFor!"Parameters",
510+
assert(parameters.childs[0].nonterminalID == nonterminalIDFor!"Parameters",
506511
locationStr(declarator.location));
507-
Tree paramsTree = declarator.childs[1].childs[0].childs[1];
512+
Tree paramsTree = parameters.childs[0].childs[1];
508513
assert(!paramsTree.isValid
509514
|| paramsTree.nodeType == NodeType.array);
510-
skipToken(codeBefore, data, declarator.childs[1].childs[0].childs[0]); // (
515+
skipToken(codeBefore, data, parameters.childs[0].childs[0]); // (
511516

512517
FunctionDeclaratorInfo functionDeclaratorInfo;
513518
findParams(declarator, condition, functionDeclaratorInfo, data, currentScope);
@@ -536,7 +541,7 @@ DeclaratorData[] declaratorList(Tree declarator, immutable(Formula)* condition,
536541
}
537542
codeMiddle.write("...");
538543
}
539-
skipToken(codeMiddle, data, declarator.childs[1].childs[0].childs[2]); // )
544+
skipToken(codeMiddle, data, parameters.childs[0].childs[2]); // )
540545

541546
if (functionDeclaratorInfo.attributeTrees.length)
542547
{
@@ -670,7 +675,7 @@ string translateBuiltin(string name, bool builtinCppTypes)
670675
}
671676
}
672677

673-
void translateBuiltinAll(ref ConditionMap!string codeType, ref ConditionMap!string realId, immutable(Formula)* condition, bool isConst, DWriterData data)
678+
void translateBuiltinAll(ref ConditionMap!string codeType, ref ConditionMap!string realId, immutable(Formula)* condition, bool isConst, DWriterData data, LocationX start)
674679
{
675680
auto semantic = data.semantic;
676681
auto logicSystem = semantic.logicSystem;
@@ -681,7 +686,7 @@ void translateBuiltinAll(ref ConditionMap!string codeType, ref ConditionMap!stri
681686
string name = e.data;
682687
if (name.startsWith("$builtin_"))
683688
{
684-
name = translateBuiltin(normalizeBuiltinTypeParts(name[9 .. $].split("$builtin_")), data.options.builtinCppTypes);
689+
name = translateBuiltin(normalizeBuiltinTypeParts(name[9 .. $].split("$builtin_"), start), data.options.builtinCppTypes);
685690
}
686691
if (isConst && name == "auto")
687692
name = ""; // const is enough
@@ -733,7 +738,7 @@ string typeToCode(QualType type, DWriterData data, immutable(Formula)* condition
733738
CodeWriter code;
734739
code.write("UnknownType!q{");
735740
ConditionMap!string realId;
736-
translateBuiltinAll(codeType, realId, condition, false, data);
741+
translateBuiltinAll(codeType, realId, condition, false, data, currentLoc.start);
737742
if (realId.entries.length)
738743
code.write(idMapToCode(realId, condition, data));
739744

@@ -1009,7 +1014,7 @@ string typeToCode(QualType type, DWriterData data, immutable(Formula)* condition
10091014
realId.add(condition, translation, semantic.logicSystem);
10101015
else
10111016
realId.add(condition, type.name, semantic.logicSystem);
1012-
translateBuiltinAll(codeType, realId, condition, isConst, data);
1017+
translateBuiltinAll(codeType, realId, condition, isConst, data, currentLoc.start);
10131018
realId.removeFalseEntries();
10141019

10151020
if (realId.entries.length == 0)

0 commit comments

Comments
 (0)