generateTopLevelField method

Future<FieldDeclaration> generateTopLevelField(
  1. VariableMirror fieldMirror,
  2. Package package,
  3. String libraryUri,
  4. Uri sourceUri,
)

Generate top-level field with analyzer support

Implementation

Future<FieldDeclaration> generateTopLevelField(
  mirrors.VariableMirror fieldMirror,
  Package package,
  String libraryUri,
  Uri sourceUri,
) async {
  final fieldName = mirrors.MirrorSystem.getName(fieldMirror.simpleName);
  final libraryElement = await _getLibraryElement(Uri.parse(libraryUri));

  // Get top-level variable element
  TopLevelVariableElement? variableElement;
  if (libraryElement != null) {
    variableElement = libraryElement.topLevelVariables.firstWhereOrNull((v) => v.name == fieldName);
  }

  final dartType = variableElement?.type;
  final mirrorType = fieldMirror.type;
  Type runtimeType = mirrorType.hasReflectedType ? mirrorType.reflectedType : mirrorType.runtimeType;

  // Extract annotations and resolve type
  if(GenericTypeParser.shouldCheckGeneric(runtimeType)) {
    final annotations = await _extractAnnotations(mirrorType.metadata, package);
    final resolvedType = await _resolveTypeFromGenericAnnotation(annotations, fieldName);
    if (resolvedType != null) {
      runtimeType = resolvedType;
    }
  }

  final sourceCode = await _readSourceCode(sourceUri);

  return StandardFieldDeclaration(
    name: fieldName,
    type: runtimeType,
    element: variableElement,
    dartType: dartType,
    libraryDeclaration: _libraryCache[libraryUri]!,
    parentClass: null,
    linkDeclaration: await _getLinkDeclaration(fieldMirror.type, package, libraryUri, dartType),
    annotations: await _extractAnnotations(fieldMirror.metadata, package),
    sourceLocation: sourceUri,
    isFinal: fieldMirror.isFinal,
    isConst: fieldMirror.isConst,
    isLate: false,
    isStatic: true,
    isAbstract: false,
    isPublic: !_isInternal(fieldName),
    isSynthetic: _isSynthetic(fieldName),
    isNullable: _isNullable(fieldName: fieldName, sourceCode: sourceCode)
  );
}