extractFromSources function

DartProject extractFromSources(
  1. Map<String, String> sources, {
  2. FieldRename globalRename = FieldRename.none,
})

Extracts models from in-memory sources keyed by relative path.

Implementation

DartProject extractFromSources(
  Map<String, String> sources, {
  FieldRename globalRename = FieldRename.none,
}) {
  final units = <String, (CompilationUnit, LineInfo)>{};
  for (final e in sources.entries) {
    final result = parseString(
      content: e.value,
      path: e.key,
      throwIfDiagnostics: false,
    );
    units[e.key] = (result.unit, result.lineInfo);
  }

  // Pass 1: enums and the names of every class with a fromJson.
  final enums = <String, DartEnum>{};
  final modelNames = <String>{};
  for (final e in units.entries) {
    final (unit, lines) = e.value;
    for (final decl in unit.declarations) {
      if (decl is EnumDeclaration) {
        final en = _extractEnum(decl, e.key, lines);
        enums[en.name] = en;
      } else if (decl is ClassDeclaration && _isJsonClass(decl)) {
        modelNames.add(decl.namePart.typeName.lexeme);
      }
    }
  }

  // Pass 2: models.
  final models = <String, DartModel>{};
  for (final e in units.entries) {
    final (unit, lines) = e.value;
    for (final decl in unit.declarations) {
      if (decl is! ClassDeclaration || !_isJsonClass(decl)) continue;
      final model = _extractModel(
        decl,
        file: e.key,
        lines: lines,
        globalRename: globalRename,
        modelNames: modelNames,
        enums: enums,
      );
      if (model != null) models[model.name] = model;
    }
  }
  return DartProject(models: models, enums: enums);
}