Skip to content

Commit 6b0d311

Browse files
HackerpilotWebFreak001
authored andcommitted
Support parsing named function and template arguments.
1 parent c6750b1 commit 6b0d311

File tree

6 files changed

+250
-43
lines changed

6 files changed

+250
-43
lines changed

src/dparse/ast.d

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,10 @@ abstract class ASTVisitor
305305
/** */ void visit(const Module module_) { module_.accept(this); }
306306
/** */ void visit(const ModuleDeclaration moduleDeclaration) { moduleDeclaration.accept(this); }
307307
/** */ void visit(const MulExpression mulExpression) { mulExpression.accept(this); }
308+
/** */ void visit(const NamedArgument argument) { argument.accept(this); }
309+
/** */ void visit(const NamedArgumentList argument) { argument.accept(this); }
310+
/** */ void visit(const NamedTemplateArgumentList templateArgumentList) { templateArgumentList.accept(this); }
311+
/** */ void visit(const NamedTemplateArgument templateArgument) { templateArgument.accept(this); }
308312
/** */ void visit(const NamespaceList namespaceList) { namespaceList.accept(this); }
309313
/** */ void visit(const NewAnonClassExpression newAnonClassExpression) { newAnonClassExpression.accept(this); }
310314
/** */ void visit(const NewExpression newExpression) { newExpression.accept(this); }
@@ -626,6 +630,33 @@ final class AnonymousEnumMember : BaseNode
626630
/** */ string comment;
627631
}
628632

633+
///
634+
final class NamedArgument : BaseNode
635+
{
636+
override void accept(ASTVisitor visitor) const
637+
{
638+
mixin (visitIfNotNull!(name, assignExpression));
639+
}
640+
mixin OpEquals;
641+
/** */ Token name;
642+
/** */ ExpressionNode assignExpression;
643+
/** */ size_t startLocation;
644+
/** */ size_t endLocation;
645+
}
646+
647+
///
648+
final class NamedArgumentList : BaseNode
649+
{
650+
override void accept(ASTVisitor visitor) const
651+
{
652+
mixin (visitIfNotNull!(items));
653+
}
654+
mixin OpEquals;
655+
/** */ NamedArgument[] items;
656+
/** */ size_t startLocation;
657+
/** */ size_t endLocation;
658+
}
659+
629660
///
630661
final class ArgumentList : BaseNode
631662
{
@@ -644,10 +675,10 @@ final class Arguments : BaseNode
644675
{
645676
override void accept(ASTVisitor visitor) const
646677
{
647-
mixin (visitIfNotNull!(argumentList));
678+
mixin (visitIfNotNull!(namedArgumentList));
648679
}
649680
mixin OpEquals;
650-
/** */ ArgumentList argumentList;
681+
/** */ NamedArgumentList namedArgumentList;
651682
}
652683

653684
///
@@ -3122,6 +3153,30 @@ final class TemplateAliasParameter : BaseNode
31223153
mixin OpEquals;
31233154
}
31243155

3156+
///
3157+
final class NamedTemplateArgument : BaseNode
3158+
{
3159+
override void accept(ASTVisitor visitor) const
3160+
{
3161+
mixin (visitIfNotNull!(name, type, assignExpression));
3162+
}
3163+
/** */ Token name;
3164+
/** */ Type type;
3165+
/** */ ExpressionNode assignExpression;
3166+
mixin OpEquals;
3167+
}
3168+
3169+
///
3170+
final class NamedTemplateArgumentList : BaseNode
3171+
{
3172+
override void accept(ASTVisitor visitor) const
3173+
{
3174+
mixin (visitIfNotNull!(items));
3175+
}
3176+
/** */ NamedTemplateArgument[] items;
3177+
mixin OpEquals;
3178+
}
3179+
31253180
///
31263181
final class TemplateArgument : BaseNode
31273182
{
@@ -3141,7 +3196,7 @@ final class TemplateArgumentList : BaseNode
31413196
{
31423197
mixin (visitIfNotNull!(items));
31433198
}
3144-
/** */ TemplateArgument[] items;
3199+
/** */ NamedTemplateArgument[] items;
31453200
mixin OpEquals;
31463201
}
31473202

