Skip to content

Commit 11e94bd

Browse files
author
msftbot[bot]
authored
Merge pull request #45389 from dotnet/merges/master-to-master-vs-deps
Merge master to master-vs-deps
2 parents 2cc47de + 0c92f53 commit 11e94bd

24 files changed

+341
-280
lines changed

src/Compilers/CSharp/Portable/Symbols/TypeSymbolExtensions.cs

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -656,12 +656,20 @@ private static bool IsTypeLessVisibleThan(TypeSymbol type, Symbol sym, ref HashS
656656
case TypeKind.Struct:
657657
case TypeKind.Interface:
658658
case TypeKind.Delegate:
659-
foreach (var typeArg in ((NamedTypeSymbol)current).TypeArgumentsWithAnnotationsNoUseSiteDiagnostics)
659+
var typeArguments = ((NamedTypeSymbol)current).TypeArgumentsWithAnnotationsNoUseSiteDiagnostics;
660+
if (typeArguments.IsEmpty)
661+
{
662+
return null;
663+
}
664+
665+
int i;
666+
for (i = 0; i < typeArguments.Length - 1; i++)
660667
{
661668
// Let's try to avoid early resolution of nullable types
669+
(TypeWithAnnotations nextTypeWithAnnotations, TypeSymbol? nextType) = getNextIterationElements(typeArguments[i], canDigThroughNullable);
662670
var result = VisitType(
663-
typeWithAnnotationsOpt: canDigThroughNullable ? default : typeArg,
664-
type: canDigThroughNullable ? typeArg.NullableUnderlyingTypeOrSelf : null,
671+
typeWithAnnotationsOpt: nextTypeWithAnnotations,
672+
type: nextType,
665673
typeWithAnnotationsPredicate,
666674
typePredicate,
667675
arg,
@@ -672,7 +680,9 @@ private static bool IsTypeLessVisibleThan(TypeSymbol type, Symbol sym, ref HashS
672680
return result;
673681
}
674682
}
675-
return null;
683+
684+
next = typeArguments[i];
685+
break;
676686

677687
case TypeKind.Array:
678688
next = ((ArrayTypeSymbol)current).ElementTypeWithAnnotations;
@@ -683,7 +693,15 @@ private static bool IsTypeLessVisibleThan(TypeSymbol type, Symbol sym, ref HashS
683693
break;
684694

685695
case TypeKind.FunctionPointer:
686-
return visitFunctionPointerType((FunctionPointerTypeSymbol)current, typeWithAnnotationsPredicate, typePredicate, arg, useDefaultType, canDigThroughNullable);
696+
{
697+
var result = visitFunctionPointerType((FunctionPointerTypeSymbol)current, typeWithAnnotationsPredicate, typePredicate, arg, useDefaultType, canDigThroughNullable, out next);
698+
if (result is object)
699+
{
700+
return result;
701+
}
702+
703+
break;
704+
}
687705

688706
default:
689707
throw ExceptionUtilities.UnexpectedValue(current.TypeKind);
@@ -694,9 +712,18 @@ private static bool IsTypeLessVisibleThan(TypeSymbol type, Symbol sym, ref HashS
694712
type = canDigThroughNullable ? next.NullableUnderlyingTypeOrSelf : null;
695713
}
696714

697-
static TypeSymbol? visitFunctionPointerType(FunctionPointerTypeSymbol type, Func<TypeWithAnnotations, T, bool, bool>? typeWithAnnotationsPredicate, Func<TypeSymbol, T, bool, bool>? typePredicate, T arg, bool useDefaultType, bool canDigThroughNullable)
715+
static (TypeWithAnnotations, TypeSymbol?) getNextIterationElements(TypeWithAnnotations type, bool canDigThroughNullable)
716+
=> canDigThroughNullable ? (default(TypeWithAnnotations), type.NullableUnderlyingTypeOrSelf) : (type, null);
717+
718+
static TypeSymbol? visitFunctionPointerType(FunctionPointerTypeSymbol type, Func<TypeWithAnnotations, T, bool, bool>? typeWithAnnotationsPredicate, Func<TypeSymbol, T, bool, bool>? typePredicate, T arg, bool useDefaultType, bool canDigThroughNullable, out TypeWithAnnotations next)
698719
{
699720
MethodSymbol currentPointer = type.Signature;
721+
if (currentPointer.ParameterCount == 0)
722+
{
723+
next = currentPointer.ReturnTypeWithAnnotations;
724+
return null;
725+
}
726+
700727
var result = VisitType(
701728
typeWithAnnotationsOpt: canDigThroughNullable ? default : currentPointer.ReturnTypeWithAnnotations,
702729
type: canDigThroughNullable ? currentPointer.ReturnTypeWithAnnotations.NullableUnderlyingTypeOrSelf : null,
@@ -707,25 +734,30 @@ private static bool IsTypeLessVisibleThan(TypeSymbol type, Symbol sym, ref HashS
707734
useDefaultType);
708735
if (result is object)
709736
{
737+
next = default;
710738
return result;
711739
}
712740

713-
foreach (var parameter in currentPointer.Parameters)
741+
int i;
742+
for (i = 0; i < currentPointer.ParameterCount - 1; i++)
714743
{
744+
(TypeWithAnnotations nextTypeWithAnnotations, TypeSymbol? nextType) = getNextIterationElements(currentPointer.Parameters[i].TypeWithAnnotations, canDigThroughNullable);
715745
result = VisitType(
716-
typeWithAnnotationsOpt: canDigThroughNullable ? default : parameter.TypeWithAnnotations,
717-
type: canDigThroughNullable ? parameter.TypeWithAnnotations.NullableUnderlyingTypeOrSelf : null,
746+
typeWithAnnotationsOpt: nextTypeWithAnnotations,
747+
type: nextType,
718748
typeWithAnnotationsPredicate,
719749
typePredicate,
720750
arg,
721751
canDigThroughNullable,
722752
useDefaultType);
723753
if (result is object)
724754
{
755+
next = default;
725756
return result;
726757
}
727758
}
728759

760+
next = currentPointer.Parameters[i].TypeWithAnnotations;
729761
return null;
730762
}
731763
}

src/Compilers/CSharp/Test/Emit/Emit/EndToEndTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ public static void Main(string[] args)
227227
}
228228
}
229229

230-
[ConditionalFact(typeof(WindowsOnly))]
230+
[ConditionalFact(typeof(WindowsOrLinuxOnly))]
231231
public void NestedIfStatements()
232232
{
233233
int nestingLevel = (ExecutionConditionUtil.Architecture, ExecutionConditionUtil.Configuration) switch
@@ -273,7 +273,7 @@ static void Main()
273273
}
274274

275275
[WorkItem(42361, "https://github.com/dotnet/roslyn/issues/42361")]
276-
[ConditionalFact(typeof(WindowsOnly))]
276+
[ConditionalFact(typeof(WindowsOrLinuxOnly))]
277277
public void Constraints()
278278
{
279279
int n = (ExecutionConditionUtil.Architecture, ExecutionConditionUtil.Configuration) switch

src/EditorFeatures/CSharpTest/EditAndContinue/CSharpEditAndContinueAnalyzerTests.cs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class CSharpEditAndContinueAnalyzerTests
2828
{
2929
private static readonly IExportProviderFactory s_exportProviderFactoryWithTestActiveStatementSpanTracker =
3030
ExportProviderCache.GetOrCreateExportProviderFactory(TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic
31-
.WithPart(typeof(TestActiveStatementSpanTracker)));
31+
.WithPart(typeof(TestActiveStatementSpanTrackerFactory)));
3232

3333
#region Helpers
3434

@@ -266,7 +266,6 @@ public static void Main()
266266
}
267267
}
268268
";
269-
var analyzer = new CSharpEditAndContinueAnalyzer();
270269

