| Index: observatory_pub_packages/analyzer/file_system/file_system.dart
|
| ===================================================================
|
| --- observatory_pub_packages/analyzer/file_system/file_system.dart (revision 0)
|
| +++ observatory_pub_packages/analyzer/file_system/file_system.dart (working copy)
|
| @@ -0,0 +1,148 @@
|
| +// Copyright (c) 2014, 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.
|
| +
|
| +library file_system;
|
| +
|
| +import 'dart:async';
|
| +
|
| +import 'package:analyzer/src/generated/source.dart';
|
| +import 'package:path/path.dart';
|
| +import 'package:watcher/watcher.dart';
|
| +
|
| +
|
| +/**
|
| + * [File]s are leaf [Resource]s which contain data.
|
| + */
|
| +abstract class File extends Resource {
|
| + /**
|
| + * Create a new [Source] instance that serves this file.
|
| + */
|
| + Source createSource([Uri uri]);
|
| +}
|
| +
|
| +
|
| +/**
|
| + * [Folder]s are [Resource]s which may contain files and/or other folders.
|
| + */
|
| +abstract class Folder extends Resource {
|
| + /**
|
| + * Watch for changes to the files inside this folder (and in any nested
|
| + * folders, including folders reachable via links).
|
| + */
|
| + Stream<WatchEvent> get changes;
|
| +
|
| + /**
|
| + * If the path [path] is a relative path, convert it to an absolute path
|
| + * by interpreting it relative to this folder. If it is already an aboslute
|
| + * path, then don't change it.
|
| + *
|
| + * However, regardless of whether [path] is relative or absolute, normalize
|
| + * it by removing path components of the form '.' or '..'.
|
| + */
|
| + String canonicalizePath(String path);
|
| +
|
| + /**
|
| + * Return `true` if absolute [path] references a resource in this folder.
|
| + */
|
| + bool contains(String path);
|
| +
|
| + /**
|
| + * Return an existing child [Resource] with the given [relPath].
|
| + * Return a not existing [File] if no such child exist.
|
| + */
|
| + Resource getChild(String relPath);
|
| +
|
| + /**
|
| + * Return a list of existing direct children [Resource]s (folders and files)
|
| + * in this folder, in no particular order.
|
| + */
|
| + List<Resource> getChildren();
|
| +}
|
| +
|
| +
|
| +/**
|
| + * The abstract class [Resource] is an abstraction of file or folder.
|
| + */
|
| +abstract class Resource {
|
| + /**
|
| + * Return `true` if this resource exists.
|
| + */
|
| + bool get exists;
|
| +
|
| + /**
|
| + * Return the [Folder] that contains this resource, or `null` if this resource
|
| + * is a root folder.
|
| + */
|
| + Folder get parent;
|
| +
|
| + /**
|
| + * Return the full path to this resource.
|
| + */
|
| + String get path;
|
| +
|
| + /**
|
| + * Return a short version of the name that can be displayed to the user to
|
| + * denote this resource.
|
| + */
|
| + String get shortName;
|
| +
|
| + /**
|
| + * Return `true` if absolute [path] references this resource or a resource in
|
| + * this folder.
|
| + */
|
| + bool isOrContains(String path);
|
| +}
|
| +
|
| +
|
| +/**
|
| + * Instances of the class [ResourceProvider] convert [String] paths into
|
| + * [Resource]s.
|
| + */
|
| +abstract class ResourceProvider {
|
| + /**
|
| + * Get the path context used by this resource provider.
|
| + */
|
| + Context get pathContext;
|
| +
|
| + /**
|
| + * Return the [Resource] that corresponds to the given [path].
|
| + */
|
| + Resource getResource(String path);
|
| +}
|
| +
|
| +
|
| +/**
|
| + * A [UriResolver] for [Resource]s.
|
| + */
|
| +class ResourceUriResolver extends UriResolver {
|
| + /**
|
| + * The name of the `file` scheme.
|
| + */
|
| + static String _FILE_SCHEME = "file";
|
| +
|
| + final ResourceProvider _provider;
|
| +
|
| + ResourceUriResolver(this._provider);
|
| +
|
| + @override
|
| + Source resolveAbsolute(Uri uri) {
|
| + if (!_isFileUri(uri)) {
|
| + return null;
|
| + }
|
| + Resource resource = _provider.getResource(_provider.pathContext.fromUri(uri)
|
| + );
|
| + if (resource is File) {
|
| + return resource.createSource(uri);
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * Return `true` if the given URI is a `file` URI.
|
| + *
|
| + * @param uri the URI being tested
|
| + * @return `true` if the given URI is a `file` URI
|
| + */
|
| + static bool _isFileUri(Uri uri) => uri.scheme == _FILE_SCHEME;
|
| +}
|
|
|