@@ -3150,9 +3205,9 @@ final class TemplateArguments : BaseNode
31503205
{
31513206
override void accept(ASTVisitor visitor) const
31523207
{
3153-
mixin (visitIfNotNull!(templateArgumentList, templateSingleArgument));
3208+
mixin (visitIfNotNull!(namedTemplateArgumentList, templateSingleArgument));
31543209
}
3155-
/** */ TemplateArgumentList templateArgumentList;
3210+
/** */ NamedTemplateArgumentList namedTemplateArgumentList;
31563211
/** */ TemplateSingleArgument templateSingleArgument;
31573212
mixin OpEquals;
31583213
}
@@ -3472,7 +3527,7 @@ final class UnaryExpression : ExpressionNode
34723527
{
34733528
// TODO prefix, postfix, unary
34743529
mixin (visitIfNotNull!(primaryExpression, newExpression, deleteExpression,
3475-
castExpression, functionCallExpression, argumentList, unaryExpression,
3530+
castExpression, functionCallExpression, unaryExpression,
34763531
type, identifierOrTemplateInstance, assertExpression, throwExpression,
34773532
indexExpression));
34783533
}
@@ -3486,7 +3541,6 @@ final class UnaryExpression : ExpressionNode
34863541
/** */ DeleteExpression deleteExpression;
34873542
/** */ CastExpression castExpression;
34883543
/** */ FunctionCallExpression functionCallExpression;
3489-
/** */ ArgumentList argumentList;
34903544
/** */ IdentifierOrTemplateInstance identifierOrTemplateInstance;
34913545
/** */ AssertExpression assertExpression;
34923546
/** */ ThrowExpression throwExpression;

src/dparse/astprinter.d

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,16 +1134,20 @@ class XMLPrinter : ASTVisitor
11341134
override void visit(const ImportBindings importBindings) { mixin (tagAndAccept!"importBindings"); }
11351135
override void visit(const ImportDeclaration importDeclaration) { mixin (tagAndAccept!"importDeclaration"); }
11361136
override void visit(const ImportExpression importExpression) { mixin (tagAndAccept!"importExpression"); }
1137-
override void visit(const IndexExpression indexExpression) { mixin (tagAndAccept!"indexExpression"); }
1138-
override void visit(const InStatement inStatement) { mixin (tagAndAccept!"inStatement"); }
11391137
override void visit(const InContractExpression inContractExpression) { mixin (tagAndAccept!"inContractExpression"); }
1138+
override void visit(const IndexExpression indexExpression) { mixin (tagAndAccept!"indexExpression"); }
11401139
override void visit(const InOutContractExpression inOutContractExpression) { mixin (tagAndAccept!"inOutContractExpression"); }
1140+
override void visit(const InStatement inStatement) { mixin (tagAndAccept!"inStatement"); }
11411141
override void visit(const KeyValuePairs keyValuePairs) { mixin (tagAndAccept!"keyValuePairs"); }
1142+
override void visit(const LastCatch lastCatch) { mixin (tagAndAccept!"lastCatch"); }
11421143
override void visit(const MixinExpression mixinExpression) { mixin (tagAndAccept!"mixinExpression"); }
11431144
override void visit(const MixinTemplateDeclaration mixinTemplateDeclaration) { mixin (tagAndAccept!"mixinTemplateDeclaration"); }
11441145
override void visit(const MixinTemplateName mixinTemplateName) { mixin (tagAndAccept!"mixinTemplateName"); }
11451146
override void visit(const ModuleDeclaration moduleDeclaration) { mixin (tagAndAccept!"moduleDeclaration"); }
1146-
override void visit(const LastCatch lastCatch) { mixin (tagAndAccept!"lastCatch"); }
1147+
override void visit(const NamedArgumentList namedArgumentList) { mixin (tagAndAccept!"namedArgumentList"); }
1148+
override void visit(const NamedArgument namedArgument) { mixin (tagAndAccept!"namedArgument"); }
1149+
override void visit(const NamedTemplateArgumentList namedTemplateArgumentList) { mixin (tagAndAccept!"namedTemplateArgumentList"); }
1150+
override void visit(const NamedTemplateArgument namedTemplateArgument) { mixin (tagAndAccept!"namedTemplateArgument"); }
11471151
override void visit(const NewExpression newExpression) { mixin (tagAndAccept!"newExpression"); }
11481152
override void visit(const NonVoidInitializer nonVoidInitializer) { mixin (tagAndAccept!"nonVoidInitializer"); }
11491153
override void visit(const Operands operands) { mixin (tagAndAccept!"operands"); }

