diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart index db0da52f532..c5d278197c0 100644 --- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart @@ -3842,7 +3842,8 @@ class BodyBuilder extends StackListenerImpl isLate: isLate, isRequired: isRequired, hasDeclaredInitializer: initializer != null, - isStaticLate: isFinal && initializer == null) + isStaticLate: isFinal && initializer == null, + isWildcard: identifier.name == '_') ..fileOffset = identifier.nameOffset ..fileEqualsOffset = offsetForToken(equalsToken); typeInferrer.assignedVariables.declare(variable); @@ -3900,8 +3901,9 @@ class BodyBuilder extends StackListenerImpl push(variable); // Avoid adding the local identifier to scope if it's a wildcard. - if (!(libraryFeatures.wildcardVariables.isEnabled && - variable.name == '_')) { + // TODO(kallentu): Emit better error on lookup, rather than not adding it to + // the scope. + if (!(libraryFeatures.wildcardVariables.isEnabled && variable.isWildcard)) { declareVariable(variable, scope); } } diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart index 65b044a1d2a..565bcf855a8 100644 --- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart +++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart @@ -1151,7 +1151,8 @@ class VariableDeclarationImpl extends VariableDeclaration { bool isRequired = false, bool isLowered = false, bool isSynthesized = false, - this.isStaticLate = false}) + this.isStaticLate = false, + bool isWildcard = false}) : isImplicitlyTyped = type == null, isLocalFunction = isLocalFunction, super(name, @@ -1165,7 +1166,8 @@ class VariableDeclarationImpl extends VariableDeclaration { isRequired: isRequired, isLowered: isLowered, isSynthesized: isSynthesized, - hasDeclaredInitializer: hasDeclaredInitializer); + hasDeclaredInitializer: hasDeclaredInitializer, + isWildcard: isWildcard); VariableDeclarationImpl.forEffect(Expression initializer) : forSyntheticToken = false, diff --git a/pkg/front_end/testcases/general/arithmetic.dart.strong.expect b/pkg/front_end/testcases/general/arithmetic.dart.strong.expect index 601c2cb3c99..94c7258edb7 100644 --- a/pkg/front_end/testcases/general/arithmetic.dart.strong.expect +++ b/pkg/front_end/testcases/general/arithmetic.dart.strong.expect @@ -7,7 +7,7 @@ static method foo(core::int x, core::int y) → core::int { return z.{core::int::<<}(4){(core::int) → core::int}; } static method loop(core::List xs) → void { - core::int _ = xs.{core::List::length}{core::int}; + wildcard core::int _ = xs.{core::List::length}{core::int}; for (core::int i = 0; i.{core::num::<}(xs.{core::List::length}{core::int}){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) { } } diff --git a/pkg/front_end/testcases/general/arithmetic.dart.strong.modular.expect b/pkg/front_end/testcases/general/arithmetic.dart.strong.modular.expect index 601c2cb3c99..94c7258edb7 100644 --- a/pkg/front_end/testcases/general/arithmetic.dart.strong.modular.expect +++ b/pkg/front_end/testcases/general/arithmetic.dart.strong.modular.expect @@ -7,7 +7,7 @@ static method foo(core::int x, core::int y) → core::int { return z.{core::int::<<}(4){(core::int) → core::int}; } static method loop(core::List xs) → void { - core::int _ = xs.{core::List::length}{core::int}; + wildcard core::int _ = xs.{core::List::length}{core::int}; for (core::int i = 0; i.{core::num::<}(xs.{core::List::length}{core::int}){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) { } } diff --git a/pkg/front_end/testcases/general/arithmetic.dart.strong.transformed.expect b/pkg/front_end/testcases/general/arithmetic.dart.strong.transformed.expect index 39639500c93..523a17326ca 100644 --- a/pkg/front_end/testcases/general/arithmetic.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/general/arithmetic.dart.strong.transformed.expect @@ -7,7 +7,7 @@ static method foo(core::int x, core::int y) → core::int { return z.{core::int::<<}(4){(core::int) → core::int}; } static method loop(core::List xs) → void { - core::int _ = xs.{core::List::length}{core::int}; + wildcard core::int _ = xs.{core::List::length}{core::int}; for (core::int i = 0; i.{core::num::<}(xs.{core::List::length}{core::int}){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) { } } diff --git a/pkg/front_end/testcases/general/closure.dart.strong.expect b/pkg/front_end/testcases/general/closure.dart.strong.expect index 54c40dfb195..cc7701e473f 100644 --- a/pkg/front_end/testcases/general/closure.dart.strong.expect +++ b/pkg/front_end/testcases/general/closure.dart.strong.expect @@ -14,7 +14,7 @@ class Bar extends core::Object { ; } static method useCallback(dynamic callback) → dynamic { - dynamic _ = callback{dynamic}(); + wildcard dynamic _ = callback{dynamic}(); } static method main() → dynamic { dynamic x; @@ -23,5 +23,5 @@ static method main() → dynamic { return new self::Foo::•(); } self::useCallback(inner); - self::Bar _ = inner(){() → self::Foo}.{self::Foo::_field}{self::Bar}; + wildcard self::Bar _ = inner(){() → self::Foo}.{self::Foo::_field}{self::Bar}; } diff --git a/pkg/front_end/testcases/general/closure.dart.strong.modular.expect b/pkg/front_end/testcases/general/closure.dart.strong.modular.expect index 54c40dfb195..cc7701e473f 100644 --- a/pkg/front_end/testcases/general/closure.dart.strong.modular.expect +++ b/pkg/front_end/testcases/general/closure.dart.strong.modular.expect @@ -14,7 +14,7 @@ class Bar extends core::Object { ; } static method useCallback(dynamic callback) → dynamic { - dynamic _ = callback{dynamic}(); + wildcard dynamic _ = callback{dynamic}(); } static method main() → dynamic { dynamic x; @@ -23,5 +23,5 @@ static method main() → dynamic { return new self::Foo::•(); } self::useCallback(inner); - self::Bar _ = inner(){() → self::Foo}.{self::Foo::_field}{self::Bar}; + wildcard self::Bar _ = inner(){() → self::Foo}.{self::Foo::_field}{self::Bar}; } diff --git a/pkg/front_end/testcases/general/closure.dart.strong.transformed.expect b/pkg/front_end/testcases/general/closure.dart.strong.transformed.expect index 54c40dfb195..cc7701e473f 100644 --- a/pkg/front_end/testcases/general/closure.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/general/closure.dart.strong.transformed.expect @@ -14,7 +14,7 @@ class Bar extends core::Object { ; } static method useCallback(dynamic callback) → dynamic { - dynamic _ = callback{dynamic}(); + wildcard dynamic _ = callback{dynamic}(); } static method main() → dynamic { dynamic x; @@ -23,5 +23,5 @@ static method main() → dynamic { return new self::Foo::•(); } self::useCallback(inner); - self::Bar _ = inner(){() → self::Foo}.{self::Foo::_field}{self::Bar}; + wildcard self::Bar _ = inner(){() → self::Foo}.{self::Foo::_field}{self::Bar}; } diff --git a/pkg/front_end/testcases/general/escape.dart.strong.expect b/pkg/front_end/testcases/general/escape.dart.strong.expect index 1c642025173..58c7c810b61 100644 --- a/pkg/front_end/testcases/general/escape.dart.strong.expect +++ b/pkg/front_end/testcases/general/escape.dart.strong.expect @@ -28,10 +28,10 @@ class X extends core::Object implements self::A, self::B { ; } static method useAsA(self::A object) → void { - dynamic _ = object.{self::A::field}{dynamic}; + wildcard dynamic _ = object.{self::A::field}{dynamic}; } static method useAsB(self::B object) → void { - dynamic _ = object.{self::B::field}{dynamic}; + wildcard dynamic _ = object.{self::B::field}{dynamic}; self::escape(object); } static method escape(dynamic x) → void { diff --git a/pkg/front_end/testcases/general/escape.dart.strong.modular.expect b/pkg/front_end/testcases/general/escape.dart.strong.modular.expect index 1c642025173..58c7c810b61 100644 --- a/pkg/front_end/testcases/general/escape.dart.strong.modular.expect +++ b/pkg/front_end/testcases/general/escape.dart.strong.modular.expect @@ -28,10 +28,10 @@ class X extends core::Object implements self::A, self::B { ; } static method useAsA(self::A object) → void { - dynamic _ = object.{self::A::field}{dynamic}; + wildcard dynamic _ = object.{self::A::field}{dynamic}; } static method useAsB(self::B object) → void { - dynamic _ = object.{self::B::field}{dynamic}; + wildcard dynamic _ = object.{self::B::field}{dynamic}; self::escape(object); } static method escape(dynamic x) → void { diff --git a/pkg/front_end/testcases/general/escape.dart.strong.transformed.expect b/pkg/front_end/testcases/general/escape.dart.strong.transformed.expect index 1c642025173..58c7c810b61 100644 --- a/pkg/front_end/testcases/general/escape.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/general/escape.dart.strong.transformed.expect @@ -28,10 +28,10 @@ class X extends core::Object implements self::A, self::B { ; } static method useAsA(self::A object) → void { - dynamic _ = object.{self::A::field}{dynamic}; + wildcard dynamic _ = object.{self::A::field}{dynamic}; } static method useAsB(self::B object) → void { - dynamic _ = object.{self::B::field}{dynamic}; + wildcard dynamic _ = object.{self::B::field}{dynamic}; self::escape(object); } static method escape(dynamic x) → void { diff --git a/pkg/front_end/testcases/general/issue48347.dart.strong.expect b/pkg/front_end/testcases/general/issue48347.dart.strong.expect index aa6c00cbe4d..3e2a3d8e2c1 100644 --- a/pkg/front_end/testcases/general/issue48347.dart.strong.expect +++ b/pkg/front_end/testcases/general/issue48347.dart.strong.expect @@ -5,7 +5,7 @@ import "dart:async" as asy; import "dart:async"; static method test(asy::StreamController _eventStreamController) → dynamic async /* emittedValueType= dynamic */ { - await for (final void _ in _eventStreamController.{asy::StreamController::stream}{asy::Stream}) { + await for (final wildcard void _ in _eventStreamController.{asy::StreamController::stream}{asy::Stream}) { } } static method main() → dynamic {} diff --git a/pkg/front_end/testcases/general/issue48347.dart.strong.modular.expect b/pkg/front_end/testcases/general/issue48347.dart.strong.modular.expect index aa6c00cbe4d..3e2a3d8e2c1 100644 --- a/pkg/front_end/testcases/general/issue48347.dart.strong.modular.expect +++ b/pkg/front_end/testcases/general/issue48347.dart.strong.modular.expect @@ -5,7 +5,7 @@ import "dart:async" as asy; import "dart:async"; static method test(asy::StreamController _eventStreamController) → dynamic async /* emittedValueType= dynamic */ { - await for (final void _ in _eventStreamController.{asy::StreamController::stream}{asy::Stream}) { + await for (final wildcard void _ in _eventStreamController.{asy::StreamController::stream}{asy::Stream}) { } } static method main() → dynamic {} diff --git a/pkg/front_end/testcases/general/issue48347.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue48347.dart.strong.transformed.expect index c0005bd364b..70dbcc910d5 100644 --- a/pkg/front_end/testcases/general/issue48347.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/general/issue48347.dart.strong.transformed.expect @@ -11,7 +11,7 @@ static method test(asy::StreamController _eventStreamController) → dynam synthesized asy::_StreamIterator? :for-iterator = new asy::_StreamIterator::•(:stream); try while (let dynamic #t1 = asy::_asyncStarMoveNextHelper(:stream) in await :for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future}) { - final void _ = :for-iterator.{asy::_StreamIterator::current}{void}; + final wildcard void _ = :for-iterator.{asy::_StreamIterator::current}{void}; {} } finally diff --git a/pkg/front_end/testcases/patterns/issue52345.dart.strong.expect b/pkg/front_end/testcases/patterns/issue52345.dart.strong.expect index 74d6b62463b..72b18bb9d92 100644 --- a/pkg/front_end/testcases/patterns/issue52345.dart.strong.expect +++ b/pkg/front_end/testcases/patterns/issue52345.dart.strong.expect @@ -6,7 +6,7 @@ static method main() → void { final core::List works = ["b", "l"]; final core::List fails = ["c"]; for (final core::List test in >[works, fails]) { - final void _ = block { + final wildcard void _ = block { void #t1; final synthesized core::List #0#0 = test; synthesized core::int #0#1; diff --git a/pkg/front_end/testcases/patterns/issue52345.dart.strong.modular.expect b/pkg/front_end/testcases/patterns/issue52345.dart.strong.modular.expect index 74d6b62463b..72b18bb9d92 100644 --- a/pkg/front_end/testcases/patterns/issue52345.dart.strong.modular.expect +++ b/pkg/front_end/testcases/patterns/issue52345.dart.strong.modular.expect @@ -6,7 +6,7 @@ static method main() → void { final core::List works = ["b", "l"]; final core::List fails = ["c"]; for (final core::List test in >[works, fails]) { - final void _ = block { + final wildcard void _ = block { void #t1; final synthesized core::List #0#0 = test; synthesized core::int #0#1; diff --git a/pkg/front_end/testcases/patterns/issue52345.dart.strong.transformed.expect b/pkg/front_end/testcases/patterns/issue52345.dart.strong.transformed.expect index e84b4520204..68dcec52d4d 100644 --- a/pkg/front_end/testcases/patterns/issue52345.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/patterns/issue52345.dart.strong.transformed.expect @@ -10,7 +10,7 @@ static method main() → void { for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) { final core::List test = :sync-for-iterator.{core::Iterator::current}{core::List}; { - final void _ = block { + final wildcard void _ = block { void #t1; final synthesized core::List #0#0 = test; synthesized core::int #0#1; diff --git a/pkg/front_end/testcases/records/block_combine_statements.dart.strong.expect b/pkg/front_end/testcases/records/block_combine_statements.dart.strong.expect index 810a75970de..fd1e4a871ec 100644 --- a/pkg/front_end/testcases/records/block_combine_statements.dart.strong.expect +++ b/pkg/front_end/testcases/records/block_combine_statements.dart.strong.expect @@ -4,7 +4,7 @@ import "dart:core" as core; import "dart:_internal" as _in; static method main() → void { - for ((core::Iterable, core::Iterable) _ in self::split([1, 2, 3])) { + for (wildcard(core::Iterable, core::Iterable) _ in self::split([1, 2, 3])) { } } static method split(core::Iterable it) → core::Iterable<(core::Iterable, core::Iterable)> diff --git a/pkg/front_end/testcases/records/block_combine_statements.dart.strong.modular.expect b/pkg/front_end/testcases/records/block_combine_statements.dart.strong.modular.expect index 810a75970de..fd1e4a871ec 100644 --- a/pkg/front_end/testcases/records/block_combine_statements.dart.strong.modular.expect +++ b/pkg/front_end/testcases/records/block_combine_statements.dart.strong.modular.expect @@ -4,7 +4,7 @@ import "dart:core" as core; import "dart:_internal" as _in; static method main() → void { - for ((core::Iterable, core::Iterable) _ in self::split([1, 2, 3])) { + for (wildcard(core::Iterable, core::Iterable) _ in self::split([1, 2, 3])) { } } static method split(core::Iterable it) → core::Iterable<(core::Iterable, core::Iterable)> diff --git a/pkg/front_end/testcases/records/block_combine_statements.dart.strong.transformed.expect b/pkg/front_end/testcases/records/block_combine_statements.dart.strong.transformed.expect index 9d1d9073307..a0d945a876d 100644 --- a/pkg/front_end/testcases/records/block_combine_statements.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/records/block_combine_statements.dart.strong.transformed.expect @@ -7,7 +7,7 @@ static method main() → void { { synthesized core::Iterator<(core::Iterable, core::Iterable)> :sync-for-iterator = self::split(core::_GrowableList::_literal3(1, 2, 3)).{core::Iterable::iterator}{core::Iterator<(core::Iterable, core::Iterable)>}; for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) { - (core::Iterable, core::Iterable) _ = :sync-for-iterator.{core::Iterator::current}{(core::Iterable, core::Iterable)}; + wildcard(core::Iterable, core::Iterable) _ = :sync-for-iterator.{core::Iterator::current}{(core::Iterable, core::Iterable)}; {} } } diff --git a/pkg/front_end/testcases/wildcard_variables/for_loop.dart.strong.expect b/pkg/front_end/testcases/wildcard_variables/for_loop.dart.strong.expect index b8024c07909..12f49dc6bb5 100644 --- a/pkg/front_end/testcases/wildcard_variables/for_loop.dart.strong.expect +++ b/pkg/front_end/testcases/wildcard_variables/for_loop.dart.strong.expect @@ -19,19 +19,19 @@ import "dart:core" as core; import "dart:async" as asy; static method main() → dynamic async /* emittedValueType= dynamic */ { - for (core::int _ = 0, core::int _ = 2; ; ) { + for (wildcard core::int _ = 0, wildcard core::int _ = 2; ; ) { core::print(invalid-expression "pkg/front_end/testcases/wildcard_variables/for_loop.dart:8:11: Error: Undefined name '_'. print(_); ^"); } core::List list = []; - for (dynamic _ in list) { + for (wildcard dynamic _ in list) { core::print(invalid-expression "pkg/front_end/testcases/wildcard_variables/for_loop.dart:13:11: Error: Undefined name '_'. print(_); ^"); } asy::Stream stream = new asy::_EmptyStream::•(); - await for (dynamic _ in stream) { + await for (wildcard dynamic _ in stream) { core::print(invalid-expression "pkg/front_end/testcases/wildcard_variables/for_loop.dart:18:11: Error: Undefined name '_'. print(_); ^"); diff --git a/pkg/front_end/testcases/wildcard_variables/for_loop.dart.strong.modular.expect b/pkg/front_end/testcases/wildcard_variables/for_loop.dart.strong.modular.expect index b8024c07909..12f49dc6bb5 100644 --- a/pkg/front_end/testcases/wildcard_variables/for_loop.dart.strong.modular.expect +++ b/pkg/front_end/testcases/wildcard_variables/for_loop.dart.strong.modular.expect @@ -19,19 +19,19 @@ import "dart:core" as core; import "dart:async" as asy; static method main() → dynamic async /* emittedValueType= dynamic */ { - for (core::int _ = 0, core::int _ = 2; ; ) { + for (wildcard core::int _ = 0, wildcard core::int _ = 2; ; ) { core::print(invalid-expression "pkg/front_end/testcases/wildcard_variables/for_loop.dart:8:11: Error: Undefined name '_'. print(_); ^"); } core::List list = []; - for (dynamic _ in list) { + for (wildcard dynamic _ in list) { core::print(invalid-expression "pkg/front_end/testcases/wildcard_variables/for_loop.dart:13:11: Error: Undefined name '_'. print(_); ^"); } asy::Stream stream = new asy::_EmptyStream::•(); - await for (dynamic _ in stream) { + await for (wildcard dynamic _ in stream) { core::print(invalid-expression "pkg/front_end/testcases/wildcard_variables/for_loop.dart:18:11: Error: Undefined name '_'. print(_); ^"); diff --git a/pkg/front_end/testcases/wildcard_variables/for_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/wildcard_variables/for_loop.dart.strong.transformed.expect index d626e2dc462..57402456aa2 100644 --- a/pkg/front_end/testcases/wildcard_variables/for_loop.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/wildcard_variables/for_loop.dart.strong.transformed.expect @@ -19,7 +19,7 @@ import "dart:core" as core; import "dart:async" as asy; static method main() → dynamic async /* emittedValueType= dynamic */ { - for (core::int _ = 0, core::int _ = 2; ; ) { + for (wildcard core::int _ = 0, wildcard core::int _ = 2; ; ) { core::print(invalid-expression "pkg/front_end/testcases/wildcard_variables/for_loop.dart:8:11: Error: Undefined name '_'. print(_); ^"); @@ -28,7 +28,7 @@ static method main() → dynamic async /* emittedValueType= dynamic */ { { synthesized core::Iterator :sync-for-iterator = list.{core::Iterable::iterator}{core::Iterator}; for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) { - dynamic _ = :sync-for-iterator.{core::Iterator::current}{dynamic}; + wildcard dynamic _ = :sync-for-iterator.{core::Iterator::current}{dynamic}; { core::print(invalid-expression "pkg/front_end/testcases/wildcard_variables/for_loop.dart:13:11: Error: Undefined name '_'. print(_); @@ -42,7 +42,7 @@ static method main() → dynamic async /* emittedValueType= dynamic */ { synthesized asy::_StreamIterator? :for-iterator = new asy::_StreamIterator::•(:stream); try while (let dynamic #t1 = asy::_asyncStarMoveNextHelper(:stream) in await :for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future}) { - dynamic _ = :for-iterator.{asy::_StreamIterator::current}{dynamic}; + wildcard dynamic _ = :for-iterator.{asy::_StreamIterator::current}{dynamic}; { core::print(invalid-expression "pkg/front_end/testcases/wildcard_variables/for_loop.dart:18:11: Error: Undefined name '_'. print(_); diff --git a/pkg/front_end/testcases/wildcard_variables/local_member_no_shadowing.dart.strong.expect b/pkg/front_end/testcases/wildcard_variables/local_member_no_shadowing.dart.strong.expect index e6ec8035506..28e17e53953 100644 --- a/pkg/front_end/testcases/wildcard_variables/local_member_no_shadowing.dart.strong.expect +++ b/pkg/front_end/testcases/wildcard_variables/local_member_no_shadowing.dart.strong.expect @@ -8,8 +8,8 @@ class Field extends core::Object { : super core::Object::•() ; method member() → void { - core::int _ = 1; - core::int _ = 2; + wildcard core::int _ = 1; + wildcard core::int _ = 2; this.{self::Field::_} = 3; } } diff --git a/pkg/front_end/testcases/wildcard_variables/local_member_no_shadowing.dart.strong.modular.expect b/pkg/front_end/testcases/wildcard_variables/local_member_no_shadowing.dart.strong.modular.expect index e6ec8035506..28e17e53953 100644 --- a/pkg/front_end/testcases/wildcard_variables/local_member_no_shadowing.dart.strong.modular.expect +++ b/pkg/front_end/testcases/wildcard_variables/local_member_no_shadowing.dart.strong.modular.expect @@ -8,8 +8,8 @@ class Field extends core::Object { : super core::Object::•() ; method member() → void { - core::int _ = 1; - core::int _ = 2; + wildcard core::int _ = 1; + wildcard core::int _ = 2; this.{self::Field::_} = 3; } } diff --git a/pkg/front_end/testcases/wildcard_variables/local_member_no_shadowing.dart.strong.transformed.expect b/pkg/front_end/testcases/wildcard_variables/local_member_no_shadowing.dart.strong.transformed.expect index e6ec8035506..28e17e53953 100644 --- a/pkg/front_end/testcases/wildcard_variables/local_member_no_shadowing.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/wildcard_variables/local_member_no_shadowing.dart.strong.transformed.expect @@ -8,8 +8,8 @@ class Field extends core::Object { : super core::Object::•() ; method member() → void { - core::int _ = 1; - core::int _ = 2; + wildcard core::int _ = 1; + wildcard core::int _ = 2; this.{self::Field::_} = 3; } } diff --git a/pkg/front_end/testcases/wildcard_variables/local_var.dart.strong.expect b/pkg/front_end/testcases/wildcard_variables/local_var.dart.strong.expect index 3690277567e..8769dd68a51 100644 --- a/pkg/front_end/testcases/wildcard_variables/local_var.dart.strong.expect +++ b/pkg/front_end/testcases/wildcard_variables/local_var.dart.strong.expect @@ -10,8 +10,8 @@ import self as self; import "dart:core" as core; static method main() → dynamic { - core::int _ = 1; - core::int _ = 2; + wildcard core::int _ = 1; + wildcard core::int _ = 2; invalid-expression "pkg/front_end/testcases/wildcard_variables/local_var.dart:8:3: Error: Setter not found: '_'. _ = 3; ^"; diff --git a/pkg/front_end/testcases/wildcard_variables/local_var.dart.strong.modular.expect b/pkg/front_end/testcases/wildcard_variables/local_var.dart.strong.modular.expect index 3690277567e..8769dd68a51 100644 --- a/pkg/front_end/testcases/wildcard_variables/local_var.dart.strong.modular.expect +++ b/pkg/front_end/testcases/wildcard_variables/local_var.dart.strong.modular.expect @@ -10,8 +10,8 @@ import self as self; import "dart:core" as core; static method main() → dynamic { - core::int _ = 1; - core::int _ = 2; + wildcard core::int _ = 1; + wildcard core::int _ = 2; invalid-expression "pkg/front_end/testcases/wildcard_variables/local_var.dart:8:3: Error: Setter not found: '_'. _ = 3; ^"; diff --git a/pkg/front_end/testcases/wildcard_variables/local_var.dart.strong.transformed.expect b/pkg/front_end/testcases/wildcard_variables/local_var.dart.strong.transformed.expect index 3690277567e..8769dd68a51 100644 --- a/pkg/front_end/testcases/wildcard_variables/local_var.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/wildcard_variables/local_var.dart.strong.transformed.expect @@ -10,8 +10,8 @@ import self as self; import "dart:core" as core; static method main() → dynamic { - core::int _ = 1; - core::int _ = 2; + wildcard core::int _ = 1; + wildcard core::int _ = 2; invalid-expression "pkg/front_end/testcases/wildcard_variables/local_var.dart:8:3: Error: Setter not found: '_'. _ = 3; ^"; diff --git a/pkg/front_end/testcases/wildcard_variables/local_var_no_shadowing.dart.strong.expect b/pkg/front_end/testcases/wildcard_variables/local_var_no_shadowing.dart.strong.expect index fac4ef3c460..407215a136c 100644 --- a/pkg/front_end/testcases/wildcard_variables/local_var_no_shadowing.dart.strong.expect +++ b/pkg/front_end/testcases/wildcard_variables/local_var_no_shadowing.dart.strong.expect @@ -4,7 +4,7 @@ import "dart:core" as core; static field core::int _ = 100; static method main() → dynamic { - core::int _ = 1; - core::int _ = 2; + wildcard core::int _ = 1; + wildcard core::int _ = 2; self::_ = 3; } diff --git a/pkg/front_end/testcases/wildcard_variables/local_var_no_shadowing.dart.strong.modular.expect b/pkg/front_end/testcases/wildcard_variables/local_var_no_shadowing.dart.strong.modular.expect index fac4ef3c460..407215a136c 100644 --- a/pkg/front_end/testcases/wildcard_variables/local_var_no_shadowing.dart.strong.modular.expect +++ b/pkg/front_end/testcases/wildcard_variables/local_var_no_shadowing.dart.strong.modular.expect @@ -4,7 +4,7 @@ import "dart:core" as core; static field core::int _ = 100; static method main() → dynamic { - core::int _ = 1; - core::int _ = 2; + wildcard core::int _ = 1; + wildcard core::int _ = 2; self::_ = 3; } diff --git a/pkg/front_end/testcases/wildcard_variables/local_var_no_shadowing.dart.strong.transformed.expect b/pkg/front_end/testcases/wildcard_variables/local_var_no_shadowing.dart.strong.transformed.expect index fac4ef3c460..407215a136c 100644 --- a/pkg/front_end/testcases/wildcard_variables/local_var_no_shadowing.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/wildcard_variables/local_var_no_shadowing.dart.strong.transformed.expect @@ -4,7 +4,7 @@ import "dart:core" as core; static field core::int _ = 100; static method main() → dynamic { - core::int _ = 1; - core::int _ = 2; + wildcard core::int _ = 1; + wildcard core::int _ = 2; self::_ = 3; } diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md index 2cad44a8a69..166905856a0 100644 --- a/pkg/kernel/binary.md +++ b/pkg/kernel/binary.md @@ -147,7 +147,7 @@ type CanonicalName { type ComponentFile { UInt32 magic = 0x90ABCDEF; - UInt32 formatVersion = 118; + UInt32 formatVersion = 119; Byte[10] shortSdkHash; List problemsAsJson; // Described in problems.md. Library[] libraries; @@ -1501,7 +1501,7 @@ type VariableDeclarationPlain { UInt flags (isFinal, isConst, hasDeclaredInitializer, isInitializingFormal, isCovariantByClass, isLate, isRequired, isCovariantByDeclaration, - isLowered, isSynthesized, isHoisted); + isLowered, isSynthesized, isHoisted, isWildcard); // For named parameters, this is the parameter name. // For other variables, the name is cosmetic, may be empty, // and is not necessarily unique. diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart index 5c06d08c9a3..2c1c82d3870 100644 --- a/pkg/kernel/lib/ast.dart +++ b/pkg/kernel/lib/ast.dart @@ -10513,7 +10513,8 @@ class VariableDeclaration extends Statement implements Annotatable { bool isLowered = false, bool isSynthesized = false, bool isHoisted = false, - bool hasDeclaredInitializer = false}) { + bool hasDeclaredInitializer = false, + bool isWildcard = false}) { initializer?.parent = this; if (flags != -1) { this.flags = flags; @@ -10528,6 +10529,7 @@ class VariableDeclaration extends Statement implements Annotatable { this.hasDeclaredInitializer = hasDeclaredInitializer; this.isSynthesized = isSynthesized; this.isHoisted = isHoisted; + this.isWildcard = isWildcard; } assert(_name != null || this.isSynthesized, "Only synthesized variables can have no name."); @@ -10576,6 +10578,7 @@ class VariableDeclaration extends Statement implements Annotatable { static const int FlagLowered = 1 << 8; static const int FlagSynthesized = 1 << 9; static const int FlagHoisted = 1 << 10; + static const int FlagWildcard = 1 << 11; bool get isFinal => flags & FlagFinal != 0; bool get isConst => flags & FlagConst != 0; @@ -10641,6 +10644,11 @@ class VariableDeclaration extends Statement implements Annotatable { /// as the initializer of the second variable. bool get hasDeclaredInitializer => flags & FlagHasDeclaredInitializer != 0; + /// Whether this variable is a wildcard variable. + /// + /// Wildcard variables have the name `_`. + bool get isWildcard => flags & FlagWildcard != 0; + /// Whether the variable is assignable. /// /// This is `true` if the variable is neither constant nor final, or if it @@ -10709,6 +10717,12 @@ class VariableDeclaration extends Statement implements Annotatable { : (flags & ~FlagHasDeclaredInitializer); } + void set isWildcard(bool value) { + // TODO(kallentu): Change the name to be unique with other wildcard + // variables. + flags = value ? (flags | FlagWildcard) : (flags & ~FlagWildcard); + } + void clearAnnotations() { annotations = const []; } diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart index a43b09fd388..611537bc6bd 100644 --- a/pkg/kernel/lib/binary/tag.dart +++ b/pkg/kernel/lib/binary/tag.dart @@ -226,7 +226,7 @@ class Tag { /// Internal version of kernel binary format. /// Bump it when making incompatible changes in kernel binaries. /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md. - static const int BinaryFormatVersion = 118; + static const int BinaryFormatVersion = 119; } abstract class ConstantTag { diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart index 51d7af30c06..1bcbd5a0401 100644 --- a/pkg/kernel/lib/text/ast_to_text.dart +++ b/pkg/kernel/lib/text/ast_to_text.dart @@ -2452,6 +2452,7 @@ class Printer extends VisitorDefault with VisitorVoidMixin { writeModifier(node.isConst, 'const'); writeModifier(node.isSynthesized && node.name != null, 'synthesized'); writeModifier(node.isHoisted, 'hoisted'); + writeModifier(node.isWildcard, 'wildcard'); bool hasImplicitInitializer = node.initializer is NullLiteral || (node.initializer is ConstantExpression && (node.initializer as ConstantExpression).constant is NullConstant); diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h index 4b5e6432fff..3b97724486d 100644 --- a/runtime/vm/compiler/frontend/kernel_translation_helper.h +++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h @@ -419,6 +419,7 @@ class VariableDeclarationHelper { kLowered = 1 << 8, kSynthesized = 1 << 9, kHoisted = 1 << 10, + kWildcard = 1 << 11, }; explicit VariableDeclarationHelper(KernelReaderHelper* helper) @@ -440,6 +441,7 @@ class VariableDeclarationHelper { bool IsRequired() const { return (flags_ & kRequired) != 0; } bool IsSynthesized() const { return (flags_ & kSynthesized) != 0; } bool IsHoisted() const { return (flags_ & kHoisted) != 0; } + bool IsWildcard() const { return (flags_ & kWildcard) != 0; } bool HasDeclaredInitializer() const { return (flags_ & kHasDeclaredInitializer) != 0; } diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h index d2c07d35192..ad34f31ab63 100644 --- a/runtime/vm/kernel_binary.h +++ b/runtime/vm/kernel_binary.h @@ -18,7 +18,7 @@ namespace kernel { // package:kernel/binary.md. static const uint32_t kMagicProgramFile = 0x90ABCDEFu; -static const uint32_t kSupportedKernelFormatVersion = 118; +static const uint32_t kSupportedKernelFormatVersion = 119; // Keep in sync with package:kernel/lib/binary/tag.dart #define KERNEL_TAG_LIST(V) \