generateTopLevelField method
Future<FieldDeclaration>
generateTopLevelField(
- VariableMirror fieldMirror,
- Package package,
- String libraryUri,
- 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)
);
}