blob: 6b65f248b75e12c3130cfbbbf871c5a77c30a25d [file] [log] [blame]
// Copyright (c) 2020, 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/plugin/edit/fix/fix_core.dart';
import 'package:analysis_server/src/services/correction/change_workspace.dart';
import 'package:analysis_server/src/services/correction/fix.dart';
import 'package:analysis_server/src/services/correction/fix/dart/top_level_declarations.dart';
import 'package:analysis_server/src/services/correction/fix_internal.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/error/error.dart';
import 'package:analyzer/instrumentation/service.dart';
import 'package:analyzer/source/line_info.dart';
import 'package:analyzer/src/dart/analysis/performance_logger.dart';
import 'package:analyzer/src/dart/micro/resolve_file.dart';
import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
class CiderErrorFixes {
final AnalysisError error;
/// The fixes for the [error], might be empty.
final List<Fix> fixes;
final LineInfo lineInfo;
CiderErrorFixes({
required this.error,
required this.fixes,
required this.lineInfo,
});
}
class CiderFixesComputer {
final PerformanceLog _logger;
final FileResolver _fileResolver;
CiderFixesComputer(this._logger, this._fileResolver);
/// Compute quick fixes for errors on the line with the [offset].
Future<List<CiderErrorFixes>> compute(String path, int lineNumber) async {
var result = <CiderErrorFixes>[];
var resolvedUnit = _fileResolver.resolve(path: path);
var lineInfo = resolvedUnit.lineInfo;
await _logger.runAsync('Compute fixes', () async {
for (var error in resolvedUnit.errors) {
var errorLine = lineInfo.getLocation(error.offset).lineNumber;
if (errorLine == lineNumber) {
var workspace = DartChangeWorkspace([resolvedUnit.session]);
var context = _CiderDartFixContextImpl(
_fileResolver,
workspace,
resolvedUnit,
error,
);
var fixes = await DartFixContributor().computeFixes(context);
fixes.sort(Fix.SORT_BY_RELEVANCE);
result.add(
CiderErrorFixes(error: error, fixes: fixes, lineInfo: lineInfo),
);
}
}
});
return result;
}
}
class _CiderDartFixContextImpl extends DartFixContextImpl {
final FileResolver _fileResolver;
_CiderDartFixContextImpl(
this._fileResolver,
ChangeWorkspace workspace,
ResolvedUnitResult resolvedUnit,
AnalysisError error,
) : super(InstrumentationService.NULL_SERVICE, workspace, resolvedUnit,
error);
@override
Future<Map<LibraryElement, Element>> getTopLevelDeclarations(
String name,
) async {
var result = <LibraryElement, Element>{};
var files = _fileResolver.getFilesWithTopLevelDeclarations(name);
for (var file in files) {
if (file.partOfLibrary == null) {
var libraryElement = _fileResolver.getLibraryByUri(
uriStr: file.uriStr,
);
TopLevelDeclarations.addElement(result, libraryElement, name);
}
}
return result;
}
@override
Stream<LibraryElement> librariesWithExtensions(String memberName) async* {}
}