blob: a05c39cf90c7858b09dcef23ac1b760092512129 [file] [log] [blame]
// 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:analyzer/src/generated/source.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.contextRoot.root;
if (context.isWithin(root, path) &&
context.isWithin(root, containingPath)) {
String relativePath =
context.relative(path, from: context.dirname(containingPath));
if (context.isRelative(relativePath)) {
return new Uri.file(relativePath);
}
}
}
Source source = provider.getFile(path).createSource();
return driver.sourceFactory.restoreUri(source);
}
@override
String uriToPath(Uri uri) => driver.sourceFactory.forUri2(uri)?.fullName;
}