提交 8d0d534d 编写于 作者: J Jonathon Marolf

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

Check if syntax tree is present
......@@ -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 CompletionItem Disambiguate(CompletionItem item, CompletionItem e
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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册