271270
using var workspace = TestWorkspace.CreateCSharp(source1, exportProvider: s_exportProviderFactoryWithTestActiveStatementSpanTracker.CreateExportProvider());
272271
var oldSolution = workspace.CurrentSolution;
@@ -287,7 +286,8 @@ public static void Main()
287286
var oldStatementSyntax = oldSyntaxRoot.FindNode(oldStatementTextSpan);
288287

289288
var baseActiveStatements = ImmutableArray.Create(ActiveStatementsDescription.CreateActiveStatement(ActiveStatementFlags.IsLeafFrame, oldStatementSpan, DocumentId.CreateNewId(ProjectId.CreateNewId())));
290-
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTracker>());
289+
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTrackerFactory>().GetOrCreateActiveStatementSpanTracker());
290+
var analyzer = new CSharpEditAndContinueAnalyzer(spanTracker);
291291

292292
var result = await analyzer.AnalyzeDocumentAsync(oldDocument, baseActiveStatements, newDocument, CancellationToken.None);
293293

@@ -324,7 +324,6 @@ public static void Main()
324324
}
325325
}
326326
";
327-
var analyzer = new CSharpEditAndContinueAnalyzer();
328327

329328
using var workspace = TestWorkspace.CreateCSharp(source1, exportProvider: s_exportProviderFactoryWithTestActiveStatementSpanTracker.CreateExportProvider());
330329
var oldSolution = workspace.CurrentSolution;
@@ -334,7 +333,8 @@ public static void Main()
334333
var newSolution = workspace.CurrentSolution.WithDocumentText(documentId, SourceText.From(source2));
335334

