Skip to content
代码片段 群组 项目
提交 8d0d534d 编辑于 作者: Jonathon Marolf's avatar Jonathon Marolf
浏览文件

Merge pull request #9732 from jmarolf/check-if-syntaxtree-is-supported

Check if syntax tree is present
No related branches found
No related tags found
无相关合并请求
......@@ -167,6 +167,7 @@
<Compile Include="Diagnostics\UseAutoProperty\UseAutoPropertyTests.vb" />
<Compile Include="Expansion\LambdaParameterExpansionTests.vb" />
<Compile Include="GoToImplementation\GoToImplementationTests.vb" />
<Compile Include="IntelliSense\CompletionServiceTests.vb" />
<Compile Include="InteractivePaste\InteractivePasteCommandHandlerTests.vb" />
<Compile Include="IntelliSense\CompletionRulesTests.vb" />
<Compile Include="LanguageServices\SyntaxFactsServiceTests.vb" />
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System.Globalization
Imports System.Threading
Imports System.Threading.Tasks
Imports Microsoft.CodeAnalysis.Completion
Imports Microsoft.CodeAnalysis.CSharp.Completion
Imports Microsoft.CodeAnalysis.CSharp.Completion.Providers
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.Text
Imports Moq
Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense
Public Class CompletionServiceTests
<Fact>
Public Async Function TestComplemtionDoesNotCrashWhenSyntaxTreeNotPresent() As Task
Dim workspaceDefinition =
<Workspace>
<Project Language="NoCompilation" AssemblyName="TestAssembly" CommonReferencesPortable="true">
<Document>
var x = {}; // e.g., TypeScript code or anything else that doesn't support compilations
</Document>
</Project>
</Workspace>
Using workspace = Await TestWorkspace.CreateAsync(workspaceDefinition)
Dim document = workspace.CurrentSolution.Projects.First.Documents.First
Dim mockCompletionService = New Mock(Of AbstractCompletionService)
mockCompletionService.Setup(Function(service) service.GetDefaultCompletionProviders()).Returns({New TestCompletionProvider()})
Dim list = Await mockCompletionService.Object.GetCompletionListAsync(
document:=document,
position:=0,
triggerInfo:=CompletionTriggerInfo.CreateInvokeCompletionTriggerInfo(),
options:=Nothing,
providers:=Nothing,
cancellationToken:=Nothing)
Assert.NotNull(list)
Assert.NotEmpty(list.Items)
Assert.True(list.Items.Length = 1, "Completion list contained more than one item")
Assert.Equal("Completion Item From Test Completion Provider", list.Items.First.DisplayText)
End Using
End Function
Private Class TestCompletionProvider
Inherits CompletionListProvider
Public Overrides Function IsTriggerCharacter(text As SourceText, characterPosition As Int32, options As OptionSet) As [Boolean]
Return True
End Function
Public Overrides Function ProduceCompletionListAsync(context As CompletionListContext) As Task
context.AddItem(New CompletionItem(Me, "Completion Item From Test Completion Provider", filterSpan:=New TextSpan(), descriptionFactory:=Nothing, glyph:=Nothing))
Return Task.CompletedTask
End Function
End Class
End Class
End Namespace
\ No newline at end of file
......@@ -278,17 +278,24 @@ private static async Task<CompletionList> GetCompletionListAsync(
CancellationToken cancellationToken)
{
var context = new CompletionListContext(document, position, triggerInfo, options, cancellationToken);
var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
if (!root.FullSpan.IntersectsWith(position))
if (document.SupportsSyntaxTree)
{
try
var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
if (!root.FullSpan.IntersectsWith(position))
{
// Trying to track down source of https://github.com/dotnet/roslyn/issues/9325
var sourceText = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);
ReportException(position, root, sourceText);
try
{
// Trying to track down source of https://github.com/dotnet/roslyn/issues/9325
var sourceText = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);
ReportException(position, root, sourceText);
}
catch (Exception e) when (FatalError.ReportWithoutCrash(e))
{
}
}
catch (Exception e) when (FatalError.ReportWithoutCrash(e))
else
{
await provider.ProduceCompletionListAsync(context).ConfigureAwait(false);
}
}
else
......
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册