示例#1
0
            public SnapshotSourceText(ITextBufferCloneService textBufferCloneServiceOpt, ITextImage textImage, Encoding encodingOpt, TextBufferContainer containerOpt)
            {
                Contract.ThrowIfNull(textImage);

                _textBufferCloneServiceOpt = textBufferCloneServiceOpt;
                this.TextImage             = textImage;
                _encodingOpt  = encodingOpt;
                _containerOpt = containerOpt;
            }
示例#2
0
 public EditorTextFactoryService(
     ITextBufferCloneService textBufferCloneService,
     ITextBufferFactoryService textBufferFactoryService,
     IContentTypeRegistryService contentTypeRegistryService)
 {
     _textBufferCloneService = textBufferCloneService;
     _textBufferFactory      = textBufferFactoryService;
     _unknownContentType     = contentTypeRegistryService.UnknownContentType;
 }
示例#3
0
            private SnapshotSourceText(ITextBufferCloneService textBufferCloneServiceOpt, ITextSnapshot editorSnapshot, TextBufferContainer container)
            {
                Contract.ThrowIfNull(editorSnapshot);

                _textBufferCloneServiceOpt = textBufferCloneServiceOpt;
                this.TextImage             = RecordReverseMapAndGetImage(editorSnapshot);
                _encodingOpt  = editorSnapshot.TextBuffer.GetEncodingOrUTF8();
                _containerOpt = container;
            }
示例#4
0
            /// <summary>
            /// This only exist to break circular dependency on creating buffer. nobody except extension itself should use it
            /// </summary>
            internal static SourceText From(ITextBufferCloneService textBufferCloneServiceOpt, ITextSnapshot editorSnapshot, TextBufferContainer container)
            {
                if (editorSnapshot == null)
                {
                    throw new ArgumentNullException(nameof(editorSnapshot));
                }

                Contract.ThrowIfFalse(editorSnapshot.TextBuffer == container.GetTextBuffer());
                return(s_textSnapshotMap.GetValue(editorSnapshot, s => new SnapshotSourceText(textBufferCloneServiceOpt, s, container)));
            }
示例#5
0
 internal static SourceText AsRoslynText(
     this ITextSnapshot textSnapshot,
     ITextBufferCloneService textBufferCloneServiceOpt,
     Encoding?encoding
     ) =>
 new SnapshotSourceText.ClosedSnapshotSourceText(
     textBufferCloneServiceOpt,
     ((ITextSnapshot2)textSnapshot).TextImage,
     encoding
     );
示例#6
0
 public VisualStudioWorkspaceImpl(ExportProvider exportProvider)
     : base(
         MefV1HostServices.Create(exportProvider),
         backgroundWork: WorkspaceBackgroundWork.ParseAndCompile)
 {
     _textBufferCloneService   = exportProvider.GetExportedValue <ITextBufferCloneService>();
     _textBufferFactoryService = exportProvider.GetExportedValue <ITextBufferFactoryService>();
     _textBufferFactoryService.TextBufferCreated += AddTextBufferCloneServiceToBuffer;
     exportProvider.GetExportedValue <PrimaryWorkspace>().Register(this);
 }
            private IEnumerable <InlineRenameReplacement> GetMergedReplacementInfos(
                IEnumerable <InlineRenameReplacement> relevantReplacements,
                Document preMergeDocument,
                Document postMergeDocument,
                CancellationToken cancellationToken)
            {
                AssertIsForeground();

                var textDiffService = preMergeDocument.Project.Solution.Workspace.Services.GetService <IDocumentTextDifferencingService>();
                var contentType     = preMergeDocument.Project.LanguageServices.GetService <IContentTypeLanguageService>().GetDefaultContentType();

                // TODO: Track all spans at once

                ITextBufferCloneService textBufferCloneService = null;
                SnapshotSpan?           snapshotSpanToClone    = null;
                string preMergeDocumentTextString = null;

                var preMergeDocumentText = preMergeDocument.GetTextAsync(cancellationToken).WaitAndGetResult(cancellationToken);
                var snapshot             = preMergeDocumentText.FindCorrespondingEditorTextSnapshot();

                if (snapshot != null)
                {
                    textBufferCloneService = preMergeDocument.Project.Solution.Workspace.Services.GetService <ITextBufferCloneService>();
                    if (textBufferCloneService != null)
                    {
                        snapshotSpanToClone = snapshot.GetFullSpan();
                    }
                }

                if (snapshotSpanToClone == null)
                {
                    preMergeDocumentTextString = preMergeDocument.GetTextAsync(cancellationToken).WaitAndGetResult(cancellationToken).ToString();
                }

                foreach (var replacement in relevantReplacements)
                {
                    var buffer       = snapshotSpanToClone.HasValue ? textBufferCloneService.CloneWithUnknownContentType(snapshotSpanToClone.Value) : _textBufferFactoryService.CreateTextBuffer(preMergeDocumentTextString, contentType);
                    var trackingSpan = buffer.CurrentSnapshot.CreateTrackingSpan(replacement.NewSpan.ToSpan(), SpanTrackingMode.EdgeExclusive, TrackingFidelityMode.Forward);

                    using (var edit = _subjectBuffer.CreateEdit(EditOptions.None, null, s_calculateMergedSpansEditTag))
                    {
                        foreach (var change in textDiffService.GetTextChangesAsync(preMergeDocument, postMergeDocument, cancellationToken).WaitAndGetResult(cancellationToken))
                        {
                            buffer.Replace(change.Span.ToSpan(), change.NewText);
                        }

                        edit.ApplyAndLogExceptions();
                    }

                    yield return(new InlineRenameReplacement(replacement.Kind, replacement.OriginalSpan, trackingSpan.GetSpan(buffer.CurrentSnapshot).Span.ToTextSpan()));
                }
            }
