parent
ca844afe5a
commit
67f255adca
|
|
@ -5,7 +5,6 @@ using System;
|
||||||
using System.ComponentModel.Composition;
|
using System.ComponentModel.Composition;
|
||||||
using Microsoft.AspNetCore.Razor.Language;
|
using Microsoft.AspNetCore.Razor.Language;
|
||||||
using Microsoft.CodeAnalysis;
|
using Microsoft.CodeAnalysis;
|
||||||
using Microsoft.CodeAnalysis.Razor;
|
|
||||||
|
|
||||||
namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,11 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Razor.Language;
|
using Microsoft.AspNetCore.Razor.Language;
|
||||||
|
using Microsoft.CodeAnalysis;
|
||||||
|
|
||||||
namespace Microsoft.CodeAnalysis.Razor
|
namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
{
|
{
|
||||||
public abstract class RazorCodeDocumentProvider
|
internal abstract class RazorCodeDocumentProvider
|
||||||
{
|
{
|
||||||
public abstract bool TryGetFromDocument(TextDocument document, out RazorCodeDocument codeDocument);
|
public abstract bool TryGetFromDocument(TextDocument document, out RazorCodeDocument codeDocument);
|
||||||
}
|
}
|
||||||
|
|
@ -6,6 +6,7 @@ using System.Collections.Generic;
|
||||||
using System.Collections.Immutable;
|
using System.Collections.Immutable;
|
||||||
using System.ComponentModel.Composition;
|
using System.ComponentModel.Composition;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Razor.Language;
|
using Microsoft.AspNetCore.Razor.Language;
|
||||||
|
|
@ -33,10 +34,10 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
CSharpCodeParser.RemoveTagHelperDirectiveDescriptor,
|
CSharpCodeParser.RemoveTagHelperDirectiveDescriptor,
|
||||||
CSharpCodeParser.TagHelperPrefixDirectiveDescriptor,
|
CSharpCodeParser.TagHelperPrefixDirectiveDescriptor,
|
||||||
};
|
};
|
||||||
private readonly RazorCodeDocumentProvider _codeDocumentProvider;
|
private readonly Lazy<RazorCodeDocumentProvider> _codeDocumentProvider;
|
||||||
|
|
||||||
[ImportingConstructor]
|
[ImportingConstructor]
|
||||||
public RazorDirectiveCompletionProvider(RazorCodeDocumentProvider codeDocumentProvider)
|
public RazorDirectiveCompletionProvider([Import(typeof(RazorCodeDocumentProvider))] Lazy<RazorCodeDocumentProvider> codeDocumentProvider)
|
||||||
{
|
{
|
||||||
if (codeDocumentProvider == null)
|
if (codeDocumentProvider == null)
|
||||||
{
|
{
|
||||||
|
|
@ -82,7 +83,17 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_codeDocumentProvider.TryGetFromDocument(context.Document, out var codeDocument))
|
var result = AddCompletionItems(context);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We do not want this inlined because the work done in this method requires Razor.Workspaces and Razor.Language assemblies.
|
||||||
|
// If those two assemblies were to load you'd have them load in every C# editor completion scenario.
|
||||||
|
[MethodImpl(MethodImplOptions.NoInlining)]
|
||||||
|
private Task AddCompletionItems(CompletionContext context)
|
||||||
|
{
|
||||||
|
if (!_codeDocumentProvider.Value.TryGetFromDocument(context.Document, out var codeDocument))
|
||||||
{
|
{
|
||||||
// A Razor code document has not yet been associated with the document.
|
// A Razor code document has not yet been associated with the document.
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// 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.Collections.Generic;
|
||||||
using System.Collections.Immutable;
|
using System.Collections.Immutable;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
@ -12,7 +13,6 @@ using Microsoft.AspNetCore.Razor.Language.Legacy;
|
||||||
using Microsoft.CodeAnalysis;
|
using Microsoft.CodeAnalysis;
|
||||||
using Microsoft.CodeAnalysis.Completion;
|
using Microsoft.CodeAnalysis.Completion;
|
||||||
using Microsoft.CodeAnalysis.Options;
|
using Microsoft.CodeAnalysis.Options;
|
||||||
using Microsoft.CodeAnalysis.Razor;
|
|
||||||
using Microsoft.CodeAnalysis.Text;
|
using Microsoft.CodeAnalysis.Text;
|
||||||
using Microsoft.VisualStudio.Text;
|
using Microsoft.VisualStudio.Text;
|
||||||
using Moq;
|
using Moq;
|
||||||
|
|
@ -41,7 +41,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
[RazorDirectiveCompletionProvider.DescriptionKey] = expectedDescription,
|
[RazorDirectiveCompletionProvider.DescriptionKey] = expectedDescription,
|
||||||
}).ToImmutableDictionary());
|
}).ToImmutableDictionary());
|
||||||
var codeDocumentProvider = new Mock<RazorCodeDocumentProvider>();
|
var codeDocumentProvider = new Mock<RazorCodeDocumentProvider>();
|
||||||
var completionProvider = new RazorDirectiveCompletionProvider(codeDocumentProvider.Object);
|
var completionProvider = new RazorDirectiveCompletionProvider(new Lazy<RazorCodeDocumentProvider>(() => codeDocumentProvider.Object));
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var description = await completionProvider.GetDescriptionAsync(document, item, CancellationToken.None);
|
var description = await completionProvider.GetDescriptionAsync(document, item, CancellationToken.None);
|
||||||
|
|
@ -60,7 +60,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
var document = CreateDocument();
|
var document = CreateDocument();
|
||||||
var item = CompletionItem.Create("TestDirective");
|
var item = CompletionItem.Create("TestDirective");
|
||||||
var codeDocumentProvider = new Mock<RazorCodeDocumentProvider>();
|
var codeDocumentProvider = new Mock<RazorCodeDocumentProvider>();
|
||||||
var completionProvider = new RazorDirectiveCompletionProvider(codeDocumentProvider.Object);
|
var completionProvider = new RazorDirectiveCompletionProvider(new Lazy<RazorCodeDocumentProvider>(() => codeDocumentProvider.Object));
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var description = await completionProvider.GetDescriptionAsync(document, item, CancellationToken.None);
|
var description = await completionProvider.GetDescriptionAsync(document, item, CancellationToken.None);
|
||||||
|
|
@ -75,7 +75,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var codeDocumentProvider = new Mock<RazorCodeDocumentProvider>(MockBehavior.Strict);
|
var codeDocumentProvider = new Mock<RazorCodeDocumentProvider>(MockBehavior.Strict);
|
||||||
var completionProvider = new FailOnGetCompletionsProvider(codeDocumentProvider.Object);
|
var completionProvider = new FailOnGetCompletionsProvider(new Lazy<RazorCodeDocumentProvider>(() => codeDocumentProvider.Object));
|
||||||
var document = CreateDocument();
|
var document = CreateDocument();
|
||||||
document = document.WithFilePath("NotRazor.cs");
|
document = document.WithFilePath("NotRazor.cs");
|
||||||
var context = CreateContext(1, completionProvider, document);
|
var context = CreateContext(1, completionProvider, document);
|
||||||
|
|
@ -92,7 +92,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
var codeDocumentProvider = new Mock<RazorCodeDocumentProvider>();
|
var codeDocumentProvider = new Mock<RazorCodeDocumentProvider>();
|
||||||
codeDocumentProvider.Setup(provider => provider.TryGetFromDocument(It.IsAny<TextDocument>(), out codeDocument))
|
codeDocumentProvider.Setup(provider => provider.TryGetFromDocument(It.IsAny<TextDocument>(), out codeDocument))
|
||||||
.Returns(false);
|
.Returns(false);
|
||||||
var completionProvider = new FailOnGetCompletionsProvider(codeDocumentProvider.Object);
|
var completionProvider = new FailOnGetCompletionsProvider(new Lazy<RazorCodeDocumentProvider>(() => codeDocumentProvider.Object));
|
||||||
var document = CreateDocument();
|
var document = CreateDocument();
|
||||||
var context = CreateContext(1, completionProvider, document);
|
var context = CreateContext(1, completionProvider, document);
|
||||||
|
|
||||||
|
|
@ -162,7 +162,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
var codeDocument = TestRazorCodeDocument.CreateEmpty();
|
var codeDocument = TestRazorCodeDocument.CreateEmpty();
|
||||||
codeDocumentProvider.Setup(provider => provider.TryGetFromDocument(It.IsAny<TextDocument>(), out codeDocument))
|
codeDocumentProvider.Setup(provider => provider.TryGetFromDocument(It.IsAny<TextDocument>(), out codeDocument))
|
||||||
.Returns(true);
|
.Returns(true);
|
||||||
var completionProvider = new FailOnGetCompletionsProvider(codeDocumentProvider.Object);
|
var completionProvider = new FailOnGetCompletionsProvider(new Lazy<RazorCodeDocumentProvider>(() => codeDocumentProvider.Object));
|
||||||
var document = CreateDocument();
|
var document = CreateDocument();
|
||||||
var context = CreateContext(2, completionProvider, document);
|
var context = CreateContext(2, completionProvider, document);
|
||||||
|
|
||||||
|
|
@ -177,7 +177,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
var codeDocumentProvider = CreateCodeDocumentProvider("@", Enumerable.Empty<DirectiveDescriptor>());
|
var codeDocumentProvider = CreateCodeDocumentProvider("@", Enumerable.Empty<DirectiveDescriptor>());
|
||||||
var completionProvider = new RazorDirectiveCompletionProvider(codeDocumentProvider);
|
var completionProvider = new RazorDirectiveCompletionProvider(codeDocumentProvider);
|
||||||
var document = CreateDocument();
|
var document = CreateDocument();
|
||||||
codeDocumentProvider.TryGetFromDocument(document, out var codeDocument);
|
codeDocumentProvider.Value.TryGetFromDocument(document, out var codeDocument);
|
||||||
var syntaxTree = codeDocument.GetSyntaxTree();
|
var syntaxTree = codeDocument.GetSyntaxTree();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -198,7 +198,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
var codeDocumentProvider = CreateCodeDocumentProvider("@", new[] { SectionDirective.Directive });
|
var codeDocumentProvider = CreateCodeDocumentProvider("@", new[] { SectionDirective.Directive });
|
||||||
var completionProvider = new RazorDirectiveCompletionProvider(codeDocumentProvider);
|
var completionProvider = new RazorDirectiveCompletionProvider(codeDocumentProvider);
|
||||||
var document = CreateDocument();
|
var document = CreateDocument();
|
||||||
codeDocumentProvider.TryGetFromDocument(document, out var codeDocument);
|
codeDocumentProvider.Value.TryGetFromDocument(document, out var codeDocument);
|
||||||
var syntaxTree = codeDocument.GetSyntaxTree();
|
var syntaxTree = codeDocument.GetSyntaxTree();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -221,7 +221,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
var codeDocumentProvider = CreateCodeDocumentProvider("@", new[] { customDirective });
|
var codeDocumentProvider = CreateCodeDocumentProvider("@", new[] { customDirective });
|
||||||
var completionProvider = new RazorDirectiveCompletionProvider(codeDocumentProvider);
|
var completionProvider = new RazorDirectiveCompletionProvider(codeDocumentProvider);
|
||||||
var document = CreateDocument();
|
var document = CreateDocument();
|
||||||
codeDocumentProvider.TryGetFromDocument(document, out var codeDocument);
|
codeDocumentProvider.Value.TryGetFromDocument(document, out var codeDocument);
|
||||||
var syntaxTree = codeDocument.GetSyntaxTree();
|
var syntaxTree = codeDocument.GetSyntaxTree();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -249,7 +249,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
Assert.Equal(CompletionTags.Intrinsic, tag);
|
Assert.Equal(CompletionTags.Intrinsic, tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static RazorCodeDocumentProvider CreateCodeDocumentProvider(string text, IEnumerable<DirectiveDescriptor> directives)
|
private static Lazy<RazorCodeDocumentProvider> CreateCodeDocumentProvider(string text, IEnumerable<DirectiveDescriptor> directives)
|
||||||
{
|
{
|
||||||
var codeDocumentProvider = new Mock<RazorCodeDocumentProvider>();
|
var codeDocumentProvider = new Mock<RazorCodeDocumentProvider>();
|
||||||
var codeDocument = TestRazorCodeDocument.CreateEmpty();
|
var codeDocument = TestRazorCodeDocument.CreateEmpty();
|
||||||
|
|
@ -266,7 +266,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
codeDocumentProvider.Setup(provider => provider.TryGetFromDocument(It.IsAny<TextDocument>(), out codeDocument))
|
codeDocumentProvider.Setup(provider => provider.TryGetFromDocument(It.IsAny<TextDocument>(), out codeDocument))
|
||||||
.Returns(true);
|
.Returns(true);
|
||||||
|
|
||||||
return codeDocumentProvider.Object;
|
return new Lazy<RazorCodeDocumentProvider>(() => codeDocumentProvider.Object);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static CompletionContext CreateContext(int position, RazorDirectiveCompletionProvider completionProvider, Document document)
|
private static CompletionContext CreateContext(int position, RazorDirectiveCompletionProvider completionProvider, Document document)
|
||||||
|
|
@ -301,7 +301,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
|
||||||
{
|
{
|
||||||
private readonly bool _canGetSnapshotPoint;
|
private readonly bool _canGetSnapshotPoint;
|
||||||
|
|
||||||
public FailOnGetCompletionsProvider(RazorCodeDocumentProvider codeDocumentProvider, bool canGetSnapshotPoint = true)
|
public FailOnGetCompletionsProvider(Lazy<RazorCodeDocumentProvider> codeDocumentProvider, bool canGetSnapshotPoint = true)
|
||||||
: base(codeDocumentProvider)
|
: base(codeDocumentProvider)
|
||||||
{
|
{
|
||||||
_canGetSnapshotPoint = canGetSnapshotPoint;
|
_canGetSnapshotPoint = canGetSnapshotPoint;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue