generateMixin method
Future<MixinDeclaration>
generateMixin(
- ClassMirror mixinMirror,
- Package package,
- String libraryUri,
- Uri sourceUri,
Generate mixin declaration with analyzer support
Implementation
Future<MixinDeclaration> generateMixin(mirrors.ClassMirror mixinMirror, Package package, String libraryUri, Uri sourceUri) async {
final mixinName = mirrors.MirrorSystem.getName(mixinMirror.simpleName);
Type runtimeType = mixinMirror.hasReflectedType ? mixinMirror.reflectedType : mixinMirror.runtimeType;
// Get analyzer element
final mixinElement = await _getMixinElement(mixinName, sourceUri);
final dartType = mixinElement?.thisType;
final annotations = await _extractAnnotations(mixinMirror.metadata, package);
if(GenericTypeParser.shouldCheckGeneric(runtimeType)) {
final resolvedType = await _resolveTypeFromGenericAnnotation(annotations, mixinName);
if (resolvedType != null) {
runtimeType = resolvedType;
}
}
final fields = <FieldDeclaration>[];
final methods = <MethodDeclaration>[];
// Extract constraints and interfaces using LinkDeclarations
final constraints = await _extractMixinConstraintsAsLink(mixinMirror, mixinElement, package, libraryUri);
final interfaces = await _extractInterfacesAsLink(mixinMirror, mixinElement, package, libraryUri);
StandardMixinDeclaration reflectedMixin = StandardMixinDeclaration(
name: mixinName,
type: runtimeType,
element: mixinElement,
dartType: dartType,
qualifiedName: _buildQualifiedName(mixinName, (mixinMirror.location?.sourceUri ?? Uri.parse(libraryUri)).toString()),
parentLibrary: _libraryCache[libraryUri]!,
isNullable: false,
typeArguments: await _extractTypeArgumentsAsLinks(mixinMirror.typeVariables, mixinElement?.typeParameters, package, libraryUri),
annotations: annotations,
sourceLocation: sourceUri,
fields: fields,
methods: methods,
constraints: constraints,
interfaces: interfaces,
isPublic: !_isInternal(mixinName),
isSynthetic: _isSynthetic(mixinName),
);
// Process fields
for (final field in mixinMirror.declarations.values.whereType<mirrors.VariableMirror>()) {
fields.add(await generateField(field, mixinElement, package, libraryUri, sourceUri, mixinName, null, null));
}
// Process methods
for (final method in mixinMirror.declarations.values.whereType<mirrors.MethodMirror>()) {
if (!method.isConstructor && !method.isAbstract) {
methods.add(await generateMethod(method, mixinElement, package, libraryUri, sourceUri, mixinName, null));
}
}
reflectedMixin = reflectedMixin.copyWith(fields: fields, methods: methods);
_typeCache[runtimeType] = reflectedMixin;
return reflectedMixin;
}