提交 bc48af7c 编写于 作者: C CyrusNajmabadi

Merge branch 'moveTypeToFile' into addUsingOOP2

...@@ -16,74 +16,74 @@ namespace Microsoft.CodeAnalysis.CodeFixes.AddImport ...@@ -16,74 +16,74 @@ namespace Microsoft.CodeAnalysis.CodeFixes.AddImport
{ {
internal abstract partial class AbstractAddImportCodeFixProvider<TSimpleNameSyntax> internal abstract partial class AbstractAddImportCodeFixProvider<TSimpleNameSyntax>
{ {
private class AssemblyReferenceCodeAction : CodeAction private class AssemblyReferenceCodeAction : CodeAction
{ {
private readonly ReferenceAssemblyWithTypeResult _referenceAssemblyWithType; private readonly ReferenceAssemblyWithTypeResult _referenceAssemblyWithType;
private readonly string _title; private readonly string _title;
private readonly Document _document; private readonly Document _document;
private readonly ImmutableArray<TextChange> _textChanges; private readonly ImmutableArray<TextChange> _textChanges;
public override string Title => _title; public override string Title => _title;
public override ImmutableArray<string> Tags => WellKnownTagArrays.AddReference; public override ImmutableArray<string> Tags => WellKnownTagArrays.AddReference;
private readonly Lazy<string> _lazyResolvedPath; private readonly Lazy<string> _lazyResolvedPath;
public AssemblyReferenceCodeAction( public AssemblyReferenceCodeAction(
string title, string title,
ReferenceAssemblyWithTypeResult referenceAssemblyWithType, ReferenceAssemblyWithTypeResult referenceAssemblyWithType,
Document document, Document document,
ImmutableArray<TextChange> textChanges) ImmutableArray<TextChange> textChanges)
{ {
_referenceAssemblyWithType = referenceAssemblyWithType; _referenceAssemblyWithType = referenceAssemblyWithType;
_document = document; _document = document;
_textChanges = textChanges; _textChanges = textChanges;
_title = title; _title = title;
_lazyResolvedPath = new Lazy<string>(ResolvePath); _lazyResolvedPath = new Lazy<string>(ResolvePath);
} }
// Adding a reference is always low priority. // Adding a reference is always low priority.
internal override CodeActionPriority Priority => CodeActionPriority.Low; internal override CodeActionPriority Priority => CodeActionPriority.Low;
private string ResolvePath() private string ResolvePath()
{ {
var assemblyResolverService = _document.Project.Solution.Workspace.Services.GetService<IFrameworkAssemblyPathResolver>(); var assemblyResolverService = _document.Project.Solution.Workspace.Services.GetService<IFrameworkAssemblyPathResolver>();
var fullyQualifiedName = string.Join( var fullyQualifiedName = string.Join(
".", _referenceAssemblyWithType.ContainingNamespaceNames.Concat(_referenceAssemblyWithType.TypeName)); ".", _referenceAssemblyWithType.ContainingNamespaceNames.Concat(_referenceAssemblyWithType.TypeName));
var assemblyPath = assemblyResolverService?.ResolveAssemblyPath( var assemblyPath = assemblyResolverService?.ResolveAssemblyPath(
_document.Project.Id, _referenceAssemblyWithType.AssemblyName, fullyQualifiedName); _document.Project.Id, _referenceAssemblyWithType.AssemblyName, fullyQualifiedName);
return assemblyPath; return assemblyPath;
} }
internal override bool PerformFinalApplicabilityCheck internal override bool PerformFinalApplicabilityCheck
=> true; => true;
internal override bool IsApplicable(Workspace workspace) internal override bool IsApplicable(Workspace workspace)
=> !string.IsNullOrWhiteSpace(_lazyResolvedPath.Value); => !string.IsNullOrWhiteSpace(_lazyResolvedPath.Value);
protected override async Task<IEnumerable<CodeActionOperation>> ComputeOperationsAsync(CancellationToken cancellationToken) protected override async Task<IEnumerable<CodeActionOperation>> ComputeOperationsAsync(CancellationToken cancellationToken)
{ {
var service = _document.Project.Solution.Workspace.Services.GetService<IMetadataService>(); var service = _document.Project.Solution.Workspace.Services.GetService<IMetadataService>();
var resolvedPath = _lazyResolvedPath.Value; var resolvedPath = _lazyResolvedPath.Value;
var reference = service.GetReference(resolvedPath, MetadataReferenceProperties.Assembly); var reference = service.GetReference(resolvedPath, MetadataReferenceProperties.Assembly);
var oldText = await _document.GetTextAsync(cancellationToken).ConfigureAwait(false); var oldText = await _document.GetTextAsync(cancellationToken).ConfigureAwait(false);
var newText = oldText.WithChanges(_textChanges); var newText = oldText.WithChanges(_textChanges);
var newDocument = _document.WithText(newText); var newDocument = _document.WithText(newText);
// Now add the actual assembly reference. // Now add the actual assembly reference.
var newProject = newDocument.Project; var newProject = newDocument.Project;
newProject = newProject.WithMetadataReferences( newProject = newProject.WithMetadataReferences(
newProject.MetadataReferences.Concat(reference)); newProject.MetadataReferences.Concat(reference));
var operation = new ApplyChangesOperation(newProject.Solution); var operation = new ApplyChangesOperation(newProject.Solution);
return SpecializedCollections.SingletonEnumerable<CodeActionOperation>(operation); return SpecializedCollections.SingletonEnumerable<CodeActionOperation>(operation);
}
} }
}
} }
} }
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册