From bdd49f2361fd983faca6a73ca2696896c359521b Mon Sep 17 00:00:00 2001 From: Matthew Berry Date: Mon, 3 Jun 2024 19:02:20 -0700 Subject: [PATCH 1/4] Revive to the object's `variableElement` if available Variables have been tracked on DartObject since https://dart.googlesource.com/sdk/+/54b7f4b72a1701f8f9a0334c94ce6f59732bd261. This change uses the variable in the reviver if it exists. I believe the existing tests in https://github.com/dart-lang/source_gen/blob/master/source_gen/test/constants_test.dart already cover this, but lmk if you'd like any additional tests --- source_gen/lib/src/constants/revive.dart | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/source_gen/lib/src/constants/revive.dart b/source_gen/lib/src/constants/revive.dart index 63b44e43..bfafea44 100644 --- a/source_gen/lib/src/constants/revive.dart +++ b/source_gen/lib/src/constants/revive.dart @@ -20,6 +20,21 @@ import '../utils.dart'; /// Dart source code (such as referencing private constructors). It is up to the /// build tool(s) using this library to surface error messages to the user. Revivable reviveInstance(DartObject object, [LibraryElement? origin]) { + final variableElement = object.variable; + if (variableElement != null && + variableElement.isConst && + variableElement.isPublic) { + final url = Uri.parse(urlOfElement(variableElement)).removeFragment(); + if (variableElement.enclosingElement + case TypeDefiningElement enclosingElement?) { + return Revivable._( + source: url, + accessor: '${enclosingElement.name}.${variableElement.name}', + ); + } + return Revivable._(source: url, accessor: variableElement.name); + } + final objectType = object.type; Element? element = objectType!.alias?.element; if (element == null) { From 5f2f0c5cb47cbc62f481cb3af13eed70ad860762 Mon Sep 17 00:00:00 2001 From: Matthew Berry Date: Wed, 5 Jun 2024 16:05:12 -0700 Subject: [PATCH 2/4] Add test using extension types --- source_gen/test/constants_test.dart | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/source_gen/test/constants_test.dart b/source_gen/test/constants_test.dart index fe97e07c..0335efe9 100644 --- a/source_gen/test/constants_test.dart +++ b/source_gen/test/constants_test.dart @@ -227,6 +227,7 @@ void main() { @_privateField @Wrapper(_privateFunction) @ProcessStartMode.normal + @ExtensionTypeWithStaticField.staticField class Example {} class Int64Like implements Int64LikeBase{ @@ -296,6 +297,10 @@ void main() { } void _privateFunction() {} + + extension type const ExtensionTypeWithStaticField._(int _) { + static const staticField = ExtensionTypeWithStaticField._(1); + } ''', (resolver) async => (await resolver.findLibraryByName('test_lib'))!, ); @@ -393,5 +398,11 @@ void main() { expect(staticFieldWithPrivateImpl.isPrivate, isFalse); expect(staticFieldWithPrivateImpl.source.fragment, isEmpty); }); + + test('should decode static fields on extension types', () { + final fieldOnly = constants[14].revive(); + expect(fieldOnly.source.fragment, isEmpty); + expect(fieldOnly.accessor, 'ExtensionTypeWithStaticField.staticField'); + }); }); } From c5a9e801a9628020a51ecf34f7e41842fea6e657 Mon Sep 17 00:00:00 2001 From: Matthew Berry Date: Sat, 8 Jun 2024 02:44:06 +0000 Subject: [PATCH 3/4] Make enclosingElement final --- source_gen/lib/src/constants/revive.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source_gen/lib/src/constants/revive.dart b/source_gen/lib/src/constants/revive.dart index bfafea44..56a810ca 100644 --- a/source_gen/lib/src/constants/revive.dart +++ b/source_gen/lib/src/constants/revive.dart @@ -26,7 +26,7 @@ Revivable reviveInstance(DartObject object, [LibraryElement? origin]) { variableElement.isPublic) { final url = Uri.parse(urlOfElement(variableElement)).removeFragment(); if (variableElement.enclosingElement - case TypeDefiningElement enclosingElement?) { + case final TypeDefiningElement enclosingElement?) { return Revivable._( source: url, accessor: '${enclosingElement.name}.${variableElement.name}', From b86dfa234140c0136d0899cac09a6bd003f5246f Mon Sep 17 00:00:00 2001 From: Matthew Berry Date: Sun, 9 Jun 2024 11:31:49 -0700 Subject: [PATCH 4/4] Add a changelog entry --- source_gen/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/source_gen/CHANGELOG.md b/source_gen/CHANGELOG.md index f63fd293..08beb4ab 100644 --- a/source_gen/CHANGELOG.md +++ b/source_gen/CHANGELOG.md @@ -4,6 +4,7 @@ `GeneratorForAnnotation.generateForAnnotatedElement`. - Support all the glob quotes. - Require Dart 3.4.0 +- Revive to the object's `variableElement` if available ## 1.5.0