| File: Text\StringText.cs | Web Access |
| Project: src\roslyn\src\Compilers\Core\Portable\Microsoft.CodeAnalysis.csproj (Microsoft.CodeAnalysis) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System; using System.Collections.Immutable; using System.Diagnostics; using System.IO; using System.Text; using System.Threading; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.Text { /// <summary> /// Implementation of SourceText based on a <see cref="String"/> input /// </summary> internal sealed class StringText : SourceText { private readonly string _source; private readonly Encoding? _encodingOpt; internal StringText( string source, Encoding? encodingOpt, ImmutableArray<byte> checksum = default(ImmutableArray<byte>), SourceHashAlgorithm checksumAlgorithm = SourceHashAlgorithm.Sha1, ImmutableArray<byte> embeddedTextBlob = default(ImmutableArray<byte>)) : base(checksum, checksumAlgorithm, embeddedTextBlob) { RoslynDebug.Assert(source != null); _source = source; _encodingOpt = encodingOpt; } public override Encoding? Encoding => _encodingOpt; /// <summary> /// Underlying string which is the source of this <see cref="StringText"/>instance /// </summary> public string Source => _source; /// <summary> /// The length of the text represented by <see cref="StringText"/>. /// </summary> public override int Length => _source.Length; /// <summary> /// Returns a character at given position. /// </summary> /// <param name="position">The position to get the character from.</param> /// <returns>The character.</returns> /// <exception cref="ArgumentOutOfRangeException">When position is negative or /// greater than <see cref="Length"/>.</exception> public override char this[int position] { get { // NOTE: we are not validating position here as that would not // add any value to the range check that string accessor performs anyways. return _source[position]; } } /// <summary> /// Provides a string representation of the StringText located within given span. /// </summary> /// <exception cref="ArgumentOutOfRangeException">When given span is outside of the text range.</exception> public override string ToString(TextSpan span) { if (span.End > this.Source.Length) { throw new ArgumentOutOfRangeException(nameof(span)); } if (span.Start == 0 && span.Length == this.Length) { return this.Source; } return this.Source.Substring(span.Start, span.Length); } public override void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count) { this.Source.CopyTo(sourceIndex, destination, destinationIndex, count); } public override void Write(TextWriter textWriter, TextSpan span, CancellationToken cancellationToken = default(CancellationToken)) { if (span.Start == 0 && span.End == this.Length) { textWriter.Write(this.Source); } else { base.Write(textWriter, span, cancellationToken); } } } }