| // Copyright (c) 2018, 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:analyzer/dart/analysis/uri_converter.dart'; |
| import 'package:analyzer/file_system/file_system.dart'; |
| import 'package:analyzer/src/dart/analysis/driver.dart'; |
| import 'package:path/src/context.dart'; |
| |
| /// An implementation of a URI converter based on an analysis driver. |
| class DriverBasedUriConverter implements UriConverter { |
| /// The driver associated with the context in which the conversion will occur. |
| final AnalysisDriver driver; |
| |
| /// Initialize a newly created URI converter to use the given [driver] to = |
| /// perform the conversions. |
| DriverBasedUriConverter(this.driver); |
| |
| @override |
| Uri? pathToUri(String path, {String? containingPath}) { |
| ResourceProvider provider = driver.resourceProvider; |
| if (containingPath != null) { |
| Context context = provider.pathContext; |
| String root = driver.analysisContext!.contextRoot.root.path; |
| if (context.isWithin(root, path) && |
| context.isWithin(root, containingPath)) { |
| String relativePath = |
| context.relative(path, from: context.dirname(containingPath)); |
| if (context.isRelative(relativePath)) { |
| return Uri.file(relativePath); |
| } |
| } |
| } |
| return driver.sourceFactory.pathToUri(path); |
| } |
| |
| @override |
| String? uriToPath(Uri uri) => driver.sourceFactory.forUri2(uri)?.fullName; |
| } |