336335
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
337-
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTracker>());
336+
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTrackerFactory>().GetOrCreateActiveStatementSpanTracker());
337+
var analyzer = new CSharpEditAndContinueAnalyzer(spanTracker);
338338

339339
var result = await analyzer.AnalyzeDocumentAsync(oldDocument, baseActiveStatements, newSolution.GetDocument(documentId), CancellationToken.None);
340340

@@ -355,13 +355,13 @@ public static void Main()
355355
}
356356
}
357357
";
358-
var analyzer = new CSharpEditAndContinueAnalyzer();
359358

360359
using var workspace = TestWorkspace.CreateCSharp(source, exportProvider: s_exportProviderFactoryWithTestActiveStatementSpanTracker.CreateExportProvider());
361360
var oldProject = workspace.CurrentSolution.Projects.Single();
362361
var oldDocument = oldProject.Documents.Single();
363362
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
364-
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTracker>());
363+
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTrackerFactory>().GetOrCreateActiveStatementSpanTracker());
364+
var analyzer = new CSharpEditAndContinueAnalyzer(spanTracker);
365365

366366
var result = await analyzer.AnalyzeDocumentAsync(oldDocument, baseActiveStatements, oldDocument, CancellationToken.None);
367367

@@ -391,7 +391,6 @@ public static void Main()
391391
}
392392
}
393393
";
394-
var analyzer = new CSharpEditAndContinueAnalyzer();
395394

396395
using var workspace = TestWorkspace.CreateCSharp(source1, exportProvider: s_exportProviderFactoryWithTestActiveStatementSpanTracker.CreateExportProvider());
397396

@@ -403,7 +402,8 @@ public static void Main()
403402
var newSolution = workspace.CurrentSolution.WithDocumentText(documentId, SourceText.From(source2));
404403

405404
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
406-
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTracker>());
405+
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTrackerFactory>().GetOrCreateActiveStatementSpanTracker());
406+
var analyzer = new CSharpEditAndContinueAnalyzer(spanTracker);
407407

408408
var result = await analyzer.AnalyzeDocumentAsync(oldDocument, baseActiveStatements, newSolution.GetDocument(documentId), CancellationToken.None);
409409

@@ -424,7 +424,6 @@ public static void Main()
424424
}
425425
}
426426
";
427-
var analyzer = new CSharpEditAndContinueAnalyzer();
428427
var experimentalFeatures = new Dictionary<string, string>(); // no experimental features to enable
429428
var experimental = TestOptions.Regular.WithFeatures(experimentalFeatures);
430429

@@ -437,7 +436,8 @@ public static void Main()
437436
var documentId = oldDocument.Id;
438437

439438
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
440-
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTracker>());
439+
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTrackerFactory>().GetOrCreateActiveStatementSpanTracker());
440+
var analyzer = new CSharpEditAndContinueAnalyzer(spanTracker);
441441

442442
var result = await analyzer.AnalyzeDocumentAsync(oldDocument, baseActiveStatements, oldDocument, CancellationToken.None);
443443

@@ -473,7 +473,6 @@ public static void Main()
473473
}
474474
}
475475
";
476-
var analyzer = new CSharpEditAndContinueAnalyzer();
477476

478477
var featuresToEnable = new Dictionary<string, string>() { { feature, "enabled" } };
479478
var experimental = TestOptions.Regular.WithFeatures(featuresToEnable);
@@ -489,7 +488,8 @@ public static void Main()
489488
var newSolution = workspace.CurrentSolution.WithDocumentText(documentId, SourceText.From(source2));
490489

491490
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
492-
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTracker>());
491+
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTrackerFactory>().GetOrCreateActiveStatementSpanTracker());
492+
var analyzer = new CSharpEditAndContinueAnalyzer(spanTracker);
493493

494494
var result = await analyzer.AnalyzeDocumentAsync(oldDocument, baseActiveStatements, newSolution.GetDocument(documentId), CancellationToken.None);
495495