示例#8
0
            public static SourceText From(ITextBufferCloneService textBufferCloneServiceOpt, ITextSnapshot editorSnapshot)
            {
                if (editorSnapshot == null)
                {
                    throw new ArgumentNullException(nameof(editorSnapshot));
                }

                if (!s_textSnapshotMap.TryGetValue(editorSnapshot, out var snapshot))
                {
                    // Avoid capturing `textBufferCloneServiceOpt` on the fast path
                    var tempTextBufferCloneServiceOpt = textBufferCloneServiceOpt;
                    snapshot = s_textSnapshotMap.GetValue(editorSnapshot, s => new SnapshotSourceText(tempTextBufferCloneServiceOpt, s));
                }

                return(snapshot);
            }
            public static SourceText From(ITextBufferCloneService textBufferCloneServiceOpt, ITextSnapshot editorSnapshot)
            {
                if (editorSnapshot == null)
                {
                    throw new ArgumentNullException(nameof(editorSnapshot));
                }

                if (!s_textSnapshotMap.TryGetValue(editorSnapshot, out var snapshot))
                {
                    // Explicitly obtain the TextBufferContainer before calling GetValue to avoid reentrancy in
                    // ConditionalWeakTable. https://github.com/dotnet/roslyn/issues/28256
                    var container = TextBufferContainer.From(editorSnapshot.TextBuffer);

                    // Avoid capturing `textBufferCloneServiceOpt` on the fast path
                    var tempTextBufferCloneServiceOpt = textBufferCloneServiceOpt;
                    snapshot = s_textSnapshotMap.GetValue(editorSnapshot, s => new SnapshotSourceText(tempTextBufferCloneServiceOpt, s, container));
                }

                return(snapshot);
            }
示例#10
0
 private SnapshotSourceText(ITextBufferCloneService textBufferCloneServiceOpt, ITextSnapshot editorSnapshot) :
     this(textBufferCloneServiceOpt, editorSnapshot, TextBufferContainer.From(editorSnapshot.TextBuffer))
 {
 }
示例#11
0
 public ChangedSourceText(ITextBufferCloneService textBufferCloneServiceOpt, SnapshotSourceText baseText, ITextImage baseSnapshot, ITextImage currentSnapshot)
     : base(textBufferCloneServiceOpt, currentSnapshot, baseText.Encoding, containerOpt: null)
 {
     _baseText     = baseText;
     _baseSnapshot = baseSnapshot;
 }
示例#12
0
 public ClosedSnapshotSourceText(ITextBufferCloneService textBufferCloneServiceOpt, ITextImage textImage, Encoding encodingOpt)
     : base(textBufferCloneServiceOpt, textImage, encodingOpt, containerOpt: null)
 {
 }
 public TextBufferCloneServiceFactory(
     ITextBufferFactoryService textBufferFactoryService,
     IContentTypeRegistryService contentTypeRegistry)
 {
     _singleton = new TextBufferCloneService((ITextBufferFactoryService3)textBufferFactoryService, contentTypeRegistry.UnknownContentType);
 }
示例#14
0
 public TextBufferCloneServiceFactory(ITextBufferCloneService textBufferCloneService)
 {
     _singleton = textBufferCloneService;
 }
 public TextBufferCloneServiceFactory(
     ITextBufferFactoryService textBufferFactoryService,
     IContentTypeRegistryService contentTypeRegistry)
 {
     _singleton = new TextBufferCloneService((ITextBufferFactoryService2)textBufferFactoryService, contentTypeRegistry.UnknownContentType);
 }