Skip to content
This repository has been archived by the owner on Oct 2, 2024. It is now read-only.

Commit

Permalink
Merge pull request #229 from comigor/override-annotation-fix
Browse files Browse the repository at this point in the history
override annotation fix
  • Loading branch information
vasilich6107 authored Oct 13, 2020
2 parents 6c1537e + a3a426c commit 5c1e79b
Show file tree
Hide file tree
Showing 9 changed files with 62 additions and 43 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# CHANGELOG

## 6.15.1-beta.1
- Override annotation fix

## 6.14.1-beta.1
- Package updates

Expand Down
5 changes: 1 addition & 4 deletions lib/generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -270,10 +270,7 @@ ClassProperty createClassProperty({
return ClassProperty(
type: TypeName(name: 'String'),
name: fieldName,
annotations: [
'override',
'JsonKey(name: \'${context.schemaMap.typeNameField}\')'
],
annotations: ['JsonKey(name: \'${context.schemaMap.typeNameField}\')'],
isResolveType: true,
);
}
Expand Down
17 changes: 14 additions & 3 deletions lib/generator/print_helpers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,9 @@ Method _propsMethod(String body) {

/// Generates a [Spec] of a single class definition.
Spec classDefinitionToSpec(
ClassDefinition definition, Iterable<FragmentClassDefinition> fragments) {
ClassDefinition definition,
Iterable<FragmentClassDefinition> fragments,
Iterable<ClassDefinition> classes) {
final fromJson = definition.factoryPossibilities.isNotEmpty
? Constructor(
(b) => b
Expand Down Expand Up @@ -119,6 +121,9 @@ Spec classDefinitionToSpec(
.expand((i) => i)
.followedBy(definition.properties.map((p) => p.name.namePrintable));

final extendedClass = classes
.firstWhere((e) => e.name == definition.extension, orElse: () => null);

return Class(
(b) => b
..annotations
Expand Down Expand Up @@ -156,6 +161,12 @@ Spec classDefinitionToSpec(
..constructors.add(fromJson)
..methods.add(toJson)
..fields.addAll(definition.properties.map((p) {
if (extendedClass != null &&
extendedClass.properties.any((e) => e == p)) {
// if class has the same prop as in extension
p.annotations.add('override');
}

final field = Field(
(f) => f
..name = p.name.namePrintable
Expand Down Expand Up @@ -364,8 +375,8 @@ Spec generateLibrarySpec(LibraryDefinition definition) {
final enums = uniqueDefinitions.whereType<EnumDefinition>();

bodyDirectives.addAll(fragments.map(fragmentClassDefinitionToSpec));
bodyDirectives
.addAll(classes.map((cDef) => classDefinitionToSpec(cDef, fragments)));
bodyDirectives.addAll(
classes.map((cDef) => classDefinitionToSpec(cDef, fragments, classes)));
bodyDirectives.addAll(enums.map(enumDefinitionToSpec));

for (final queryDef in definition.queries) {
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: artemis
version: 6.14.1-beta.1
version: 6.15.1-beta.1

description: Build dart types from GraphQL schemas and queries (using Introspection Query).
homepage: https://github.com/comigor/artemis
Expand Down
24 changes: 13 additions & 11 deletions test/generator/print_helpers_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -133,19 +133,21 @@ void main() {
test('It will throw if name is null or empty.', () {
expect(
() => classDefinitionToSpec(
ClassDefinition(name: null, properties: []), []),
ClassDefinition(name: null, properties: []), [], []),
throwsA(TypeMatcher<AssertionError>()));
expect(
() => classDefinitionToSpec(
ClassDefinition(name: ClassName(name: ''), properties: []), []),
ClassDefinition(name: ClassName(name: ''), properties: []),
[],
[]),
throwsA(TypeMatcher<AssertionError>()));
});

test('It can generate a class without properties.', () {
final definition =
ClassDefinition(name: ClassName(name: 'AClass'), properties: []);

final str = specToString(classDefinitionToSpec(definition, []));
final str = specToString(classDefinitionToSpec(definition, [], []));

expect(str, '''@JsonSerializable(explicitToJson: true)
class AClass with EquatableMixin {
Expand All @@ -166,7 +168,7 @@ class AClass with EquatableMixin {
properties: [],
extension: ClassName(name: 'AnotherClass'));

final str = specToString(classDefinitionToSpec(definition, []));
final str = specToString(classDefinitionToSpec(definition, [], []));

expect(str, '''@JsonSerializable(explicitToJson: true)
class AClass extends AnotherClass with EquatableMixin {
Expand Down Expand Up @@ -194,7 +196,7 @@ class AClass extends AnotherClass with EquatableMixin {
typeNameField: TypeName(name: '__typename'),
);

final str = specToString(classDefinitionToSpec(definition, []));
final str = specToString(classDefinitionToSpec(definition, [], []));

expect(str, r'''@JsonSerializable(explicitToJson: true)
class AClass with EquatableMixin {
Expand Down Expand Up @@ -238,7 +240,7 @@ class AClass with EquatableMixin {
name: ClassPropertyName(name: 'anotherName')),
]);

final str = specToString(classDefinitionToSpec(definition, []));
final str = specToString(classDefinitionToSpec(definition, [], []));

expect(str, '''@JsonSerializable(explicitToJson: true)
class AClass with EquatableMixin {
Expand Down Expand Up @@ -266,7 +268,7 @@ class AClass with EquatableMixin {
type: TypeName(name: 'Type'),
name: ClassPropertyName(name: 'name')),
ClassProperty(
type: TypeName(name: 'AnnotedProperty'),
type: TypeName(name: 'AnnotatedProperty'),
name: ClassPropertyName(name: 'name'),
annotations: ['Hey()']),
ClassProperty(
Expand All @@ -279,7 +281,7 @@ class AClass with EquatableMixin {
annotations: ['override', 'Ho()']),
]);

final str = specToString(classDefinitionToSpec(definition, []));
final str = specToString(classDefinitionToSpec(definition, [], []));

expect(str, '''@JsonSerializable(explicitToJson: true)
class AClass with EquatableMixin {
Expand All @@ -290,7 +292,7 @@ class AClass with EquatableMixin {
Type name;
@Hey()
AnnotedProperty name;
AnnotatedProperty name;
@override
OverridenProperty name;
Expand Down Expand Up @@ -322,7 +324,7 @@ class AClass with EquatableMixin {
type: TypeName(name: 'Type'),
name: ClassPropertyName(name: 'name')),
])
]));
], []));

expect(str, '''@JsonSerializable(explicitToJson: true)
class AClass with EquatableMixin, FragmentMixin {
Expand Down Expand Up @@ -353,7 +355,7 @@ class AClass with EquatableMixin, FragmentMixin {
isInput: true,
);

final str = specToString(classDefinitionToSpec(definition, []));
final str = specToString(classDefinitionToSpec(definition, [], []));

expect(str, '''@JsonSerializable(explicitToJson: true)
class AClass with EquatableMixin {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,7 @@ final LibraryDefinition libraryDefinition =
ClassProperty(
type: TypeName(name: r'String'),
name: ClassPropertyName(name: r'__typename'),
annotations: [
r'override',
r'''JsonKey(name: '__typename')'''
],
annotations: [r'''JsonKey(name: '__typename')'''],
isNonNull: false,
isResolveType: true)
],
Expand Down Expand Up @@ -259,7 +256,6 @@ class Custom$Query$NodeById with EquatableMixin {
String id;
@override
@JsonKey(name: '__typename')
String $$typename;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,10 +111,7 @@ final LibraryDefinition libraryDefinition =
ClassProperty(
type: TypeName(name: r'String'),
name: ClassPropertyName(name: r'__typename'),
annotations: [
r'override',
r'''JsonKey(name: '__typename')'''
],
annotations: [r'''JsonKey(name: '__typename')'''],
isNonNull: false,
isResolveType: true)
],
Expand Down Expand Up @@ -202,7 +199,6 @@ class Custom$Query$Node with EquatableMixin {
String id;
@override
@JsonKey(name: '__typename')
String $$typename;
Expand Down
6 changes: 1 addition & 5 deletions test/query_generator/interfaces/interface_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -121,10 +121,7 @@ final LibraryDefinition libraryDefinition =
ClassProperty(
type: TypeName(name: r'String'),
name: ClassPropertyName(name: r'__typename'),
annotations: [
r'override',
r'''JsonKey(name: '__typename')'''
],
annotations: [r'''JsonKey(name: '__typename')'''],
isNonNull: false,
isResolveType: true)
],
Expand Down Expand Up @@ -247,7 +244,6 @@ class Custom$Query$Node with EquatableMixin {
String id;
@override
@JsonKey(name: '__typename')
String $$typename;
Expand Down
36 changes: 27 additions & 9 deletions test/query_generator/union_types_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ final String query = r'''
_a_a
_a_a_
_new
__typename,
},
... on TypeB {
b
Expand All @@ -39,6 +40,7 @@ final String query = r'''
_b_b_
new
IN
__typename,
}
}
}
Expand Down Expand Up @@ -118,7 +120,13 @@ final LibraryDefinition libraryDefinition =
name: ClassPropertyName(name: r'_new'),
annotations: [r'''JsonKey(name: '_new')'''],
isNonNull: false,
isResolveType: false)
isResolveType: false),
ClassProperty(
type: TypeName(name: r'String'),
name: ClassPropertyName(name: r'__typename'),
annotations: [r'''JsonKey(name: '__typename')'''],
isNonNull: false,
isResolveType: true)
],
extension: ClassName(name: r'SomeQuery$_SomeObject$_SomeUnion'),
factoryPossibilities: {},
Expand Down Expand Up @@ -167,7 +175,13 @@ final LibraryDefinition libraryDefinition =
name: ClassPropertyName(name: r'IN'),
annotations: [r'''JsonKey(name: 'IN')'''],
isNonNull: false,
isResolveType: false)
isResolveType: false),
ClassProperty(
type: TypeName(name: r'String'),
name: ClassPropertyName(name: r'__typename'),
annotations: [r'''JsonKey(name: '__typename')'''],
isNonNull: false,
isResolveType: true)
],
extension: ClassName(name: r'SomeQuery$_SomeObject$_SomeUnion'),
factoryPossibilities: {},
Expand All @@ -179,10 +193,7 @@ final LibraryDefinition libraryDefinition =
ClassProperty(
type: TypeName(name: r'String'),
name: ClassPropertyName(name: r'__typename'),
annotations: [
r'override',
r'''JsonKey(name: '__typename')'''
],
annotations: [r'''JsonKey(name: '__typename')'''],
isNonNull: false,
isResolveType: true)
],
Expand Down Expand Up @@ -244,8 +255,12 @@ class SomeQuery$SomeObject$SomeUnion$TypeA
@JsonKey(name: '_new')
String $new;
@JsonKey(name: '__typename')
@override
String $$typename;
@override
List<Object> get props => [a, $, $a, $aA, $aA_, $new];
List<Object> get props => [a, $, $a, $aA, $aA_, $new, $$typename];
Map<String, dynamic> toJson() =>
_$SomeQuery$SomeObject$SomeUnion$TypeAToJson(this);
}
Expand Down Expand Up @@ -279,8 +294,12 @@ class SomeQuery$SomeObject$SomeUnion$TypeB
@JsonKey(name: 'IN')
String kw$IN;
@JsonKey(name: '__typename')
@override
List<Object> get props => [b, $, $b, $bB, $bB_, kw$new, kw$IN];
String $$typename;
@override
List<Object> get props => [b, $, $b, $bB, $bB_, kw$new, kw$IN, $$typename];
Map<String, dynamic> toJson() =>
_$SomeQuery$SomeObject$SomeUnion$TypeBToJson(this);
}
Expand All @@ -300,7 +319,6 @@ class SomeQuery$SomeObject$SomeUnion with EquatableMixin {
return _$SomeQuery$SomeObject$SomeUnionFromJson(json);
}
@override
@JsonKey(name: '__typename')
String $$typename;
Expand Down

0 comments on commit 5c1e79b

Please sign in to comment.