From e0f92765df95f89a83b30dadf23d423d6fe9fefd Mon Sep 17 00:00:00 2001 From: Paul Berry Date: Thu, 25 Sep 2025 20:01:38 +0000 Subject: [PATCH] [go_router_builder] Ignore upcoming `experimental_member_use` warnings. In an upcoming Dart SDK change (https://dart-review.googlesource.com/c/sdk/+/450970), I intend to add logic to the analyzer for generating a warning if an API marked `@experimental` is used. This will allow experimental analyzer features to be developed without creating a risk of breaking changes downstream. Unfortunately, the `go_router_builder` package uses an old version of the analyzer in which some parts of the API were marked as `@experimental`, even though they were fully supported. So to avoid breaking trybots when the new warning rolls out, I need to add `// ignore` comments to ignore the upcoming warnings. In a future PR, I intend to bump the `go_router_builder` package's analyzer dependency to 8.2.0; in that analyzer version, the erroneous `@experimental` annotations have been removed. Unfortunately, that can't be done yet, since `go_router_builder` still needs to support versions of flutter that pin analyzer to an earlier version. (See https://github.com/flutter/packages/pull/10079, which attempts to bump the analyzer dependency, but breaks trybots). --- packages/go_router_builder/lib/src/route_config.dart | 2 ++ packages/go_router_builder/lib/src/type_helpers.dart | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/go_router_builder/lib/src/route_config.dart b/packages/go_router_builder/lib/src/route_config.dart index 61ca5438549..24bab43cfdc 100644 --- a/packages/go_router_builder/lib/src/route_config.dart +++ b/packages/go_router_builder/lib/src/route_config.dart @@ -645,6 +645,7 @@ abstract class RouteBaseConfig { } // TODO(kevmoo): validate that this MUST be a subtype of `GoRouteData` + // ignore: experimental_member_use final InterfaceElement2 classElement = typeParamType.element3; final RouteBaseConfig value; @@ -945,6 +946,7 @@ String _enumMapConst(InterfaceType type) { final StringBuffer buffer = StringBuffer('const ${enumMapName(type)} = {'); + // ignore: experimental_member_use for (final FieldElement2 enumField in type.element3.fields2.where( (FieldElement2 element) => element.isEnumConstant, )) { diff --git a/packages/go_router_builder/lib/src/type_helpers.dart b/packages/go_router_builder/lib/src/type_helpers.dart index af6393fcefc..ed21b1f68be 100644 --- a/packages/go_router_builder/lib/src/type_helpers.dart +++ b/packages/go_router_builder/lib/src/type_helpers.dart @@ -72,6 +72,7 @@ bool _isStringToStringFunction( /// Returns the custom codec for the annotation. String? _getCustomCodec(ElementAnnotation annotation, String name) { final ExecutableElement2? executableElement = + // ignore: experimental_member_use annotation.computeConstantValue()?.getField(name)?.toFunctionValue2(); if (_isStringToStringFunction(executableElement, name)) { return executableElement!.displayName; @@ -188,10 +189,12 @@ T? getNodeDeclaration(InterfaceElement2 element) { } final ParsedLibraryResult parsedLibrary = + // ignore: experimental_member_use session.getParsedLibraryByElement2(element.library2) as ParsedLibraryResult; final FragmentDeclarationResult? declaration = parsedLibrary - .getFragmentDeclaration(element.firstFragment); + // ignore: experimental_member_use + .getFragmentDeclaration(element.firstFragment); final AstNode? node = declaration?.node; return node is T ? node : null; @@ -684,6 +687,7 @@ class _TypeHelperJson extends _TypeHelperWithHelper { final MethodElement2? toJsonMethod = type.lookUpMethod3( 'toJson', + // ignore: experimental_member_use type.element3.library2, ); if (toJsonMethod == null || @@ -698,6 +702,7 @@ class _TypeHelperJson extends _TypeHelperWithHelper { return _matchesType(type.typeArguments.first); } + // ignore: experimental_member_use final ConstructorElement2? fromJsonMethod = type.element3 .getNamedConstructor2('fromJson'); @@ -711,6 +716,7 @@ class _TypeHelperJson extends _TypeHelperWithHelper { throw InvalidGenerationSourceError( 'The parameter type ' '`${type.getDisplayString(withNullability: false)}` not have a supported fromJson definition.', + // ignore: experimental_member_use element: type.element3, ); } @@ -741,6 +747,7 @@ class _TypeHelperJson extends _TypeHelperWithHelper { bool _isNestedTemplate(InterfaceType type) { // check if has fromJson constructor + // ignore: experimental_member_use final ConstructorElement2? fromJsonMethod = type.element3 .getNamedConstructor2('fromJson'); if (fromJsonMethod == null || !fromJsonMethod.isPublic) { @@ -764,6 +771,7 @@ class _TypeHelperJson extends _TypeHelperWithHelper { throw InvalidGenerationSourceError( 'The parameter type ' '`${type.getDisplayString(withNullability: false)}` not have a supported fromJson definition.', + // ignore: experimental_member_use element: type.element3, ); } @@ -782,6 +790,7 @@ class _TypeHelperJson extends _TypeHelperWithHelper { throw InvalidGenerationSourceError( 'The parameter type ' '`${type.getDisplayString(withNullability: false)}` not have a supported fromJson definition.', + // ignore: experimental_member_use element: type.element3, ); }