Skip to content

Commit 0e2ed5a

Browse files
chloestefantsovaCommit Queue
authored and
Commit Queue
committed
[cfe] Report an error on optional positional or named parameters in extension type declarations
Part of #49731 Change-Id: I49e813f9573b2b66950e8aae572591b65b62e2ec Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/331260 Commit-Queue: Chloe Stefantsova <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent 379f8ca commit 0e2ed5a

26 files changed

+700
-83
lines changed

pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10365,6 +10365,16 @@ Message _withArgumentsNamedMixinOverride(String name, String name2) {
1036510365
arguments: {'name': name, 'name2': name2});
1036610366
}
1036710367

10368+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
10369+
const Code<Null> codeNamedParametersInExtensionTypeDeclaration =
10370+
messageNamedParametersInExtensionTypeDeclaration;
10371+
10372+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
10373+
const MessageCode messageNamedParametersInExtensionTypeDeclaration =
10374+
const MessageCode("NamedParametersInExtensionTypeDeclaration",
10375+
problemMessage:
10376+
r"""Extension type declarations can't have named parameters.""");
10377+
1036810378
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
1036910379
const Code<Null> codeNativeClauseShouldBeAnnotation =
1037010380
messageNativeClauseShouldBeAnnotation;
@@ -11593,6 +11603,16 @@ const MessageCode messageOperatorWithTypeParameters = const MessageCode(
1159311603
r"""Types parameters aren't allowed when defining an operator.""",
1159411604
correctionMessage: r"""Try removing the type parameters.""");
1159511605

