Skip to content
This repository was archived by the owner on Mar 21, 2025. It is now read-only.

Commit 5d9a03a

Browse files
committed
Change assert from a statement to an expression.
Closes #77.
1 parent 4dc61ef commit 5d9a03a

File tree

10 files changed

+38
-41
lines changed

10 files changed

+38
-41
lines changed

doc/language/expressions.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ primary-expression ::= parenthesized-expression |
99
block-expression |
1010
this-expression |
1111
meta-expression |
12+
assert-expression |
1213
identifier-expression |
1314
literal-expression |
1415
module-expression |
Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
1-
# Assertion Statement
1+
# Assert Expression
22

33
```ebnf
4-
assert-statement ::= 'assert' expression
4+
assert-expression ::= 'assert' expression
55
```
66

77
Evaluates [`expression`](../expressions.md) (the *condition*). If the result
88
does not test as [truthy](../expressions/control/if-expression.md#truthiness), a
9-
panic occurs. An `assert` statement is always executed; it is not conditional on
10-
build flags or similar.
9+
panic occurs. An `assert` expression is always executed; it is not conditional
10+
on build flags or similar.
1111

1212
<!-- TODO: Link to panic definition. -->
1313

14-
An `assert` statement is typically used in a
14+
An `assert` expression is typically used in a
1515
[`test` declaration](../declarations/test-declaration.md) to verify the outcome
1616
of a unit test, but it can also be used in regular code. The runtime system is
1717
allowed to optimize with the assumption that *condition* holds after the
18-
`assert` statement.
18+
`assert` expression.
19+
20+
The result of an `assert` expression is the value of the *condition*.

doc/language/statements.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,5 @@
33
```ebnf
44
statement ::= attribute* (let-statement |
55
defer-statement |
6-
assert-statement |
76
expression-statement) ';'
87
```

doc/toc.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@
5959
* [Statements](language/statements.md)
6060
* [Let Statement](language/statements/let-statement.md)
6161
* [Defer Statement](language/statements/defer-statement.md)
62-
* [Assert Statement](language/statements/assert-statement.md)
6362
* [Expression Statement](language/statements/expression-statement.md)
6463
* [Expressions](language/expressions.md)
6564
* Value Expressions
@@ -96,6 +95,7 @@
9695
* [Block Expression](language/expressions/block-expression.md)
9796
* [This Expression](language/expressions/this-expression.md)
9897
* [Meta Expression](language/expressions/meta-expression.md)
98+
* [Assert Expression](language/expressions/assert-expression.md)
9999
* [Identifier Expression](language/expressions/identifier-expression.md)
100100
* [Assignment Expression](language/expressions/assignment-expression.md)
101101
* [Field Expression](language/expressions/field-expression.md)

src/language/core/Quality/Passes/TestWithoutAssertPass.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ protected internal override void Run(LintPassContext context)
1515
{
1616
foreach (var decl in Unsafe.As<ModuleDocumentSemantics>(context.Root).Declarations)
1717
if (decl is TestDeclarationSemantics { Syntax.NameToken: { IsMissing: false } name } test &&
18-
test.Body.Descendants().All(static node => node is not AssertStatementSemantics))
18+
test.Body.Descendants().All(static node => node is not AssertExpressionSemantics))
1919
context.ReportDiagnostic(
20-
name.Span, $"Test declaration '{name.Text}' lacks 'assert' statements");
20+
name.Span, $"Test declaration '{name.Text}' lacks 'assert' expressions");
2121
}
2222
}

src/language/core/Semantics/LanguageAnalyzer.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -546,14 +546,6 @@ public override DeferStatementSemantics VisitDeferStatement(DeferStatementSyntax
546546
return new(node, attrs, expr);
547547
}
548548

