blob: bfe84aa70abb48ed0fda4dc43b7e1d3c1c472437 [file] [log] [blame] [edit]
import 'dart:io';
import 'package:path/path.dart' as path;
import 'config.dart';
import 'generator/generator.dart';
import 'parser/_core/utils.dart';
import 'parser/parser.dart';
import 'transformer/transform.dart';
/// Used to generate the wrapper swift file.
Future<void> generateWrapper(Config config) async {
final Directory tempDir;
final bool deleteTempDirWhenDone;
if (config.tempDir == null) {
tempDir = Directory.systemTemp.createTempSync(defaultTempDirPrefix);
deleteTempDirWhenDone = true;
} else {
tempDir = Directory.fromUri(config.tempDir!);
deleteTempDirWhenDone = false;
}
final input = config.input;
final symbolgraphCommand = input.symbolgraphCommand;
if (symbolgraphCommand != null) {
await _generateSymbolgraphJson(
symbolgraphCommand,
tempDir,
);
}
final symbolgraphFileName = switch (input) {
FilesInputConfig() => '${input.generatedModuleName}$symbolgraphFileSuffix',
ModuleInputConfig() => '${input.module}$symbolgraphFileSuffix',
JsonFileInputConfig() => path.absolute(input.jsonFile.path),
};
final symbolgraphJsonPath = path.join(tempDir.path, symbolgraphFileName);
final symbolgraphJson = readJsonFile(symbolgraphJsonPath);
final sourceModule = switch (input) {
FilesInputConfig() => null,
ModuleInputConfig() => input.module,
JsonFileInputConfig() => parseModuleName(symbolgraphJson),
};
final declarations = parseAst(symbolgraphJson);
final transformedDeclarations =
transform(declarations, filter: config.include);
final wrapperCode = generate(
transformedDeclarations,
moduleName: sourceModule,
preamble: config.preamble,
);
File.fromUri(config.outputFile).writeAsStringSync(wrapperCode);
if (deleteTempDirWhenDone) {
tempDir.deleteSync(recursive: true);
}
}
Future<void> _generateSymbolgraphJson(
Command symbolgraphCommand,
Directory workingDirectory,
) async {
final result = await Process.run(
symbolgraphCommand.executable,
symbolgraphCommand.args,
workingDirectory: workingDirectory.path,
);
if (result.exitCode != 0) {
throw ProcessException(
symbolgraphCommand.executable,
symbolgraphCommand.args,
'Error generating symbol graph \n${result.stdout} \n${result.stderr}',
);
}
}