Gen stub of reflectedclass
This commit is contained in:
parent
4500f33ae9
commit
97474294c5
2 changed files with 56 additions and 0 deletions
|
@ -1,4 +1,5 @@
|
||||||
import 'package:analyzer/dart/element/element.dart';
|
import 'package:analyzer/dart/element/element.dart';
|
||||||
|
import 'package:analyzer/dart/element/type.dart';
|
||||||
import 'package:angel_container/angel_container.dart';
|
import 'package:angel_container/angel_container.dart';
|
||||||
import 'package:code_builder/code_builder.dart';
|
import 'package:code_builder/code_builder.dart';
|
||||||
import 'package:recase/recase.dart';
|
import 'package:recase/recase.dart';
|
||||||
|
@ -18,6 +19,15 @@ class ReflectorLibraryGenerator {
|
||||||
Library generate() {
|
Library generate() {
|
||||||
return new Library((lib) {
|
return new Library((lib) {
|
||||||
lib.body.add(generateReflectorClass());
|
lib.body.add(generateReflectorClass());
|
||||||
|
|
||||||
|
// Generate a ReflectedClass for each type
|
||||||
|
for (var type in annotation.types) {
|
||||||
|
if (type is InterfaceType) {
|
||||||
|
lib.body.add(generateReflectedClass(type, lib));
|
||||||
|
} else {
|
||||||
|
// TODO: Handle these
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,4 +50,43 @@ class ReflectorLibraryGenerator {
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference _convertDartType(DartType type) {
|
||||||
|
if (type is InterfaceType) {
|
||||||
|
return new TypeReference((b) => b
|
||||||
|
..symbol = type.name
|
||||||
|
..types.addAll(type.typeArguments.map(_convertDartType)));
|
||||||
|
} else {
|
||||||
|
return refer(type.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Class generateReflectedClass(InterfaceType type, LibraryBuilder lib) {
|
||||||
|
return new Class((clazz) {
|
||||||
|
var rc = new ReCase(type.name);
|
||||||
|
clazz
|
||||||
|
..name = '_Reflected${rc.pascalCase}Class'
|
||||||
|
..extend = refer('ReflectedClass');
|
||||||
|
|
||||||
|
// Create const instance
|
||||||
|
lib.body.add(refer(clazz.name)
|
||||||
|
.constInstanceNamed('_', [])
|
||||||
|
.assignVar('_reflected${rc.pascalCase}Class', refer('ReflectedClass'))
|
||||||
|
.statement);
|
||||||
|
|
||||||
|
// Add const constructor
|
||||||
|
var superArgs = <Expression>[
|
||||||
|
literalString(type.name), // name
|
||||||
|
literalConstList([]), // typeParameters
|
||||||
|
literalConstList([]), // annotations
|
||||||
|
literalConstList([]), // constructors
|
||||||
|
literalConstList([]), // declarations,
|
||||||
|
_convertDartType(type), // reflectedType
|
||||||
|
];
|
||||||
|
clazz.constructors.add(new Constructor((b) => b
|
||||||
|
..constant = true
|
||||||
|
..name = '_'
|
||||||
|
..initializers.add(refer('super').call(superArgs).code)));
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,3 +9,10 @@ part of angel_container_generator_test;
|
||||||
class AngelContainerGeneratorTestReflector implements Reflector {
|
class AngelContainerGeneratorTestReflector implements Reflector {
|
||||||
const AngelContainerGeneratorTestReflector();
|
const AngelContainerGeneratorTestReflector();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReflectedClass _reflectedArtistClass = const _ReflectedArtistClass._();
|
||||||
|
|
||||||
|
class _ReflectedArtistClass extends ReflectedClass {
|
||||||
|
const _ReflectedArtistClass._()
|
||||||
|
: super('Artist', const [], const [], const [], const [], Artist);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue