未验证 提交 ee7c923d 编写于 作者: G Gen Lu 提交者: GitHub

Merge pull request #35225 from genlu/FixRazorCompletion

Fix razor completion
......@@ -273,7 +273,7 @@ public void ChangeSignatureCommandDisabledInSubmission()
{
var exportProvider = ExportProviderCache
.GetOrCreateExportProviderFactory(
TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(typeof(InteractiveTextBufferSupportsFeatureService)))
TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(typeof(InteractiveSupportsFeatureService.InteractiveTextBufferSupportsFeatureService)))
.CreateExportProvider();
using (var workspace = TestWorkspace.Create(XElement.Parse(@"
......
......@@ -194,7 +194,7 @@ public void EncapsulateFieldCommandDisabledInSubmission()
{
var exportProvider = ExportProviderCache
.GetOrCreateExportProviderFactory(
TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(typeof(InteractiveTextBufferSupportsFeatureService)))
TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(typeof(InteractiveSupportsFeatureService.InteractiveTextBufferSupportsFeatureService)))
.CreateExportProvider();
using (var workspace = TestWorkspace.Create(XElement.Parse(@"
......
......@@ -1062,7 +1062,7 @@ class $$Test<T, U>
public void ExtractInterfaceCommandDisabledInSubmission()
{
var exportProvider = ExportProviderCache
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(typeof(InteractiveTextBufferSupportsFeatureService)))
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(typeof(InteractiveSupportsFeatureService.InteractiveTextBufferSupportsFeatureService)))
.CreateExportProvider();
using (var workspace = TestWorkspace.Create(XElement.Parse(@"
......
......@@ -10353,7 +10353,7 @@ public async Task ExtractMethod_Argument2()
public void ExtractMethodCommandDisabledInSubmission()
{
var exportProvider = ExportProviderCache
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(typeof(InteractiveTextBufferSupportsFeatureService)))
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(typeof(InteractiveSupportsFeatureService.InteractiveTextBufferSupportsFeatureService)))
.CreateExportProvider();
using (var workspace = TestWorkspace.Create(XElement.Parse(@"
......
......@@ -1077,7 +1077,7 @@ void B()
public void OrganizingCommandsDisabledInSubmission()
{
var exportProvider = ExportProviderCache
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(typeof(InteractiveTextBufferSupportsFeatureService)))
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(typeof(InteractiveSupportsFeatureService.InteractiveTextBufferSupportsFeatureService)))
.CreateExportProvider();
using (var workspace = TestWorkspace.Create(XElement.Parse(@"
......
// 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.Composition;
using Microsoft.CodeAnalysis.Editor.Shared;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.InteractiveWindow;
using Microsoft.CodeAnalysis.Shared;
namespace Microsoft.CodeAnalysis.Editor.Implementation.Interactive
{
internal sealed class InteractiveSupportsFeatureService
{
[ExportWorkspaceService(typeof(ITextBufferSupportsFeatureService), WorkspaceKind.Interactive), Shared]
internal class InteractiveTextBufferSupportsFeatureService : ITextBufferSupportsFeatureService
{
public bool SupportsCodeFixes(ITextBuffer textBuffer)
{
if (textBuffer != null)
{
var evaluator = (IInteractiveEvaluator)textBuffer.Properties[typeof(IInteractiveEvaluator)];
var window = evaluator?.CurrentWindow;
if (window?.CurrentLanguageBuffer == textBuffer)
{
// These are only correct if we're on the UI thread.
// Otherwise, they're guesses and they might change immediately even if they're correct.
// If we return true and the buffer later becomes readonly, it appears that the
// the code fix simply has no effect.
return !window.IsResetting && !window.IsRunning;
}
}
return false;
}
public bool SupportsRefactorings(ITextBuffer textBuffer)
{
return false;
}
public bool SupportsRename(ITextBuffer textBuffer)
{
return false;
}
public bool SupportsNavigationToAnyPosition(ITextBuffer textBuffer)
{
return true;
}
}
[ExportWorkspaceService(typeof(IDocumentSupportsFeatureService), WorkspaceKind.Interactive), Shared]
internal class InteractiveDocumentSupportsFeatureService : IDocumentSupportsFeatureService
{
public bool SupportsCodeFixes(Document document)
{
// TODO: Implement this.
return false;
}
public bool SupportsRefactorings(Document document)
{
return false;
}
public bool SupportsRename(Document document)
{
return false;
}
public bool SupportsNavigationToAnyPosition(Document document)
{
return true;
}
}
}
}
// 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.Composition;
using Microsoft.CodeAnalysis.Editor.Shared;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.Text;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.InteractiveWindow;
namespace Microsoft.CodeAnalysis.Editor.Implementation.Interactive
{
[ExportWorkspaceService(typeof(ITextBufferSupportsFeatureService), WorkspaceKind.Interactive), Shared]
internal sealed class InteractiveTextBufferSupportsFeatureService : ITextBufferSupportsFeatureService
{
public bool SupportsCodeFixes(ITextBuffer textBuffer)
{
if (textBuffer != null)
{
var evaluator = (IInteractiveEvaluator)textBuffer.Properties[typeof(IInteractiveEvaluator)];
var window = evaluator?.CurrentWindow;
if (window?.CurrentLanguageBuffer == textBuffer)
{
// These are only correct if we're on the UI thread.
// Otherwise, they're guesses and they might change immediately even if they're correct.
// If we return true and the buffer later becomes readonly, it appears that the
// the code fix simply has no effect.
return !window.IsResetting && !window.IsRunning;
}
}
return false;
}
public bool SupportsRefactorings(ITextBuffer textBuffer)
{
return false;
}
public bool SupportsRename(ITextBuffer textBuffer)
{
return false;
}
public bool SupportsNavigationToAnyPosition(ITextBuffer textBuffer)
{
return true;
}
}
}
// 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 Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Shared;
using Microsoft.VisualStudio.Text;
namespace Microsoft.CodeAnalysis.Editor.Shared
......
......@@ -51,7 +51,7 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.Rename
<Trait(Traits.Feature, Traits.Features.Interactive)>
Public Sub RenameCommandDisabledInSubmission()
Dim exportProvider = ExportProviderCache _
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(GetType(InteractiveTextBufferSupportsFeatureService))) _
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(GetType(InteractiveSupportsFeatureService.InteractiveTextBufferSupportsFeatureService))) _
.CreateExportProvider()
Using workspace = TestWorkspace.Create(
......
......@@ -96,7 +96,7 @@ End Module
<Trait(Traits.Feature, Traits.Features.Interactive)>
Public Sub TestChangeSignatureCommandDisabledInSubmission()
Dim exportProvider = ExportProviderCache _
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(GetType(InteractiveTextBufferSupportsFeatureService))) _
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(GetType(InteractiveSupportsFeatureService.InteractiveTextBufferSupportsFeatureService))) _
.CreateExportProvider()
Using workspace = TestWorkspace.Create(
......
......@@ -134,7 +134,7 @@ End Class
<Trait(Traits.Feature, Traits.Features.Interactive)>
Public Sub EncapsulateFieldCommandDisabledInSubmission()
Dim exportProvider = ExportProviderCache _
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(GetType(InteractiveTextBufferSupportsFeatureService))) _
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(GetType(InteractiveSupportsFeatureService.InteractiveTextBufferSupportsFeatureService))) _
.CreateExportProvider()
Using workspace = TestWorkspace.Create(
......
......@@ -1270,7 +1270,7 @@ End Namespace
<Trait(Traits.Feature, Traits.Features.Interactive)>
Public Sub TestExtractInterfaceCommandDisabledInSubmission()
Dim exportProvider = ExportProviderCache _
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(GetType(InteractiveTextBufferSupportsFeatureService))) _
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(GetType(InteractiveSupportsFeatureService.InteractiveTextBufferSupportsFeatureService))) _
.CreateExportProvider()
Using workspace = TestWorkspace.Create(
......
......@@ -3367,7 +3367,7 @@ End Namespace"
<Trait(Traits.Feature, Traits.Features.Interactive)>
Public Sub TestExtractMethodCommandDisabledInSubmission()
Dim exportProvider = ExportProviderCache _
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(GetType(InteractiveTextBufferSupportsFeatureService))) _
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(GetType(InteractiveSupportsFeatureService.InteractiveTextBufferSupportsFeatureService))) _
.CreateExportProvider()
Using workspace = TestWorkspace.Create(
......
......@@ -939,7 +939,7 @@ End Namespace</element>
<Trait(Traits.Feature, Traits.Features.Interactive)>
Public Sub TestOrganizingCommandsDisabledInSubmission()
Dim exportProvider = ExportProviderCache _
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(GetType(InteractiveTextBufferSupportsFeatureService))) _
.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(GetType(InteractiveSupportsFeatureService.InteractiveTextBufferSupportsFeatureService))) _
.CreateExportProvider()
Using workspace = TestWorkspace.Create(
......
......@@ -11,6 +11,7 @@
using Microsoft.CodeAnalysis.Editing;
using Microsoft.CodeAnalysis.FindSymbols;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.CodeAnalysis.RemoveUnnecessaryImports;
......@@ -588,6 +589,13 @@ private static async Task<ImmutableArray<ReferencedSymbol>> FindReferencesAsync(
string newNamespace,
CancellationToken cancellationToken)
{
// Can't apply change to certain document, simply return unchanged.
// e.g. Razor document (*.g.cs file, not *.cshtml)
if (!document.CanApplyChange())
{
return document;
}
// 1. Fully qualify all simple references (i.e. not via an alias) with new namespace.
// 2. Add using of new namespace (for each reference's container).
// 3. Try to simplify qualified names introduced from step(1).
......
......@@ -22,8 +22,8 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte
var textSpan = context.Span;
var cancellationToken = context.CancellationToken;
var workspace = document.Project.Solution.Workspace;
if (workspace.Kind == WorkspaceKind.MiscellaneousFiles || document.IsGeneratedCode(cancellationToken))
if (document.Project.Solution.Workspace.Kind == WorkspaceKind.MiscellaneousFiles ||
document.IsGeneratedCode(cancellationToken))
{
return;
}
......
......@@ -15,6 +15,7 @@
using Microsoft.CodeAnalysis.Internal.Log;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.PooledObjects;
using Microsoft.CodeAnalysis.Shared;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Shared.Extensions.ContextQuery;
using Microsoft.CodeAnalysis.Text;
......@@ -249,6 +250,13 @@ static bool ShouldCompleteWithFullyQualifyTypeName(Document document)
return true;
}
// Certain documents, e.g. Razor document, don't support adding imports
var documentSupportsFeatureService = workspace.Services.GetService<IDocumentSupportsFeatureService>();
if (!documentSupportsFeatureService.SupportsRefactorings(document))
{
return true;
}
return false;
}
}
......
......@@ -18,7 +18,7 @@ internal class MoveToNamespaceResult
public MoveToNamespaceResult(
Solution originalSolution,
Solution updatedSolution,
Solution updatedSolution,
DocumentId updatedDocumentId,
ImmutableDictionary<string, ISymbol> newNameOriginalSymbolMapping)
{
......
// 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.Composition;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Host.Mef;
namespace Microsoft.CodeAnalysis.Shared
{
internal interface IDocumentSupportsFeatureService : IWorkspaceService
{
bool SupportsCodeFixes(Document document);
bool SupportsRefactorings(Document document);
bool SupportsRename(Document document);
bool SupportsNavigationToAnyPosition(Document document);
}
[ExportWorkspaceService(typeof(IDocumentSupportsFeatureService), ServiceLayer.Default), Shared]
internal class DefaultDocumentSupportsFeatureService : IDocumentSupportsFeatureService
{
public bool SupportsCodeFixes(Document document)
=> true;
public bool SupportsNavigationToAnyPosition(Document document)
=> true;
public bool SupportsRefactorings(Document document)
=> true;
public bool SupportsRename(Document document)
=> true;
}
}
// 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.Immutable;
using System.Composition;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Editor.Shared;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.Shared;
using Microsoft.CodeAnalysis.Text;
using Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem;
using Microsoft.VisualStudio.LanguageServices.Implementation.Venus;
using Microsoft.VisualStudio.Text;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.SuggestionService
{
internal sealed class VisualStudioSupportsFeatureService
{
[ExportWorkspaceService(typeof(ITextBufferSupportsFeatureService), ServiceLayer.Host), Shared]
private class VisualStudioTextBufferSupportsFeatureService : ITextBufferSupportsFeatureService
{
public bool SupportsCodeFixes(ITextBuffer textBuffer)
{
return SupportsCodeFixesWorker(GetContainedDocumentId(textBuffer));
}
public bool SupportsRefactorings(ITextBuffer textBuffer)
{
return SupportsRefactoringsWorker(GetContainedDocumentId(textBuffer));
}
public bool SupportsRename(ITextBuffer textBuffer)
{
var sourceTextContainer = textBuffer.AsTextContainer();
if (Workspace.TryGetWorkspace(sourceTextContainer, out var workspace))
{
return SupportsRenameWorker(workspace.GetRelatedDocumentIds(sourceTextContainer).ToImmutableArray());
}
return false;
}
public bool SupportsNavigationToAnyPosition(ITextBuffer textBuffer)
{
return SupportsNavigationToAnyPositionWorker(GetContainedDocumentId(textBuffer));
}
private static DocumentId GetContainedDocumentId(ITextBuffer textBuffer)
{
var sourceTextContainer = textBuffer.AsTextContainer();
if (Workspace.TryGetWorkspace(sourceTextContainer, out var workspace)
&& workspace is VisualStudioWorkspaceImpl vsWorkspace)
{
return vsWorkspace.GetDocumentIdInCurrentContext(sourceTextContainer);
}
return null;
}
}
[ExportWorkspaceService(typeof(IDocumentSupportsFeatureService), ServiceLayer.Host), Shared]
private class VisualStudioDocumentSupportsFeatureService : IDocumentSupportsFeatureService
{
public bool SupportsCodeFixes(Document document)
{
return SupportsCodeFixesWorker(document.Id);
}
public bool SupportsRefactorings(Document document)
{
return SupportsRefactoringsWorker(document.Id);
}
public bool SupportsRename(Document document)
{
return SupportsRenameWorker(document.Project.Solution.GetRelatedDocumentIds(document.Id));
}
public bool SupportsNavigationToAnyPosition(Document document)
{
return SupportsNavigationToAnyPositionWorker(document.Id);
}
}
private static bool SupportsCodeFixesWorker(DocumentId id)
{
return ContainedDocument.TryGetContainedDocument(id) == null;
}
private static bool SupportsRefactoringsWorker(DocumentId id)
{
return ContainedDocument.TryGetContainedDocument(id) == null;
}
private static bool SupportsRenameWorker(ImmutableArray<DocumentId> ids)
{
return ids.Select(id => ContainedDocument.TryGetContainedDocument(id))
.All(cd => cd == null || cd.SupportsRename);
}
private static bool SupportsNavigationToAnyPositionWorker(DocumentId id)
{
return ContainedDocument.TryGetContainedDocument(id) == null;
}
}
}
// 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.Composition;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Editor.Shared;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.Text;
using Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem;
using Microsoft.VisualStudio.LanguageServices.Implementation.Venus;
using Microsoft.VisualStudio.Text;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.SuggestionService
{
[ExportWorkspaceService(typeof(ITextBufferSupportsFeatureService), ServiceLayer.Host), Shared]
internal sealed class VisualStudioTextBufferSupportsFeatureService : ITextBufferSupportsFeatureService
{
public bool SupportsCodeFixes(ITextBuffer textBuffer)
{
return GetContainedDocument(textBuffer) == null;
}
public bool SupportsRefactorings(ITextBuffer textBuffer)
{
return GetContainedDocument(textBuffer) == null;
}
public bool SupportsRename(ITextBuffer textBuffer)
{
var sourceTextContainer = textBuffer.AsTextContainer();
if (Workspace.TryGetWorkspace(sourceTextContainer, out var workspace))
{
return workspace.GetRelatedDocumentIds(sourceTextContainer)
.Select(id => ContainedDocument.TryGetContainedDocument(id))
.All(cd => cd == null || cd.SupportsRename);
}
return false;
}
public bool SupportsNavigationToAnyPosition(ITextBuffer textBuffer)
{
return GetContainedDocument(textBuffer) == null;
}
private static ContainedDocument GetContainedDocument(ITextBuffer textBuffer)
{
var sourceTextContainer = textBuffer.AsTextContainer();
if (Workspace.TryGetWorkspace(sourceTextContainer, out var workspace)
&& workspace is VisualStudioWorkspaceImpl vsWorkspace)
{
var id = vsWorkspace.GetDocumentIdInCurrentContext(sourceTextContainer);
if (id != null)
{
return ContainedDocument.TryGetContainedDocument(id);
}
}
return null;
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册