// Copyright (c) 2023, 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/src/generated/timestamped_data.dart'; /// The interface `Source` defines the behavior of objects representing source /// code that can be analyzed by the analysis engine. /// /// Implementations of this interface need to be aware of some assumptions made /// by the analysis engine concerning sources: /// /// * Sources are not required to be unique. That is, there can be multiple /// instances representing the same source. /// * Sources are long lived. That is, the engine is allowed to hold on to a /// source for an extended period of time and that source must continue to /// report accurate and up-to-date information. /// /// Because of these assumptions, most implementations will not maintain any /// state but will delegate to an authoritative system of record in order to /// implement this API. For example, a source that represents files on disk /// would typically query the file system to determine the state of the file. /// /// If the instances that implement this API are the system of record, then they /// will typically be unique. In that case, sources that are created that /// represent nonexistent files must also be retained so that if those files /// are created at a later date the long-lived sources representing those files /// will know that they now exist. abstract class Source { /// Get the contents and timestamp of this source. /// /// @return the contents and timestamp of the source /// @throws Exception if the contents of this source could not be accessed TimestampedData get contents; /// Return the full (long) version of the name that can be displayed to the /// user to denote this source. For example, for a source representing a file /// this would typically be the absolute path of the file. /// /// @return a name that can be displayed to the user to denote this source String get fullName; /// Return a hash code for this source. /// /// @return a hash code for this source /// See [Object.hashCode]. @override int get hashCode; /// Return a short version of the name that can be displayed to the user to /// denote this source. For example, for a source representing a file this /// would typically be the name of the file. /// /// @return a name that can be displayed to the user to denote this source String get shortName; /// Return the URI from which this source was originally derived. /// /// @return the URI from which this source was originally derived Uri get uri; /// Return `true` if the given object is a source that represents the same /// source code as this source. /// /// @param object the object to be compared with this object /// @return `true` if the given object is a source that represents the same /// source code as this source /// See [Object.==]. @override bool operator ==(Object other); /// Return `true` if this source exists. /// /// Clients should consider using the method `AnalysisSession.getFile` (and /// checking for an invalid result) because contexts can have local overrides /// of the content of a source that the source is not aware of and a source /// with local content is considered to exist even if there is no file on disk. bool exists(); }