提交 32fc4734 编写于 作者: M Manish Vasani

Merge pull request #480 from mavasani/issue320test

Fix #251: Preview Changes dialog always shows additional files as empty
......@@ -56,6 +56,10 @@ public void Dispose()
}
var document = snapshotSpans.First(vt => vt.SnapshotSpan.Snapshot == position.Snapshot).Document;
if (document == null)
{
return SpecializedTasks.EmptyEnumerable<ITagSpan<AbstractNavigatableReferenceHighlightingTag>>();
}
return ProduceTagsAsync(snapshotSpans, position, workspace, document, cancellationToken);
}
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Threading;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.SolutionCrawler;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.Editor.Shared.Preview
......@@ -51,6 +48,12 @@ public override bool CanApplyChange(ApplyChangesKind feature)
public override void OpenDocument(DocumentId documentId, bool activate = true)
{
if (this.CurrentSolution.ContainsAdditionalDocument(documentId))
{
OpenAdditionalDocument(documentId, activate);
return;
}
var document = this.CurrentSolution.GetDocument(documentId);
var text = document.GetTextAsync(CancellationToken.None).WaitAndGetResult(CancellationToken.None);
......
......@@ -7,6 +7,7 @@
using Microsoft.CodeAnalysis.Editor.Tagging;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Tagging;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.Editor.Shared.Tagging
{
......@@ -36,6 +37,10 @@ public Task<IEnumerable<ITagSpan<TTag>>> ProduceTagsAsync(IEnumerable<DocumentSn
var snapshotSpan = snapshotSpans.Single().SnapshotSpan;
var document = snapshotSpans.Single().Document;
if (document == null)
{
return SpecializedTasks.EmptyEnumerable<ITagSpan<TTag>>();
}
return ProduceTagsAsync(document, snapshotSpan, GetCaretPosition(caretPosition, snapshotSpan), cancellationToken);
}
......
......@@ -30,7 +30,7 @@ internal class FileChange : AbstractChange
private readonly ITextBuffer _buffer;
private readonly Encoding _encoding;
private readonly IVsImageService2 _imageService;
public FileChange(TextDocument left,
TextDocument right,
IComponentModel componentModel,
......@@ -44,7 +44,7 @@ internal class FileChange : AbstractChange
_left = left;
_right = right;
_imageService = imageService;
_componentModel = componentModel;
var bufferFactory = componentModel.GetService<ITextBufferFactoryService>();
var bufferText = left != null ?
......@@ -204,6 +204,8 @@ public TextDocument GetUpdatedDocument()
return _right.WithText(UpdateBufferText());
}
public bool IsAdditionalDocumentChange => !((_left ?? _right) is Document);
internal override void GetDisplayData(VSTREEDISPLAYDATA[] pData)
{
var document = _right ?? _left;
......
......@@ -7,6 +7,7 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Editor;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.VisualStudio.ComponentModelHost;
using Microsoft.VisualStudio.Editor;
using Microsoft.VisualStudio.Shell.Interop;
......@@ -152,8 +153,8 @@ private void AppendFileChanges(IEnumerable<DocumentId> changedDocuments, ArrayBu
continue;
}
var left = _oldSolution.GetDocument(documentId) ?? _oldSolution.GetAdditionalDocument(documentId);
var right = _newSolution.GetDocument(documentId) ?? _newSolution.GetAdditionalDocument(documentId);
var left = _oldSolution.GetTextDocument(documentId);
var right = _newSolution.GetTextDocument(documentId);
var leftDocument = left as Document;
var rightDocument = right as Document;
......@@ -194,7 +195,7 @@ public int GetWarning(out string pbstrWarning, out int ppcwlWarningLevel)
public void UpdatePreview(DocumentId documentId, SpanChange spanSource)
{
var updatedSolution = _topLevelChange.GetUpdatedSolution(applyingChanges: false);
var document = updatedSolution.GetDocument(documentId);
var document = updatedSolution.GetTextDocument(documentId);
if (document != null)
{
_updater.UpdateView(document, spanSource);
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Editor.Shared.Preview;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.Preview
......@@ -24,9 +21,28 @@ public void UnregisterTextContainer(SourceTextContainer container)
{
}
public void CloseDocument(DocumentId id, SourceText text)
public void CloseDocument(TextDocument document, SourceText text)
{
OnDocumentClosed(id, new PreviewTextLoader(text));
if (document is Document)
{
OnDocumentClosed(document.Id, new PreviewTextLoader(text));
}
else
{
OnAdditionalDocumentClosed(document.Id, new PreviewTextLoader(text));
}
}
public void OpenDocument(TextDocument document)
{
if (document is Document)
{
OpenDocument(document.Id);
}
else
{
OpenAdditionalDocument(document.Id);
}
}
protected override void ApplyDocumentTextChanged(DocumentId id, SourceText text)
......@@ -34,6 +50,11 @@ protected override void ApplyDocumentTextChanged(DocumentId id, SourceText text)
OnDocumentTextChanged(id, text, PreservationMode.PreserveIdentity);
}
protected override void ApplyAdditionalDocumentTextChanged(DocumentId id, SourceText text)
{
OnAdditionalDocumentTextChanged(id, text, PreservationMode.PreserveIdentity);
}
private class PreviewTextLoader : TextLoader
{
private readonly SourceText _text;
......
......@@ -3,13 +3,10 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Editor;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
using Microsoft.CodeAnalysis.Text.Shared.Extensions;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Utilities;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.Preview
{
......@@ -35,13 +32,13 @@ public void CloseWorkspace()
}
}
public void UpdateView(Document document, SpanChange spanSource)
public void UpdateView(TextDocument document, SpanChange spanSource)
{
var documentText = document.GetTextAsync().Result.ToString();
if (TextView.TextBuffer.CurrentSnapshot.GetText() != documentText)
{
SourceTextContainer container;
Document documentBackedByTextBuffer;
TextDocument documentBackedByTextBuffer;
UpdateBuffer(document, spanSource, out container, out documentBackedByTextBuffer);
}
......@@ -52,15 +49,17 @@ public void UpdateView(Document document, SpanChange spanSource)
Tagger.OnTextBufferChanged();
}
private void UpdateBuffer(Document document, SpanChange spanSource, out SourceTextContainer container, out Document documentBackedByTextBuffer)
private void UpdateBuffer(TextDocument document, SpanChange spanSource, out SourceTextContainer container, out TextDocument documentBackedByTextBuffer)
{
if (_previewWorkspace != null)
{
_previewWorkspace.CloseDocument(_currentDocument, _previewWorkspace.CurrentSolution.GetDocument(_currentDocument).GetTextAsync().Result);
var currentDocument = _previewWorkspace.CurrentSolution.GetTextDocument(_currentDocument);
var currentDocumentText = currentDocument.GetTextAsync().Result;
_previewWorkspace.CloseDocument(currentDocument, currentDocumentText);
// Put the new document into the current preview solution
var updatedSolution = _previewWorkspace.CurrentSolution.WithDocumentText(document.Id, document.GetTextAsync().Result);
var updatedDocument = updatedSolution.GetDocument(document.Id);
// Put the new document into the current preview solution.
var updatedSolution = _previewWorkspace.CurrentSolution.WithTextDocumentText(document.Id, document.GetTextAsync().Result);
var updatedDocument = updatedSolution.GetTextDocument(document.Id);
ApplyDocumentToBuffer(updatedDocument, spanSource, out container, out documentBackedByTextBuffer);
......@@ -73,13 +72,12 @@ private void UpdateBuffer(Document document, SpanChange spanSource, out SourceTe
_currentDocument = document.Id;
ApplyDocumentToBuffer(document, spanSource, out container, out documentBackedByTextBuffer);
_previewWorkspace = new PreviewDialogWorkspace(documentBackedByTextBuffer.Project.Solution);
_previewWorkspace.OpenDocument(document.Id);
}
}
private void ApplyDocumentToBuffer(Document document, SpanChange spanSource, out SourceTextContainer container, out Document documentBackedByTextBuffer)
private void ApplyDocumentToBuffer(TextDocument document, SpanChange spanSource, out SourceTextContainer container, out TextDocument documentBackedByTextBuffer)
{
var contentTypeService = document.Project.LanguageServices.GetService<IContentTypeLanguageService>();
var contentType = contentTypeService.GetDefaultContentType();
......
......@@ -78,6 +78,7 @@ private Solution ApplyFileChanges(Solution solution, IEnumerable<FileChange> fil
{
var oldDocument = fileChange.GetOldDocument();
var updatedDocument = fileChange.GetUpdatedDocument();
bool isAdditionalDoc = fileChange.IsAdditionalDocumentChange;
if (oldDocument == null)
{
......@@ -85,7 +86,9 @@ private Solution ApplyFileChanges(Solution solution, IEnumerable<FileChange> fil
// If unchecked, then remove this added document from new solution.
if (applyingChanges && fileChange.CheckState == __PREVIEWCHANGESITEMCHECKSTATE.PCCS_Unchecked)
{
solution = solution.RemoveDocument(updatedDocument.Id);
solution = isAdditionalDoc ?
solution.RemoveAdditionalDocument(updatedDocument.Id) :
solution.RemoveDocument(updatedDocument.Id);
}
}
else if (updatedDocument == null)
......@@ -95,13 +98,17 @@ private Solution ApplyFileChanges(Solution solution, IEnumerable<FileChange> fil
if (applyingChanges && fileChange.CheckState == __PREVIEWCHANGESITEMCHECKSTATE.PCCS_Unchecked)
{
var oldText = oldDocument.GetTextAsync().Result.ToString();
solution = solution.AddDocument(oldDocument.Id, oldDocument.Name, oldText, oldDocument.Folders, oldDocument.FilePath);
solution = isAdditionalDoc ?
solution.AddAdditionalDocument(oldDocument.Id, oldDocument.Name, oldText, oldDocument.Folders, oldDocument.FilePath) :
solution.AddDocument(oldDocument.Id, oldDocument.Name, oldText, oldDocument.Folders, oldDocument.FilePath);
}
}
else
{
// Changed document.
solution = solution.WithDocumentText(updatedDocument.Id, updatedDocument.GetTextAsync().Result);
solution = isAdditionalDoc ?
solution.WithAdditionalDocumentText(updatedDocument.Id, updatedDocument.GetTextAsync().Result) :
solution.WithDocumentText(updatedDocument.Id, updatedDocument.GetTextAsync().Result);
}
}
......
......@@ -43,5 +43,23 @@ public static IEnumerable<DocumentId> GetChangedDocuments(this Solution newSolut
}
}
}
public static TextDocument GetTextDocument(this Solution solution, DocumentId documentId)
{
return solution.GetDocument(documentId) ?? solution.GetAdditionalDocument(documentId);
}
public static Solution WithTextDocumentText(this Solution solution, DocumentId documentId, SourceText text, PreservationMode mode = PreservationMode.PreserveIdentity)
{
var document = solution.GetTextDocument(documentId);
if (document is Document)
{
return solution.WithDocumentText(documentId, text, mode);
}
else
{
return solution.WithAdditionalDocumentText(documentId, text, mode);
}
}
}
}
......@@ -27,7 +27,7 @@ public static TextDocument WithText(this TextDocument textDocument, SourceText t
public static TextDocument WithAdditionalDocumentText(this TextDocument textDocument, SourceText text)
{
Contract.ThrowIfTrue(textDocument is Document);
return textDocument.Project.Solution.WithAdditionalDocumentText(textDocument.Id, text, PreservationMode.PreserveIdentity).GetDocument(textDocument.Id);
return textDocument.Project.Solution.WithAdditionalDocumentText(textDocument.Id, text, PreservationMode.PreserveIdentity).GetTextDocument(textDocument.Id);
}
}
}
......@@ -36,7 +36,7 @@ public static Document GetOpenDocumentInCurrentContextWithChanges(this SourceTex
if (Workspace.TryGetWorkspace(text.Container, out workspace))
{
var id = workspace.GetDocumentIdInCurrentContext(text.Container);
if (id == null)
if (id == null || !workspace.CurrentSolution.ContainsDocument(id))
{
return null;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册