diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/diagnostic.g.dart b/pkg/_fe_analyzer_shared/lib/src/messages/diagnostic.g.dart index 1ddf8384924..d07e7a81352 100644 --- a/pkg/_fe_analyzer_shared/lib/src/messages/diagnostic.g.dart +++ b/pkg/_fe_analyzer_shared/lib/src/messages/diagnostic.g.dart @@ -2663,6 +2663,17 @@ const MessageCode nonPartOfDirectiveInPart = const MessageCode( """Try removing the other directives, or moving them to the library for which this is a part.""", ); +// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. +const MessageCode +nonRedirectingGenerativeConstructorWithPrimary = const MessageCode( + "NonRedirectingGenerativeConstructorWithPrimary", + sharedCode: SharedCode.nonRedirectingGenerativeConstructorWithPrimary, + problemMessage: + """Classes with primary constructors can't have non-redirecting generative constructors.""", + correctionMessage: + """Try making the constructor redirect to the primary constructor, or remove the primary constructor.""", +); + // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. const MessageCode nullAwareCascadeOutOfOrder = const MessageCode( "NullAwareCascadeOutOfOrder", @@ -3527,6 +3538,7 @@ enum SharedCode { nativeClauseShouldBeAnnotation, newConstructorNewName, newConstructorQualifiedName, + nonRedirectingGenerativeConstructorWithPrimary, nullAwareCascadeOutOfOrder, outOfOrderClauses, patternAssignmentDeclaresVariable, diff --git a/pkg/_fe_analyzer_shared/messages.yaml b/pkg/_fe_analyzer_shared/messages.yaml index b36dcaf396f..23ec7985ebb 100644 --- a/pkg/_fe_analyzer_shared/messages.yaml +++ b/pkg/_fe_analyzer_shared/messages.yaml @@ -2490,3 +2490,16 @@ factoryConstructorNewName: class C { factory new() => throw ''; } + +nonRedirectingGenerativeConstructorWithPrimary: + type: compileTimeError + parameters: none + problemMessage: "Classes with primary constructors can't have non-redirecting generative constructors." + correctionMessage: "Try making the constructor redirect to the primary constructor, or remove the primary constructor." + analyzerCode: nonRedirectingGenerativeConstructorWithPrimary + hasPublishedDocs: false + experiments: primary-constructors + script: | + class C() { + C.named(); + } \ No newline at end of file diff --git a/pkg/analyzer/lib/src/diagnostic/diagnostic_code_values.g.dart b/pkg/analyzer/lib/src/diagnostic/diagnostic_code_values.g.dart index 799d7ba1f88..4ffd12298c8 100644 --- a/pkg/analyzer/lib/src/diagnostic/diagnostic_code_values.g.dart +++ b/pkg/analyzer/lib/src/diagnostic/diagnostic_code_values.g.dart @@ -1263,6 +1263,7 @@ final sharedAnalyzerCodes = [ diag.nativeClauseShouldBeAnnotation, diag.newConstructorNewName, diag.newConstructorQualifiedName, + diag.nonRedirectingGenerativeConstructorWithPrimary, diag.nullAwareCascadeOutOfOrder, diag.outOfOrderClauses, diag.patternAssignmentDeclaresVariable, diff --git a/pkg/analyzer/messages.yaml b/pkg/analyzer/messages.yaml index 380efbec34f..413de6f8cd0 100644 --- a/pkg/analyzer/messages.yaml +++ b/pkg/analyzer/messages.yaml @@ -13122,12 +13122,6 @@ CompileTimeErrorCode: class B implements A {} ``` - nonRedirectingGenerativeConstructorWithPrimary: - type: compileTimeError - parameters: none - problemMessage: "Classes with primary constructors can't have non-redirecting generative constructors." - correctionMessage: "Try making the constructor redirect to the primary constructor, or remove the primary constructor." - hasPublishedDocs: false nonSyncFactory: type: compileTimeError parameters: none diff --git a/pkg/front_end/lib/src/kernel/kernel_target.dart b/pkg/front_end/lib/src/kernel/kernel_target.dart index a138f518149..51339c9edae 100644 --- a/pkg/front_end/lib/src/kernel/kernel_target.dart +++ b/pkg/front_end/lib/src/kernel/kernel_target.dart @@ -1617,6 +1617,25 @@ class KernelTarget { field.takePrimaryConstructorFieldInitializer(), ); } + if (classDeclaration is SourceClassBuilder) { + Iterator otherConstructorIterator = + classDeclaration.filteredConstructorsIterator( + includeDuplicates: false, + ); + while (otherConstructorIterator.moveNext()) { + SourceConstructorBuilder otherConstructor = + otherConstructorIterator.current; + if (constructor != otherConstructor && + !otherConstructor.isEffectivelyRedirecting) { + classDeclaration.libraryBuilder.addProblem( + diag.nonRedirectingGenerativeConstructorWithPrimary, + otherConstructor.fileOffset, + noLength, + otherConstructor.fileUri, + ); + } + } + } } } diff --git a/pkg/front_end/lib/src/source/fragment_factory_impl.dart b/pkg/front_end/lib/src/source/fragment_factory_impl.dart index 2562d5a0943..f145bf8af7f 100644 --- a/pkg/front_end/lib/src/source/fragment_factory_impl.dart +++ b/pkg/front_end/lib/src/source/fragment_factory_impl.dart @@ -1454,6 +1454,11 @@ class FragmentFactoryImpl implements FragmentFactory { NominalParameterNameSpace typeParameterNameSpace = _nominalParameterNameSpaces.pop(); + if (enclosingDeclaration.kind == DeclarationFragmentKind.enumDeclaration) { + // Primary constructors in enums are always constant. + isConst = true; + } + PrimaryConstructorFragment fragment = new PrimaryConstructorFragment( constructorName: constructorName, fileUri: _compilationUnit.fileUri, diff --git a/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart b/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart index 95c27ed8295..6f18b544a3d 100644 --- a/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart +++ b/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart @@ -2,7 +2,7 @@ // 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. -enum E1() { // Error +enum E1() { a } diff --git a/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.expect b/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.expect index 58259f342d0..78c2e571b89 100644 --- a/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.expect +++ b/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.expect @@ -2,15 +2,6 @@ library; // // Problems in library: // -// pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:5:8: Error: Generative enum constructors must be marked as 'const'. -// enum E1() { // Error -// ^ -// -// pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected. -// Try using a constructor or factory that is 'const'. -// a -// ^ -// // pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:15:14: Error: Final field 'b' is not initialized. // Try to initialize the field in the declaration or in every constructor. // final int? b; // Error @@ -27,23 +18,17 @@ import self as self; import "dart:core" as core; class E1 extends core::_Enum /*isEnum*/ { - enum-element static const field invalid-type a = invalid-expression "pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected. -Try using a constructor or factory that is 'const'. - a - ^"; - static const field core::List values = invalid-expression "pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected. -Try using a constructor or factory that is 'const'. - a - ^"; - constructor •(core::int #index, core::String #name) → self::E1 + enum-element static const field self::E1 a = #C3; + static const field core::List values = #C4; + const constructor •(core::int #index, core::String #name) → self::E1 : super core::_Enum::•(#index, #name) ; method core::_enumToString() → core::String return "E1.${this.{core::_Enum::_name}{core::String}}"; } class E2 extends core::_Enum /*isEnum*/ { - enum-element static const field self::E2 a = #C3; - static const field core::List values = #C4; + enum-element static const field self::E2 a = #C5; + static const field core::List values = #C6; const constructor •(core::int #index, core::String #name) → self::E2 : super core::_Enum::•(#index, #name) ; @@ -51,9 +36,9 @@ class E2 extends core::_Enum /*isEnum*/ { return "E2.${this.{core::_Enum::_name}{core::String}}"; } class E3 extends core::_Enum /*isEnum*/ { - enum-element static const field self::E3 a = #C6; + enum-element static const field self::E3 a = #C8; final field core::int? b = null; - static const field core::List values = #C7; + static const field core::List values = #C9; const constructor •(core::int #index, core::String #name) → self::E3 : super core::_Enum::•(#index, #name) ; @@ -61,9 +46,9 @@ class E3 extends core::_Enum /*isEnum*/ { return "E3.${this.{core::_Enum::_name}{core::String}}"; } class E4 extends core::_Enum /*isEnum*/ { - enum-element static const field self::E4 a = #C8; + enum-element static const field self::E4 a = #C10; field core::int? b = null; - static const field core::List values = #C9; + static const field core::List values = #C11; const constructor •(core::int #index, core::String #name) → self::E4 : super core::_Enum::•(#index, #name) ; @@ -74,20 +59,23 @@ class E4 extends core::_Enum /*isEnum*/ { constants { #C1 = 0 #C2 = "a" - #C3 = self::E2 {index:#C1, _name:#C2} - #C4 = [#C3] - #C5 = null - #C6 = self::E3 {b:#C5, index:#C1, _name:#C2} - #C7 = [#C6] - #C8 = self::E4 {b:#C5, index:#C1, _name:#C2} - #C9 = [#C8] + #C3 = self::E1 {index:#C1, _name:#C2} + #C4 = [#C3] + #C5 = self::E2 {index:#C1, _name:#C2} + #C6 = [#C5] + #C7 = null + #C8 = self::E3 {b:#C7, index:#C1, _name:#C2} + #C9 = [#C8] + #C10 = self::E4 {b:#C7, index:#C1, _name:#C2} + #C11 = [#C10] } Constructor coverage from constants: org-dartlang-testcase:///enum_primary_constructor.dart: -- E2. (from org-dartlang-testcase:///enum_primary_constructor.dart:9:14) +- E1. (from org-dartlang-testcase:///enum_primary_constructor.dart:5:8) - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart) - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart) +- E2. (from org-dartlang-testcase:///enum_primary_constructor.dart:9:14) - E3. (from org-dartlang-testcase:///enum_primary_constructor.dart:13:14) - E4. (from org-dartlang-testcase:///enum_primary_constructor.dart:18:14) diff --git a/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.modular.expect b/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.modular.expect index 58259f342d0..78c2e571b89 100644 --- a/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.modular.expect +++ b/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.modular.expect @@ -2,15 +2,6 @@ library; // // Problems in library: // -// pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:5:8: Error: Generative enum constructors must be marked as 'const'. -// enum E1() { // Error -// ^ -// -// pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected. -// Try using a constructor or factory that is 'const'. -// a -// ^ -// // pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:15:14: Error: Final field 'b' is not initialized. // Try to initialize the field in the declaration or in every constructor. // final int? b; // Error @@ -27,23 +18,17 @@ import self as self; import "dart:core" as core; class E1 extends core::_Enum /*isEnum*/ { - enum-element static const field invalid-type a = invalid-expression "pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected. -Try using a constructor or factory that is 'const'. - a - ^"; - static const field core::List values = invalid-expression "pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected. -Try using a constructor or factory that is 'const'. - a - ^"; - constructor •(core::int #index, core::String #name) → self::E1 + enum-element static const field self::E1 a = #C3; + static const field core::List values = #C4; + const constructor •(core::int #index, core::String #name) → self::E1 : super core::_Enum::•(#index, #name) ; method core::_enumToString() → core::String return "E1.${this.{core::_Enum::_name}{core::String}}"; } class E2 extends core::_Enum /*isEnum*/ { - enum-element static const field self::E2 a = #C3; - static const field core::List values = #C4; + enum-element static const field self::E2 a = #C5; + static const field core::List values = #C6; const constructor •(core::int #index, core::String #name) → self::E2 : super core::_Enum::•(#index, #name) ; @@ -51,9 +36,9 @@ class E2 extends core::_Enum /*isEnum*/ { return "E2.${this.{core::_Enum::_name}{core::String}}"; } class E3 extends core::_Enum /*isEnum*/ { - enum-element static const field self::E3 a = #C6; + enum-element static const field self::E3 a = #C8; final field core::int? b = null; - static const field core::List values = #C7; + static const field core::List values = #C9; const constructor •(core::int #index, core::String #name) → self::E3 : super core::_Enum::•(#index, #name) ; @@ -61,9 +46,9 @@ class E3 extends core::_Enum /*isEnum*/ { return "E3.${this.{core::_Enum::_name}{core::String}}"; } class E4 extends core::_Enum /*isEnum*/ { - enum-element static const field self::E4 a = #C8; + enum-element static const field self::E4 a = #C10; field core::int? b = null; - static const field core::List values = #C9; + static const field core::List values = #C11; const constructor •(core::int #index, core::String #name) → self::E4 : super core::_Enum::•(#index, #name) ; @@ -74,20 +59,23 @@ class E4 extends core::_Enum /*isEnum*/ { constants { #C1 = 0 #C2 = "a" - #C3 = self::E2 {index:#C1, _name:#C2} - #C4 = [#C3] - #C5 = null - #C6 = self::E3 {b:#C5, index:#C1, _name:#C2} - #C7 = [#C6] - #C8 = self::E4 {b:#C5, index:#C1, _name:#C2} - #C9 = [#C8] + #C3 = self::E1 {index:#C1, _name:#C2} + #C4 = [#C3] + #C5 = self::E2 {index:#C1, _name:#C2} + #C6 = [#C5] + #C7 = null + #C8 = self::E3 {b:#C7, index:#C1, _name:#C2} + #C9 = [#C8] + #C10 = self::E4 {b:#C7, index:#C1, _name:#C2} + #C11 = [#C10] } Constructor coverage from constants: org-dartlang-testcase:///enum_primary_constructor.dart: -- E2. (from org-dartlang-testcase:///enum_primary_constructor.dart:9:14) +- E1. (from org-dartlang-testcase:///enum_primary_constructor.dart:5:8) - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart) - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart) +- E2. (from org-dartlang-testcase:///enum_primary_constructor.dart:9:14) - E3. (from org-dartlang-testcase:///enum_primary_constructor.dart:13:14) - E4. (from org-dartlang-testcase:///enum_primary_constructor.dart:18:14) diff --git a/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.outline.expect b/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.outline.expect index a68ed91f8e4..a3cc336d87c 100644 --- a/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.outline.expect +++ b/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.outline.expect @@ -1,26 +1,12 @@ library; -// -// Problems in library: -// -// pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:5:8: Error: Generative enum constructors must be marked as 'const'. -// enum E1() { // Error -// ^ -// -// pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected. -// Try using a constructor or factory that is 'const'. -// a -// ^ -// import self as self; import "dart:core" as core; class E1 extends core::_Enum /*isEnum*/ { - enum-element static const field invalid-type a = invalid-expression "pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected. -Try using a constructor or factory that is 'const'. - a - ^"; + enum-element static const field self::E1 a = const self::E1::•(0, "a"); static const field core::List values = const [self::E1::a]; - constructor •(core::int #index, core::String #name) → self::E1 + const constructor •(core::int #index, core::String #name) → self::E1 + : super core::_Enum::•(#index, #name) ; method core::_enumToString() → core::String return "E1.${this.{core::_Enum::_name}{core::String}}"; @@ -57,10 +43,12 @@ class E4 extends core::_Enum /*isEnum*/ { Extra constant evaluation status: +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_primary_constructor.dart:6:3 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "a"}) +Evaluated: ListLiteral @ org-dartlang-testcase:///enum_primary_constructor.dart:5:6 -> ListConstant(const [const E1{_Enum.index: 0, _Enum._name: "a"}]) Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_primary_constructor.dart:10:3 -> InstanceConstant(const E2{_Enum.index: 0, _Enum._name: "a"}) Evaluated: ListLiteral @ org-dartlang-testcase:///enum_primary_constructor.dart:9:12 -> ListConstant(const [const E2{_Enum.index: 0, _Enum._name: "a"}]) Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_primary_constructor.dart:14:3 -> InstanceConstant(const E3{E3.b: null, _Enum.index: 0, _Enum._name: "a"}) Evaluated: ListLiteral @ org-dartlang-testcase:///enum_primary_constructor.dart:13:12 -> ListConstant(const [const E3{E3.b: null, _Enum.index: 0, _Enum._name: "a"}]) Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_primary_constructor.dart:19:3 -> InstanceConstant(const E4{E4.b: null, _Enum.index: 0, _Enum._name: "a"}) Evaluated: ListLiteral @ org-dartlang-testcase:///enum_primary_constructor.dart:18:12 -> ListConstant(const [const E4{E4.b: null, _Enum.index: 0, _Enum._name: "a"}]) -Extra constant evaluation: evaluated: 26, effectively constant: 6 +Extra constant evaluation: evaluated: 28, effectively constant: 8 diff --git a/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.transformed.expect index 58259f342d0..78c2e571b89 100644 --- a/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart.strong.transformed.expect @@ -2,15 +2,6 @@ library; // // Problems in library: // -// pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:5:8: Error: Generative enum constructors must be marked as 'const'. -// enum E1() { // Error -// ^ -// -// pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected. -// Try using a constructor or factory that is 'const'. -// a -// ^ -// // pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:15:14: Error: Final field 'b' is not initialized. // Try to initialize the field in the declaration or in every constructor. // final int? b; // Error @@ -27,23 +18,17 @@ import self as self; import "dart:core" as core; class E1 extends core::_Enum /*isEnum*/ { - enum-element static const field invalid-type a = invalid-expression "pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected. -Try using a constructor or factory that is 'const'. - a - ^"; - static const field core::List values = invalid-expression "pkg/front_end/testcases/primary_constructors/enum_primary_constructor.dart:6:3: Error: Cannot invoke a non-'const' constructor where a const expression is expected. -Try using a constructor or factory that is 'const'. - a - ^"; - constructor •(core::int #index, core::String #name) → self::E1 + enum-element static const field self::E1 a = #C3; + static const field core::List values = #C4; + const constructor •(core::int #index, core::String #name) → self::E1 : super core::_Enum::•(#index, #name) ; method core::_enumToString() → core::String return "E1.${this.{core::_Enum::_name}{core::String}}"; } class E2 extends core::_Enum /*isEnum*/ { - enum-element static const field self::E2 a = #C3; - static const field core::List values = #C4; + enum-element static const field self::E2 a = #C5; + static const field core::List values = #C6; const constructor •(core::int #index, core::String #name) → self::E2 : super core::_Enum::•(#index, #name) ; @@ -51,9 +36,9 @@ class E2 extends core::_Enum /*isEnum*/ { return "E2.${this.{core::_Enum::_name}{core::String}}"; } class E3 extends core::_Enum /*isEnum*/ { - enum-element static const field self::E3 a = #C6; + enum-element static const field self::E3 a = #C8; final field core::int? b = null; - static const field core::List values = #C7; + static const field core::List values = #C9; const constructor •(core::int #index, core::String #name) → self::E3 : super core::_Enum::•(#index, #name) ; @@ -61,9 +46,9 @@ class E3 extends core::_Enum /*isEnum*/ { return "E3.${this.{core::_Enum::_name}{core::String}}"; } class E4 extends core::_Enum /*isEnum*/ { - enum-element static const field self::E4 a = #C8; + enum-element static const field self::E4 a = #C10; field core::int? b = null; - static const field core::List values = #C9; + static const field core::List values = #C11; const constructor •(core::int #index, core::String #name) → self::E4 : super core::_Enum::•(#index, #name) ; @@ -74,20 +59,23 @@ class E4 extends core::_Enum /*isEnum*/ { constants { #C1 = 0 #C2 = "a" - #C3 = self::E2 {index:#C1, _name:#C2} - #C4 = [#C3] - #C5 = null - #C6 = self::E3 {b:#C5, index:#C1, _name:#C2} - #C7 = [#C6] - #C8 = self::E4 {b:#C5, index:#C1, _name:#C2} - #C9 = [#C8] + #C3 = self::E1 {index:#C1, _name:#C2} + #C4 = [#C3] + #C5 = self::E2 {index:#C1, _name:#C2} + #C6 = [#C5] + #C7 = null + #C8 = self::E3 {b:#C7, index:#C1, _name:#C2} + #C9 = [#C8] + #C10 = self::E4 {b:#C7, index:#C1, _name:#C2} + #C11 = [#C10] } Constructor coverage from constants: org-dartlang-testcase:///enum_primary_constructor.dart: -- E2. (from org-dartlang-testcase:///enum_primary_constructor.dart:9:14) +- E1. (from org-dartlang-testcase:///enum_primary_constructor.dart:5:8) - _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart) - Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart) +- E2. (from org-dartlang-testcase:///enum_primary_constructor.dart:9:14) - E3. (from org-dartlang-testcase:///enum_primary_constructor.dart:13:14) - E4. (from org-dartlang-testcase:///enum_primary_constructor.dart:18:14) diff --git a/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart b/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart new file mode 100644 index 00000000000..09f1baa80f3 --- /dev/null +++ b/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart @@ -0,0 +1,75 @@ +// Copyright (c) 2026, 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 C1() { + C1.other(); // Error +} + +class C2() { + new other1(); // Error + new other2(); // Error +} + +class C3() { + new other() : this(); // Ok +} + +class C4() { + new other() : this(); // Ok +} + +class C5.primary() { + new(); // Error +} + +class C6.primary() { + new() : this.primary(); // Ok +} + +enum E1() { + a(), b.other(); + const E1.other(); // Error +} + +enum E2() { + a(), b.other1(), c.other2(); + const new other1(); // Error + const new other2(); // Error +} + +enum E3() { + a(), b.other(); + const new other() : this(); // Ok +} + +enum E4() { + a(), b.other(); + const new other() : this(); // Ok +} + +enum E5.primary() { + a(), b.primary(); + const new(); // Error +} + +enum E6.primary() { + a(), b.primary(); + const new() : this.primary(); // Ok +} + +extension type ET1(int i) { + ET1.other(this.i); // Ok +} + +extension type E2T(int i) { + new other(int i) : this(i); // Ok +} + +extension type ET3.primary(int i) { + new(this.i); // Ok +} + +extension type ET4.primary(int i) { + new(int i) : this.primary(i); // Ok +} \ No newline at end of file diff --git a/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.strong.expect b/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.strong.expect new file mode 100644 index 00000000000..5f08b20a397 --- /dev/null +++ b/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.strong.expect @@ -0,0 +1,305 @@ +library; +// +// Problems in library: +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:6:3: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// C1.other(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:10:7: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// new other1(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:11:7: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// new other2(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:23:3: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// new(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:32:9: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// const E1.other(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:37:13: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// const new other1(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:38:13: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// const new other2(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:53:9: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// const new(); // Error +// ^ +// +import self as self; +import "dart:core" as core; + +class C1 extends core::Object { + constructor •() → self::C1 + : super core::Object::•() + ; + constructor other() → self::C1 + : super core::Object::•() + ; +} +class C2 extends core::Object { + constructor •() → self::C2 + : super core::Object::•() + ; + constructor other1() → self::C2 + : super core::Object::•() + ; + constructor other2() → self::C2 + : super core::Object::•() + ; +} +class C3 extends core::Object { + constructor •() → self::C3 + : super core::Object::•() + ; + constructor other() → self::C3 + : this self::C3::•() + ; +} +class C4 extends core::Object { + constructor •() → self::C4 + : super core::Object::•() + ; + constructor other() → self::C4 + : this self::C4::•() + ; +} +class C5 extends core::Object { + constructor primary() → self::C5 + : super core::Object::•() + ; + constructor •() → self::C5 + : super core::Object::•() + ; +} +class C6 extends core::Object { + constructor primary() → self::C6 + : super core::Object::•() + ; + constructor •() → self::C6 + : this self::C6::primary() + ; +} +class E1 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E1 a = #C3; + enum-element static const field self::E1 b = #C6; + static const field core::List values = #C7; + const constructor •(core::int #index, core::String #name) → self::E1 + : super core::_Enum::•(#index, #name) + ; + const constructor other(core::int #index, core::String #name) → self::E1 + : super core::_Enum::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E1.${this.{core::_Enum::_name}{core::String}}"; +} +class E2 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E2 a = #C8; + enum-element static const field self::E2 b = #C9; + enum-element static const field self::E2 c = #C12; + static const field core::List values = #C13; + const constructor •(core::int #index, core::String #name) → self::E2 + : super core::_Enum::•(#index, #name) + ; + const constructor other1(core::int #index, core::String #name) → self::E2 + : super core::_Enum::•(#index, #name) + ; + const constructor other2(core::int #index, core::String #name) → self::E2 + : super core::_Enum::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E2.${this.{core::_Enum::_name}{core::String}}"; +} +class E3 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E3 a = #C14; + enum-element static const field self::E3 b = #C15; + static const field core::List values = #C16; + const constructor •(core::int #index, core::String #name) → self::E3 + : super core::_Enum::•(#index, #name) + ; + const constructor other(core::int #index, core::String #name) → self::E3 + : this self::E3::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E3.${this.{core::_Enum::_name}{core::String}}"; +} +class E4 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E4 a = #C17; + enum-element static const field self::E4 b = #C18; + static const field core::List values = #C19; + const constructor •(core::int #index, core::String #name) → self::E4 + : super core::_Enum::•(#index, #name) + ; + const constructor other(core::int #index, core::String #name) → self::E4 + : this self::E4::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E4.${this.{core::_Enum::_name}{core::String}}"; +} +class E5 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E5 a = #C20; + enum-element static const field self::E5 b = #C21; + static const field core::List values = #C22; + const constructor primary(core::int #index, core::String #name) → self::E5 + : super core::_Enum::•(#index, #name) + ; + const constructor •(core::int #index, core::String #name) → self::E5 + : super core::_Enum::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E5.${this.{core::_Enum::_name}{core::String}}"; +} +class E6 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E6 a = #C23; + enum-element static const field self::E6 b = #C24; + static const field core::List values = #C25; + const constructor primary(core::int #index, core::String #name) → self::E6 + : super core::_Enum::•(#index, #name) + ; + const constructor •(core::int #index, core::String #name) → self::E6 + : this self::E6::primary(#index, #name) + ; + method core::_enumToString() → core::String + return "E6.${this.{core::_Enum::_name}{core::String}}"; +} +extension type ET1(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor • = self::ET1|constructor#; + constructor tearoff • = self::ET1|constructor#_#new#tearOff; + constructor other = self::ET1|constructor#other; + constructor tearoff other = self::ET1|constructor#_#other#tearOff; +} +extension type E2T(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor • = self::E2T|constructor#; + constructor tearoff • = self::E2T|constructor#_#new#tearOff; + constructor other = self::E2T|constructor#other; + constructor tearoff other = self::E2T|constructor#_#other#tearOff; +} +extension type ET3(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor primary = self::ET3|constructor#primary; + constructor tearoff primary = self::ET3|constructor#_#primary#tearOff; + constructor • = self::ET3|constructor#; + constructor tearoff • = self::ET3|constructor#_#new#tearOff; +} +extension type ET4(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor primary = self::ET4|constructor#primary; + constructor tearoff primary = self::ET4|constructor#_#primary#tearOff; + constructor • = self::ET4|constructor#; + constructor tearoff • = self::ET4|constructor#_#new#tearOff; +} +static extension-type-member method ET1|constructor#(core::int i) → self::ET1% /* erasure=core::int, declared=! */ { + lowered final self::ET1% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET1|constructor#_#new#tearOff(core::int i) → self::ET1% /* erasure=core::int, declared=! */ + return self::ET1|constructor#(i); +static extension-type-member method ET1|constructor#other(core::int i) → self::ET1% /* erasure=core::int, declared=! */ { + lowered final self::ET1% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET1|constructor#_#other#tearOff(core::int i) → self::ET1% /* erasure=core::int, declared=! */ + return self::ET1|constructor#other(i); +static extension-type-member method E2T|constructor#(core::int i) → self::E2T% /* erasure=core::int, declared=! */ { + lowered final self::E2T% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method E2T|constructor#_#new#tearOff(core::int i) → self::E2T% /* erasure=core::int, declared=! */ + return self::E2T|constructor#(i); +static extension-type-member method E2T|constructor#other(core::int i) → self::E2T% /* erasure=core::int, declared=! */ { + lowered final self::E2T% /* erasure=core::int, declared=! */ #this; + #this = self::E2T|constructor#(i); + return #this; +} +static extension-type-member synthetic method E2T|constructor#_#other#tearOff(core::int i) → self::E2T% /* erasure=core::int, declared=! */ + return self::E2T|constructor#other(i); +static extension-type-member method ET3|constructor#primary(core::int i) → self::ET3% /* erasure=core::int, declared=! */ { + lowered final self::ET3% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET3|constructor#_#primary#tearOff(core::int i) → self::ET3% /* erasure=core::int, declared=! */ + return self::ET3|constructor#primary(i); +static extension-type-member method ET3|constructor#(core::int i) → self::ET3% /* erasure=core::int, declared=! */ { + lowered final self::ET3% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET3|constructor#_#new#tearOff(core::int i) → self::ET3% /* erasure=core::int, declared=! */ + return self::ET3|constructor#(i); +static extension-type-member method ET4|constructor#primary(core::int i) → self::ET4% /* erasure=core::int, declared=! */ { + lowered final self::ET4% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET4|constructor#_#primary#tearOff(core::int i) → self::ET4% /* erasure=core::int, declared=! */ + return self::ET4|constructor#primary(i); +static extension-type-member method ET4|constructor#(core::int i) → self::ET4% /* erasure=core::int, declared=! */ { + lowered final self::ET4% /* erasure=core::int, declared=! */ #this; + #this = self::ET4|constructor#primary(i); + return #this; +} +static extension-type-member synthetic method ET4|constructor#_#new#tearOff(core::int i) → self::ET4% /* erasure=core::int, declared=! */ + return self::ET4|constructor#(i); + +constants { + #C1 = 0 + #C2 = "a" + #C3 = self::E1 {index:#C1, _name:#C2} + #C4 = 1 + #C5 = "b" + #C6 = self::E1 {index:#C4, _name:#C5} + #C7 = [#C3, #C6] + #C8 = self::E2 {index:#C1, _name:#C2} + #C9 = self::E2 {index:#C4, _name:#C5} + #C10 = 2 + #C11 = "c" + #C12 = self::E2 {index:#C10, _name:#C11} + #C13 = [#C8, #C9, #C12] + #C14 = self::E3 {index:#C1, _name:#C2} + #C15 = self::E3 {index:#C4, _name:#C5} + #C16 = [#C14, #C15] + #C17 = self::E4 {index:#C1, _name:#C2} + #C18 = self::E4 {index:#C4, _name:#C5} + #C19 = [#C17, #C18] + #C20 = self::E5 {index:#C1, _name:#C2} + #C21 = self::E5 {index:#C4, _name:#C5} + #C22 = [#C20, #C21] + #C23 = self::E6 {index:#C1, _name:#C2} + #C24 = self::E6 {index:#C4, _name:#C5} + #C25 = [#C23, #C24] +} + + +Constructor coverage from constants: +org-dartlang-testcase:///primary_and_generative.dart: +- E1. (from org-dartlang-testcase:///primary_and_generative.dart:30:8) +- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart) +- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart) +- E1.other (from org-dartlang-testcase:///primary_and_generative.dart:32:9) +- E2. (from org-dartlang-testcase:///primary_and_generative.dart:35:8) +- E2.other1 (from org-dartlang-testcase:///primary_and_generative.dart:37:13) +- E2.other2 (from org-dartlang-testcase:///primary_and_generative.dart:38:13) +- E3. (from org-dartlang-testcase:///primary_and_generative.dart:41:8) +- E3.other (from org-dartlang-testcase:///primary_and_generative.dart:43:13) +- E4. (from org-dartlang-testcase:///primary_and_generative.dart:46:8) +- E4.other (from org-dartlang-testcase:///primary_and_generative.dart:48:13) +- E5. (from org-dartlang-testcase:///primary_and_generative.dart:53:9) +- E5.primary (from org-dartlang-testcase:///primary_and_generative.dart:51:9) +- E6. (from org-dartlang-testcase:///primary_and_generative.dart:58:9) +- E6.primary (from org-dartlang-testcase:///primary_and_generative.dart:56:9) diff --git a/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.strong.modular.expect b/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.strong.modular.expect new file mode 100644 index 00000000000..5f08b20a397 --- /dev/null +++ b/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.strong.modular.expect @@ -0,0 +1,305 @@ +library; +// +// Problems in library: +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:6:3: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// C1.other(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:10:7: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// new other1(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:11:7: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// new other2(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:23:3: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// new(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:32:9: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// const E1.other(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:37:13: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// const new other1(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:38:13: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// const new other2(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:53:9: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// const new(); // Error +// ^ +// +import self as self; +import "dart:core" as core; + +class C1 extends core::Object { + constructor •() → self::C1 + : super core::Object::•() + ; + constructor other() → self::C1 + : super core::Object::•() + ; +} +class C2 extends core::Object { + constructor •() → self::C2 + : super core::Object::•() + ; + constructor other1() → self::C2 + : super core::Object::•() + ; + constructor other2() → self::C2 + : super core::Object::•() + ; +} +class C3 extends core::Object { + constructor •() → self::C3 + : super core::Object::•() + ; + constructor other() → self::C3 + : this self::C3::•() + ; +} +class C4 extends core::Object { + constructor •() → self::C4 + : super core::Object::•() + ; + constructor other() → self::C4 + : this self::C4::•() + ; +} +class C5 extends core::Object { + constructor primary() → self::C5 + : super core::Object::•() + ; + constructor •() → self::C5 + : super core::Object::•() + ; +} +class C6 extends core::Object { + constructor primary() → self::C6 + : super core::Object::•() + ; + constructor •() → self::C6 + : this self::C6::primary() + ; +} +class E1 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E1 a = #C3; + enum-element static const field self::E1 b = #C6; + static const field core::List values = #C7; + const constructor •(core::int #index, core::String #name) → self::E1 + : super core::_Enum::•(#index, #name) + ; + const constructor other(core::int #index, core::String #name) → self::E1 + : super core::_Enum::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E1.${this.{core::_Enum::_name}{core::String}}"; +} +class E2 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E2 a = #C8; + enum-element static const field self::E2 b = #C9; + enum-element static const field self::E2 c = #C12; + static const field core::List values = #C13; + const constructor •(core::int #index, core::String #name) → self::E2 + : super core::_Enum::•(#index, #name) + ; + const constructor other1(core::int #index, core::String #name) → self::E2 + : super core::_Enum::•(#index, #name) + ; + const constructor other2(core::int #index, core::String #name) → self::E2 + : super core::_Enum::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E2.${this.{core::_Enum::_name}{core::String}}"; +} +class E3 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E3 a = #C14; + enum-element static const field self::E3 b = #C15; + static const field core::List values = #C16; + const constructor •(core::int #index, core::String #name) → self::E3 + : super core::_Enum::•(#index, #name) + ; + const constructor other(core::int #index, core::String #name) → self::E3 + : this self::E3::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E3.${this.{core::_Enum::_name}{core::String}}"; +} +class E4 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E4 a = #C17; + enum-element static const field self::E4 b = #C18; + static const field core::List values = #C19; + const constructor •(core::int #index, core::String #name) → self::E4 + : super core::_Enum::•(#index, #name) + ; + const constructor other(core::int #index, core::String #name) → self::E4 + : this self::E4::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E4.${this.{core::_Enum::_name}{core::String}}"; +} +class E5 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E5 a = #C20; + enum-element static const field self::E5 b = #C21; + static const field core::List values = #C22; + const constructor primary(core::int #index, core::String #name) → self::E5 + : super core::_Enum::•(#index, #name) + ; + const constructor •(core::int #index, core::String #name) → self::E5 + : super core::_Enum::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E5.${this.{core::_Enum::_name}{core::String}}"; +} +class E6 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E6 a = #C23; + enum-element static const field self::E6 b = #C24; + static const field core::List values = #C25; + const constructor primary(core::int #index, core::String #name) → self::E6 + : super core::_Enum::•(#index, #name) + ; + const constructor •(core::int #index, core::String #name) → self::E6 + : this self::E6::primary(#index, #name) + ; + method core::_enumToString() → core::String + return "E6.${this.{core::_Enum::_name}{core::String}}"; +} +extension type ET1(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor • = self::ET1|constructor#; + constructor tearoff • = self::ET1|constructor#_#new#tearOff; + constructor other = self::ET1|constructor#other; + constructor tearoff other = self::ET1|constructor#_#other#tearOff; +} +extension type E2T(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor • = self::E2T|constructor#; + constructor tearoff • = self::E2T|constructor#_#new#tearOff; + constructor other = self::E2T|constructor#other; + constructor tearoff other = self::E2T|constructor#_#other#tearOff; +} +extension type ET3(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor primary = self::ET3|constructor#primary; + constructor tearoff primary = self::ET3|constructor#_#primary#tearOff; + constructor • = self::ET3|constructor#; + constructor tearoff • = self::ET3|constructor#_#new#tearOff; +} +extension type ET4(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor primary = self::ET4|constructor#primary; + constructor tearoff primary = self::ET4|constructor#_#primary#tearOff; + constructor • = self::ET4|constructor#; + constructor tearoff • = self::ET4|constructor#_#new#tearOff; +} +static extension-type-member method ET1|constructor#(core::int i) → self::ET1% /* erasure=core::int, declared=! */ { + lowered final self::ET1% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET1|constructor#_#new#tearOff(core::int i) → self::ET1% /* erasure=core::int, declared=! */ + return self::ET1|constructor#(i); +static extension-type-member method ET1|constructor#other(core::int i) → self::ET1% /* erasure=core::int, declared=! */ { + lowered final self::ET1% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET1|constructor#_#other#tearOff(core::int i) → self::ET1% /* erasure=core::int, declared=! */ + return self::ET1|constructor#other(i); +static extension-type-member method E2T|constructor#(core::int i) → self::E2T% /* erasure=core::int, declared=! */ { + lowered final self::E2T% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method E2T|constructor#_#new#tearOff(core::int i) → self::E2T% /* erasure=core::int, declared=! */ + return self::E2T|constructor#(i); +static extension-type-member method E2T|constructor#other(core::int i) → self::E2T% /* erasure=core::int, declared=! */ { + lowered final self::E2T% /* erasure=core::int, declared=! */ #this; + #this = self::E2T|constructor#(i); + return #this; +} +static extension-type-member synthetic method E2T|constructor#_#other#tearOff(core::int i) → self::E2T% /* erasure=core::int, declared=! */ + return self::E2T|constructor#other(i); +static extension-type-member method ET3|constructor#primary(core::int i) → self::ET3% /* erasure=core::int, declared=! */ { + lowered final self::ET3% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET3|constructor#_#primary#tearOff(core::int i) → self::ET3% /* erasure=core::int, declared=! */ + return self::ET3|constructor#primary(i); +static extension-type-member method ET3|constructor#(core::int i) → self::ET3% /* erasure=core::int, declared=! */ { + lowered final self::ET3% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET3|constructor#_#new#tearOff(core::int i) → self::ET3% /* erasure=core::int, declared=! */ + return self::ET3|constructor#(i); +static extension-type-member method ET4|constructor#primary(core::int i) → self::ET4% /* erasure=core::int, declared=! */ { + lowered final self::ET4% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET4|constructor#_#primary#tearOff(core::int i) → self::ET4% /* erasure=core::int, declared=! */ + return self::ET4|constructor#primary(i); +static extension-type-member method ET4|constructor#(core::int i) → self::ET4% /* erasure=core::int, declared=! */ { + lowered final self::ET4% /* erasure=core::int, declared=! */ #this; + #this = self::ET4|constructor#primary(i); + return #this; +} +static extension-type-member synthetic method ET4|constructor#_#new#tearOff(core::int i) → self::ET4% /* erasure=core::int, declared=! */ + return self::ET4|constructor#(i); + +constants { + #C1 = 0 + #C2 = "a" + #C3 = self::E1 {index:#C1, _name:#C2} + #C4 = 1 + #C5 = "b" + #C6 = self::E1 {index:#C4, _name:#C5} + #C7 = [#C3, #C6] + #C8 = self::E2 {index:#C1, _name:#C2} + #C9 = self::E2 {index:#C4, _name:#C5} + #C10 = 2 + #C11 = "c" + #C12 = self::E2 {index:#C10, _name:#C11} + #C13 = [#C8, #C9, #C12] + #C14 = self::E3 {index:#C1, _name:#C2} + #C15 = self::E3 {index:#C4, _name:#C5} + #C16 = [#C14, #C15] + #C17 = self::E4 {index:#C1, _name:#C2} + #C18 = self::E4 {index:#C4, _name:#C5} + #C19 = [#C17, #C18] + #C20 = self::E5 {index:#C1, _name:#C2} + #C21 = self::E5 {index:#C4, _name:#C5} + #C22 = [#C20, #C21] + #C23 = self::E6 {index:#C1, _name:#C2} + #C24 = self::E6 {index:#C4, _name:#C5} + #C25 = [#C23, #C24] +} + + +Constructor coverage from constants: +org-dartlang-testcase:///primary_and_generative.dart: +- E1. (from org-dartlang-testcase:///primary_and_generative.dart:30:8) +- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart) +- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart) +- E1.other (from org-dartlang-testcase:///primary_and_generative.dart:32:9) +- E2. (from org-dartlang-testcase:///primary_and_generative.dart:35:8) +- E2.other1 (from org-dartlang-testcase:///primary_and_generative.dart:37:13) +- E2.other2 (from org-dartlang-testcase:///primary_and_generative.dart:38:13) +- E3. (from org-dartlang-testcase:///primary_and_generative.dart:41:8) +- E3.other (from org-dartlang-testcase:///primary_and_generative.dart:43:13) +- E4. (from org-dartlang-testcase:///primary_and_generative.dart:46:8) +- E4.other (from org-dartlang-testcase:///primary_and_generative.dart:48:13) +- E5. (from org-dartlang-testcase:///primary_and_generative.dart:53:9) +- E5.primary (from org-dartlang-testcase:///primary_and_generative.dart:51:9) +- E6. (from org-dartlang-testcase:///primary_and_generative.dart:58:9) +- E6.primary (from org-dartlang-testcase:///primary_and_generative.dart:56:9) diff --git a/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.strong.outline.expect b/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.strong.outline.expect new file mode 100644 index 00000000000..d859b99538f --- /dev/null +++ b/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.strong.outline.expect @@ -0,0 +1,207 @@ +library; +import self as self; +import "dart:core" as core; + +class C1 extends core::Object { + constructor •() → self::C1 + ; + constructor other() → self::C1 + ; +} +class C2 extends core::Object { + constructor •() → self::C2 + ; + constructor other1() → self::C2 + ; + constructor other2() → self::C2 + ; +} +class C3 extends core::Object { + constructor •() → self::C3 + ; + constructor other() → self::C3 + ; +} +class C4 extends core::Object { + constructor •() → self::C4 + ; + constructor other() → self::C4 + ; +} +class C5 extends core::Object { + constructor primary() → self::C5 + ; + constructor •() → self::C5 + ; +} +class C6 extends core::Object { + constructor primary() → self::C6 + ; + constructor •() → self::C6 + ; +} +class E1 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E1 a = const self::E1::•(0, "a"); + enum-element static const field self::E1 b = const self::E1::other(1, "b"); + static const field core::List values = const [self::E1::a, self::E1::b]; + const constructor •(core::int #index, core::String #name) → self::E1 + : super core::_Enum::•(#index, #name) + ; + const constructor other(core::int #index, core::String #name) → self::E1 + : super core::_Enum::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E1.${this.{core::_Enum::_name}{core::String}}"; +} +class E2 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E2 a = const self::E2::•(0, "a"); + enum-element static const field self::E2 b = const self::E2::other1(1, "b"); + enum-element static const field self::E2 c = const self::E2::other2(2, "c"); + static const field core::List values = const [self::E2::a, self::E2::b, self::E2::c]; + const constructor •(core::int #index, core::String #name) → self::E2 + : super core::_Enum::•(#index, #name) + ; + const constructor other1(core::int #index, core::String #name) → self::E2 + : super core::_Enum::•(#index, #name) + ; + const constructor other2(core::int #index, core::String #name) → self::E2 + : super core::_Enum::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E2.${this.{core::_Enum::_name}{core::String}}"; +} +class E3 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E3 a = const self::E3::•(0, "a"); + enum-element static const field self::E3 b = const self::E3::other(1, "b"); + static const field core::List values = const [self::E3::a, self::E3::b]; + const constructor •(core::int #index, core::String #name) → self::E3 + : super core::_Enum::•(#index, #name) + ; + const constructor other(core::int #index, core::String #name) → self::E3 + : this self::E3::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E3.${this.{core::_Enum::_name}{core::String}}"; +} +class E4 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E4 a = const self::E4::•(0, "a"); + enum-element static const field self::E4 b = const self::E4::other(1, "b"); + static const field core::List values = const [self::E4::a, self::E4::b]; + const constructor •(core::int #index, core::String #name) → self::E4 + : super core::_Enum::•(#index, #name) + ; + const constructor other(core::int #index, core::String #name) → self::E4 + : this self::E4::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E4.${this.{core::_Enum::_name}{core::String}}"; +} +class E5 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E5 a = const self::E5::•(0, "a"); + enum-element static const field self::E5 b = const self::E5::primary(1, "b"); + static const field core::List values = const [self::E5::a, self::E5::b]; + const constructor primary(core::int #index, core::String #name) → self::E5 + : super core::_Enum::•(#index, #name) + ; + const constructor •(core::int #index, core::String #name) → self::E5 + : super core::_Enum::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E5.${this.{core::_Enum::_name}{core::String}}"; +} +class E6 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E6 a = const self::E6::•(0, "a"); + enum-element static const field self::E6 b = const self::E6::primary(1, "b"); + static const field core::List values = const [self::E6::a, self::E6::b]; + const constructor primary(core::int #index, core::String #name) → self::E6 + : super core::_Enum::•(#index, #name) + ; + const constructor •(core::int #index, core::String #name) → self::E6 + : this self::E6::primary(#index, #name) + ; + method core::_enumToString() → core::String + return "E6.${this.{core::_Enum::_name}{core::String}}"; +} +extension type ET1(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor • = self::ET1|constructor#; + constructor tearoff • = self::ET1|constructor#_#new#tearOff; + constructor other = self::ET1|constructor#other; + constructor tearoff other = self::ET1|constructor#_#other#tearOff; +} +extension type E2T(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor • = self::E2T|constructor#; + constructor tearoff • = self::E2T|constructor#_#new#tearOff; + constructor other = self::E2T|constructor#other; + constructor tearoff other = self::E2T|constructor#_#other#tearOff; +} +extension type ET3(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor primary = self::ET3|constructor#primary; + constructor tearoff primary = self::ET3|constructor#_#primary#tearOff; + constructor • = self::ET3|constructor#; + constructor tearoff • = self::ET3|constructor#_#new#tearOff; +} +extension type ET4(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor primary = self::ET4|constructor#primary; + constructor tearoff primary = self::ET4|constructor#_#primary#tearOff; + constructor • = self::ET4|constructor#; + constructor tearoff • = self::ET4|constructor#_#new#tearOff; +} +static extension-type-member method ET1|constructor#(core::int i) → self::ET1% /* erasure=core::int, declared=! */ + ; +static extension-type-member synthetic method ET1|constructor#_#new#tearOff(core::int i) → self::ET1% /* erasure=core::int, declared=! */ + return self::ET1|constructor#(i); +static extension-type-member method ET1|constructor#other(core::int i) → self::ET1% /* erasure=core::int, declared=! */ + ; +static extension-type-member synthetic method ET1|constructor#_#other#tearOff(core::int i) → self::ET1% /* erasure=core::int, declared=! */ + return self::ET1|constructor#other(i); +static extension-type-member method E2T|constructor#(core::int i) → self::E2T% /* erasure=core::int, declared=! */ + ; +static extension-type-member synthetic method E2T|constructor#_#new#tearOff(core::int i) → self::E2T% /* erasure=core::int, declared=! */ + return self::E2T|constructor#(i); +static extension-type-member method E2T|constructor#other(core::int i) → self::E2T% /* erasure=core::int, declared=! */ + ; +static extension-type-member synthetic method E2T|constructor#_#other#tearOff(core::int i) → self::E2T% /* erasure=core::int, declared=! */ + return self::E2T|constructor#other(i); +static extension-type-member method ET3|constructor#primary(core::int i) → self::ET3% /* erasure=core::int, declared=! */ + ; +static extension-type-member synthetic method ET3|constructor#_#primary#tearOff(core::int i) → self::ET3% /* erasure=core::int, declared=! */ + return self::ET3|constructor#primary(i); +static extension-type-member method ET3|constructor#(core::int i) → self::ET3% /* erasure=core::int, declared=! */ + ; +static extension-type-member synthetic method ET3|constructor#_#new#tearOff(core::int i) → self::ET3% /* erasure=core::int, declared=! */ + return self::ET3|constructor#(i); +static extension-type-member method ET4|constructor#primary(core::int i) → self::ET4% /* erasure=core::int, declared=! */ + ; +static extension-type-member synthetic method ET4|constructor#_#primary#tearOff(core::int i) → self::ET4% /* erasure=core::int, declared=! */ + return self::ET4|constructor#primary(i); +static extension-type-member method ET4|constructor#(core::int i) → self::ET4% /* erasure=core::int, declared=! */ + ; +static extension-type-member synthetic method ET4|constructor#_#new#tearOff(core::int i) → self::ET4% /* erasure=core::int, declared=! */ + return self::ET4|constructor#(i); + + +Extra constant evaluation status: +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///primary_and_generative.dart:31:3 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "a"}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///primary_and_generative.dart:31:10 -> InstanceConstant(const E1{_Enum.index: 1, _Enum._name: "b"}) +Evaluated: ListLiteral @ org-dartlang-testcase:///primary_and_generative.dart:30:6 -> ListConstant(const [const E1{_Enum.index: 0, _Enum._name: "a"}, const E1{_Enum.index: 1, _Enum._name: "b"}]) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///primary_and_generative.dart:36:3 -> InstanceConstant(const E2{_Enum.index: 0, _Enum._name: "a"}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///primary_and_generative.dart:36:10 -> InstanceConstant(const E2{_Enum.index: 1, _Enum._name: "b"}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///primary_and_generative.dart:36:22 -> InstanceConstant(const E2{_Enum.index: 2, _Enum._name: "c"}) +Evaluated: ListLiteral @ org-dartlang-testcase:///primary_and_generative.dart:35:6 -> ListConstant(const [const E2{_Enum.index: 0, _Enum._name: "a"}, const E2{_Enum.index: 1, _Enum._name: "b"}, const E2{_Enum.index: 2, _Enum._name: "c"}]) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///primary_and_generative.dart:42:3 -> InstanceConstant(const E3{_Enum.index: 0, _Enum._name: "a"}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///primary_and_generative.dart:42:10 -> InstanceConstant(const E3{_Enum.index: 1, _Enum._name: "b"}) +Evaluated: ListLiteral @ org-dartlang-testcase:///primary_and_generative.dart:41:6 -> ListConstant(const [const E3{_Enum.index: 0, _Enum._name: "a"}, const E3{_Enum.index: 1, _Enum._name: "b"}]) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///primary_and_generative.dart:47:3 -> InstanceConstant(const E4{_Enum.index: 0, _Enum._name: "a"}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///primary_and_generative.dart:47:10 -> InstanceConstant(const E4{_Enum.index: 1, _Enum._name: "b"}) +Evaluated: ListLiteral @ org-dartlang-testcase:///primary_and_generative.dart:46:6 -> ListConstant(const [const E4{_Enum.index: 0, _Enum._name: "a"}, const E4{_Enum.index: 1, _Enum._name: "b"}]) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///primary_and_generative.dart:52:3 -> InstanceConstant(const E5{_Enum.index: 0, _Enum._name: "a"}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///primary_and_generative.dart:52:10 -> InstanceConstant(const E5{_Enum.index: 1, _Enum._name: "b"}) +Evaluated: ListLiteral @ org-dartlang-testcase:///primary_and_generative.dart:51:6 -> ListConstant(const [const E5{_Enum.index: 0, _Enum._name: "a"}, const E5{_Enum.index: 1, _Enum._name: "b"}]) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///primary_and_generative.dart:57:3 -> InstanceConstant(const E6{_Enum.index: 0, _Enum._name: "a"}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///primary_and_generative.dart:57:10 -> InstanceConstant(const E6{_Enum.index: 1, _Enum._name: "b"}) +Evaluated: ListLiteral @ org-dartlang-testcase:///primary_and_generative.dart:56:6 -> ListConstant(const [const E6{_Enum.index: 0, _Enum._name: "a"}, const E6{_Enum.index: 1, _Enum._name: "b"}]) +Extra constant evaluation: evaluated: 79, effectively constant: 19 diff --git a/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.strong.transformed.expect b/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.strong.transformed.expect new file mode 100644 index 00000000000..5f08b20a397 --- /dev/null +++ b/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.strong.transformed.expect @@ -0,0 +1,305 @@ +library; +// +// Problems in library: +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:6:3: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// C1.other(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:10:7: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// new other1(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:11:7: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// new other2(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:23:3: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// new(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:32:9: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// const E1.other(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:37:13: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// const new other1(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:38:13: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// const new other2(); // Error +// ^ +// +// pkg/front_end/testcases/primary_constructors/primary_and_generative.dart:53:9: Error: Classes with primary constructors can't have non-redirecting generative constructors. +// Try making the constructor redirect to the primary constructor, or remove the primary constructor. +// const new(); // Error +// ^ +// +import self as self; +import "dart:core" as core; + +class C1 extends core::Object { + constructor •() → self::C1 + : super core::Object::•() + ; + constructor other() → self::C1 + : super core::Object::•() + ; +} +class C2 extends core::Object { + constructor •() → self::C2 + : super core::Object::•() + ; + constructor other1() → self::C2 + : super core::Object::•() + ; + constructor other2() → self::C2 + : super core::Object::•() + ; +} +class C3 extends core::Object { + constructor •() → self::C3 + : super core::Object::•() + ; + constructor other() → self::C3 + : this self::C3::•() + ; +} +class C4 extends core::Object { + constructor •() → self::C4 + : super core::Object::•() + ; + constructor other() → self::C4 + : this self::C4::•() + ; +} +class C5 extends core::Object { + constructor primary() → self::C5 + : super core::Object::•() + ; + constructor •() → self::C5 + : super core::Object::•() + ; +} +class C6 extends core::Object { + constructor primary() → self::C6 + : super core::Object::•() + ; + constructor •() → self::C6 + : this self::C6::primary() + ; +} +class E1 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E1 a = #C3; + enum-element static const field self::E1 b = #C6; + static const field core::List values = #C7; + const constructor •(core::int #index, core::String #name) → self::E1 + : super core::_Enum::•(#index, #name) + ; + const constructor other(core::int #index, core::String #name) → self::E1 + : super core::_Enum::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E1.${this.{core::_Enum::_name}{core::String}}"; +} +class E2 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E2 a = #C8; + enum-element static const field self::E2 b = #C9; + enum-element static const field self::E2 c = #C12; + static const field core::List values = #C13; + const constructor •(core::int #index, core::String #name) → self::E2 + : super core::_Enum::•(#index, #name) + ; + const constructor other1(core::int #index, core::String #name) → self::E2 + : super core::_Enum::•(#index, #name) + ; + const constructor other2(core::int #index, core::String #name) → self::E2 + : super core::_Enum::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E2.${this.{core::_Enum::_name}{core::String}}"; +} +class E3 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E3 a = #C14; + enum-element static const field self::E3 b = #C15; + static const field core::List values = #C16; + const constructor •(core::int #index, core::String #name) → self::E3 + : super core::_Enum::•(#index, #name) + ; + const constructor other(core::int #index, core::String #name) → self::E3 + : this self::E3::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E3.${this.{core::_Enum::_name}{core::String}}"; +} +class E4 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E4 a = #C17; + enum-element static const field self::E4 b = #C18; + static const field core::List values = #C19; + const constructor •(core::int #index, core::String #name) → self::E4 + : super core::_Enum::•(#index, #name) + ; + const constructor other(core::int #index, core::String #name) → self::E4 + : this self::E4::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E4.${this.{core::_Enum::_name}{core::String}}"; +} +class E5 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E5 a = #C20; + enum-element static const field self::E5 b = #C21; + static const field core::List values = #C22; + const constructor primary(core::int #index, core::String #name) → self::E5 + : super core::_Enum::•(#index, #name) + ; + const constructor •(core::int #index, core::String #name) → self::E5 + : super core::_Enum::•(#index, #name) + ; + method core::_enumToString() → core::String + return "E5.${this.{core::_Enum::_name}{core::String}}"; +} +class E6 extends core::_Enum /*isEnum*/ { + enum-element static const field self::E6 a = #C23; + enum-element static const field self::E6 b = #C24; + static const field core::List values = #C25; + const constructor primary(core::int #index, core::String #name) → self::E6 + : super core::_Enum::•(#index, #name) + ; + const constructor •(core::int #index, core::String #name) → self::E6 + : this self::E6::primary(#index, #name) + ; + method core::_enumToString() → core::String + return "E6.${this.{core::_Enum::_name}{core::String}}"; +} +extension type ET1(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor • = self::ET1|constructor#; + constructor tearoff • = self::ET1|constructor#_#new#tearOff; + constructor other = self::ET1|constructor#other; + constructor tearoff other = self::ET1|constructor#_#other#tearOff; +} +extension type E2T(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor • = self::E2T|constructor#; + constructor tearoff • = self::E2T|constructor#_#new#tearOff; + constructor other = self::E2T|constructor#other; + constructor tearoff other = self::E2T|constructor#_#other#tearOff; +} +extension type ET3(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor primary = self::ET3|constructor#primary; + constructor tearoff primary = self::ET3|constructor#_#primary#tearOff; + constructor • = self::ET3|constructor#; + constructor tearoff • = self::ET3|constructor#_#new#tearOff; +} +extension type ET4(core::int i) { + abstract extension-type-member representation-field get i() → core::int; + constructor primary = self::ET4|constructor#primary; + constructor tearoff primary = self::ET4|constructor#_#primary#tearOff; + constructor • = self::ET4|constructor#; + constructor tearoff • = self::ET4|constructor#_#new#tearOff; +} +static extension-type-member method ET1|constructor#(core::int i) → self::ET1% /* erasure=core::int, declared=! */ { + lowered final self::ET1% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET1|constructor#_#new#tearOff(core::int i) → self::ET1% /* erasure=core::int, declared=! */ + return self::ET1|constructor#(i); +static extension-type-member method ET1|constructor#other(core::int i) → self::ET1% /* erasure=core::int, declared=! */ { + lowered final self::ET1% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET1|constructor#_#other#tearOff(core::int i) → self::ET1% /* erasure=core::int, declared=! */ + return self::ET1|constructor#other(i); +static extension-type-member method E2T|constructor#(core::int i) → self::E2T% /* erasure=core::int, declared=! */ { + lowered final self::E2T% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method E2T|constructor#_#new#tearOff(core::int i) → self::E2T% /* erasure=core::int, declared=! */ + return self::E2T|constructor#(i); +static extension-type-member method E2T|constructor#other(core::int i) → self::E2T% /* erasure=core::int, declared=! */ { + lowered final self::E2T% /* erasure=core::int, declared=! */ #this; + #this = self::E2T|constructor#(i); + return #this; +} +static extension-type-member synthetic method E2T|constructor#_#other#tearOff(core::int i) → self::E2T% /* erasure=core::int, declared=! */ + return self::E2T|constructor#other(i); +static extension-type-member method ET3|constructor#primary(core::int i) → self::ET3% /* erasure=core::int, declared=! */ { + lowered final self::ET3% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET3|constructor#_#primary#tearOff(core::int i) → self::ET3% /* erasure=core::int, declared=! */ + return self::ET3|constructor#primary(i); +static extension-type-member method ET3|constructor#(core::int i) → self::ET3% /* erasure=core::int, declared=! */ { + lowered final self::ET3% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET3|constructor#_#new#tearOff(core::int i) → self::ET3% /* erasure=core::int, declared=! */ + return self::ET3|constructor#(i); +static extension-type-member method ET4|constructor#primary(core::int i) → self::ET4% /* erasure=core::int, declared=! */ { + lowered final self::ET4% /* erasure=core::int, declared=! */ #this = i; + return #this; +} +static extension-type-member synthetic method ET4|constructor#_#primary#tearOff(core::int i) → self::ET4% /* erasure=core::int, declared=! */ + return self::ET4|constructor#primary(i); +static extension-type-member method ET4|constructor#(core::int i) → self::ET4% /* erasure=core::int, declared=! */ { + lowered final self::ET4% /* erasure=core::int, declared=! */ #this; + #this = self::ET4|constructor#primary(i); + return #this; +} +static extension-type-member synthetic method ET4|constructor#_#new#tearOff(core::int i) → self::ET4% /* erasure=core::int, declared=! */ + return self::ET4|constructor#(i); + +constants { + #C1 = 0 + #C2 = "a" + #C3 = self::E1 {index:#C1, _name:#C2} + #C4 = 1 + #C5 = "b" + #C6 = self::E1 {index:#C4, _name:#C5} + #C7 = [#C3, #C6] + #C8 = self::E2 {index:#C1, _name:#C2} + #C9 = self::E2 {index:#C4, _name:#C5} + #C10 = 2 + #C11 = "c" + #C12 = self::E2 {index:#C10, _name:#C11} + #C13 = [#C8, #C9, #C12] + #C14 = self::E3 {index:#C1, _name:#C2} + #C15 = self::E3 {index:#C4, _name:#C5} + #C16 = [#C14, #C15] + #C17 = self::E4 {index:#C1, _name:#C2} + #C18 = self::E4 {index:#C4, _name:#C5} + #C19 = [#C17, #C18] + #C20 = self::E5 {index:#C1, _name:#C2} + #C21 = self::E5 {index:#C4, _name:#C5} + #C22 = [#C20, #C21] + #C23 = self::E6 {index:#C1, _name:#C2} + #C24 = self::E6 {index:#C4, _name:#C5} + #C25 = [#C23, #C24] +} + + +Constructor coverage from constants: +org-dartlang-testcase:///primary_and_generative.dart: +- E1. (from org-dartlang-testcase:///primary_and_generative.dart:30:8) +- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart) +- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart) +- E1.other (from org-dartlang-testcase:///primary_and_generative.dart:32:9) +- E2. (from org-dartlang-testcase:///primary_and_generative.dart:35:8) +- E2.other1 (from org-dartlang-testcase:///primary_and_generative.dart:37:13) +- E2.other2 (from org-dartlang-testcase:///primary_and_generative.dart:38:13) +- E3. (from org-dartlang-testcase:///primary_and_generative.dart:41:8) +- E3.other (from org-dartlang-testcase:///primary_and_generative.dart:43:13) +- E4. (from org-dartlang-testcase:///primary_and_generative.dart:46:8) +- E4.other (from org-dartlang-testcase:///primary_and_generative.dart:48:13) +- E5. (from org-dartlang-testcase:///primary_and_generative.dart:53:9) +- E5.primary (from org-dartlang-testcase:///primary_and_generative.dart:51:9) +- E6. (from org-dartlang-testcase:///primary_and_generative.dart:58:9) +- E6.primary (from org-dartlang-testcase:///primary_and_generative.dart:56:9) diff --git a/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.textual_outline.expect b/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.textual_outline.expect new file mode 100644 index 00000000000..6c490077271 --- /dev/null +++ b/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.textual_outline.expect @@ -0,0 +1,52 @@ +class C1() { + C1.other(); +} + +class C2() { + new other1(); + new other2(); +} + +class C3() { + new other() : this(); +} + +class C4() { + new other() : this(); +} + +class C5.primary() { + new(); +} + +class C6.primary() { + new() : this.primary(); +} + +enum E1() { a(), b.other(); const E1.other(); } + +enum E2() { a(), b.other1(), c.other2(); const new other1(); const new other2(); } + +enum E3() { a(), b.other(); const new other() : this(); } + +enum E4() { a(), b.other(); const new other() : this(); } + +enum E5.primary() { a(), b.primary(); const new(); } + +enum E6.primary() { a(), b.primary(); const new() : this.primary(); } + +extension type ET1(int i) { + ET1.other(this.i); +} + +extension type E2T(int i) { + new other(int i) : this(i); +} + +extension type ET3.primary(int i) { + new(this.i); +} + +extension type ET4.primary(int i) { + new(int i) : this.primary(i); +} diff --git a/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..da91d392ea0 --- /dev/null +++ b/pkg/front_end/testcases/primary_constructors/primary_and_generative.dart.textual_outline_modelled.expect @@ -0,0 +1,52 @@ +class C1() { + C1.other(); +} + +class C2() { + new other1(); + new other2(); +} + +class C3() { + new other() : this(); +} + +class C4() { + new other() : this(); +} + +class C5.primary() { + new(); +} + +class C6.primary() { + new() : this.primary(); +} + +enum E1() { a(), b.other(); const E1.other(); } + +enum E2() { a(), b.other1(), c.other2(); const new other1(); const new other2(); } + +enum E3() { a(), b.other(); const new other() : this(); } + +enum E4() { a(), b.other(); const new other() : this(); } + +enum E5.primary() { a(), b.primary(); const new(); } + +enum E6.primary() { a(), b.primary(); const new() : this.primary(); } + +extension type E2T(int i) { + new other(int i) : this(i); +} + +extension type ET1(int i) { + ET1.other(this.i); +} + +extension type ET3.primary(int i) { + new(this.i); +} + +extension type ET4.primary(int i) { + new(int i) : this.primary(i); +}