// Copyright (c) 2013, 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/engine.dart' show TimestampedData;
import 'package:analyzer/src/generated/source.dart';

/// An implementation of [Source] that's based on an in-memory Dart string.
class StringSource extends Source {
  /// The content of the source.
  final String _contents;

  @override
  final String fullName;

  @override
  final Uri uri;

  @override
  final int modificationStamp;

  StringSource(this._contents, String fullName, {Uri uri})
      : fullName = fullName,
        uri = uri ?? (fullName == null ? null : Uri.file(fullName)),
        modificationStamp = DateTime.now().millisecondsSinceEpoch;

  @override
  TimestampedData<String> get contents =>
      TimestampedData(modificationStamp, _contents);

  @override
  String get encoding => uri.toString();

  @override
  int get hashCode => _contents.hashCode ^ fullName.hashCode;

  @override
  bool get isInSystemLibrary => false;

  @override
  String get shortName => fullName;

  @override
  UriKind get uriKind => UriKind.FILE_URI;

  /// Return `true` if the given [object] is a string source that is equal to
  /// this source.
  @override
  bool operator ==(Object object) {
    return object is StringSource &&
        object._contents == _contents &&
        object.fullName == fullName;
  }

  @override
  bool exists() => true;

  @override
  String toString() => 'StringSource ($fullName)';
}
