runAnalyzer method

Future<String> runAnalyzer(
  1. String packageDir,
  2. String dir,
  3. bool usesFlutter, {
  4. required InspectOptions inspectOptions,
})

Implementation

Future<String> runAnalyzer(
  String packageDir,
  String dir,
  bool usesFlutter, {
  required InspectOptions inspectOptions,
}) async {
  final command =
      usesFlutter ? _flutterSdk.dartAnalyzeCmd : _dartSdk.dartAnalyzeCmd;

  final analysisOptionsFile =
      File(p.join(packageDir, 'analysis_options.yaml'));
  String? originalOptions;
  if (await analysisOptionsFile.exists()) {
    originalOptions = await analysisOptionsFile.readAsString();
  }
  final rawOptionsContent = await getDefaultAnalysisOptionsYaml();
  final customOptionsContent = updatePassthroughOptions(
      original: originalOptions, custom: rawOptionsContent);
  try {
    await analysisOptionsFile.writeAsString(customOptionsContent);
    final proc = await runConstrained(
      [...command, '--format', 'machine', dir],
      environment:
          usesFlutter ? _flutterSdk.environment : _dartSdk.environment,
      workingDirectory: packageDir,
      timeout: const Duration(minutes: 5),
    );
    if (proc.wasOutputExceeded) {
      throw ToolException(
          'Running `dart analyze` produced too large output.', proc);
    }
    final output = proc.asJoinedOutput;
    if (proc.wasTimeout) {
      throw ToolException('Running `dart analyze` timed out.', proc);
    }
    if ('\n$output'.contains('\nUnhandled exception:\n')) {
      if (output.contains('No dart files found at: .')) {
        log.warning('`dart analyze` found no files to analyze.');
      } else {
        log.severe('Bad input?: $output');
      }
      var errorMessage =
          '\n$output'.split('\nUnhandled exception:\n')[1].split('\n').first;
      throw ToolException('dart analyze exception: $errorMessage', proc);
    }
    return output;
  } finally {
    if (originalOptions == null) {
      await analysisOptionsFile.delete();
    } else {
      await analysisOptionsFile.writeAsString(originalOptions);
    }
  }
}