未验证 提交 988c0e15 编写于 作者: M Manish Vasani 提交者: GitHub

Merge pull request #37638 from mavasani/AddIntegrationTest

Add an integration test for #37623
......@@ -566,7 +566,7 @@ public async Task<ImmutableArray<Diagnostic>> GetAnalyzerSemanticDiagnosticsAsyn
return await GetAnalyzerSemanticDiagnosticsCoreAsync(model, filterSpan, analyzers, cancellationToken).ConfigureAwait(false);
}
private async Task<ImmutableArray<Diagnostic>> GetAnalyzerSemanticDiagnosticsCoreAsync(SemanticModel model, TextSpan? filterSpan, ImmutableArray<DiagnosticAnalyzer> analyzers, CancellationToken cancellationToken)
private async Task<ImmutableArray<Diagnostic>> GetAnalyzerSemanticDiagnosticsCoreAsync(SemanticModel model, TextSpan? filterSpan, ImmutableArray<DiagnosticAnalyzer> analyzers, CancellationToken cancellationToken, bool forceCompletePartialTrees = true)
{
try
{
......@@ -588,7 +588,7 @@ private async Task<ImmutableArray<Diagnostic>> GetAnalyzerSemanticDiagnosticsCor
cancellationToken.ThrowIfCancellationRequested();
(ImmutableArray<CompilationEvent> compilationEvents, bool hasSymbolStartActions) = await ComputeAnalyzerDiagnosticsAsync(pendingAnalysisScope, getPendingEvents, taskToken, cancellationToken).ConfigureAwait(false);
if (hasSymbolStartActions)
if (hasSymbolStartActions && forceCompletePartialTrees)
{
await processPartialSymbolLocationsAsync(compilationEvents, analysisScope).ConfigureAwait(false);
}
......@@ -649,7 +649,7 @@ async Task processPartialSymbolLocationsAsync(ImmutableArray<CompilationEvent> c
Task.Run(() =>
{
var treeModel = _compilationData.GetOrCreateCachedSemanticModel(tree, _compilation, cancellationToken);
return GetAnalyzerSemanticDiagnosticsCoreAsync(treeModel, filterSpan: null, analysisScope.Analyzers, cancellationToken);
return GetAnalyzerSemanticDiagnosticsCoreAsync(treeModel, filterSpan: null, analysisScope.Analyzers, cancellationToken, forceCompletePartialTrees: false);
}, cancellationToken))).ConfigureAwait(false);
}
else
......@@ -658,7 +658,7 @@ async Task processPartialSymbolLocationsAsync(ImmutableArray<CompilationEvent> c
{
cancellationToken.ThrowIfCancellationRequested();
var treeModel = _compilationData.GetOrCreateCachedSemanticModel(tree, _compilation, cancellationToken);
await GetAnalyzerSemanticDiagnosticsCoreAsync(treeModel, filterSpan: null, analysisScope.Analyzers, cancellationToken).ConfigureAwait(false);
await GetAnalyzerSemanticDiagnosticsCoreAsync(treeModel, filterSpan: null, analysisScope.Analyzers, cancellationToken, forceCompletePartialTrees: false).ConfigureAwait(false);
}
}
}
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.CodeAnalysis;
using Microsoft.VisualStudio.IntegrationTest.Utilities;
using Microsoft.VisualStudio.IntegrationTest.Utilities.Input;
using Roslyn.Test.Utilities;
using Xunit;
using Xunit.Abstractions;
using ProjectUtils = Microsoft.VisualStudio.IntegrationTest.Utilities.Common.ProjectUtils;
namespace Roslyn.VisualStudio.IntegrationTests.CSharp
{
[Collection(nameof(SharedIntegrationHostFixture))]
public class CSharpTyping : AbstractEditorTest
{
protected override string LanguageName => LanguageNames.CSharp;
public CSharpTyping(VisualStudioInstanceFactory instanceFactory, ITestOutputHelper testOutputHelper)
: base(instanceFactory, testOutputHelper, nameof(CSharpTyping))
{
}
[WpfFact, WorkItem(957250, "https://devdiv.visualstudio.com/DevDiv/_workitems/edit/957250")]
public void TypingInPartialType()
{
SetUpEditor(@"
public partial class Test
{
private int f;
static void Main(string[] args) { }
public void Noop()
{
f = 1;$$
}
}
");
var secondPartialDecl = @"
public partial class Test
{
int val1 = 1, val2 = 2;
public void TestA()
{
TestB();
}
}
";
var thirdPartialDecl = @"
public partial class Test
{
public void TestB()
{
int val1x = this.val1, val2x = this.val2;
}
}";
VisualStudio.SolutionExplorer.AddFile(new ProjectUtils.Project(ProjectName), "PartialType2.cs", secondPartialDecl, open: false);
VisualStudio.SolutionExplorer.AddFile(new ProjectUtils.Project(ProjectName), "PartialType3.cs", thirdPartialDecl, open: false);
// Typing intermixed with explicit Wait operations to ensure that
// we trigger multiple open file analyses along with cancellations.
VisualStudio.Editor.SendKeys(VirtualKey.Enter);
Wait(seconds: 1);
VisualStudio.Editor.SendKeys("f = 1;");
Wait(seconds: 1);
VisualStudio.Editor.SendKeys(VirtualKey.Backspace);
VisualStudio.Editor.SendKeys(VirtualKey.Backspace);
Wait(seconds: 1);
VisualStudio.Editor.SendKeys("2;");
VisualStudio.Editor.Verify.TextContains(
@"
public partial class Test
{
private int f;
static void Main(string[] args) { }
public void Noop()
{
f = 1;
f = 2;
}
}");
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册