@@ -513,7 +513,6 @@ public static void Main()
513513
}
514514
}
515515
";
516-
var analyzer = new CSharpEditAndContinueAnalyzer();
517516

518517
using var workspace = TestWorkspace.CreateCSharp(source, exportProvider: s_exportProviderFactoryWithTestActiveStatementSpanTracker.CreateExportProvider());
519518

@@ -523,7 +522,8 @@ public static void Main()
523522
var documentId = oldDocument.Id;
524523

525524
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
526-
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTracker>());
525+
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTrackerFactory>().GetOrCreateActiveStatementSpanTracker());
526+
var analyzer = new CSharpEditAndContinueAnalyzer(spanTracker);
527527

528528
var result = await analyzer.AnalyzeDocumentAsync(oldDocument, baseActiveStatements, oldDocument, CancellationToken.None);
529529

@@ -555,7 +555,6 @@ public static void Main()
555555
}
556556
}
557557
";
558-
var analyzer = new CSharpEditAndContinueAnalyzer();
559558

560559
using var workspace = TestWorkspace.CreateCSharp(source1, exportProvider: s_exportProviderFactoryWithTestActiveStatementSpanTracker.CreateExportProvider());
561560

@@ -567,7 +566,8 @@ public static void Main()
567566
var newSolution = workspace.CurrentSolution.WithDocumentText(documentId, SourceText.From(source2));
568567

569568
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
570-
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTracker>());
569+
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTrackerFactory>().GetOrCreateActiveStatementSpanTracker());
570+
var analyzer = new CSharpEditAndContinueAnalyzer(spanTracker);
571571

572572
var result = await analyzer.AnalyzeDocumentAsync(oldDocument, baseActiveStatements, newSolution.GetDocument(documentId), CancellationToken.None);
573573

@@ -599,7 +599,6 @@ public static void Main(Bar x)
599599
}
600600
}
601601
";
602-
var analyzer = new CSharpEditAndContinueAnalyzer();
603602

604603
using var workspace = TestWorkspace.CreateCSharp(source1, exportProvider: s_exportProviderFactoryWithTestActiveStatementSpanTracker.CreateExportProvider());
605604

@@ -611,7 +610,8 @@ public static void Main(Bar x)
611610
var newSolution = workspace.CurrentSolution.WithDocumentText(documentId, SourceText.From(source2));
612611

613612
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
614-
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTracker>());
613+
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTrackerFactory>().GetOrCreateActiveStatementSpanTracker());
614+
var analyzer = new CSharpEditAndContinueAnalyzer(spanTracker);
615615

616616
var result = await analyzer.AnalyzeDocumentAsync(oldDocument, baseActiveStatements, newSolution.GetDocument(documentId), CancellationToken.None);
617617

@@ -642,7 +642,6 @@ public class D
642642
}
643643
}
644644
";
645-
var analyzer = new CSharpEditAndContinueAnalyzer();
646645

647646
using var workspace = TestWorkspace.CreateCSharp(source1, exportProvider: s_exportProviderFactoryWithTestActiveStatementSpanTracker.CreateExportProvider());
648647
// fork the solution to introduce a change
@@ -664,7 +663,8 @@ public class D
664663

665664
var result = new List<DocumentAnalysisResults>();
666665
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
667-
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTracker>());
666+
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTrackerFactory>().GetOrCreateActiveStatementSpanTracker());
667+
var analyzer = new CSharpEditAndContinueAnalyzer(spanTracker);
668668

669669
foreach (var changedDocumentId in changedDocuments)
670670
{
@@ -692,7 +692,6 @@ public static void Main()
692692
";
693693
var source2 = @"
694694
";
695-
var analyzer = new CSharpEditAndContinueAnalyzer();
696695

697696
using var workspace = TestWorkspace.CreateCSharp(source1, exportProvider: s_exportProviderFactoryWithTestActiveStatementSpanTracker.CreateExportProvider());
698697

@@ -714,7 +713,8 @@ public static void Main()
714713

715714
var result = new List<DocumentAnalysisResults>();
716715
var baseActiveStatements = ImmutableArray.Create<ActiveStatement>();
717-
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTracker>());
716+
var spanTracker = Assert.IsType<TestActiveStatementSpanTracker>(workspace.Services.GetRequiredService<IActiveStatementSpanTrackerFactory>().GetOrCreateActiveStatementSpanTracker());
717+
var analyzer = new CSharpEditAndContinueAnalyzer(spanTracker);
718718

719719
foreach (var changedDocumentId in changedDocuments)
720720
{

0 commit comments

Comments
 (0)