Skip to content

Commit 22bd947

Browse files
committed
Update to latest source_gen
1 parent a7b98e0 commit 22bd947

5 files changed

+37
-66
lines changed

lib/src/json_literal_generator.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ class JsonLiteralGenerator extends GeneratorForAnnotation<JsonLiteral> {
1717

1818
@override
1919
Future<String> generateForAnnotatedElement(
20-
Element element, JsonLiteral annotation, BuildStep buildStep) async {
21-
if (p.isAbsolute(annotation.path)) {
20+
Element element, ConstantReader annotation, BuildStep buildStep) async {
21+
if (p.isAbsolute(annotation.read('path').stringValue)) {
2222
throw new ArgumentError(
2323
'`annotation.path` must be relative path to the source file.');
2424
}
2525

2626
var sourcePathDir = p.dirname(buildStep.inputId.path);
27-
var fileId = new AssetId(
28-
buildStep.inputId.package, p.join(sourcePathDir, annotation.path));
27+
var fileId = new AssetId(buildStep.inputId.package,
28+
p.join(sourcePathDir, annotation.read('path').stringValue));
2929
var content = JSON.decode(await buildStep.readAsString(fileId));
3030

3131
var thing = JSON.encode(content);

lib/src/json_serializable_generator.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class JsonSerializableGenerator
4343

4444
@override
4545
Future<String> generateForAnnotatedElement(
46-
Element element, JsonSerializable annotation, _) async {
46+
Element element, ConstantReader annotation, _) async {
4747
if (element is! ClassElement) {
4848
var friendlyName = friendlyNameForElement(element);
4949
throw new InvalidGenerationSourceError(
@@ -84,7 +84,7 @@ class JsonSerializableGenerator
8484

8585
var buffer = new StringBuffer();
8686

87-
if (annotation.createFactory) {
87+
if (annotation.read('createFactory').boolValue) {
8888
var toSkip = _writeFactory(buffer, classElement, fields, prefix);
8989

9090
// If there are fields that are final – that are not set via the generated
@@ -94,7 +94,7 @@ class JsonSerializableGenerator
9494
}
9595
}
9696

97-
if (annotation.createToJson) {
97+
if (annotation.read('createToJson').boolValue) {
9898
//
9999
// Generate the mixin class
100100
//

pubspec.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,7 @@ dev_dependencies:
1616
build_test: ^0.6.0
1717
collection: ^1.14.0
1818
test: ^0.12.3
19+
20+
dependency_overrides:
21+
source_gen:
22+
git: git@github.com:dart-lang/source_gen.git

test/json_serializable_test.dart

Lines changed: 25 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ library json_serializable.test.json_generator_test;
88
import 'dart:async';
99

1010
import 'package:analyzer/dart/ast/ast.dart';
11-
import 'package:analyzer/dart/element/element.dart';
1211
import 'package:analyzer/src/string_source.dart';
1312
import 'package:json_serializable/json_serializable.dart';
1413
import 'package:path/path.dart' as p;
14+
import 'package:source_gen/source_gen.dart';
1515
import 'package:test/test.dart';
1616

1717
import 'analysis_utils.dart';
@@ -21,42 +21,35 @@ import 'test_utils.dart';
2121
void main() {
2222
group('non-classes', () {
2323
test('const field', () async {
24-
var element = await _getClassForCodeString('theAnswer');
25-
2624
expect(
27-
_generator.generate(element, null),
25+
_runForElementNamed('theAnswer'),
2826
throwsInvalidGenerationSourceError(
2927
'Generator cannot target `const dynamic theAnswer`.',
3028
'Remove the JsonSerializable annotation from `const dynamic theAnswer`.'));
29+
// TODO: validate the properties on the thrown error
3130
});
3231

3332
test('method', () async {
34-
var element = await _getClassForCodeString('annotatedMethod');
35-
3633
expect(
37-
_generator.generate(element, null),
34+
_runForElementNamed('annotatedMethod'),
3835
throwsInvalidGenerationSourceError(
3936
'Generator cannot target `annotatedMethod`.',
4037
'Remove the JsonSerializable annotation from `annotatedMethod`.'));
38+
// TODO: validate the properties on the thrown error
4139
});
4240
});
43-
4441
group('unknown types', () {
4542
test('in constructor arguments', () async {
46-
var element = await _getClassForCodeString('UnknownCtorParamType');
47-
4843
expect(
49-
_generator.generate(element, null),
44+
_runForElementNamed('UnknownCtorParamType'),
5045
throwsInvalidGenerationSourceError(
5146
'At least one constructor argument has an invalid type: `number`.',
5247
'Check names and imports.'));
5348
});
5449

5550
test('in fields', () async {
56-
var element = await _getClassForCodeString('UnknownFieldType');
57-
5851
expect(
59-
_generator.generate(element, null),
52+
_runForElementNamed('UnknownFieldType'),
6053
throwsInvalidGenerationSourceError(
6154
'At least one field has an invalid type: `number`.',
6255
'Check names and imports.'));
@@ -65,63 +58,46 @@ void main() {
6558

6659
group('unserializable types', () {
6760
test('for toJson', () async {
68-
var element = await _getClassForCodeString('NoSerializeFieldType');
69-
7061
expect(
71-
_generator.generate(element, null),
62+
_runForElementNamed('NoSerializeFieldType'),
7263
throwsInvalidGenerationSourceError(
7364
'Could not generate `toJson` code for `Stopwatch watch`.',
7465
'Make sure all of the types are serializable.'));
7566
});
7667

7768
test('for fromJson', () async {
78-
var element = await _getClassForCodeString('NoDeserializeFieldType');
79-
8069
expect(
81-
_generator.generate(element, null),
70+
_runForElementNamed('NoDeserializeFieldType'),
8271
throwsInvalidGenerationSourceError(
8372
'Could not generate fromJson code for `Stopwatch watch`.',
8473
'Make sure all of the types are serializable.'));
8574
});
8675

8776
test('for toJson in Map key', () async {
88-
var element = await _getClassForCodeString('NoSerializeBadKey');
89-
9077
expect(
91-
_generator.generate(element, null),
78+
_runForElementNamed('NoSerializeBadKey'),
9279
throwsInvalidGenerationSourceError(
9380
'Could not generate `toJson` code for `Map<int, DateTime> intDateTimeMap`.',
9481
'Make sure all of the types are serializable.'));
9582
});
9683

9784
test('for fromJson', () async {
98-
var element = await _getClassForCodeString('NoDeserializeBadKey');
99-
10085
expect(
101-
_generator.generate(element, null),
86+
_runForElementNamed('NoDeserializeBadKey'),
10287
throwsInvalidGenerationSourceError(
10388
'Could not generate fromJson code for `Map<int, DateTime> intDateTimeMap`.',
10489
'Make sure all of the types are serializable.'));
10590
});
10691
});
10792

10893
test('class with final fields', () async {
109-
var element = await _getClassForCodeString('FinalFields');
110-
var generateResult = await _generator.generate(element, null);
94+
var generateResult = await _runForElementNamed('FinalFields');
11195
expect(generateResult, contains("Map<String, dynamic> toJson()"));
11296
});
11397

114-
test('unannotated classes no-op', () async {
115-
var element = await _getClassForCodeString('NoAnnotation');
116-
var output = _generator.generate(element, null);
117-
118-
expect(output, isNull);
119-
});
120-
12198
group('valid inputs', () {
12299
test('class with no fields', () async {
123-
var element = await _getClassForCodeString('Person');
124-
var output = await _generator.generate(element, null);
100+
var output = await _runForElementNamed('Person');
125101

126102
expect(output, isNotNull);
127103

@@ -130,50 +106,42 @@ void main() {
130106
});
131107

132108
test('class with ctor params', () async {
133-
var element = await _getClassForCodeString('Order');
134-
var output = await _generator.generate(element, null);
135-
109+
var output = await _runForElementNamed('Order');
136110
expect(output, isNotNull);
137111

138112
// TODO: test the actual output
139113
// print(output);
140114
});
141115

142116
test('class with child json-able object', () async {
143-
var element = await _getClassForCodeString('ParentObject');
144-
var output = await _generator.generate(element, null);
117+
var output = await _runForElementNamed('ParentObject');
145118

146119
expect(output, contains('new ChildObject.fromJson'));
147120
});
148121

149122
test('class with child list of json-able objects', () async {
150-
var element = await _getClassForCodeString('ParentObjectWithChildren');
151-
var output = await _generator.generate(element, null);
123+
var output = await _runForElementNamed('ParentObjectWithChildren');
152124

153125
expect(output, contains('.toList()'));
154126
expect(output, contains('new ChildObject.fromJson'));
155127
});
156128

157129
test('class with child list of dynamic objects is left alone', () async {
158-
var element =
159-
await _getClassForCodeString('ParentObjectWithDynamicChildren');
160-
var output = await _generator.generate(element, null);
130+
var output = await _runForElementNamed('ParentObjectWithDynamicChildren');
161131

162132
expect(output, contains('children = json[\'children\'] as List;'));
163133
});
164134

165135
test('class with list of int is cast for strong mode', () async {
166-
var element = await _getClassForCodeString('Person');
167-
var output = await _generator.generate(element, null);
136+
var output = await _runForElementNamed('Person');
168137

169138
expect(output,
170139
contains("json['listOfInts'] as List)?.map((v0) => v0 as int)"));
171140
});
172141
});
173142

174143
test('reads JsonKey annotations', () async {
175-
var element = await _getClassForCodeString('Person');
176-
var output = await _generator.generate(element, null);
144+
var output = await _runForElementNamed('Person');
177145

178146
expect(output, contains("'h': height,"));
179147
expect(output, contains("..height = json['h']"));
@@ -182,13 +150,15 @@ void main() {
182150

183151
const _generator = const JsonSerializableGenerator();
184152

185-
Future<Element> _getClassForCodeString(String name) async {
153+
Future<String> _runForElementNamed(String name) async {
186154
if (_compUnit == null) {
187155
_compUnit = await _getCompilationUnitForString(getPackagePath());
188156
}
189-
190-
return getElementsFromLibraryElement(_compUnit.element.library)
191-
.singleWhere((e) => e.name == name);
157+
var library = new LibraryReader(_compUnit.element.library);
158+
var element = library.allElements.singleWhere((e) => e.name == name);
159+
var annotation = _generator.typeChecker.firstAnnotationOf(element);
160+
return _generator.generateForAnnotatedElement(
161+
element, new ConstantReader(annotation), null);
192162
}
193163

194164
Future<CompilationUnit> _getCompilationUnitForString(String projectPath) async {
@@ -234,9 +204,6 @@ class Order {
234204
Order(this.height, String firstName, [this.lastName]);
235205
}
236206
237-
class NoAnnotation {
238-
}
239-
240207
@JsonSerializable()
241208
class FinalFields {
242209
final int a;

tool/phases.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'package:json_serializable/json_serializable.dart';
77
import 'package:source_gen/source_gen.dart';
88

99
final PhaseGroup phases = new PhaseGroup.singleAction(
10-
new GeneratorBuilder(const [
10+
new PartBuilder(const [
1111
const JsonSerializableGenerator(),
1212
const JsonLiteralGenerator()
1313
]),

0 commit comments

Comments
 (0)