diff --git a/src/Compilers/Core/Portable/PublicAPI.txt b/src/Compilers/Core/Portable/PublicAPI.txt index 77f4bedeb005f9904eb5deeb01a8f1897463bb27..191bd69faa2a7f3c8fd680ed6a85f16414133984 100644 --- a/src/Compilers/Core/Portable/PublicAPI.txt +++ b/src/Compilers/Core/Portable/PublicAPI.txt @@ -1327,6 +1327,7 @@ Microsoft.CodeAnalysis.Text.SourceText Microsoft.CodeAnalysis.Text.SourceText.ChecksumAlgorithm.get Microsoft.CodeAnalysis.Text.SourceText.ContentEquals(Microsoft.CodeAnalysis.Text.SourceText other) Microsoft.CodeAnalysis.Text.SourceText.GetSubText(int start) +Microsoft.CodeAnalysis.Text.SourceText.Lines.get Microsoft.CodeAnalysis.Text.SourceText.Replace(Microsoft.CodeAnalysis.Text.TextSpan span, string newText) Microsoft.CodeAnalysis.Text.SourceText.Replace(int start, int length, string newText) Microsoft.CodeAnalysis.Text.SourceText.SourceText(System.Collections.Immutable.ImmutableArray checksum = default(System.Collections.Immutable.ImmutableArray), Microsoft.CodeAnalysis.Text.SourceHashAlgorithm checksumAlgorithm = Microsoft.CodeAnalysis.Text.SourceHashAlgorithm.Sha1, Microsoft.CodeAnalysis.Text.SourceTextContainer container = null) @@ -2106,9 +2107,9 @@ virtual Microsoft.CodeAnalysis.SyntaxWalker.VisitTrivia(Microsoft.CodeAnalysis.S virtual Microsoft.CodeAnalysis.Text.SourceText.Container.get virtual Microsoft.CodeAnalysis.Text.SourceText.ContentEqualsImpl(Microsoft.CodeAnalysis.Text.SourceText other) virtual Microsoft.CodeAnalysis.Text.SourceText.GetChangeRanges(Microsoft.CodeAnalysis.Text.SourceText oldText) +virtual Microsoft.CodeAnalysis.Text.SourceText.GetLinesCore() virtual Microsoft.CodeAnalysis.Text.SourceText.GetSubText(Microsoft.CodeAnalysis.Text.TextSpan span) virtual Microsoft.CodeAnalysis.Text.SourceText.GetTextChanges(Microsoft.CodeAnalysis.Text.SourceText oldText) -virtual Microsoft.CodeAnalysis.Text.SourceText.Lines.get virtual Microsoft.CodeAnalysis.Text.SourceText.ToString(Microsoft.CodeAnalysis.Text.TextSpan span) virtual Microsoft.CodeAnalysis.Text.SourceText.WithChanges(System.Collections.Generic.IEnumerable changes) virtual Microsoft.CodeAnalysis.Text.SourceText.Write(System.IO.TextWriter writer, Microsoft.CodeAnalysis.Text.TextSpan span, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) diff --git a/src/Compilers/Core/Portable/Text/SourceText.cs b/src/Compilers/Core/Portable/Text/SourceText.cs index f244b73862a2be5df2f2e08d5c804c194b43c829..1e7f4638467b135e0b11c085064e370f0e6b875f 100644 --- a/src/Compilers/Core/Portable/Text/SourceText.cs +++ b/src/Compilers/Core/Portable/Text/SourceText.cs @@ -25,7 +25,7 @@ public abstract class SourceText private readonly SourceHashAlgorithm _checksumAlgorithm; private SourceTextContainer _lazyContainer; - private LineInfo _lazyLineInfo; + private TextLineCollection _lazyLineInfo; private ImmutableArray _lazyChecksum; protected SourceText(ImmutableArray checksum = default(ImmutableArray), SourceHashAlgorithm checksumAlgorithm = SourceHashAlgorithm.Sha1, SourceTextContainer container = null) @@ -479,20 +479,20 @@ public virtual IReadOnlyList GetTextChanges(SourceText oldText) /// /// The collection of individual text lines. /// - public virtual TextLineCollection Lines + public TextLineCollection Lines { get { - if (_lazyLineInfo == null) - { - var info = new LineInfo(this, this.ParseLineStarts()); - Interlocked.CompareExchange(ref _lazyLineInfo, info, null); - } - - return _lazyLineInfo; + var info = _lazyLineInfo; + return info ?? Interlocked.CompareExchange(ref _lazyLineInfo, info = GetLinesCore(), null) ?? info; } } + protected virtual TextLineCollection GetLinesCore() + { + return new LineInfo(this, ParseLineStarts()); + } + private class LineInfo : TextLineCollection { private readonly SourceText _text;