parseString function

ParseStringResult parseString({
  1. required String content,
  2. FeatureSet? featureSet,
  3. String? path,
  4. bool throwIfDiagnostics = true,
})

Returns the result of parsing the given content as a compilation unit.

If a featureSet is provided, it will be the default set of features that will be assumed by the parser.

If a path is provided, it will be used as the name of the file when reporting errors.

If throwIfDiagnostics is true (the default), then if any diagnostics are produced because of syntactic errors in the content an ArgumentError will be thrown. This behavior is not intended as a way for the client to find out about errors--it is intended to avoid causing problems for naive clients that might not be thinking about the possibility of parse errors (and might therefore make assumptions about the returned AST that don't hold in the presence of parse errors). Clients interested in details about parse errors should pass false and check result.errors to determine what parse errors, if any, have occurred.

Implementation

ParseStringResult parseString(
    {required String content,
    FeatureSet? featureSet,
    String? path,
    bool throwIfDiagnostics = true}) {
  featureSet ??= FeatureSet.latestLanguageVersion();
  var source = StringSource(content, path ?? '');
  var reader = CharSequenceReader(content);
  var errorCollector = RecordingErrorListener();
  var scanner = Scanner(source, reader, errorCollector)
    ..configureFeatures(
      featureSetForOverriding: featureSet,
      featureSet: featureSet,
    );
  var token = scanner.tokenize();
  var languageVersion = LibraryLanguageVersion(
      package: ExperimentStatus.currentVersion,
      override: scanner.overrideVersion);
  var lineInfo = LineInfo(scanner.lineStarts);
  var parser = Parser(
    source,
    errorCollector,
    featureSet: scanner.featureSet,
    languageVersion: languageVersion,
    lineInfo: lineInfo,
  );
  var unit = parser.parseCompilationUnit(token);
  ParseStringResult result =
      ParseStringResultImpl(content, unit, errorCollector.errors);
  if (throwIfDiagnostics && result.errors.isNotEmpty) {
    var buffer = StringBuffer();
    for (var error in result.errors) {
      var location = lineInfo.getLocation(error.offset);
      buffer.writeln('  ${error.errorCode.name}: ${error.message} - '
          '${location.lineNumber}:${location.columnNumber}');
    }
    throw ArgumentError('Content produced diagnostics when parsed:\n$buffer');
  }
  return result;
}