549-
public override AssertStatementSemantics VisitAssertStatement(AssertStatementSyntax node)
550-
{
551-
var attrs = ConvertAttributeList(node, node.Attributes);
552-
var expr = VisitExpression(node.Expression);
553-
554-
return new(node, attrs, expr);
555-
}
556-
557549
public override ExpressionStatementSemantics VisitExpressionStatement(ExpressionStatementSyntax node)
558550
{
559551
var attrs = ConvertAttributeList(node, node.Attributes);
@@ -1082,6 +1074,13 @@ public override MetaExpressionSemantics VisitMetaExpression(MetaExpressionSyntax
10821074
return new(node, oper);
10831075
}
10841076

1077+
public override AssertExpressionSemantics VisitAssertExpression(AssertExpressionSyntax node)
1078+
{
1079+
var cond = VisitExpression(node.Condition);
1080+
1081+
return new(node, cond);
1082+
}
1083+
10851084
public override AssignmentExpressionSemantics VisitAssignmentExpression(AssignmentExpressionSyntax node)
10861085
{
10871086
var left = VisitExpression(node.LeftOperand);

src/language/core/Semantics/Tree/SemanticTree.xml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,6 @@
102102
<Node Name="Expression" Type="Expression" />
103103
</Type>
104104

105-
<Type Name="AssertStatement" Base="Statement">
106-
<Nodes Name="Attribute" Type="Attribute" Override="true" />
107-
<Node Name="Expression" Type="Expression" />
108-
</Type>
109-
110105
<Type Name="ExpressionStatement" Base="Statement">
111106
<Nodes Name="Attribute" Type="Attribute" Override="true" />
112107
<Node Name="Expression" Type="Expression" />
@@ -346,6 +341,10 @@
346341
<Node Name="Operand" Type="Expression" />
347342
</Type>
348343

344+
<Type Name="AssertExpression" Base="Expression">
345+
<Node Name="Condition" Type="Expression" />
346+
</Type>
347+
349348
<Type Name="IdentifierExpression" Base="Expression">
350349
<Value Name="Symbol" Type="Symbol?" />
351350
</Type>

src/language/core/Syntax/LanguageParser.cs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1110,20 +1110,10 @@ private StatementSyntax ParseStatement(ImmutableArray<AttributeSyntax>.Builder a
11101110
{
11111111
SyntaxTokenKind.LetKeyword => ParseLetStatement(attributes),
11121112
SyntaxTokenKind.DeferKeyword => ParseDeferStatement(attributes),
1113-
SyntaxTokenKind.AssertKeyword => ParseAssertStatement(attributes),
11141113
_ => ParseExpressionStatement(attributes),
11151114
};
11161115
}
11171116

1118-
private AssertStatementSyntax ParseAssertStatement(ImmutableArray<AttributeSyntax>.Builder attributes)
1119-
{
1120-
var assert = Read();
1121-
var expr = ParseExpression();
1122-
var semi = Expect(SyntaxTokenKind.Semicolon);
1123-
1124-
return new(List(attributes), assert, expr, semi);
1125-
}
1126-
11271117
private DeferStatementSyntax ParseDeferStatement(ImmutableArray<AttributeSyntax>.Builder attributes)
11281118
{
11291119
var defer = Read();
@@ -1294,6 +1284,7 @@ private ExpressionSyntax ParsePrimaryExpression()
12941284
(var literal, _, _) when SyntaxFacts.IsLiteral(literal) => ParseLiteralExpression(),
12951285
(SyntaxTokenKind.ThisKeyword, _, _) => ParseThisExpression(),
12961286
(SyntaxTokenKind.MetaKeyword, _, _) => ParseMetaExpression(),
1287+
(SyntaxTokenKind.AssertKeyword, _, _) => ParseAssertExpression(),
12971288
(SyntaxTokenKind.UpperIdentifier, _, _) => ParseModuleExpression(),
12981289
(SyntaxTokenKind.FnKeyword, _, _) or
12991290
(SyntaxTokenKind.ErrKeyword, SyntaxTokenKind.FnKeyword, _) => ParseLambdaExpression(),
@@ -1407,6 +1398,14 @@ private MetaExpressionSyntax ParseMetaExpression()
14071398
return new(meta, oper);
14081399
}
14091400

1401+
private AssertExpressionSyntax ParseAssertExpression()
1402+
{
1403+
var assert = Read();
1404+
var cond = ParseExpression();
1405+
1406+
return new(assert, cond);
1407+
}
1408+
14101409
private LiteralExpressionSyntax ParseLiteralExpression()
14111410
{
14121411
var literal = Read();

src/language/core/Syntax/Tree/SyntaxTree.xml

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -395,13 +395,6 @@
395395
<Token Name="Semicolon" Override="true" />
396396
</Type>
397397

398-
<Type Name="AssertStatement" Base="Statement">
399-
<Nodes Name="Attribute" Type="Attribute" Override="true" />
400-
<Token Name="AssertKeyword" />
401-
<Node Name="Expression" Type="Expression" />
402-
<Token Name="Semicolon" Override="true" />
403-
</Type>
404-
405398
<Type Name="ExpressionStatement" Base="Statement">
406399
<Nodes Name="Attribute" Type="Attribute" Override="true" />
407400
<Node Name="Expression" Type="Expression" />
@@ -722,6 +715,11 @@
722715
<Node Name="Operand" Type="Expression" />
723716
</Type>
724717

718+
<Type Name="AssertExpression" Base="Expression">
719+
<Token Name="AssertKeyword" />
720+
<Node Name="Condition" Type="Expression" />
721+
</Type>
722+
725723
<Type Name="IdentifierExpression" Base="Expression">
726724
<Token Name="Name" />
727725
</Type>

src/tests/quality/tests_without_assert.diags.verified.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Warning[test-without-assert]: Test declaration 'foo' lacks 'assert' statements
1+
Warning[test-without-assert]: Test declaration 'foo' lacks 'assert' expressions
22
--> tests_without_assert.cel (2,10)-(2,13)
33
1 | mod {
44
2 | test foo {

0 commit comments

Comments
 (0)