diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart index f2b5f95b80a..f5f164f90e0 100644 --- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart +++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart @@ -4679,7 +4679,7 @@ bool isInstantiated(DartType type) { return type.accept(new IsInstantiatedVisitor()); } -class IsInstantiatedVisitor extends DartTypeVisitor { +class IsInstantiatedVisitor implements DartTypeVisitor { final _availableVariables = new Set(); bool isInstantiated(DartType type) { @@ -4739,6 +4739,23 @@ class IsInstantiatedVisitor extends DartTypeVisitor { @override bool visitNeverType(NeverType node) => true; + + @override + bool visitRecordType(RecordType node) { + return node.positional.every((p) => p.accept(this)) && + node.named.every((p) => p.type.accept(this)); + } + + @override + bool visitExtensionType(ExtensionType node) { + return node.typeArguments + .every((DartType typeArgument) => typeArgument.accept(this)); + } + + @override + bool visitIntersectionType(IntersectionType node) { + return node.left.accept(this) && node.right.accept(this); + } } bool _isFormalParameter(VariableDeclaration variable) { diff --git a/pkg/front_end/testcases/records/tear_off_with_record_type.dart b/pkg/front_end/testcases/records/tear_off_with_record_type.dart new file mode 100644 index 00000000000..6a881c3da5b --- /dev/null +++ b/pkg/front_end/testcases/records/tear_off_with_record_type.dart @@ -0,0 +1,11 @@ +// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +class C { + void method() { + C<(num, {String name})>.new; // Const + C<(T, {String name})>.new; // Non-const + C<(num, {T name})>.new; // Non-const + } +} diff --git a/pkg/front_end/testcases/records/tear_off_with_record_type.dart.strong.expect b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.strong.expect new file mode 100644 index 00000000000..024d162940b --- /dev/null +++ b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.strong.expect @@ -0,0 +1,19 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +class C extends core::Object { + synthetic constructor •() → self::C + : super core::Object::•() + ; + method method() → void { + #C2; + #C1<(self::C::T%, {required name: core::String})>; + #C1<(core::num, {required name: self::C::T%})>; + } +} + +constants { + #C1 = constructor-tearoff self::C::• + #C2 = instantiation #C1 <(core::num, {required name: core::String})> +} diff --git a/pkg/front_end/testcases/records/tear_off_with_record_type.dart.strong.transformed.expect b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.strong.transformed.expect new file mode 100644 index 00000000000..024d162940b --- /dev/null +++ b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.strong.transformed.expect @@ -0,0 +1,19 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +class C extends core::Object { + synthetic constructor •() → self::C + : super core::Object::•() + ; + method method() → void { + #C2; + #C1<(self::C::T%, {required name: core::String})>; + #C1<(core::num, {required name: self::C::T%})>; + } +} + +constants { + #C1 = constructor-tearoff self::C::• + #C2 = instantiation #C1 <(core::num, {required name: core::String})> +} diff --git a/pkg/front_end/testcases/records/tear_off_with_record_type.dart.textual_outline.expect b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.textual_outline.expect new file mode 100644 index 00000000000..263a133b3ab --- /dev/null +++ b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.textual_outline.expect @@ -0,0 +1,3 @@ +class C { + void method() {} +} diff --git a/pkg/front_end/testcases/records/tear_off_with_record_type.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..263a133b3ab --- /dev/null +++ b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.textual_outline_modelled.expect @@ -0,0 +1,3 @@ +class C { + void method() {} +} diff --git a/pkg/front_end/testcases/records/tear_off_with_record_type.dart.weak.expect b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.weak.expect new file mode 100644 index 00000000000..4d983aefed0 --- /dev/null +++ b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.weak.expect @@ -0,0 +1,19 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +class C extends core::Object { + synthetic constructor •() → self::C + : super core::Object::•() + ; + method method() → void { + #C2; + #C1<(self::C::T%, {required name: core::String})>; + #C1<(core::num, {required name: self::C::T%})>; + } +} + +constants { + #C1 = constructor-tearoff self::C::• + #C2 = instantiation #C1 <(core::num*, {required name: core::String*})*> +} diff --git a/pkg/front_end/testcases/records/tear_off_with_record_type.dart.weak.modular.expect b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.weak.modular.expect new file mode 100644 index 00000000000..4d983aefed0 --- /dev/null +++ b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.weak.modular.expect @@ -0,0 +1,19 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +class C extends core::Object { + synthetic constructor •() → self::C + : super core::Object::•() + ; + method method() → void { + #C2; + #C1<(self::C::T%, {required name: core::String})>; + #C1<(core::num, {required name: self::C::T%})>; + } +} + +constants { + #C1 = constructor-tearoff self::C::• + #C2 = instantiation #C1 <(core::num*, {required name: core::String*})*> +} diff --git a/pkg/front_end/testcases/records/tear_off_with_record_type.dart.weak.outline.expect b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.weak.outline.expect new file mode 100644 index 00000000000..b105acbd96e --- /dev/null +++ b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.weak.outline.expect @@ -0,0 +1,10 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +class C extends core::Object { + synthetic constructor •() → self::C + ; + method method() → void + ; +} diff --git a/pkg/front_end/testcases/records/tear_off_with_record_type.dart.weak.transformed.expect b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.weak.transformed.expect new file mode 100644 index 00000000000..4d983aefed0 --- /dev/null +++ b/pkg/front_end/testcases/records/tear_off_with_record_type.dart.weak.transformed.expect @@ -0,0 +1,19 @@ +library /*isNonNullableByDefault*/; +import self as self; +import "dart:core" as core; + +class C extends core::Object { + synthetic constructor •() → self::C + : super core::Object::•() + ; + method method() → void { + #C2; + #C1<(self::C::T%, {required name: core::String})>; + #C1<(core::num, {required name: self::C::T%})>; + } +} + +constants { + #C1 = constructor-tearoff self::C::• + #C2 = instantiation #C1 <(core::num*, {required name: core::String*})*> +}