void main()

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);
  }
}