Change code document provider to work in old Razor.

- Prior to this the old code document provider would utilize the editor factory service which would incorrectly create a parser for older Razor documents. This was wrong on many levels.
- Updated tests to react to new expectations.
This commit is contained in:
N. Taylor Mullen 2017-11-20 01:55:49 -08:00
parent 4f7aab7720
commit 4af7a47aac
2 changed files with 18 additions and 26 deletions

View File

@ -12,19 +12,6 @@ namespace Microsoft.VisualStudio.Editor.Razor
[Export(typeof(TextBufferCodeDocumentProvider))] [Export(typeof(TextBufferCodeDocumentProvider))]
internal class DefaultTextBufferCodeDocumentProvider : TextBufferCodeDocumentProvider internal class DefaultTextBufferCodeDocumentProvider : TextBufferCodeDocumentProvider
{ {
private readonly RazorEditorFactoryService _editorFactoryService;
[ImportingConstructor]
public DefaultTextBufferCodeDocumentProvider(RazorEditorFactoryService editorFactoryService)
{
if (editorFactoryService == null)
{
throw new ArgumentNullException(nameof(editorFactoryService));
}
_editorFactoryService = editorFactoryService;
}
public override bool TryGetFromBuffer(ITextBuffer textBuffer, out RazorCodeDocument codeDocument) public override bool TryGetFromBuffer(ITextBuffer textBuffer, out RazorCodeDocument codeDocument)
{ {
if (textBuffer == null) if (textBuffer == null)
@ -32,7 +19,7 @@ namespace Microsoft.VisualStudio.Editor.Razor
throw new ArgumentNullException(nameof(textBuffer)); throw new ArgumentNullException(nameof(textBuffer));
} }
if (_editorFactoryService.TryGetParser(textBuffer, out var parser) && parser.CodeDocument != null) if (textBuffer.Properties.TryGetProperty(typeof(VisualStudioRazorParser), out VisualStudioRazorParser parser) && parser.CodeDocument != null)
{ {
codeDocument = parser.CodeDocument; codeDocument = parser.CodeDocument;
return true; return true;

View File

@ -3,6 +3,7 @@
using Microsoft.AspNetCore.Razor.Language; using Microsoft.AspNetCore.Razor.Language;
using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Utilities;
using Moq; using Moq;
using Xunit; using Xunit;
@ -11,14 +12,17 @@ namespace Microsoft.VisualStudio.Editor.Razor
public class DefaultTextBufferCodeDocumentProviderTest public class DefaultTextBufferCodeDocumentProviderTest
{ {
[Fact] [Fact]
public void TryGetFromBuffer_SucceedsIfParserFromProviderHasCodeDocument() public void TryGetFromBuffer_SucceedsIfParserHasCodeDocument()
{ {
// Arrange // Arrange
var expectedCodeDocument = TestRazorCodeDocument.Create("Hello World"); var expectedCodeDocument = TestRazorCodeDocument.Create("Hello World");
VisualStudioRazorParser parser = new DefaultVisualStudioRazorParser(expectedCodeDocument); VisualStudioRazorParser parser = new DefaultVisualStudioRazorParser(expectedCodeDocument);
var parserProvider = Mock.Of<RazorEditorFactoryService>(p => p.TryGetParser(It.IsAny<ITextBuffer>(), out parser) == true); var properties = new PropertyCollection()
var textBuffer = Mock.Of<ITextBuffer>(); {
var provider = new DefaultTextBufferCodeDocumentProvider(parserProvider); [typeof(VisualStudioRazorParser)] = parser
};
var textBuffer = Mock.Of<ITextBuffer>(buffer => buffer.Properties == properties);
var provider = new DefaultTextBufferCodeDocumentProvider();
// Act // Act
var result = provider.TryGetFromBuffer(textBuffer, out var codeDocument); var result = provider.TryGetFromBuffer(textBuffer, out var codeDocument);
@ -29,13 +33,16 @@ namespace Microsoft.VisualStudio.Editor.Razor
} }
[Fact] [Fact]
public void TryGetFromBuffer_FailsIfParserFromProviderMissingCodeDocument() public void TryGetFromBuffer_FailsIfParserMissingCodeDocument()
{ {
// Arrange // Arrange
VisualStudioRazorParser parser = new DefaultVisualStudioRazorParser(codeDocument: null); VisualStudioRazorParser parser = new DefaultVisualStudioRazorParser(codeDocument: null);
var parserProvider = Mock.Of<RazorEditorFactoryService>(p => p.TryGetParser(It.IsAny<ITextBuffer>(), out parser) == true); var properties = new PropertyCollection()
var textBuffer = Mock.Of<ITextBuffer>(); {
var provider = new DefaultTextBufferCodeDocumentProvider(parserProvider); [typeof(VisualStudioRazorParser)] = parser
};
var textBuffer = Mock.Of<ITextBuffer>(buffer => buffer.Properties == properties);
var provider = new DefaultTextBufferCodeDocumentProvider();
// Act // Act
var result = provider.TryGetFromBuffer(textBuffer, out var codeDocument); var result = provider.TryGetFromBuffer(textBuffer, out var codeDocument);
@ -49,10 +56,8 @@ namespace Microsoft.VisualStudio.Editor.Razor
public void TryGetFromBuffer_FailsIfNoParserIsAvailable() public void TryGetFromBuffer_FailsIfNoParserIsAvailable()
{ {
// Arrange // Arrange
VisualStudioRazorParser parser = null; var textBuffer = Mock.Of<ITextBuffer>(buffer => buffer.Properties == new PropertyCollection());
var parserProvider = Mock.Of<RazorEditorFactoryService>(p => p.TryGetParser(It.IsAny<ITextBuffer>(), out parser) == false); var provider = new DefaultTextBufferCodeDocumentProvider();
var textBuffer = Mock.Of<ITextBuffer>();
var provider = new DefaultTextBufferCodeDocumentProvider(parserProvider);
// Act // Act
var result = provider.TryGetFromBuffer(textBuffer, out var codeDocument); var result = provider.TryGetFromBuffer(textBuffer, out var codeDocument);