Skip to content

Commit

Permalink
[ashmind/SharpLab#1289] Fix support for Microsoft.CodeAnalysis 4.9
Browse files Browse the repository at this point in the history
  • Loading branch information
ashmind committed Oct 13, 2023
1 parent bb0e94c commit 03a0b5f
Show file tree
Hide file tree
Showing 18 changed files with 2,737 additions and 93 deletions.
3 changes: 3 additions & 0 deletions Common/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Changelog

## Unreleased
- Fixed support for Microsoft.CodeAnalysis 4.9.0 (preview versions)

## [3.0.7] - 2023-09-07
- Fixed support for Microsoft.CodeAnalysis 4.8.0 (preview versions)

Expand Down
4 changes: 3 additions & 1 deletion Common/Internal/Roslyn/RoslynInternals.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ private static Assembly LoadInternalsAssemblyWithDependenciesSlowUncached() {
if (roslynVersion.Major == 42 && roslynVersion.Minor == 42) {
// Try previous versions, in case CI is not on newest yet
assembly = GetAssemblyOrNullIfTypesFailToLoad(assembly)
?? GetAssemblyOrNullIfTypesFailToLoad(LoadInternalsAssemblySlow(new Version(4, 8)))
?? GetAssemblyOrNullIfTypesFailToLoad(LoadInternalsAssemblySlow(new Version(4, 7)))
?? GetAssemblyOrNullIfTypesFailToLoad(LoadInternalsAssemblySlow(new Version(4, 6)))
?? GetAssemblyOrNullIfTypesFailToLoad(LoadInternalsAssemblySlow(new Version(4, 5)))
Expand All @@ -75,7 +76,8 @@ private static Assembly LoadInternalsAssemblyWithDependenciesSlowUncached() {

private static Assembly LoadInternalsAssemblySlow(Version roslynVersion) {
var assemblyName = roslynVersion switch {
{ Major: > 4 } or { Major: 4, Minor: >= 8 } => "MirrorSharp.Internal.Roslyn48.dll",
{ Major: > 4 } or { Major: 4, Minor: >= 9 } => "MirrorSharp.Internal.Roslyn49.dll",
{ Major: 4, Minor: 8 } => "MirrorSharp.Internal.Roslyn48.dll",
{ Major: 4, Minor: 7 } => "MirrorSharp.Internal.Roslyn47.dll",
{ Major: 4, Minor: 6 } => "MirrorSharp.Internal.Roslyn46.dll",
{ Major: 4, Minor: 5 } => "MirrorSharp.Internal.Roslyn45.dll",
Expand Down
6 changes: 3 additions & 3 deletions Internal.Roslyn48/Internal.Roslyn48.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@

<ItemGroup>
<PackageReference Include="IgnoresAccessChecksToGenerator" Version="0.5.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.CodeAnalysis" Version="4.8.0-3.23456.12" PrivateAssets="All" />
<PackageReference Include="Microsoft.CodeAnalysis.Features" Version="4.8.0-3.23456.12" PrivateAssets="All" />
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.Common" Version="4.8.0-3.23456.12" PrivateAssets="All" />
<PackageReference Include="Microsoft.CodeAnalysis" Version="4.8.0-3.23510.8" PrivateAssets="All" />
<PackageReference Include="Microsoft.CodeAnalysis.Features" Version="4.8.0-3.23510.8" PrivateAssets="All" />
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.Common" Version="4.8.0-3.23510.8" PrivateAssets="All" />
</ItemGroup>

<ItemGroup>
Expand Down
72 changes: 36 additions & 36 deletions Internal.Roslyn48/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,25 @@
},
"Microsoft.CodeAnalysis": {
"type": "Direct",
"requested": "[4.8.0-3.23456.12, )",
"resolved": "4.8.0-3.23456.12",
"contentHash": "pky54fj0paHhQpsLvoaIlYrxiXRvb7Pt8bBF2EeUx4Q8s3q192vrdG03US5Jn/E53c0uP5PFlBuXosyeLIIz3g==",
"requested": "[4.8.0-3.23510.8, )",
"resolved": "4.8.0-3.23510.8",
"contentHash": "cOwCvMAssDHz+YS5RYkV350gp6p1H9A32Y+2g+BSWHwnKaGSXMu/3uXfpZwswXwTdYTBsN3jaf8c8eAY0kA1gQ==",
"dependencies": {
"Microsoft.CodeAnalysis.CSharp.Workspaces": "[4.8.0-3.23456.12]",
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": "[4.8.0-3.23456.12]"
"Microsoft.CodeAnalysis.CSharp.Workspaces": "[4.8.0-3.23510.8]",
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": "[4.8.0-3.23510.8]"
}
},
"Microsoft.CodeAnalysis.Features": {
"type": "Direct",
"requested": "[4.8.0-3.23456.12, )",
"resolved": "4.8.0-3.23456.12",
"contentHash": "FJ5vijD6oFtetgOYLou7amREGO79RWqvvyaWvu8d0929CWT8SqkPIBe7YB2kob1eidLYM4duFI6btefd8FfeyA==",
"requested": "[4.8.0-3.23510.8, )",
"resolved": "4.8.0-3.23510.8",
"contentHash": "1RgB41QjO53YAn2//r/2Vs7YlsNCMo/2jpsZ553tcS9F0N5FXcEQ3Qd91G4hPe6sK2fav6MUuN8QOT34f9q/jw==",
"dependencies": {
"Microsoft.CodeAnalysis.AnalyzerUtilities": "3.3.0",
"Microsoft.CodeAnalysis.Common": "[4.8.0-3.23456.12]",
"Microsoft.CodeAnalysis.Common": "[4.8.0-3.23510.8]",
"Microsoft.CodeAnalysis.Elfie": "1.0.0",
"Microsoft.CodeAnalysis.Scripting.Common": "[4.8.0-3.23456.12]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.8.0-3.23456.12]",
"Microsoft.CodeAnalysis.Scripting.Common": "[4.8.0-3.23510.8]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.8.0-3.23510.8]",
"Microsoft.DiaSymReader": "2.0.0",
"System.Text.Json": "7.0.3",
"System.Threading.Tasks.Extensions": "4.5.4"
Expand All @@ -42,13 +42,13 @@
},
"Microsoft.CodeAnalysis.Workspaces.Common": {
"type": "Direct",
"requested": "[4.8.0-3.23456.12, )",
"resolved": "4.8.0-3.23456.12",
"contentHash": "yvEUoiYSvQoc+mwurt7CAMhjhttwkTYYsVy0gQwZLGeF2ob5Lsi+wq3qtzhw8L6UYojx83gmaYwISq080YbnEQ==",
"requested": "[4.8.0-3.23510.8, )",
"resolved": "4.8.0-3.23510.8",
"contentHash": "0xaj+b9W++JAH5GxrNBGh4iPUEInYTgR6xQdFGtzaYiv+MvckLdSpVW+nnZbUHH8fcnijRYh9VMpPhqNkAitBg==",
"dependencies": {
"Humanizer.Core": "2.14.1",
"Microsoft.Bcl.AsyncInterfaces": "7.0.0",
"Microsoft.CodeAnalysis.Common": "[4.8.0-3.23456.12]",
"Microsoft.CodeAnalysis.Common": "[4.8.0-3.23510.8]",
"System.Composition": "7.0.0",
"System.IO.Pipelines": "7.0.0",
"System.Threading.Channels": "7.0.0"
Expand Down Expand Up @@ -88,8 +88,8 @@
},
"Microsoft.CodeAnalysis.Common": {
"type": "Transitive",
"resolved": "4.8.0-3.23456.12",
"contentHash": "u1QujEprHz3kaJwN5oTUFjTcR7JmTtlq0niOwFp064nUgKi1u5/db6Nj8lF7JfZdTf0wJE85az7zsdcTMg2UYA==",
"resolved": "4.8.0-3.23510.8",
"contentHash": "l8L2Wa/1zAzFrDezM2wfned01yD2y4PXqs+EmqP0Np4uO7xSF9vCuinhSalnjgsYktxixO9uWrqDba9FBB8qDg==",
"dependencies": {
"Microsoft.CodeAnalysis.Analyzers": "3.3.4",
"System.Collections.Immutable": "7.0.0",
Expand All @@ -102,21 +102,21 @@
},
"Microsoft.CodeAnalysis.CSharp": {
"type": "Transitive",
"resolved": "4.8.0-3.23456.12",
"contentHash": "7+feLjVLl3HMzrLzQsEsa1jyF7vcXlGLf//lb0n5wQTqsRzZQIjHkbtzXFB4+WTOISvaGdal6bdxO8ef96GsrA==",
"resolved": "4.8.0-3.23510.8",
"contentHash": "42Sgg8UL6vuO7yuvkjGT6DMWKVVJvt4JXtFt3nkJXd2j50Mf4Yz+K3aiLnap6NchvXtAjXw1vuYBCw9hS4Mrbg==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.8.0-3.23456.12]"
"Microsoft.CodeAnalysis.Common": "[4.8.0-3.23510.8]"
}
},
"Microsoft.CodeAnalysis.CSharp.Workspaces": {
"type": "Transitive",
"resolved": "4.8.0-3.23456.12",
"contentHash": "f9x0fk+Y0WtdxuNkHIi0ZES2BQ+wiiOzXrIR+LesHholNSBKnokXjEfIERHdMrbwAsCKyFY3gE30dD29phg8zA==",
"resolved": "4.8.0-3.23510.8",
"contentHash": "9VpCyjx7lagI+hYbNEBpMB76T49alwc/wZvWOm3RUBPxGohVYIibaEorEuWTbwN3rfoS40DgQaOILN5jDHllIA==",
"dependencies": {
"Humanizer.Core": "2.14.1",
"Microsoft.CodeAnalysis.CSharp": "[4.8.0-3.23456.12]",
"Microsoft.CodeAnalysis.Common": "[4.8.0-3.23456.12]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.8.0-3.23456.12]"
"Microsoft.CodeAnalysis.CSharp": "[4.8.0-3.23510.8]",
"Microsoft.CodeAnalysis.Common": "[4.8.0-3.23510.8]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.8.0-3.23510.8]"
}
},
"Microsoft.CodeAnalysis.Elfie": {
Expand All @@ -130,28 +130,28 @@
},
"Microsoft.CodeAnalysis.Scripting.Common": {
"type": "Transitive",
"resolved": "4.8.0-3.23456.12",
"contentHash": "HQSraNmae6xRidGSRZDAP2GQ4xMh9saBfojSMYFNx79D+kuF3qTU92etiMYPt/gwr3pKdjarfzJTowyTfX0RXQ==",
"resolved": "4.8.0-3.23510.8",
"contentHash": "Skny1lRxi4ubKQrl299t7vRYXr6uxTtxpnGK67hmAXvQ0p2cSRZVDX8h7Rro35HGoWyAPnTG2Uw2Z5V2Q0mGiA==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.8.0-3.23456.12]"
"Microsoft.CodeAnalysis.Common": "[4.8.0-3.23510.8]"
}
},
"Microsoft.CodeAnalysis.VisualBasic": {
"type": "Transitive",
"resolved": "4.8.0-3.23456.12",
"contentHash": "5Aroat73KLGFgqf99G06thzl9PyGZFAyU/qYCd4pMMiRd4M7e/4iZYj5Thvn354jV8p22SNOdSuoXZK4wfAw6A==",
"resolved": "4.8.0-3.23510.8",
"contentHash": "Ok7Z2xecIpMCGVzmU2UrXvebV0AV6gCvpCyCvEKP0ZZSxiRMkV31DXh9k7pk9DuijiFbNWr9u9o5JbkGxE2QZQ==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.8.0-3.23456.12]"
"Microsoft.CodeAnalysis.Common": "[4.8.0-3.23510.8]"
}
},
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": {
"type": "Transitive",
"resolved": "4.8.0-3.23456.12",
"contentHash": "EdweXZ/CWI9USYSkt0ISf8IDF3XhWLgpaqLPnpu7j088MwpU8ZbM4p3wQW0SYvPq49IcwrpTYAf2DNNIaeS9Rg==",
"resolved": "4.8.0-3.23510.8",
"contentHash": "2O5i/TRiti1q1Egdx+etGKV2R2aeNUmartQ5M7znhKkmTJ19NHy0Qmh+ZYut6MiU0231h1fLOmgORw8bcFJH0Q==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.8.0-3.23456.12]",
"Microsoft.CodeAnalysis.VisualBasic": "[4.8.0-3.23456.12]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.8.0-3.23456.12]"
"Microsoft.CodeAnalysis.Common": "[4.8.0-3.23510.8]",
"Microsoft.CodeAnalysis.VisualBasic": "[4.8.0-3.23510.8]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[4.8.0-3.23510.8]"
}
},
"Microsoft.DiaSymReader": {
Expand Down
25 changes: 25 additions & 0 deletions Internal.Roslyn49/CodeActionInternals.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System.Collections.Immutable;
using System.Composition;
using Microsoft.CodeAnalysis.CodeActions;
using MirrorSharp.Internal.Roslyn.Internals;

namespace MirrorSharp.Internal.Roslyn47 {
[Shared]
[Export(typeof(ICodeActionInternals))]
internal class CodeActionInternals : ICodeActionInternals {
public bool IsInlinable(CodeAction action) {
Argument.NotNull(nameof(action), action);
return action.IsInlinable;
}

public Roslyn.Internals.CodeActionPriority GetPriority(CodeAction action) {
Argument.NotNull(nameof(action), action);
return (Roslyn.Internals.CodeActionPriority)(int)action.Priority;
}

public ImmutableArray<CodeAction> GetNestedCodeActions(CodeAction action) {
Argument.NotNull(nameof(action), action);
return action.NestedCodeActions;
}
}
}
30 changes: 30 additions & 0 deletions Internal.Roslyn49/Internal.Roslyn49.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>MirrorSharp.Internal.Roslyn49</AssemblyName>
<RootNamespace>MirrorSharp.Internal.Roslyn49</RootNamespace>
<IsPackable>false</IsPackable>
</PropertyGroup>

<PropertyGroup>
<InternalsAssemblyNames>Microsoft.CodeAnalysis.Features;Microsoft.CodeAnalysis.Workspaces</InternalsAssemblyNames>
</PropertyGroup>

<PropertyGroup>
<RestoreAdditionalProjectSources>
https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json;
https://pkgs.dev.azure.com/azure-public/vside/_packaging/vs-impl/nuget/v3/index.json
</RestoreAdditionalProjectSources>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="IgnoresAccessChecksToGenerator" Version="0.5.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.CodeAnalysis" Version="4.9.0-1.23513.1" PrivateAssets="All" />
<PackageReference Include="Microsoft.CodeAnalysis.Features" Version="4.9.0-1.23513.1" PrivateAssets="All" />
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.Common" Version="4.9.0-1.23513.1" PrivateAssets="All" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Internal.RoslynInternals\Internal.RoslynInternals.csproj" />
</ItemGroup>
</Project>
29 changes: 29 additions & 0 deletions Internal.Roslyn49/MirrorSharpDiagnosticAnalyzerService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Composition;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Text;

namespace MirrorSharp.Internal.Roslyn47 {
[Shared]
[Export(typeof(IDiagnosticAnalyzerService))]
internal class MirrorSharpDiagnosticAnalyzerService : IDiagnosticAnalyzerService {
DiagnosticAnalyzerInfoCache IDiagnosticAnalyzerService.AnalyzerInfoCache { get; } = new();
IGlobalOptionService IDiagnosticAnalyzerService.GlobalOptions => throw new NotSupportedException();
Task IDiagnosticAnalyzerService.ForceAnalyzeProjectAsync(Project project, CancellationToken cancellationToken) => throw new NotSupportedException();
Task<ImmutableArray<DiagnosticData>> IDiagnosticAnalyzerService.GetCachedDiagnosticsAsync(Workspace workspace, ProjectId? projectId, DocumentId? documentId, bool includeSuppressedDiagnostics, bool includeLocalDocumentDiagnostics, bool includeNonLocalDocumentDiagnostics, CancellationToken cancellationToken) => throw new NotSupportedException();
Task<ImmutableArray<DiagnosticData>> IDiagnosticAnalyzerService.GetDiagnosticsAsync(Solution solution, ProjectId? projectId, DocumentId? documentId, bool includeSuppressedDiagnostics, bool includeNonLocalDocumentDiagnostics, CancellationToken cancellationToken) => throw new NotSupportedException();
Task<ImmutableArray<DiagnosticData>> IDiagnosticAnalyzerService.GetDiagnosticsForIdsAsync(Solution solution, ProjectId? projectId, DocumentId? documentId, ImmutableHashSet<string>? diagnosticIds, Func<DiagnosticAnalyzer, bool>? shouldIncludeAnalyzer, bool includeSuppressedDiagnostics, bool includeLocalDocumentDiagnostics, bool includeNonLocalDocumentDiagnostics, CancellationToken cancellationToken) => throw new NotSupportedException();
Task<ImmutableArray<DiagnosticData>> IDiagnosticAnalyzerService.GetDiagnosticsForSpanAsync(TextDocument document, TextSpan? range, Func<string, bool>? shouldIncludeDiagnostic, bool includeCompilerDiagnostics, bool includeSuppressedDiagnostics, ICodeActionRequestPriorityProvider priorityProvider, Func<string, IDisposable?>? addOperationScope, DiagnosticKind diagnosticKind, bool isExplicit, CancellationToken cancellationToken) => throw new NotSupportedException();
Task<ImmutableArray<DiagnosticData>> IDiagnosticAnalyzerService.GetProjectDiagnosticsForIdsAsync(Solution solution, ProjectId? projectId, ImmutableHashSet<string>? diagnosticIds, Func<DiagnosticAnalyzer, bool>? shouldIncludeAnalyzer, bool includeSuppressedDiagnostics, bool includeNonLocalDocumentDiagnostics, CancellationToken cancellationToken) => throw new NotSupportedException();
Task<ImmutableArray<DiagnosticData>> IDiagnosticAnalyzerService.GetSpecificCachedDiagnosticsAsync(Workspace workspace, object id, bool includeSuppressedDiagnostics, bool includeNonLocalDocumentDiagnostics, CancellationToken cancellationToken) => throw new NotSupportedException();
void IDiagnosticAnalyzerService.Reanalyze(Workspace workspace, IEnumerable<ProjectId>? projectIds, IEnumerable<DocumentId>? documentIds, bool highPriority) => throw new NotSupportedException();
Task<(ImmutableArray<DiagnosticData> diagnostics, bool upToDate)> IDiagnosticAnalyzerService.TryGetDiagnosticsForSpanAsync(TextDocument document, TextSpan range, Func<string, bool>? shouldIncludeDiagnostic, bool includeSuppressedDiagnostics, ICodeActionRequestPriorityProvider priorityProvider, DiagnosticKind diagnosticKind, bool isExplicit, CancellationToken cancellationToken) => throw new NotSupportedException();
}
}
1 change: 1 addition & 0 deletions Internal.Roslyn49/PublicAPI.Shipped.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#nullable enable
Empty file.
61 changes: 61 additions & 0 deletions Internal.Roslyn49/SignatureHelpProviderWrapper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.SignatureHelp;
using MirrorSharp.Internal.Roslyn.Internals;
using SignatureHelpTriggerReason = Microsoft.CodeAnalysis.SignatureHelp.SignatureHelpTriggerReason;

namespace MirrorSharp.Internal.Roslyn47 {
internal class SignatureHelpProviderWrapper : ISignatureHelpProviderWrapper {
private readonly ISignatureHelpProvider _provider;

public SignatureHelpProviderWrapper(ISignatureHelpProvider provider) {
_provider = provider;
}

public async Task<SignatureHelpItemsData?> GetItemsAsync(Document document, int position, SignatureHelpTriggerInfoData triggerInfo, SignatureHelpOptionsData options, CancellationToken cancellationToken) {
// This is quite complicated to implement correctly and is still shifting around.
// For now we will only allow default options. There is no way to check if user
// intended something different, but that can be implemented later.
var mappedOptions = SignatureHelpOptions.Default;
var mappedTriggerInfo = new SignatureHelpTriggerInfo(
(SignatureHelpTriggerReason)(int)triggerInfo.TriggerReason,
triggerInfo.TriggerCharacter
);

var items = await _provider.GetItemsAsync(
document, position,
mappedTriggerInfo,
mappedOptions, cancellationToken
).ConfigureAwait(false);

if (items == null)
return null;

return new SignatureHelpItemsData(
items.Items.Select(i => new SignatureHelpItemData(
i.DocumentationFactory,
prefixDisplayParts: i.PrefixDisplayParts,
separatorDisplayParts: i.SeparatorDisplayParts,
suffixDisplayParts: i.SuffixDisplayParts,
parameters: i.Parameters.Select(p => new SignatureHelpParameterData(
p.Name,
p.DocumentationFactory,
displayParts: p.DisplayParts,
prefixDisplayParts: p.PrefixDisplayParts,
suffixDisplayParts: p.SuffixDisplayParts
)),
i.Parameters.Length
)),
applicableSpan: items.ApplicableSpan,
argumentIndex: items.ArgumentIndex,
argumentCount: items.ArgumentCount,
selectedItemIndex: items.SelectedItemIndex
);
}

public bool IsRetriggerCharacter(char ch) => _provider.IsRetriggerCharacter(ch);
public bool IsTriggerCharacter(char ch) => _provider.IsTriggerCharacter(ch);
}
}
31 changes: 31 additions & 0 deletions Internal.Roslyn49/SignatureHelpProviderWrapperResolver.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Composition;
using System.Linq;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.Shared.Utilities;
using Microsoft.CodeAnalysis.SignatureHelp;
using MirrorSharp.Internal.Roslyn.Internals;

namespace MirrorSharp.Internal.Roslyn47 {
[Export(typeof(ISignatureHelpProviderWrapperResolver))]
internal class SignatureHelpProviderWrapperResolver : ISignatureHelpProviderWrapperResolver {
private readonly IList<Lazy<ISignatureHelpProvider, OrderableLanguageMetadata>> _allProviders;

[ImportingConstructor]
public SignatureHelpProviderWrapperResolver(
[ImportMany] IEnumerable<Lazy<ISignatureHelpProvider, OrderableLanguageMetadata>> allProviders
) {
_allProviders = ExtensionOrderer.Order(allProviders);
}

public IEnumerable<ISignatureHelpProviderWrapper> GetAllSlow(string languageName) {
if (languageName == null)
throw new ArgumentNullException(nameof(languageName));

return _allProviders
.Where(l => l.Metadata.Language == languageName)
.Select(l => new SignatureHelpProviderWrapper(l.Value));
}
}
}
Loading

0 comments on commit 03a0b5f

Please sign in to comment.