Skip to content

Commit daa93a5

Browse files
LaurentTreguierdlang-bot
authored andcommitted
Implement DIP1009 correctly (#303) (#304)
Implement DIP1009 correctly (#303) merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
1 parent 4e6b58a commit daa93a5

File tree

3 files changed

+472
-274
lines changed

3 files changed

+472
-274
lines changed

src/dparse/ast.d

Lines changed: 113 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ abstract class ASTVisitor
170170
/** */ void visit(const AsmTypePrefix asmTypePrefix) { asmTypePrefix.accept(this); }
171171
/** */ void visit(const AsmUnaExp asmUnaExp) { asmUnaExp.accept(this); }
172172
/** */ void visit(const AsmXorExp asmXorExp) { asmXorExp.accept(this); }
173+
/** */ void visit(const AssertArguments assertArguments) { assertArguments.accept(this); }
173174
/** */ void visit(const AssertExpression assertExpression) { assertExpression.accept(this); }
174175
/** */ void visit(const AssignExpression assignExpression) { assignExpression.accept(this); }
175176
/** */ void visit(const AssocArrayLiteral assocArrayLiteral) { assocArrayLiteral.accept(this); }
@@ -179,7 +180,6 @@ abstract class ASTVisitor
179180
/** */ void visit(const AutoDeclaration autoDeclaration) { autoDeclaration.accept(this); }
180181
/** */ void visit(const AutoDeclarationPart autoDeclarationPart) { autoDeclarationPart.accept(this); }
181182
/** */ void visit(const BlockStatement blockStatement) { blockStatement.accept(this); }
182-
/** */ void visit(const BodyStatement bodyStatement) { bodyStatement.accept(this); }
183183
/** */ void visit(const BreakStatement breakStatement) { breakStatement.accept(this); }
184184
/** */ void visit(const BaseClass baseClass) { baseClass.accept(this); }
185185
/** */ void visit(const BaseClassList baseClassList) { baseClassList.accept(this); }
@@ -228,6 +228,7 @@ abstract class ASTVisitor
228228
/** */ void visit(const FunctionAttribute functionAttribute) { functionAttribute.accept(this); }
229229
/** */ void visit(const FunctionBody functionBody) { functionBody.accept(this); }
230230
/** */ void visit(const FunctionCallExpression functionCallExpression) { functionCallExpression.accept(this); }
231+
/** */ void visit(const FunctionContract functionContract) { functionContract.accept(this); }
231232
/** */ void visit(const FunctionDeclaration functionDeclaration) { functionDeclaration.accept(this); }
232233
/** */ void visit(const FunctionLiteralExpression functionLiteralExpression) { functionLiteralExpression.accept(this); }
233234
/** */ void visit(const GotoStatement gotoStatement) { gotoStatement.accept(this); }
@@ -242,7 +243,10 @@ abstract class ASTVisitor
242243
/** */ void visit(const ImportDeclaration importDeclaration) { importDeclaration.accept(this); }
243244
/** */ void visit(const ImportExpression importExpression) { importExpression.accept(this); }
244245
/** */ void visit(const IndexExpression indexExpression) { indexExpression.accept(this); }
246+
/** */ void visit(const InContractExpression inContractExpression) { inContractExpression.accept(this); }
245247
/** */ void visit(const InExpression inExpression) { inExpression.accept(this); }
248+
/** */ void visit(const InOutContractExpression inOutContractExpression) { inOutContractExpression.accept(this); }
249+
/** */ void visit(const InOutStatement inOutStatement) { inOutStatement.accept(this); }
246250
/** */ void visit(const InStatement inStatement) { inStatement.accept(this); }
247251
/** */ void visit(const Initialize initialize) { initialize.accept(this); }
248252
/** */ void visit(const Initializer initializer) { initializer.accept(this); }
@@ -255,6 +259,7 @@ abstract class ASTVisitor
255259
/** */ void visit(const LastCatch lastCatch) { lastCatch.accept(this); }
256260
/** */ void visit(const LinkageAttribute linkageAttribute) { linkageAttribute.accept(this); }
257261
/** */ void visit(const MemberFunctionAttribute memberFunctionAttribute) { memberFunctionAttribute.accept(this); }
262+
/** */ void visit(const MissingFunctionBody missingFunctionBody) { missingFunctionBody.accept(this); }
258263
/** */ void visit(const MixinDeclaration mixinDeclaration) { mixinDeclaration.accept(this); }
259264
/** */ void visit(const MixinExpression mixinExpression) { mixinExpression.accept(this); }
260265
/** */ void visit(const MixinTemplateDeclaration mixinTemplateDeclaration) { mixinTemplateDeclaration.accept(this); }
@@ -268,6 +273,7 @@ abstract class ASTVisitor
268273
/** */ void visit(const Operands operands) { operands.accept(this); }
269274
/** */ void visit(const OrExpression orExpression) { orExpression.accept(this); }
270275
/** */ void visit(const OrOrExpression orOrExpression) { orOrExpression.accept(this); }
276+
/** */ void visit(const OutContractExpression outContractExpression) { outContractExpression.accept(this); }
271277
/** */ void visit(const OutStatement outStatement) { outStatement.accept(this); }
272278
/** */ void visit(const ParameterAttribute parameterAttribute) { parameterAttribute.accept(this); }
273279
/** */ void visit(const Parameter parameter) { parameter.accept(this); }
@@ -287,6 +293,7 @@ abstract class ASTVisitor
287293
/** */ void visit(const ShiftExpression shiftExpression) { shiftExpression.accept(this); }
288294
/** */ void visit(const SingleImport singleImport) { singleImport.accept(this); }
289295
/** */ void visit(const Index index) { index.accept(this); }
296+
/** */ void visit(const SpecifiedFunctionBody specifiedFunctionBody) { specifiedFunctionBody.accept(this); }
290297
/** */ void visit(const Statement statement) { statement.accept(this); }
291298
/** */ void visit(const StatementNoCaseNoDefault statementNoCaseNoDefault) { statementNoCaseNoDefault.accept(this); }
292299
/** */ void visit(const StaticAssertDeclaration staticAssertDeclaration) { staticAssertDeclaration.accept(this); }
@@ -817,19 +824,30 @@ final class AsmXorExp : ExpressionNode
817824
}
818825

819826
///
820-
final class AssertExpression : ExpressionNode
827+
final class AssertArguments : ASTNode
821828
{
822829
override void accept(ASTVisitor visitor) const
823830
{
824831
mixin (visitIfNotNull!(assertion, message));
825832
}
826-
/** */ size_t line;
827-
/** */ size_t column;
828833
/** */ ExpressionNode assertion;
829834
/** */ ExpressionNode message;
830835
mixin OpEquals;
831836
}
832837

838+
///
839+
final class AssertExpression : ExpressionNode
840+
{
841+
override void accept(ASTVisitor visitor) const
842+
{
843+
mixin (visitIfNotNull!(assertArguments));
844+
}
845+
/** */ size_t line;
846+
/** */ size_t column;
847+
/** */ AssertArguments assertArguments;
848+
mixin OpEquals;
849+
}
850+
833851
///
834852
final class AssignExpression : ExpressionNode
835853
{
@@ -953,17 +971,6 @@ final class BlockStatement : ASTNode
953971
mixin OpEquals;
954972
}
955973

956-
///
957-
final class BodyStatement : ASTNode
958-
{
959-
override void accept(ASTVisitor visitor) const
960-
{
961-
mixin (visitIfNotNull!(blockStatement));
962-
}
963-
/** */ BlockStatement blockStatement;
964-
mixin OpEquals;
965-
}
966-
967974
///
968975
final class BreakStatement : ASTNode
969976
{
@@ -1671,14 +1678,11 @@ final class FunctionBody : ASTNode
16711678
{
16721679
override void accept(ASTVisitor visitor) const
16731680
{
1674-
mixin (visitIfNotNull!(inStatements, outStatements, bodyStatement,
1675-
blockStatement));
1681+
mixin (visitIfNotNull!(specifiedFunctionBody, missingFunctionBody));
16761682
}
16771683

1678-
/** */ BlockStatement blockStatement;
1679-
/** */ BodyStatement bodyStatement;
1680-
/** */ OutStatement[] outStatements;
1681-
/** */ InStatement[] inStatements;
1684+
/** */ SpecifiedFunctionBody specifiedFunctionBody;
1685+
/** */ MissingFunctionBody missingFunctionBody;
16821686
mixin OpEquals;
16831687
}
16841688

@@ -1696,6 +1700,18 @@ final class FunctionCallExpression : ExpressionNode
16961700
mixin OpEquals;
16971701
}
16981702

1703+
///
1704+
final class FunctionContract : ASTNode
1705+
{
1706+
override void accept(ASTVisitor visitor) const
1707+
{
1708+
mixin (visitIfNotNull!(inOutContractExpression, inOutStatement));
1709+
}
1710+
/** */ InOutContractExpression inOutContractExpression;
1711+
/** */ InOutStatement inOutStatement;
1712+
mixin OpEquals;
1713+
}
1714+
16991715
///
17001716
final class FunctionDeclaration : ASTNode
17011717
{
@@ -1726,11 +1742,11 @@ final class FunctionLiteralExpression : ExpressionNode
17261742
override void accept(ASTVisitor visitor) const
17271743
{
17281744
mixin (visitIfNotNull!(returnType, parameters, functionAttributes,
1729-
memberFunctionAttributes, functionBody, assignExpression));
1745+
memberFunctionAttributes, specifiedFunctionBody, assignExpression));
17301746
}
17311747
/** */ ExpressionNode assignExpression;
17321748
/** */ FunctionAttribute[] functionAttributes;
1733-
/** */ FunctionBody functionBody;
1749+
/** */ SpecifiedFunctionBody specifiedFunctionBody;
17341750
/** */ IdType functionOrDelegate;
17351751
/** */ MemberFunctionAttribute[] memberFunctionAttributes;
17361752
/** */ Parameters parameters;
@@ -1909,6 +1925,18 @@ final class IndexExpression : ExpressionNode
19091925
mixin OpEquals;
19101926
}
19111927