11606+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
11607+
const Code<Null> codeOptionalParametersInExtensionTypeDeclaration =
11608+
messageOptionalParametersInExtensionTypeDeclaration;
11609+
11610+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
11611+
const MessageCode messageOptionalParametersInExtensionTypeDeclaration =
11612+
const MessageCode("OptionalParametersInExtensionTypeDeclaration",
11613+
problemMessage:
11614+
r"""Extension type declarations can't have optional parameters.""");
11615+
1159611616
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
1159711617
const Template<
1159811618
Message Function(

pkg/front_end/lib/src/fasta/modifier.dart

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,13 +136,18 @@ class Modifier {
136136
/// Method [maskContainsActualModifiers] returns `true` if the mask has any of
137137
/// the actual modifier bits set, and `false` otherwise.
138138
static bool maskContainsActualModifiers(int mask) {
139-
mask &= ~(1 << mixinDeclarationMask);
140-
mask &= ~(1 << hasInitializerMask);
141-
mask &= ~(1 << initializingFormalMask);
142-
mask &= ~(1 << declaresConstConstructorMask);
143-
mask &= ~(1 << superInitializingFormalMask);
144-
mask &= ~(1 << varMask);
139+
mask &= ~(mixinDeclarationMask |
140+
hasInitializerMask |
141+
initializingFormalMask |
142+
declaresConstConstructorMask |
143+
superInitializingFormalMask |
144+
varMask);
145145

146146
return mask != 0;
147147
}
148+
149+
/// Sets the bit in [mask] corresponding to [requiredMask] to 0.
150+
static int removeRequiredMask(int mask) {
151+
return mask & ~requiredMask;
152+
}
148153
}

pkg/front_end/lib/src/fasta/source/outline_builder.dart

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1627,25 +1627,31 @@ class OutlineBuilder extends StackListenerImpl {
16271627
bool inExtensionType =
16281628
declarationContext == DeclarationContext.ExtensionType;
16291629
if (formals != null) {
1630-
if (inExtensionType && formals.isEmpty) {
1631-
libraryBuilder.addProblem(
1632-
messageExpectedRepresentationField, charOffset, 1, uri);
1633-
}
1634-
if (inExtensionType && formals.length > 1) {
1635-
libraryBuilder.addProblem(
1636-
messageMultipleRepresentationFields, charOffset, 1, uri);
1637-
}
1630+
int requiredPositionalCount = 0;
1631+
int? firstNamedParameterOffset;
1632+
int? firstOptionalPositionalParameterOffset;
16381633
for (int i = 0; i < formals.length; i++) {
16391634
FormalParameterBuilder formal = formals[i];
16401635
if (inExtensionType && formal.type is ImplicitTypeBuilder) {
16411636
libraryBuilder.addProblem(messageExpectedRepresentationType,
16421637
formal.charOffset, formal.name.length, formal.fileUri);
16431638
}
16441639
if (inExtensionType &&
1645-
Modifier.maskContainsActualModifiers(formal.modifiers)) {
1640+
Modifier.maskContainsActualModifiers(
1641+
Modifier.removeRequiredMask(formal.modifiers))) {
16461642
libraryBuilder.addProblem(messageRepresentationFieldModifier,
16471643
formal.charOffset, formal.name.length, formal.fileUri);
16481644
}
1645+
if (formal.isPositional) {
1646+
if (formal.isOptionalPositional) {
1647+
firstOptionalPositionalParameterOffset = formal.charOffset;
1648+
} else {
1649+
requiredPositionalCount++;
1650+
}
1651+
}
1652+
if (formal.isNamed) {
1653+
firstNamedParameterOffset = formal.charOffset;
1654+
}
16491655
libraryBuilder.addPrimaryConstructorField(
16501656
// TODO(johnniwinther): Support annotations on annotations on fields
16511657
// defined through a primary constructor. This is not needed for
@@ -1657,6 +1663,27 @@ class OutlineBuilder extends StackListenerImpl {
16571663
charOffset: formal.charOffset);
16581664
formals[i] = formal.forPrimaryConstructor(libraryBuilder);
16591665
}
1666+
if (inExtensionType) {
1667+
if (firstOptionalPositionalParameterOffset != null) {
1668+
libraryBuilder.addProblem(
1669+
messageOptionalParametersInExtensionTypeDeclaration,
1670+
firstOptionalPositionalParameterOffset,
1671+
1,
1672+
uri);
1673+
} else if (firstNamedParameterOffset != null) {
1674+
libraryBuilder.addProblem(
1675+
messageNamedParametersInExtensionTypeDeclaration,
1676+
firstNamedParameterOffset,
1677+
1,
1678+
uri);
1679+
} else if (requiredPositionalCount == 0) {
1680+
libraryBuilder.addProblem(
1681+
messageExpectedRepresentationField, charOffset, 1, uri);
1682+
} else if (inExtensionType && formals.length > 1) {
1683+
libraryBuilder.addProblem(
1684+
messageMultipleRepresentationFields, charOffset, 1, uri);
1685+
}
1686+
}
16601687
}
16611688

16621689
libraryBuilder.beginNestedDeclaration(

pkg/front_end/messages.status

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -378,8 +378,8 @@ FastaUsageShort/analyzerCode: Fail
378378
FastaUsageShort/example: Fail
379379
FfiAbiSpecificIntegerInvalid/analyzerCode: Fail
380380
FfiAbiSpecificIntegerMappingInvalid/analyzerCode: Fail
381-
FfiCreateOfStructOrUnion/analyzerCode: Fail
382381
FfiCompoundImplementsFinalizable/analyzerCode: Fail
382+
FfiCreateOfStructOrUnion/analyzerCode: Fail
383383
FfiDartTypeMismatch/analyzerCode: Fail
384384
FfiEmptyStruct/analyzerCode: Fail
385385
FfiExceptionalReturnNull/analyzerCode: Fail
@@ -395,14 +395,14 @@ FfiFieldNoAnnotation/analyzerCode: Fail
395395
FfiFieldNull/analyzerCode: Fail
396396
FfiLeafCallMustNotReturnHandle/analyzerCode: Fail
397397
FfiLeafCallMustNotTakeHandle/analyzerCode: Fail
398+
FfiNativeCallableListenerReturnVoid/analyzerCode: Fail
398399
FfiNativeMustBeExternal/analyzerCode: Fail
399400
FfiNativeOnlyNativeFieldWrapperClassCanBePointer/analyzerCode: Fail
400401
FfiNativeUnexpectedNumberOfParameters/analyzerCode: Fail
401402
FfiNativeUnexpectedNumberOfParametersWithReceiver/analyzerCode: Fail
402403
FfiNotStatic/analyzerCode: Fail
403404
FfiPackedAnnotation/analyzerCode: Fail
404405
FfiPackedAnnotationAlignment/analyzerCode: Fail
405-
FfiNativeCallableListenerReturnVoid/analyzerCode: Fail
406406
FfiSizeAnnotation/analyzerCode: Fail
407407
FfiSizeAnnotationDimensions/analyzerCode: Fail
408408
FfiStructAnnotation/analyzerCode: Fail
@@ -616,10 +616,10 @@ JsInteropExportMemberCollision/analyzerCode: Fail # Web compiler specific
616616
JsInteropExportMemberCollision/example: Fail # Web compiler specific
617617
JsInteropExportNoExportableMembers/analyzerCode: Fail # Web compiler specific
618618
JsInteropExportNoExportableMembers/example: Fail # Web compiler specific
619-
JsInteropExtensionTypeNotInterop/analyzerCode: Fail # Web compiler specific
620-
JsInteropExtensionTypeNotInterop/example: Fail # Web compiler specific
621619
JsInteropExtensionTypeMemberNotInterop/analyzerCode: Fail # Web compiler specific
622620
JsInteropExtensionTypeMemberNotInterop/example: Fail # Web compiler specific
621+
JsInteropExtensionTypeNotInterop/analyzerCode: Fail # Web compiler specific
622+
JsInteropExtensionTypeNotInterop/example: Fail # Web compiler specific
623623
JsInteropExtensionTypeUsedWithWrongJsAnnotation/analyzerCode: Fail # Web compiler specific
624624
JsInteropExtensionTypeUsedWithWrongJsAnnotation/example: Fail # Web compiler specific
625625
JsInteropExternalExtensionMemberOnTypeInvalid/analyzerCode: Fail # Web compiler specific
@@ -628,6 +628,8 @@ JsInteropExternalExtensionMemberWithStaticDisallowed/analyzerCode: Fail # Web co
628628
JsInteropExternalExtensionMemberWithStaticDisallowed/example: Fail # Web compiler specific
629629
JsInteropExternalMemberNotJSAnnotated/analyzerCode: Fail # Web compiler specific
630630
JsInteropExternalMemberNotJSAnnotated/example: Fail # Web compiler specific
631+
JsInteropFunctionToJSRequiresStaticType/analyzerCode: Fail # Web compiler specific
632+
JsInteropFunctionToJSRequiresStaticType/example: Fail # Web compiler specific
631633
JsInteropInvalidStaticClassMemberName/analyzerCode: Fail
632634
JsInteropInvalidStaticClassMemberName/example: Fail
633635
JsInteropJSClassExtendsDartClass/analyzerCode: Fail # Web compiler specific
@@ -642,12 +644,12 @@ JsInteropNonExternalMember/analyzerCode: Fail # Web compiler specific
642644
JsInteropNonExternalMember/example: Fail # Web compiler specific
643645
JsInteropNonStaticWithStaticInteropSupertype/analyzerCode: Fail # Web compiler specific
644646
JsInteropNonStaticWithStaticInteropSupertype/example: Fail # Web compiler specific
647+
JsInteropObjectLiteralConstructorPositionalParameters/analyzerCode: Fail # Web compiler specific
648+
JsInteropObjectLiteralConstructorPositionalParameters/example: Fail # Web compiler specific
645649
JsInteropOperatorCannotBeRenamed/analyzerCode: Fail # Web compiler specific
646650
JsInteropOperatorCannotBeRenamed/example: Fail # Web compiler specific
647651
JsInteropOperatorsNotSupported/analyzerCode: Fail # Web compiler specific
648652
JsInteropOperatorsNotSupported/example: Fail # Web compiler specific
649-
JsInteropObjectLiteralConstructorPositionalParameters/analyzerCode: Fail # Web compiler specific
650-
JsInteropObjectLiteralConstructorPositionalParameters/example: Fail # Web compiler specific
651653
JsInteropStaticInteropExternalMemberWithInvalidTypeParameters/analyzerCode: Fail # Web compiler specific
652654
JsInteropStaticInteropExternalMemberWithInvalidTypeParameters/example: Fail # Web compiler specific
653655
JsInteropStaticInteropExternalTypeViolation/analyzerCode: Fail # Web compiler specific
@@ -680,8 +682,6 @@ JsInteropStaticInteropWithInvalidJsTypesSupertype/analyzerCode: Fail # Web compi
680682
JsInteropStaticInteropWithInvalidJsTypesSupertype/example: Fail # Web compiler specific
681683
JsInteropStaticInteropWithNonStaticSupertype/analyzerCode: Fail # Web compiler specific
682684
JsInteropStaticInteropWithNonStaticSupertype/example: Fail # Web compiler specific
683-
JsInteropFunctionToJSRequiresStaticType/analyzerCode: Fail # Web compiler specific
684-
JsInteropFunctionToJSRequiresStaticType/example: Fail # Web compiler specific
685685
JsInteropStrictModeForbiddenLibrary/analyzerCode: Fail # Web compiler specific
686686
JsInteropStrictModeForbiddenLibrary/example: Fail # Web compiler specific
687687
LanguageVersionInvalidInDotPackages/analyzerCode: Fail
@@ -748,6 +748,7 @@ NameNotFoundInRecordNameGet/example: Fail
748748
NamedFunctionExpression/example: Fail
749749
NamedMixinOverride/analyzerCode: Fail
750750
NamedMixinOverride/example: Fail
751+
NamedParametersInExtensionTypeDeclaration/analyzerCode: Fail
751752
NativeClauseShouldBeAnnotation/example: Fail
752753
NeverReachableSwitchDefaultError/analyzerCode: Fail
753754
NeverReachableSwitchDefaultError/example: Fail
@@ -868,6 +869,7 @@ OperatorParameterMismatch1/example: Fail
868869
OperatorParameterMismatch2/example: Fail
869870
OperatorWithOptionalFormals/analyzerCode: Fail
870871
OperatorWithOptionalFormals/example: Fail
872+
OptionalParametersInExtensionTypeDeclaration/analyzerCode: Fail
871873
OptionalSuperParameterWithoutInitializer/analyzerCode: Fail
872874
OptionalSuperParameterWithoutInitializer/example: Fail
873875
OverrideFewerNamedArguments/example: Fail

pkg/front_end/messages.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7468,3 +7468,15 @@ AwaitOfExtensionTypeNotFuture:
74687468
script: |
74697469
extension type E(num foo) { test(E e) async { await e; } }
74707470
analyzerCode: AWAIT_OF_EXTENSION_TYPE_NOT_FUTURE
7471+
7472+
NamedParametersInExtensionTypeDeclaration:
7473+
problemMessage: "Extension type declarations can't have named parameters."
7474+
experiments: inline-class
7475+
script: |
7476+
extension type E(int foo, {dynamic bar}) {}
7477+
7478+
OptionalParametersInExtensionTypeDeclaration:
7479+
problemMessage: "Extension type declarations can't have optional parameters."
7480+
experiments: inline-class
7481+
script: |
7482+
extension type E(int foo, [dynamic bar]) {}

pkg/front_end/testcases/extension_types/issue52119.dart.strong.expect

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ library;
66
// extension type Bar<T>._(this.i) {
77
// ^
88
//
9-
// pkg/front_end/testcases/extension_types/issue52119.dart:15:30: Error: Representation fields can't have modifiers.
10-
// extension type Bar<T>._(this.i) {
11-
// ^
12-
//
139
// pkg/front_end/testcases/extension_types/issue52119.dart:12:26: Error: Couldn't find constructor 'Foo.unresolved'.
1410
// Foo.erroneous() : this.unresolved(); // Error
1511
// ^^^^^^^^^^

pkg/front_end/testcases/extension_types/issue52119.dart.strong.transformed.expect

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ library;
66
// extension type Bar<T>._(this.i) {
77
// ^
88
//
9-
// pkg/front_end/testcases/extension_types/issue52119.dart:15:30: Error: Representation fields can't have modifiers.
10-
// extension type Bar<T>._(this.i) {
11-
// ^
12-
//
139
// pkg/front_end/testcases/extension_types/issue52119.dart:12:26: Error: Couldn't find constructor 'Foo.unresolved'.
1410
// Foo.erroneous() : this.unresolved(); // Error
1511
// ^^^^^^^^^^

pkg/front_end/testcases/extension_types/issue52119.dart.weak.expect

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ library;
66
// extension type Bar<T>._(this.i) {
77
// ^
88
//
9-
// pkg/front_end/testcases/extension_types/issue52119.dart:15:30: Error: Representation fields can't have modifiers.
10-
// extension type Bar<T>._(this.i) {
11-
// ^
12-
//
139
// pkg/front_end/testcases/extension_types/issue52119.dart:12:26: Error: Couldn't find constructor 'Foo.unresolved'.
1410
// Foo.erroneous() : this.unresolved(); // Error
1511
// ^^^^^^^^^^

pkg/front_end/testcases/extension_types/issue52119.dart.weak.modular.expect

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ library;
66
// extension type Bar<T>._(this.i) {
77
// ^
88
//
9-
// pkg/front_end/testcases/extension_types/issue52119.dart:15:30: Error: Representation fields can't have modifiers.
10-
// extension type Bar<T>._(this.i) {
11-
// ^
12-
//
139
// pkg/front_end/testcases/extension_types/issue52119.dart:12:26: Error: Couldn't find constructor 'Foo.unresolved'.
1410
// Foo.erroneous() : this.unresolved(); // Error
1511
// ^^^^^^^^^^

pkg/front_end/testcases/extension_types/issue52119.dart.weak.outline.expect

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ library;
66
// extension type Bar<T>._(this.i) {
77
// ^
88
//
9-
// pkg/front_end/testcases/extension_types/issue52119.dart:15:30: Error: Representation fields can't have modifiers.
10-
// extension type Bar<T>._(this.i) {
11-
// ^
12-
//
139
import self as self;
1410
import "dart:core" as core;
1511

pkg/front_end/testcases/extension_types/issue52119.dart.weak.transformed.expect

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ library;
66
// extension type Bar<T>._(this.i) {
77
// ^
88
//
9-
// pkg/front_end/testcases/extension_types/issue52119.dart:15:30: Error: Representation fields can't have modifiers.
10-
// extension type Bar<T>._(this.i) {
11-
// ^
12-
//
139
// pkg/front_end/testcases/extension_types/issue52119.dart:12:26: Error: Couldn't find constructor 'Foo.unresolved'.
1410
// Foo.erroneous() : this.unresolved(); // Error
1511
// ^^^^^^^^^^

pkg/front_end/testcases/extension_types/representation.dart.strong.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@ library;
1717
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
1818
// ^^^^^^^^^^^^^
1919
//
20-
// pkg/front_end/testcases/extension_types/representation.dart:9:25: Error: Each extension type should have exactly one representation field.
21-
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
22-
// ^
23-
//
2420
// pkg/front_end/testcases/extension_types/representation.dart:9:50: Error: 'instanceField' is already declared in this scope.
2521
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
2622
// ^^^^^^^^^^^^^
2723
// pkg/front_end/testcases/extension_types/representation.dart:9:31: Context: Previous declaration of 'instanceField'.
2824
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
2925
// ^^^^^^^^^^^^^
3026
//
27+
// pkg/front_end/testcases/extension_types/representation.dart:9:25: Error: Each extension type should have exactly one representation field.
28+
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
29+
// ^
30+
//
3131
// pkg/front_end/testcases/extension_types/representation.dart:9:31: Error: Can't use 'instanceField' because it is declared more than once.
3232
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
3333
// ^^^^^^^^^^^^^

pkg/front_end/testcases/extension_types/representation.dart.strong.transformed.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@ library;
1717
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
1818
// ^^^^^^^^^^^^^
1919
//
20-
// pkg/front_end/testcases/extension_types/representation.dart:9:25: Error: Each extension type should have exactly one representation field.
21-
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
22-
// ^
23-
//
2420
// pkg/front_end/testcases/extension_types/representation.dart:9:50: Error: 'instanceField' is already declared in this scope.
2521
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
2622
// ^^^^^^^^^^^^^
2723
// pkg/front_end/testcases/extension_types/representation.dart:9:31: Context: Previous declaration of 'instanceField'.
2824
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
2925
// ^^^^^^^^^^^^^
3026
//
27+
// pkg/front_end/testcases/extension_types/representation.dart:9:25: Error: Each extension type should have exactly one representation field.
28+
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
29+
// ^
30+
//
3131
// pkg/front_end/testcases/extension_types/representation.dart:9:31: Error: Can't use 'instanceField' because it is declared more than once.
3232
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
3333
// ^^^^^^^^^^^^^

pkg/front_end/testcases/extension_types/representation.dart.weak.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@ library;
1717
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
1818
// ^^^^^^^^^^^^^
1919
//
20-
// pkg/front_end/testcases/extension_types/representation.dart:9:25: Error: Each extension type should have exactly one representation field.
21-
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
22-
// ^
23-
//
2420
// pkg/front_end/testcases/extension_types/representation.dart:9:50: Error: 'instanceField' is already declared in this scope.
2521
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
2622
// ^^^^^^^^^^^^^
2723
// pkg/front_end/testcases/extension_types/representation.dart:9:31: Context: Previous declaration of 'instanceField'.
2824
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
2925
// ^^^^^^^^^^^^^
3026
//
27+
// pkg/front_end/testcases/extension_types/representation.dart:9:25: Error: Each extension type should have exactly one representation field.
28+
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
29+
// ^
30+
//
3131
// pkg/front_end/testcases/extension_types/representation.dart:9:31: Error: Can't use 'instanceField' because it is declared more than once.
3232
// extension type Duplicate(bool instanceField, int instanceField) {} // Error
3333
// ^^^^^^^^^^^^^

0 commit comments

Comments
 (0)