blob: 809db1fdff4249dc2866efeb41d5fb9ad73041a9 [file] [log] [blame]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/src/services/correction/organize_imports.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/error/error.dart';
import 'package:analyzer/error/listener.dart';
import 'package:analyzer/source/line_info.dart';
import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/dart/analysis/results.dart';
import 'package:analyzer/src/dart/scanner/reader.dart';
import 'package:analyzer/src/dart/scanner/scanner.dart';
import 'package:analyzer/src/generated/parser.dart' as p;
import 'package:analyzer/src/string_source.dart';
import 'package:dart_style/dart_style.dart';
/// Return a formatted string if successful, throws a [FormatterException] if
/// unable to format. Takes a string as input.
String format(String content) {
var code = SourceCode(content);
var formatter = DartFormatter();
SourceCode formattedResult;
formattedResult = formatter.formatSource(code);
return formattedResult.text;
}
/// Returns a [ParseStringResult]. If successful, the result contains the sorted
/// code. On failure, the result contains the unsorted original code, and the
/// cause of the failure, a list of [AnalysisError]'s.
ParseStringResult sortDirectives(String contents, {String? fileName}) {
var (unit, errors) = _parse(contents, fullName: fileName);
var hasParseErrors = errors.any((error) =>
error.errorCode is ScannerErrorCode ||
error.errorCode is ParserErrorCode);
if (hasParseErrors) {
return ParseStringResultImpl(contents, unit, errors);
}
var sorter = ImportOrganizer(contents, unit, errors);
sorter.organize();
return ParseStringResultImpl(sorter.code, unit, errors);
}
(CompilationUnit, List<AnalysisError>) _parse(String contents,
{String? fullName}) {
var source = StringSource(contents, fullName);
var errorListener = RecordingErrorListener();
var reader = CharSequenceReader(contents);
var featureSet = FeatureSet.fromEnableFlags2(
sdkLanguageVersion: ExperimentStatus.currentVersion,
flags: [],
);
var scanner = Scanner(source, reader, errorListener)
..configureFeatures(
featureSetForOverriding: FeatureSet.latestLanguageVersion(),
featureSet: featureSet,
);
var token = scanner.tokenize(reportScannerErrors: false);
var lineInfo = LineInfo(scanner.lineStarts);
var parser = p.Parser(
source,
errorListener,
featureSet: scanner.featureSet,
lineInfo: lineInfo,
);
var unit = parser.parseCompilationUnit(token);
return (unit, errorListener.errors);
}