[wildcards] local function `DUPLICATE_DEFINITION` support
See: https://github.com/dart-lang/sdk/issues/56089
Fixes:
CompileTimeError -> Pass (expected Pass)
co19/LanguageFeatures/Wildcards/binding_A02_t05
Change-Id: Icf996952a4f87f71cc64cecf7ac539df363c3db6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/380045
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Phil Quitslund <pquitslund@google.com>
diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
index fc548ed..0052892 100644
--- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
@@ -93,11 +93,13 @@
element: variable.declaredElement!);
}
} else if (statement is FunctionDeclarationStatement) {
- _checkDuplicateIdentifier(
- definedNames,
- statement.functionDeclaration.name,
- element: statement.functionDeclaration.declaredElement!,
- );
+ if (!_isWildCardFunction(statement)) {
+ _checkDuplicateIdentifier(
+ definedNames,
+ statement.functionDeclaration.name,
+ element: statement.functionDeclaration.declaredElement!,
+ );
+ }
} else if (statement is PatternVariableDeclarationStatementImpl) {
for (var variable in statement.declaration.elements) {
_checkDuplicateIdentifier(definedNames, variable.node.name,
@@ -264,6 +266,10 @@
}
}
+ bool _isWildCardFunction(FunctionDeclarationStatement statement) =>
+ statement.functionDeclaration.name.lexeme == '_' &&
+ _currentLibrary.hasWildcardVariablesFeatureEnabled;
+
static bool _isGetterSetterPair(Element a, Element b) {
if (a is PropertyAccessorElement && b is PropertyAccessorElement) {
return a.isGetter && b.isSetter || a.isSetter && b.isGetter;
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
index 503e8d0..4e903f0 100644
--- a/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart
@@ -2384,6 +2384,41 @@
@reflectiveTest
class DuplicateDefinitionTest extends PubPackageResolutionTest {
+ test_block_localFunction_wildcard() async {
+ await assertErrorsInCode(r'''
+void f() {
+ void _() {}
+ int _(int _) => 42;
+ String _(int _) => "42";
+}
+''', [
+ error(WarningCode.DEAD_CODE, 13, 11),
+ error(WarningCode.DEAD_CODE, 27, 19),
+ error(WarningCode.DEAD_CODE, 49, 24),
+ ]);
+ }
+
+ test_block_localFunction_wildcard_preWildcards() async {
+ await assertErrorsInCode(r'''
+// @dart = 3.4
+// (pre wildcard-variables)
+
+void f() {
+ void _() {}
+ int _(int _) => 42;
+ String _(int _) => "42";
+}
+''', [
+ error(WarningCode.UNUSED_ELEMENT, 62, 1),
+ error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 75, 1,
+ contextMessages: [message(testFile, 62, 1)]),
+ error(WarningCode.UNUSED_ELEMENT, 75, 1),
+ error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 100, 1,
+ contextMessages: [message(testFile, 62, 1)]),
+ error(WarningCode.UNUSED_ELEMENT, 100, 1),
+ ]);
+ }
+
test_block_localVariable_localVariable() async {
await assertErrorsInCode(r'''
void f() {