generateMixin method

Future<MixinDeclaration> generateMixin(
  1. ClassMirror mixinMirror,
  2. Package package,
  3. String libraryUri,
  4. 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;
}