| // Copyright (c) 2016, 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:kernel/ast.dart' show Library, Location, Source; |
| |
| import '../codes/cfe_codes.dart'; |
| import '../source/source_loader.dart'; |
| import 'compiler_context.dart' show CompilerContext; |
| |
| export '../codes/cfe_codes.dart'; |
| |
| Location? getLocation(CompilerContext context, Uri uri, int charOffset) { |
| return context.uriToSource[uri]?.getLocation(uri, charOffset); |
| } |
| |
| String? getSourceLine(CompilerContext context, Location? location, |
| [Map<Uri, Source>? uriToSource]) { |
| if (location == null) return null; |
| uriToSource ??= context.uriToSource; |
| return uriToSource[location.file]?.getTextLine(location.line); |
| } |
| |
| // Coverage-ignore(suite): Not run. |
| String? getSourceLineFromMap(Location location, Map<Uri, Source> uriToSource) { |
| return uriToSource[location.file]?.getTextLine(location.line); |
| } |
| |
| abstract interface class ProblemReporting { |
| /// Add a problem with a severity determined by the severity of the message. |
| /// |
| /// If [fileUri] is null, it defaults to `this.fileUri`. |
| /// |
| /// See `Loader.addMessage` for an explanation of the |
| /// arguments passed to this method. |
| void addProblem(Message message, int charOffset, int length, Uri? fileUri, |
| {bool wasHandled = false, |
| List<LocatedMessage>? context, |
| Severity? severity, |
| bool problemOnLibrary = false}); |
| } |
| |
| /// [ProblemReporting] that registers the messages on a [Library] node. |
| class LibraryProblemReporting implements ProblemReporting { |
| final SourceLoader _loader; |
| final Uri _fileUri; |
| |
| LibraryProblemReporting(this._loader, this._fileUri); |
| |
| /// Problems in this [Library] encoded as json objects. |
| /// |
| /// Note that this field can be null, and by convention should be null if the |
| /// list is empty. |
| List<String>? _problemsAsJson; |
| |
| Library? _library; |
| |
| @override |
| void addProblem(Message message, int charOffset, int length, Uri? fileUri, |
| {bool wasHandled = false, |
| List<LocatedMessage>? context, |
| Severity? severity, |
| bool problemOnLibrary = false}) { |
| // Coverage-ignore(suite): Not run. |
| fileUri ??= _fileUri; |
| |
| FormattedMessage? formattedMessage = _loader.addProblem( |
| message, charOffset, length, fileUri, |
| wasHandled: wasHandled, |
| context: context, |
| severity: severity, |
| problemOnLibrary: true); |
| if (formattedMessage != null) { |
| (_problemsAsJson ??= (_library?.problemsAsJson ??= []) ?? []) |
| .add(formattedMessage.toJsonString()); |
| } |
| } |
| |
| void registerLibrary(Library library) { |
| assert(_library == null, "Library has already been registered for $this."); |
| _library = library; |
| if (_problemsAsJson != null) { |
| (library.problemsAsJson ??= []).addAll(_problemsAsJson!); |
| } |
| _problemsAsJson = library.problemsAsJson; |
| } |
| |
| @override |
| String toString() => '$runtimeType(fileUri=$_fileUri)'; |
| } |