Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: add support for fields in superclasses (#39)
- Loading branch information
Showing
6 changed files
with
299 additions
and
5 deletions.
There are no files selected for viewing
18 changes: 18 additions & 0 deletions
18
xml_serializable/lib/src/extensions/class_element_extensions.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
import 'package:analyzer/dart/element/element.dart'; | ||
|
||
extension ClassElementExtensions on ClassElement { | ||
/// Returns a list containing all of the fields declared in this class and its supertypes. This includes superclasses, mixins, interfaces, and superclass constraints. | ||
List<FieldElement> get allFields { | ||
final allFields = { | ||
for (var field in fields) field.name: field, | ||
}; | ||
|
||
for (var supertype in allSupertypes) { | ||
for (var field in supertype.element2.fields) { | ||
allFields.putIfAbsent(field.name, () => field); | ||
} | ||
} | ||
|
||
return allFields.values.toList(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
219 changes: 219 additions & 0 deletions
219
xml_serializable/test/extensions/class_element_extensions_test.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,219 @@ | ||
import 'package:test/test.dart'; | ||
import 'package:xml_serializable/xml_serializable.dart'; | ||
|
||
import '../fake_class_element.dart'; | ||
import '../fake_field_element.dart'; | ||
import '../fake_interface_type.dart'; | ||
|
||
void main() { | ||
group( | ||
'ClassElementExtensions', | ||
() { | ||
group( | ||
'allFields', | ||
() { | ||
test( | ||
'should return all of the fields in the class', | ||
() { | ||
final fields = [ | ||
FakeFieldElement( | ||
name: 'field1', | ||
), | ||
FakeFieldElement( | ||
name: 'field2', | ||
), | ||
]; | ||
|
||
expect( | ||
FakeClassElement( | ||
fields: fields, | ||
).allFields, | ||
containsAll( | ||
[ | ||
...fields, | ||
], | ||
), | ||
); | ||
}, | ||
); | ||
|
||
test( | ||
'should return all of the fields in the superclass', | ||
() { | ||
final superclass1Fields = [ | ||
FakeFieldElement( | ||
name: 'superclass1Field1', | ||
), | ||
FakeFieldElement( | ||
name: 'superclass1Field2', | ||
), | ||
]; | ||
|
||
expect( | ||
FakeClassElement( | ||
allSupertypes: [ | ||
FakeInterfaceType( | ||
element2: FakeClassElement( | ||
fields: superclass1Fields, | ||
), | ||
), | ||
], | ||
).allFields, | ||
containsAll( | ||
[ | ||
...superclass1Fields, | ||
], | ||
), | ||
); | ||
}, | ||
); | ||
|
||
test( | ||
'should return all of the fields in the class and the superclass', | ||
() { | ||
final fields = [ | ||
FakeFieldElement( | ||
name: 'field1', | ||
), | ||
FakeFieldElement( | ||
name: 'field2', | ||
), | ||
]; | ||
|
||
final superclass1Fields = [ | ||
FakeFieldElement( | ||
name: 'superclass1Field1', | ||
), | ||
FakeFieldElement( | ||
name: 'superclass1Field2', | ||
), | ||
]; | ||
|
||
expect( | ||
FakeClassElement( | ||
fields: fields, | ||
allSupertypes: [ | ||
FakeInterfaceType( | ||
element2: FakeClassElement( | ||
fields: superclass1Fields, | ||
), | ||
), | ||
], | ||
).allFields, | ||
containsAll( | ||
[ | ||
...fields, | ||
...superclass1Fields, | ||
], | ||
), | ||
); | ||
}, | ||
); | ||
|
||
test( | ||
'should return all of the fields in all of the superclasses', | ||
() { | ||
final superclass1Fields = [ | ||
FakeFieldElement( | ||
name: 'superclass1Field1', | ||
), | ||
FakeFieldElement( | ||
name: 'superclass1Field2', | ||
), | ||
]; | ||
|
||
final superclass2Fields = [ | ||
FakeFieldElement( | ||
name: 'superclass2Field1', | ||
), | ||
FakeFieldElement( | ||
name: 'superclass2Field2', | ||
), | ||
]; | ||
|
||
expect( | ||
FakeClassElement( | ||
allSupertypes: [ | ||
FakeInterfaceType( | ||
element2: FakeClassElement( | ||
fields: superclass1Fields, | ||
), | ||
), | ||
FakeInterfaceType( | ||
element2: FakeClassElement( | ||
fields: superclass2Fields, | ||
), | ||
), | ||
], | ||
).allFields, | ||
containsAll( | ||
[ | ||
...superclass1Fields, | ||
...superclass2Fields, | ||
], | ||
), | ||
); | ||
}, | ||
); | ||
|
||
test( | ||
'should return all of the fields in the class and all of the superclasses', | ||
() { | ||
final fields = [ | ||
FakeFieldElement( | ||
name: 'field1', | ||
), | ||
FakeFieldElement( | ||
name: 'field2', | ||
), | ||
]; | ||
|
||
final superclass1Fields = [ | ||
FakeFieldElement( | ||
name: 'superclass1Field1', | ||
), | ||
FakeFieldElement( | ||
name: 'superclass1Field2', | ||
), | ||
]; | ||
|
||
final superclass2Fields = [ | ||
FakeFieldElement( | ||
name: 'superclass2Field1', | ||
), | ||
FakeFieldElement( | ||
name: 'superclass2Field2', | ||
), | ||
]; | ||
|
||
expect( | ||
FakeClassElement( | ||
fields: fields, | ||
allSupertypes: [ | ||
FakeInterfaceType( | ||
element2: FakeClassElement( | ||
fields: superclass1Fields, | ||
), | ||
), | ||
FakeInterfaceType( | ||
element2: FakeClassElement( | ||
fields: superclass2Fields, | ||
), | ||
), | ||
], | ||
).allFields, | ||
containsAll( | ||
[ | ||
...fields, | ||
...superclass1Fields, | ||
...superclass2Fields, | ||
], | ||
), | ||
); | ||
}, | ||
); | ||
}, | ||
); | ||
}, | ||
); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.