Skip to content

Commit 8bf5d08

Browse files
authored
fix: Support reviving a reference to a function. (#321)
* fix: Support reviving a reference to a function. * Fix test breakage.
1 parent 2ea59ef commit 8bf5d08

File tree

5 files changed

+43
-4
lines changed

5 files changed

+43
-4
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
* **BREAKING** removed the deprecated `requireLibraryDirective` parameter in
44
`PartBuilder`.
55

6+
* `Revivable` no longer throws a type error when attempting to revive a
7+
reference to a top-level function or static-class method. Now is returns a
8+
reference to that function or method, as expected.
9+
610
## 0.7.6
711

812
* `TypeChecker` now throws an `UnresolvedAnnotationException` with a more

lib/src/constants/revive.dart

+15-2
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,21 @@ import '../utils.dart';
2020
/// build tool(s) using this library to surface error messages to the user.
2121
Revivable reviveInstance(DartObject object, [LibraryElement origin]) {
2222
origin ??= object.type.element.library;
23-
var url = Uri.parse(urlOfElement(object.type.element));
24-
final clazz = object?.type?.element as ClassElement;
23+
final element = object.type.element;
24+
var url = Uri.parse(urlOfElement(element));
25+
if (element is FunctionElement) {
26+
return new Revivable._(
27+
source: url.removeFragment(),
28+
accessor: element.name,
29+
);
30+
}
31+
if (element is MethodElement && element.isStatic) {
32+
return new Revivable._(
33+
source: url.removeFragment(),
34+
accessor: '${element.enclosingElement.name}.${element.name}',
35+
);
36+
}
37+
final clazz = element as ClassElement;
2538
// Enums are not included in .definingCompilationUnit.types.
2639
if (clazz.isEnum) {
2740
for (final e in clazz.fields.where(

pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: source_gen
2-
version: 0.8.0-dev
2+
version: 0.8.0
33
author: Dart Team <[email protected]>
44
description: Automated source code generation for Dart.
55
homepage: https://github.com/dart-lang/source_gen

test/constants_test.dart

+22
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,8 @@ void main() {
195195
@VisibleClass.secret()
196196
@fieldOnly
197197
@ClassWithStaticField.staticField
198+
@Wrapper(someFunction)
199+
@Wrapper(Wrapper.someFunction)
198200
class Example {}
199201
200202
class Int64Like {
@@ -238,6 +240,14 @@ void main() {
238240
static const staticField = const ClassWithStaticField._();
239241
const ClassWithStaticField._();
240242
}
243+
244+
class Wrapper {
245+
static void someFunction(int x, String y) {}
246+
final Function f;
247+
const Wrapper(this.f);
248+
}
249+
250+
void someFunction(int x, String y) {}
241251
''', (resolver) => resolver.findLibraryByName('test_lib'));
242252
constants = library
243253
.getType('Example')
@@ -293,5 +303,17 @@ void main() {
293303
expect(fieldOnly.source.fragment, isEmpty);
294304
expect(fieldOnly.accessor, 'ClassWithStaticField.staticField');
295305
});
306+
307+
test('should decode top-level functions', () {
308+
final fieldOnly = constants[7].read('f').revive();
309+
expect(fieldOnly.source.fragment, isEmpty);
310+
expect(fieldOnly.accessor, 'someFunction');
311+
});
312+
313+
test('should decode static-class functions', () {
314+
final fieldOnly = constants[8].read('f').revive();
315+
expect(fieldOnly.source.fragment, isEmpty);
316+
expect(fieldOnly.accessor, 'Wrapper.someFunction');
317+
});
296318
});
297319
}

test/test_files/annotations.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,6 @@ const objectAnnotation = const {
6868
'null': null,
6969
'String': 'a string',
7070
'core type': bool,
71-
'imported sdk type': collection.Maps,
71+
'imported sdk type': collection.Queue,
7272
'non-core type': OtherPublicAnnotationClass
7373
};

0 commit comments

Comments
 (0)