in working/macros/example/run.dart [34:131]
void main() async {
_log('Preparing to run macros.');
// You must run from the `macros` directory, paths are relative to that.
var thisFile = File('example/data_class.dart');
if (!thisFile.existsSync()) {
print('This script must be ran from the `macros` directory.');
exit(1);
}
var executor = await isolatedExecutor.start();
var tmpDir = Directory.systemTemp.createTempSync('data_class_macro_example');
try {
var macroUri = thisFile.absolute.uri;
var macroName = 'DataClass';
var bootstrapContent = bootstrapMacroIsolate({
macroUri.toString(): {
macroName: [''],
}
});
var bootstrapFile = File(tmpDir.uri.resolve('main.dart').toFilePath())
..writeAsStringSync(bootstrapContent);
var kernelOutputFile =
File(tmpDir.uri.resolve('main.dart.dill').toFilePath());
_log('Compiling DataClass macro');
var buildSnapshotResult = await Process.run(Platform.resolvedExecutable, [
'--snapshot=${kernelOutputFile.uri.toFilePath()}',
'--snapshot-kind=kernel',
'--packages=${(await Isolate.packageConfig)!}',
bootstrapFile.uri.toFilePath(),
]);
if (buildSnapshotResult.exitCode != 0) {
print('Failed to build macro boostrap isolate:\n'
'stdout: ${buildSnapshotResult.stdout}\n'
'stderr: ${buildSnapshotResult.stderr}');
exit(1);
}
_log('Loading DataClass macro');
var clazzId = await executor.loadMacro(macroUri, macroName,
precompiledKernelUri: kernelOutputFile.uri);
var instanceId =
await executor.instantiateMacro(clazzId, '', Arguments([], {}));
_log('Running DataClass macro 100 times...');
var results = <MacroExecutionResult>[];
for (var i = 1; i < 101; i++) {
var _shouldLog = i == 1 || i == 10 || i == 100;
if (_shouldLog) _log('Running DataClass macro for the ${i}th time');
if (instanceId.shouldExecute(DeclarationKind.clazz, Phase.types)) {
if (_shouldLog) _log('Running types phase');
var result = await executor.executeTypesPhase(instanceId, myClass);
if (i == 1) results.add(result);
}
if (instanceId.shouldExecute(DeclarationKind.clazz, Phase.declarations)) {
if (_shouldLog) _log('Running declarations phase');
var result = await executor.executeDeclarationsPhase(
instanceId, myClass, FakeTypeResolver(), FakeClassIntrospector());
if (i == 1) results.add(result);
}
if (instanceId.shouldExecute(DeclarationKind.clazz, Phase.definitions)) {
if (_shouldLog) _log('Running definitions phase');
var result = await executor.executeDefinitionsPhase(
instanceId,
myClass,
FakeTypeResolver(),
FakeClassIntrospector(),
FakeTypeDeclarationResolver());
if (i == 1) results.add(result);
}
if (_shouldLog) _log('Done running DataClass macro for the ${i}th time.');
}
_log('Building augmentation library');
var library = executor.buildAugmentationLibrary(results, (identifier) {
if (identifier == boolIdentifier ||
identifier == objectIdentifier ||
identifier == stringIdentifier ||
identifier == intIdentifier) {
return Uri(scheme: 'dart', path: 'core');
} else {
return File('example/data_class.dart').absolute.uri;
}
});
executor.close();
_log('Formatting augmentation library');
var formatted = DartFormatter()
.format(library
// comment out the `augment` keywords temporarily
.replaceAll('augment', '/*augment*/'))
.replaceAll('/*augment*/', 'augment');
_log('Macro augmentation library:\n\n$formatted');
} finally {
tmpDir.deleteSync(recursive: true);
}
}