1928+
///
1929+
final class InContractExpression : ASTNode
1930+
{
1931+
override void accept(ASTVisitor visitor) const
1932+
{
1933+
mixin (visitIfNotNull!(assertArguments));
1934+
}
1935+
/** */ size_t inTokenLocation;
1936+
/** */ AssertArguments assertArguments;
1937+
mixin OpEquals;
1938+
}
1939+
19121940
///
19131941
final class InExpression : ExpressionNode
19141942
{
@@ -1921,6 +1949,30 @@ final class InExpression : ExpressionNode
19211949
mixin OpEquals;
19221950
}
19231951

1952+
///
1953+
final class InOutContractExpression : ASTNode
1954+
{
1955+
override void accept(ASTVisitor visitor) const
1956+
{
1957+
mixin (visitIfNotNull!(inContractExpression, outContractExpression));
1958+
}
1959+
/** */ InContractExpression inContractExpression;
1960+
/** */ OutContractExpression outContractExpression;
1961+
mixin OpEquals;
1962+
}
1963+
1964+
///
1965+
final class InOutStatement : ASTNode
1966+
{
1967+
override void accept(ASTVisitor visitor) const
1968+
{
1969+
mixin (visitIfNotNull!(inStatement, outStatement));
1970+
}
1971+
/** */ InStatement inStatement;
1972+
/** */ OutStatement outStatement;
1973+
mixin OpEquals;
1974+
}
1975+
19241976
///
19251977
final class InStatement : ASTNode
19261978
{
@@ -1977,9 +2029,10 @@ final class Invariant : ASTNode
19772029
{
19782030
override void accept(ASTVisitor visitor) const
19792031
{
1980-
mixin (visitIfNotNull!(blockStatement));
2032+
mixin (visitIfNotNull!(blockStatement, assertArguments));
19812033
}
19822034
/** */ BlockStatement blockStatement;
2035+
/** */ AssertArguments assertArguments;
19832036
/** */ string comment;
19842037
size_t line;
19852038
size_t index;
@@ -2076,6 +2129,17 @@ final class MemberFunctionAttribute : ASTNode
20762129
mixin OpEquals;
20772130
}
20782131

2132+
///
2133+
final class MissingFunctionBody : ASTNode
2134+
{
2135+
override void accept(ASTVisitor visitor) const
2136+
{
2137+
mixin (visitIfNotNull!(functionContracts));
2138+
}
2139+
/** */ FunctionContract[] functionContracts;
2140+
mixin OpEquals;
2141+
}
2142+
20792143
///
20802144
final class MixinDeclaration : ASTNode
20812145
{
@@ -2288,6 +2352,19 @@ final class OrOrExpression : ExpressionNode
22882352
mixin OpEquals;
22892353
}
22902354

2355+
///
2356+
final class OutContractExpression : ASTNode
2357+
{
2358+
override void accept(ASTVisitor visitor) const
2359+
{
2360+
mixin (visitIfNotNull!(parameter, assertArguments));
2361+
}
2362+
/** */ size_t outTokenLocation;
2363+
/** */ Token parameter;
2364+
/** */ AssertArguments assertArguments;
2365+
mixin OpEquals;
2366+
}
2367+
22912368
///
22922369
final class OutStatement : ASTNode
22932370
{
@@ -2542,6 +2619,18 @@ final class SingleImport : ASTNode
25422619
mixin OpEquals;
25432620
}
25442621

2622+
///
2623+
final class SpecifiedFunctionBody : ASTNode
2624+
{
2625+
override void accept(ASTVisitor visitor) const
2626+
{
2627+
mixin (visitIfNotNull!(functionContracts, blockStatement));
2628+
}
2629+
/** */ FunctionContract[] functionContracts;
2630+
/** */ BlockStatement blockStatement;
2631+
mixin OpEquals;
2632+
}
2633+
25452634
///
25462635
final class Statement : ASTNode
25472636
{

0 commit comments

Comments
 (0)