src/dparse/formatter.d

Lines changed: 57 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,29 @@ class Formatter(Sink)
244244
}
245245
}
246246

247+
void format(const NamedArgument argument)
248+
{
249+
debug(verbose) writeln("NamedArgument");
250+
251+
if (argument.name != tok!"")
252+
{
253+
format(argument.name);
254+
put(": ");
255+
}
256+
format(argument.assignExpression);
257+
}
258+
259+
void format(const NamedArgumentList argumentList)
260+
{
261+
debug(verbose) writeln("NamedArgumentList");
262+
263+
foreach(count, arg; argumentList.items)
264+
{
265+
if (count) put(", ");
266+
format(arg);
267+
}
268+
}
269+
247270
void format(const ArgumentList argumentList)
248271
{
249272
debug(verbose) writeln("ArgumentList");
@@ -260,7 +283,7 @@ class Formatter(Sink)
260283
debug(verbose) writeln("Arguments");
261284

262285
put("(");
263-
if (arguments.argumentList) format(arguments.argumentList);
286+
if (arguments.namedArgumentList) format(arguments.namedArgumentList);
264287
put(")");
265288
}
266289

@@ -3029,6 +3052,21 @@ class Formatter(Sink)
30293052
}
30303053
}
30313054

3055+
void format(const NamedTemplateArgument namedTemplateArgument)
3056+
{
3057+
debug(verbose) writeln("NamedTemplateArgument");
3058+
with(namedTemplateArgument)
3059+
{
3060+
if (name != tok!"")
3061+
{
3062+
put(name.text);
3063+
put(": ");
3064+
}
3065+
if (type) format(type);
3066+
if (assignExpression) format(assignExpression);
3067+
}
3068+
}
3069+
30323070
void format(const TemplateArgument templateArgument)
30333071
{
30343072
debug(verbose) writeln("TemplateArgument");
@@ -3045,6 +3083,19 @@ class Formatter(Sink)
30453083
}
30463084
}
30473085

3086+
void format(const NamedTemplateArgumentList namedTemplateArgumentList, bool parens = true)
3087+
{
3088+
debug(verbose) writeln("NamedTemplateArgumentList");
3089+
3090+
if (parens) put("!(");
3091+
foreach(count, arg; namedTemplateArgumentList.items)
3092+
{
3093+
if (count) put(", ");
3094+
format(arg);
3095+
}
3096+
if (parens) put(")");
3097+
}
3098+
30483099
void format(const TemplateArgumentList templateArgumentList, bool parens = true)
30493100
{
30503101
debug(verbose) writeln("TemplateArgumentList");
@@ -3069,7 +3120,7 @@ class Formatter(Sink)
30693120

30703121
with(templateArguments)
30713122
{
3072-
if (templateArgumentList) format(templateArgumentList);
3123+
if (namedTemplateArgumentList) format(namedTemplateArgumentList);
30733124
else if (templateSingleArgument) format(templateSingleArgument);
30743125
else put("!()");
30753126
}
@@ -3580,23 +3631,12 @@ class Formatter(Sink)
35803631
{
35813632
if (prefix != tok!"") format(prefix);
35823633

3583-
if (type)
3634+
if (type && identifierOrTemplateInstance)
35843635
{
35853636
// handle things like (void*).sizeof
3586-
if (identifierOrTemplateInstance)
3587-
{
3588-
put("(");
3589-
format(type);
3590-
put(")");
3591-
}
3592-
else
3593-
{
3594-
format(type);
3595-
put("(");
3596-
if (argumentList)
3597-
format(argumentList);
3598-
put(")");
3599-
}
3637+
put("(");
3638+
format(type);
3639+
put(")");
36003640
}
36013641

36023642
if (primaryExpression) format(primaryExpression);

0 commit comments

Comments
 (0)