未验证 提交 82658299 编写于 作者: D David 提交者: GitHub

Merge pull request #40851 from dotnet/merges/release/dev16.5-preview2-to-master

Merge release/dev16.5-preview2 to master
......@@ -1129,7 +1129,12 @@ internal void GetUnaliasedReferencedAssemblies(ArrayBuilder<AssemblySymbol> asse
private protected override MetadataReference? CommonGetMetadataReference(IAssemblySymbol assemblySymbol)
{
return GetMetadataReference(assemblySymbol.EnsureCSharpSymbolOrNull(nameof(assemblySymbol)));
if (assemblySymbol is Symbols.PublicModel.AssemblySymbol { UnderlyingAssemblySymbol: var underlyingSymbol })
{
return GetMetadataReference(underlyingSymbol);
}
return null;
}
internal MetadataReference? GetMetadataReference(AssemblySymbol? assemblySymbol)
......
......@@ -2267,6 +2267,20 @@ public void GetMetadataReferenceAPITest()
Assert.NotNull(reference2);
}
[Fact]
[WorkItem(40466, "https://github.com/dotnet/roslyn/issues/40466")]
public void GetMetadataReference_VisualBasicSymbols()
{
var comp = CreateCompilation("");
var vbComp = CreateVisualBasicCompilation("", referencedAssemblies: TargetFrameworkUtil.GetReferences(TargetFramework.Standard));
var assembly = (IAssemblySymbol)vbComp.GetBoundReferenceManager().GetReferencedAssemblies().First().Value;
Assert.Null(comp.GetMetadataReference(assembly));
Assert.Null(comp.GetMetadataReference(vbComp.Assembly));
Assert.Null(comp.GetMetadataReference((IAssemblySymbol)null));
}
[Fact]
public void ConsistentParseOptions()
{
......
......@@ -1232,7 +1232,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End Function
Private Protected Overrides Function CommonGetMetadataReference(assemblySymbol As IAssemblySymbol) As MetadataReference
Return GetMetadataReference(assemblySymbol.EnsureVbSymbolOrNothing(Of AssemblySymbol)(NameOf(assemblySymbol)))
Dim symbol = TryCast(assemblySymbol, AssemblySymbol)
If symbol IsNot Nothing Then
Return GetMetadataReference(symbol)
End If
Return Nothing
End Function
Public Overrides ReadOnly Property ReferencedAssemblyNames As IEnumerable(Of AssemblyIdentity)
......
......@@ -2257,6 +2257,19 @@ End Class
Assert.NotNull(reference2)
End Sub
<WorkItem(40466, "https://github.com/dotnet/roslyn/issues/40466")>
<Fact>
Public Sub GetMetadataReference_CSharpSymbols()
Dim comp As Compilation = CreateCompilation("")
Dim csComp = CreateCSharpCompilation("", referencedAssemblies:=TargetFrameworkUtil.GetReferences(TargetFramework.Standard))
Dim assembly = csComp.GetBoundReferenceManager().GetReferencedAssemblies().First().Value
Assert.Null(comp.GetMetadataReference(DirectCast(assembly.GetISymbol(), IAssemblySymbol)))
Assert.Null(comp.GetMetadataReference(csComp.Assembly))
Assert.Null(comp.GetMetadataReference(Nothing))
End Sub
<Fact()>
Public Sub EqualityOfMergedNamespaces()
......
......@@ -13,6 +13,7 @@
using Microsoft.CodeAnalysis.LanguageServer;
using Microsoft.VisualStudio.LanguageServer.Client;
using Microsoft.VisualStudio.LanguageServer.Protocol;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using StreamJsonRpc;
......@@ -52,11 +53,27 @@ internal class InProcLanguageServer
[JsonRpcMethod(Methods.InitializeName)]
public Task<InitializeResult> Initialize(JToken input, CancellationToken cancellationToken)
{
// The VS LSP protocol package changed the type of 'tagSupport' from bool to an object.
// Our version of the LSP protocol package is older and assumes that the type is bool, so deserialization fails.
// Since we don't really read this field, just no-op the error until we can update our package references.
// https://github.com/dotnet/roslyn/issues/40829 tracks updating this.
var settings = new JsonSerializerSettings
{
Error = (sender, args) =>
{
if (object.Equals(args.ErrorContext.Member, "tagSupport") && args.ErrorContext.OriginalObject.GetType() == typeof(PublishDiagnosticsSetting))
{
args.ErrorContext.Handled = true;
}
}
};
var serializer = JsonSerializer.Create(settings);
// InitializeParams only references ClientCapabilities, but the VS LSP client
// sends additional VS specific capabilities, so directly deserialize them into the VSClientCapabilities
// to avoid losing them.
_clientCapabilities = input["capabilities"].ToObject<VSClientCapabilities>();
return _protocol.InitializeAsync(_workspace.CurrentSolution, input.ToObject<InitializeParams>(), _clientCapabilities, cancellationToken);
_clientCapabilities = input["capabilities"].ToObject<VSClientCapabilities>(serializer);
return _protocol.InitializeAsync(_workspace.CurrentSolution, input.ToObject<InitializeParams>(serializer), _clientCapabilities, cancellationToken);
}
[JsonRpcMethod(Methods.InitializedName)]
......
......@@ -96,7 +96,7 @@ private async Task<List<VSPublishSymbolParams>> GetVsSearchResultsAsync(Solution
{
var result = await jsonRpc.InvokeWithCancellationAsync<JObject>(
Methods.InitializeName,
new object[] { Process.GetCurrentProcess().Id, "test", new Uri("file://test"), new ClientCapabilities(), TraceSetting.Off },
new object[] { new InitializeParams() },
CancellationToken.None);
Assert.True(result["capabilities"]["workspaceStreamingSymbolProvider"].ToObject<bool>());
......
......@@ -10,8 +10,7 @@
using Microsoft.CodeAnalysis.LanguageServer;
using Microsoft.CodeAnalysis.NavigateTo;
using Microsoft.VisualStudio.LanguageServer.Protocol;
using Newtonsoft.Json;
using Roslyn.Utilities;
using Newtonsoft.Json.Linq;
using StreamJsonRpc;
using LSP = Microsoft.VisualStudio.LanguageServer.Protocol;
......@@ -41,17 +40,15 @@ public LanguageServer(Stream stream, IServiceProvider serviceProvider)
}
[JsonRpcMethod(Methods.InitializeName)]
public object Initialize(int? processId, string rootPath, Uri rootUri, ClientCapabilities capabilities, TraceSetting trace, CancellationToken cancellationToken)
public Task<InitializeResult> Initialize(JToken input, CancellationToken cancellationToken)
{
// our LSP server only supports WorkspaceStreamingSymbolProvider capability
// for now
return new InitializeResult()
return Task.FromResult(new InitializeResult()
{
Capabilities = new VSServerCapabilities()
{
WorkspaceStreamingSymbolProvider = true
}
};
});
}
[JsonRpcMethod(Methods.InitializedName)]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册