Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 48 additions & 4 deletions src/Acornima/Parser.Statement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ private bool IsUsingKeyword(bool isFor, out VariableDeclarationKind kind)
}

var next = _tokenizer.NextTokenPosition(out var nextLine, out var nextLineStart);
int after;

if (_tokenizer._currentLine != nextLine)
{
Expand All @@ -151,7 +152,6 @@ private bool IsUsingKeyword(bool isFor, out VariableDeclarationKind kind)
if (isAwaitUsing)
{
var usingEndPos = next + 5 /* using */;
int after;
if (usingEndPos >= _tokenizer._endPosition
|| _tokenizer._input.SliceBetween(next, usingEndPos) is not "using"
|| Tokenizer.IsIdentifierChar(after = _tokenizer.FullCharCodeAt(usingEndPos), allowAstral: true)
Expand Down Expand Up @@ -183,11 +183,35 @@ private bool IsUsingKeyword(bool isFor, out VariableDeclarationKind kind)
}

var id = _tokenizer._input.SliceBetween(idStart, next);
if (IsKeywordRelationalOperator(id) || isFor && id is "of")
if (IsKeywordRelationalOperator(id))
{
return false;
}

if (isFor && !isAwaitUsing && id is "of")
{
next = _tokenizer.NextTokenPositionAt(next, ref nextLine, ref nextLineStart);
switch (_tokenizer.CharCodeAt(next))
{
case '=': // `for (using of = ...)` -- using declaration with initializer
if (_tokenizer.CharCodeAt(next + 1) is '=' or '>') // check for ==, === and => operators
{
goto default;
}
break;
case 'o': // `for (using of of ...)` -- using declaration in for-of loop
if (_tokenizer.CharCodeAt(next + 1) != 'f'
|| Tokenizer.IsIdentifierChar(after = _tokenizer.FullCharCodeAt(next + 2), allowAstral: true)
|| after == '\\')
{
goto default;
}
break;
default: // `for (using of <expr>)` -- for-of loop, 'using' is expression, not a keyword
return false;
}
}

kind = isAwaitUsing ? VariableDeclarationKind.AwaitUsing : VariableDeclarationKind.Using;
return true;
}
Expand Down Expand Up @@ -382,6 +406,13 @@ private Statement ParseStatement(StatementContext context, bool topLevel = false
// Raise(_tokenizer._start, UsingInTopLevel);
//}

// using/await using declarations are not allowed in single-statement positions
// (e.g., `for (;;) using x = ...;` or `if (true) using x = ...;`)
if (context != StatementContext.Default)
{
Unexpected();
}

if (usingKind == VariableDeclarationKind.AwaitUsing)
{
if (!CanAwait)
Expand Down Expand Up @@ -592,7 +623,7 @@ private Statement ParseForStatement(in Marker startMarker)
{
if (!CanAwait)
{
Raise(_tokenizer._start, AwaitNotInAsyncContext);
Unexpected();
}

Next();
Expand Down Expand Up @@ -686,6 +717,12 @@ private Statement ParseForStatement(in Marker startMarker)
Raise(init.Start, ForInOfLoopMultiBindings, new object[] { "for-in" });
}

// using/await using declarations are not allowed in for-in loops
if (init.Kind is VariableDeclarationKind.Using or VariableDeclarationKind.AwaitUsing)
{
Raise(init.Start, ForInOfLoopInitializer, new object[] { "for-in" });
}

if (_tokenizerOptions._ecmaVersion >= EcmaVersion.ES9 && awaitAt >= 0)
{
Unexpected(awaitAt, TokenType.Name, "await");
Expand Down Expand Up @@ -1163,7 +1200,14 @@ private VariableDeclaration ParseVar(VariableDeclarationKind kind, bool isFor)
else if (kind is VariableDeclarationKind.Using or VariableDeclarationKind.AwaitUsing && _tokenizerOptions.AllowExplicitResourceManagement() && _tokenizer._type != TokenType.In && !IsContextual("of"))
{
// Raise(_tokenizer._lastTokenEnd, `Missing initializer in ${kind} declaration`); // original acornjs error reporting
Raise(_tokenizer._lastTokenEnd, DeclarationMissingInitializer_Using);
if (kind == VariableDeclarationKind.AwaitUsing)
{
Raise(_tokenizer._lastTokenEnd, DeclarationMissingInitializer_AwaitUsing);
}
else
{
Raise(_tokenizer._lastTokenEnd, DeclarationMissingInitializer_Using);
}
}
else if (id.Type != NodeType.Identifier && !(isFor && (_tokenizer._type == TokenType.In || IsContextual("of"))))
{
Expand Down
9 changes: 9 additions & 0 deletions src/Acornima/Properties/SyntaxErrorMessages.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions src/Acornima/Properties/SyntaxErrorMessages.resx
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,10 @@
<value>Only one underscore is allowed as numeric separator</value>
<comment>https://github.com/v8/v8/blob/14.8.3/src/common/message-template.h</comment>
</data>
<data name="DeclarationMissingInitializer_AwaitUsing" xml:space="preserve">
<value>Missing initializer in await using declaration</value>
<comment>https://github.com/v8/v8/blob/14.8.3/src/common/message-template.h</comment>
</data>
<data name="DeclarationMissingInitializer_Const" xml:space="preserve">
<value>Missing initializer in const declaration</value>
<comment>https://github.com/v8/v8/blob/14.8.3/src/common/message-template.h</comment>
Expand Down
2 changes: 1 addition & 1 deletion test/Acornima.Tests.Test262/Test262Harness.settings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"SuiteGitSha": "a073f479f80b336256b7fc4e04700c827293e2fe",
"SuiteGitSha": "5c8206929d81b2d3d727ca6aac56c18358c8d790",
//"SuiteDirectory": "//mnt/c/work/test262",
"TargetPath": "./Generated",
"Namespace": "Acornima.Tests.Test262",
Expand Down
39 changes: 39 additions & 0 deletions test/Acornima.Tests.Test262/allow-list.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
# to generate this file run:
# dotnet run -c Release -- --update-allow-list

test/annexB/language/expressions/assignmenttargettype/callexpression-as-for-in-lhs.js(default)
test/annexB/language/expressions/assignmenttargettype/callexpression-as-for-of-lhs.js(default)
test/annexB/language/expressions/assignmenttargettype/callexpression-in-compound-assignment.js(default)
test/annexB/language/expressions/assignmenttargettype/callexpression-in-postfix-update.js(default)
test/annexB/language/expressions/assignmenttargettype/callexpression-in-prefix-update.js(default)
test/annexB/language/expressions/assignmenttargettype/callexpression.js(default)
test/annexB/language/expressions/assignmenttargettype/cover-callexpression-and-asyncarrowhead.js(default)
test/built-ins/RegExp/CharacterClassEscapes/character-class-digit-class-escape-negative-cases.js(default)
test/built-ins/RegExp/CharacterClassEscapes/character-class-digit-class-escape-negative-cases.js(strict mode)
test/built-ins/RegExp/CharacterClassEscapes/character-class-digit-class-escape-positive-cases.js(default)
Expand All @@ -25,6 +32,8 @@ test/built-ins/RegExp/CharacterClassEscapes/character-class-word-class-escape-ne
test/built-ins/RegExp/CharacterClassEscapes/character-class-word-class-escape-negative-cases.js(strict mode)
test/built-ins/RegExp/CharacterClassEscapes/character-class-word-class-escape-positive-cases.js(default)
test/built-ins/RegExp/CharacterClassEscapes/character-class-word-class-escape-positive-cases.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_-_Beria_Erfe.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_-_Beria_Erfe.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_-_Garay.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_-_Garay.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_-_Gurung_Khema.js(default)
Expand All @@ -33,12 +42,20 @@ test/built-ins/RegExp/property-escapes/generated/Script_-_Kirat_Rai.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_-_Kirat_Rai.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_-_Ol_Onal.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_-_Ol_Onal.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_-_Sidetic.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_-_Sidetic.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_-_Sunuwar.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_-_Sunuwar.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Yo.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_-_Tai_Yo.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_-_Todhri.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_-_Todhri.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_-_Tolong_Siki.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_-_Tolong_Siki.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_-_Tulu_Tigalari.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_-_Tulu_Tigalari.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Beria_Erfe.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Beria_Erfe.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Garay.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Garay.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Gurung_Khema.js(default)
Expand All @@ -47,10 +64,16 @@ test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kirat_Rai.j
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Kirat_Rai.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ol_Onal.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Ol_Onal.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sidetic.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sidetic.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sunuwar.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Sunuwar.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Yo.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tai_Yo.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Todhri.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Todhri.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tolong_Siki.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tolong_Siki.js(strict mode)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tulu_Tigalari.js(default)
test/built-ins/RegExp/property-escapes/generated/Script_Extensions_-_Tulu_Tigalari.js(strict mode)
test/language/identifiers/part-unicode-15.1.0-class-escaped.js(default)
Expand All @@ -69,6 +92,14 @@ test/language/identifiers/part-unicode-16.0.0-escaped.js(default)
test/language/identifiers/part-unicode-16.0.0-escaped.js(strict mode)
test/language/identifiers/part-unicode-16.0.0.js(default)
test/language/identifiers/part-unicode-16.0.0.js(strict mode)
test/language/identifiers/part-unicode-17.0.0-class-escaped.js(default)
test/language/identifiers/part-unicode-17.0.0-class-escaped.js(strict mode)
test/language/identifiers/part-unicode-17.0.0-class.js(default)
test/language/identifiers/part-unicode-17.0.0-class.js(strict mode)
test/language/identifiers/part-unicode-17.0.0-escaped.js(default)
test/language/identifiers/part-unicode-17.0.0-escaped.js(strict mode)
test/language/identifiers/part-unicode-17.0.0.js(default)
test/language/identifiers/part-unicode-17.0.0.js(strict mode)
test/language/identifiers/start-unicode-15.1.0-class-escaped.js(default)
test/language/identifiers/start-unicode-15.1.0-class-escaped.js(strict mode)
test/language/identifiers/start-unicode-15.1.0-class.js(default)
Expand All @@ -85,3 +116,11 @@ test/language/identifiers/start-unicode-16.0.0-escaped.js(default)
test/language/identifiers/start-unicode-16.0.0-escaped.js(strict mode)
test/language/identifiers/start-unicode-16.0.0.js(default)
test/language/identifiers/start-unicode-16.0.0.js(strict mode)
test/language/identifiers/start-unicode-17.0.0-class-escaped.js(default)
test/language/identifiers/start-unicode-17.0.0-class-escaped.js(strict mode)
test/language/identifiers/start-unicode-17.0.0-class.js(default)
test/language/identifiers/start-unicode-17.0.0-class.js(strict mode)
test/language/identifiers/start-unicode-17.0.0-escaped.js(default)
test/language/identifiers/start-unicode-17.0.0-escaped.js(strict mode)
test/language/identifiers/start-unicode-17.0.0.js(default)
test/language/identifiers/start-unicode-17.0.0.js(strict mode)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"index":35,"lineNumber":1,"column":35,"message":"Unexpected identifier 'await' (1:36)","description":"Unexpected identifier 'await'"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
async function f() { for (;false;) await using x = null; }
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"index":5,"lineNumber":1,"column":5,"message":"for-in loop variable declaration may not have an initializer (1:5)","description":"for-in loop variable declaration may not have an initializer"}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"index":9,"lineNumber":1,"column":9,"message":"Unexpected identifier 'using' (1:10)","description":"Unexpected identifier 'using'"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
for (;;) using x = null;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"index":10,"lineNumber":1,"column":10,"message":"Unexpected identifier 'using' (1:11)","description":"Unexpected identifier 'using'"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
if (true) using x = null;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"index":13,"lineNumber":1,"column":13,"message":"Unexpected identifier 'using' (1:14)","description":"Unexpected identifier 'using'"}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
while (true) using x = null;
Loading