Skip to content

Conversation

@jcouv
Copy link
Member

@jcouv jcouv commented May 29, 2025

From discussion with WG, relaxing this restriction allows for greater portability of classic extension methods. But we're keeping the check for members that can't be called with explicit type arguments.
To be confirmed with LDM next week.

New rule: https://github.com/dotnet/csharplang/blob/main/meetings/2025/LDM-2025-06-04.md#extension-declaration-validation

Closes #78472

Relates to test plan #76130

@jcouv jcouv self-assigned this May 29, 2025
@jcouv jcouv added Area-Compilers Feature - Extension Everything The extension everything feature labels May 29, 2025
@jcouv jcouv force-pushed the extensions-inferrability branch from 550cc8e to 8de7718 Compare May 29, 2025 21:26
@jcouv jcouv force-pushed the extensions-inferrability branch from 8de7718 to ace0477 Compare May 29, 2025 21:47
return parameter;
}

static void checkUnderspecifiedGenericExtension(ParameterSymbol parameter, ImmutableArray<TypeParameterSymbol> typeParameters, BindingDiagnosticBag diagnostics)
Copy link
Member Author

@jcouv jcouv May 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 moved this logic to SourceNamedTypeSymbol.AfterMembersCompletedChecks as the added GetMembers call was causing a circularity issue (out-of-date after new LDM decision)

@jcouv jcouv marked this pull request as ready for review May 30, 2025 22:20
@jcouv jcouv requested a review from a team as a code owner May 30, 2025 22:20

void checkUnderspecifiedGenericExtension(ParameterSymbol parameter, ImmutableArray<TypeParameterSymbol> typeParameters, BindingDiagnosticBag diagnostics)
{
if (GetMembers().All((m, a) => m is MethodSymbol { MethodKind: MethodKind.Ordinary }, arg: (object?)null))
Copy link
Contributor

@AlekseyTs AlekseyTs Jun 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All

Is there an overload that doesn't need unused additional argument? Perhaps we have Any instead? #Closed


if (TryGetOrCreateExtensionMarker() is { Parameters: [var extensionParameter] })
{
checkUnderspecifiedGenericExtension(extensionParameter, TypeParameters, diagnostics);
Copy link
Contributor

@AlekseyTs AlekseyTs Jun 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

checkUnderspecifiedGenericExtension

I think that long term it would be better to perform this check per member and report an error per member. For example, once we enable indexers, I can imagine that some indexer declarations (referencing remaining type arguments in their parameters) will be allowed, and others won't be allowed. #Closed


void checkUnderspecifiedGenericExtension(ParameterSymbol parameter, ImmutableArray<TypeParameterSymbol> typeParameters, BindingDiagnosticBag diagnostics)
{
if (GetMembers().All((m, a) => m is MethodSymbol { MethodKind: MethodKind.Ordinary }, arg: (object?)null))
Copy link
Contributor

@AlekseyTs AlekseyTs Jun 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MethodKind.Ordinary

I think operators should be allowed too. At least, consider leaving a comment to follow up, the one that starts with a link to the test plan. Operators are being worked on as we speak. BTW, similar to indexers, I think that some operator declarations would be allowed and other operator declarations wouldn't be allowed. This is even stronger reason to moving to per member check/reporting. #Closed

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The criteria we last discussed in WG is whether it's possible to use the member with explicit type arguments.
So I don't think we'll allow either indexers or operators in non-inferrable extension blocks.

FWIW, here's the update I captured in the spec (to be reviewed in LDM this week):

__Inferrability:__ All the type parameters of an extension block must be used in the receiver type when the extension block
contains a non-method member. 
This makes it always possible to infer the type arguments when applied to a receiver of the given receiver type and
the member doesn't allow explicit type arguments.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do see that in the summary, but, to be honest, I do not remember us having a serious discussion about the criteria to the point that I must have forgotten us deciding on having the restriction. At the same time, from our "Tensors and extension operators" meeting I vaguely remember us expressing a desire to support the following scenario from #78472 (comment):

extension<TTensor, TScalar>(TTensor)
    where TTensor : IReadOnlyTensor<TTensor, TScalar>
    where TScalar : IAdditionOperators<TScalar, TScalar, TScalar>
{
    public static TTensor operator +(TTensor left, TScalar right);
}

Copy link
Contributor

@AlekseyTs AlekseyTs Jun 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here is a link to the specific summary message from Tanner specifically mentioning the following shape as planned for .NET 10:

extension<TTensor, TScalar>(TTensor)
    where TTensor : IReadOnlyTensor<TTensor, TScalar>
    where TScalar : IAdditionOperators<TScalar, TScalar, TScalar>
{
    public static TTensor operator +(TTensor left, TScalar right);
}


var comp = CreateCompilation(src);
comp.VerifyEmitDiagnostics(
// (1,9): error CS9286: 'object' does not contain a definition for 'M' and no accessible extension member 'M' for receiver of type 'object' could be found (are you missing a using directive or an assembly reference?)
Copy link
Contributor

@AlekseyTs AlekseyTs Jun 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

// (1,9): error CS9286: 'object' does not contain a definition for 'M' and no accessible extension member 'M' for receiver of type 'object' could be found (are you missing a using directive or an assembly reference?)

Are we tracking an improvement for diagnostics in this scenarios? #Closed

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, we have a general tracking comment in ResolveExtensions: "// Tracked by #76130 : we'll want to describe what went wrong in a useful way (see OverloadResolutionResult.ReportDiagnostics)"
I'll also add one for this specific test

Diagnostic(ErrorCode.ERR_ExtensionResolutionFailed, "object.M").WithArguments("object", "M").WithLocation(4, 19));

src = """
var x = I.M; // binds to I1.M (method)
Copy link
Contributor

@AlekseyTs AlekseyTs Jun 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

// binds to I1.M (method)

It would be good to observe the fact. This suggestion is applicable to the other three similar comments as well. #Closed

@AlekseyTs
Copy link
Contributor

AlekseyTs commented Jun 2, 2025

Done with review pass (commit 1) #Closed

Julien Couvreur added 2 commits June 2, 2025 17:15
AlekseyTs
AlekseyTs previously approved these changes Jun 3, 2025
Copy link
Contributor

@AlekseyTs AlekseyTs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM (commit 3). However, I personally think that the implemented rule is unnecessarily restrictive. Therefore, I suggest delaying the merge until after June 4th LDM, where I hope we finalize the design.

@jcouv jcouv marked this pull request as draft June 4, 2025 21:13
@jcouv jcouv changed the title Extensions: relax inferrability rule for methods Extensions: relax inferrability rule Jun 5, 2025
@jcouv jcouv requested a review from AlekseyTs June 5, 2025 01:16
@jcouv jcouv dismissed AlekseyTs’s stale review June 5, 2025 01:17

Revised based on LDM decision today

@jcouv jcouv marked this pull request as ready for review June 5, 2025 01:20
parameter.Type.VisitType(collectTypeParameters, arg: usedTypeParameters);
}

foreach (var typeParameter in extension.TypeParameters)
Copy link
Contributor

@AlekseyTs AlekseyTs Jun 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

extension.TypeParameters

Consider adding an early return if we have no type parameters #Closed

extensionParameter.Type.VisitType(collectTypeParameters, arg: usedTypeParameters);
foreach (var parameter in parameters)
{
parameter.Type.VisitType(collectTypeParameters, arg: usedTypeParameters);
Copy link
Contributor

@AlekseyTs AlekseyTs Jun 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

parameter.Type.VisitType(collectTypeParameters, arg: usedTypeParameters);

Consider breaking out early if we already recorded extension.TypeParameters.Length type parameters. #Closed

}

var usedTypeParameters = PooledHashSet<TypeParameterSymbol>.GetInstance();
extensionParameter.Type.VisitType(collectTypeParameters, arg: usedTypeParameters);
Copy link
Contributor

@AlekseyTs AlekseyTs Jun 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

extensionParameter.Type.VisitType(collectTypeParameters, arg: usedTypeParameters);

Consider returning early if we already recorded extension.TypeParameters.Length type parameters after this. #Closed

}

var usedTypeParameters = PooledHashSet<TypeParameterSymbol>.GetInstance();
extensionParameter.Type.VisitType(collectTypeParameters, arg: usedTypeParameters);
Copy link
Contributor

@AlekseyTs AlekseyTs Jun 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

extensionParameter.Type.VisitType(collectTypeParameters, arg: usedTypeParameters);

It feels unfortunate that we have to repeat this for every member. #Closed

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed. I could leave an follow-up comment in "optimization/MQ" bucket, but I think I'm fine to leave as-is

@AlekseyTs
Copy link
Contributor

AlekseyTs commented Jun 5, 2025

Done with review pass (commit 5) #Closed

@jaredpar
Copy link
Member

jaredpar commented Jun 5, 2025

@333fred second reviewer


/// <summary>
/// For the type representing an extension declaration, returns the receiver parameter symbol.
/// Note: this may be null even if <see cref="IsExtension"/> is true, in error cases.
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 I'd already added that comment to the corresponding public API, but it seems useful here too

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Think you should add some remarks to indicate that it will not be null in the case of extension(SomeType), just an unnamed parameter.

parameter.Type.VisitType(collectTypeParameters, arg: usedTypeParameters);
}

if (usedTypeParameters.Count == extensionArity && extensionMemberArity == 0)
Copy link
Contributor

@AlekseyTs AlekseyTs Jun 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if (usedTypeParameters.Count == extensionArity && extensionMemberArity == 0)

I was actually suggesting to do this inside the loop. #Closed

Copy link
Contributor

@AlekseyTs AlekseyTs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM (commit 6), with an optimization suggestion #78758 (review)

@jcouv
Copy link
Member Author

jcouv commented Jun 5, 2025

@333fred for second review. Thanks

return;
}

var usedTypeParameters = PooledHashSet<TypeParameterSymbol>.GetInstance();
Copy link
Member

@333fred 333fred Jun 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this need some kind of comparison flags? Do we have tests where the type parameter differs by nullability? #Resolved

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this need some kind of comparison flags? Do we have tests where the type parameter differs by nullability?

We are dealing with declarations, therefore, we don't need to worry about any substitution/alpha renaming going on.


/// <summary>
/// For the type representing an extension declaration, returns the receiver parameter symbol.
/// Note: this may be null even if <see cref="IsExtension"/> is true, in error cases.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Think you should add some remarks to indicate that it will not be null in the case of extension(SomeType), just an unnamed parameter.

</data>
<data name="ERR_UnderspecifiedExtension" xml:space="preserve">
<value>The extended type '{0}' must reference all the type parameters declared by the extension, but type parameter '{1}' is not referenced.</value>
<value>Every type parameter from the extension block must be referenced by the extension parameter or a parameter of this member. But type parameter `{0}` is not referenced.</value>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is far too wordy.

Suggested change
<value>Every type parameter from the extension block must be referenced by the extension parameter or a parameter of this member. But type parameter `{0}` is not referenced.</value>
<value>The type parameter `{0}` is not referenced by either the extension parameter or a parameter of this member.</value>

@jcouv jcouv requested a review from 333fred June 6, 2025 14:02
@jcouv jcouv enabled auto-merge (squash) June 6, 2025 17:59
@jcouv jcouv merged commit df87e95 into dotnet:main Jun 6, 2025
23 of 24 checks passed
@dotnet-policy-service dotnet-policy-service bot added this to the Next milestone Jun 6, 2025
333fred added a commit that referenced this pull request Jun 17, 2025
* Simpli

* Simplify

* Simplify

* docs

* docs

* Clear

* Update src/Workspaces/Core/Portable/FindSymbols/Shared/AbstractSyntaxIndex_Persistence.cs

* Remove method

* Fix ILBuilder visualization (#78764)

Turns out that we do have visualization of in-progress IL building, but it's been broken since 2020, when we renamed Roslyn.Test.Utilities to Microsoft.CodeAnalysis.Test.Utilities. It was then further broken by the change a few months ago to pass IL visualization formats along. This gets the debugger display working again.

* Remove EditorFeaturesWpf TestComposition (#78769)

After the EditorFeatures.WPF => EditorFeatures refactoring, this TestComposition became equivalent to the EditorFeatures one, so just removing the WPF one.

* Fix renames across different extensions

* Add docs

* Add docs

* Update src/VisualStudio/Core/Def/PackageRegistration.pkgdef

* Explicitly reset

* Reset state

* Add docs

* Simplify

* Revert

* Simplify

* Simplify

* Docs

* Update src/VisualStudio/Core/Def/Commands.vsct

Co-authored-by: David Barbet <dibarbet@gmail.com>

* Update src/VisualStudio/Core/Impl/SolutionExplorer/SymbolTree/SymbolItemContextMenuController.cs

Co-authored-by: David Barbet <dibarbet@gmail.com>

* Simplify

* Simplify

* multi notify

* only if it changed

* Don't move backwards

* Docs

* Update src/VisualStudio/Core/Impl/SolutionExplorer/SymbolTree/SymbolTreeChildCollection.cs

* Ensure sln load uses project absolute paths

* lint

* Rename field to make it clearer what it's used for

It's only for dynamic files, so make that clear.

* Don't refresh dynamic files under a lock

When we were getting the notification of a dynamic file being changed,
we were taking the project and workspace locks before fetching the
actual content. This is really expensive now that the fetching itself
might not be instant.

Fundamentally this change is just switching the work to acquire the
locks to get the setup info, then releasing the locks and calling the
provider to get the info. I'm putting this around a batching queue so
we can deduplicate lots of events at once, and also to ensure ordering
so if we were to try refreshing the document more than once we don't
end up in a case where we have two threads trying to put different
versions of the document into the workspace and getting the ordering
wrong.

Fixes #78734

* Fix cast before we unsubscribe

This was otherwise throwing an exception every shutdown.

* Adjust implementation to respect diagnostic flag and update tests

* Remove workarounds for bugs that have been fixed

Closes #77995

* Remove a workaround we had for an old version of Copilot

This bug was fixed a long time ago.

* Switch return to continue

* Fixed multi-variable declaration support in RemoveUnnecessarySuppressions.

* Removed whitespace.

Co-authored-by: DoctorKrolic <70431552+DoctorKrolic@users.noreply.github.com>

* Simplified TestRemoveDiagnosticSuppression_Attribute_MultiVariableDeclaration with inline data.

* Expanded remove unnecessary suppression tests, removed unnecessary loop and fixed partial method/property support in AbstractRemoveUnnecessaryInlineSuppressionsDiagnosticAnalyzer.

* Directly create virtual project when dotnet run-api is missing for now

* Avoid dereferencing null CheckConstraintsArgs.CurrentCompilation (#78729)

Fixes #78430.

* Updates to unblock dartlab pipeline (#78793)

* update timeout

* wip

* Add main to main-vs-deps flow (#78798)

* Create branch-merge2.jsonc

* Update main-merge.yml

* Rename branch-merge2.jsonc to branch-merge-2.jsonc

* Update PublishData.json

* Update and rename branch-merge.jsonc to main-to-main-vs-deps-branch-merge.jsonc

* feedbacl

* make clear main is for validation

* EnC: Simplify diagnostic reporting (#78708)

* Refactoring of extension methods in source packages (#78620)

* Change namespace of OneOrMany and TemporaryArray to MS.CA.Collections

* Cleanup Enumerable and ImmutableArray extensions

* Update imports/usings

* Fix VB remove-imports not showing up

* add the schedule back to main-merge (#78807)

* Fix LSP references for using alias

* Clean up HasDuplicates extension method (#78808)

* Extensions: Do not consider extension block methods as entry points, consider their implementation methods instead (#78667)

* Decouple EditorFeatures.Test.Utilities from VS services

Microsoft.CodeAnalysis.EditorFeatures.Test.Utilities depended on
Microsoft.VisualStudio.Editor which brought along various VS layer
services. Further, we had some stub implementations of those VS services
there. Digging into this this coupling wasn't really necessary:

1. There were EditorFeatures tests using the editor adapters stub,
   but those tests pass just fine without it, so that was easy to
   move to the VS specific tests.
2. StubVsServiceExporters didn't appear to be used either, so unsure
   why those were in this layer at all. Those were also moved.
3. We had implementations of some settings services, which it's easier
   to just delete and remove the options persister from the composition
   in the first place. This also better ensures that we don't have
   code that might try creating registry keys from ILocalRegistry
   which we absolutely don't want.

* Extensions: mark skeleton type with 'specialname' (#78690)

* Fix await completion in an async iterator

* Extensions: fix lowering of implicit conversion on receiver in pattern-based scenarios (#78685)

* Add test

* Find metadata reference for alias

* Add a fallback path when launching the BuildHost

* refactor

* Added notes to update GetBuildHostPath if packaging changes

* Update comments

* Add heuristic for the loaded from nuget package scenario

* Fix corruption of sliding text window when trying to peek backwards.  (#78774)

Co-authored-by: Fred Silberberg <fred@silberberg.xyz>

* Track changed text instead of clearing immediate window.

* EnC: Partial solution updates (#78744)

* Restore some parts of the progression api some legacy components (like codemap) use.

* Remove unused internal APIs

* Remove unused internal APIs

* Remove unused internal APIs

* Remove unused internal APIs

* Make static

* Simplify

* Avoid ignored directive errors in disabled regions (#78158)

* Extensions: use specific tracking issues for different areas (#78834)

* Extensions: relax inferrability rule (#78758)

* Remove blank line output from the node writer proportional to the number of non-abstract nodes (#78844)

* Revert "Refactoring of extension methods in source packages (#78620)" (#78850)

This reverts commit 917401d, broke typescript

* Switch off of mutlidictionary (#78851)

This is from ICSharpCompiler, and is therefore causing unnecessary dll loads.

* Switch behavior of "Go to definition" and "Go to implementation" for partial members

* Fix LSP tests

* Fix peek test

* Switch to existing helpers for multi-dictionary use

* call TryGetValue to get dictionary entry (#78863)

* Remove more progression code

* Remove more progression code

* Remove more progression code

* Remove more progression code

* Remove more progression code

* Remove more progression code

* Remove more progression code

* Remove more progression code

* Add VSTypeScriptAsynchronousTaggerProvider2 for TypeScript that avoids TemporaryArray (#78866)

* Remove more progression code

* Remove more progression code

* Remove more progression code

* Remove more progression code

* Fix build break (#78870)

* Add more ETW events to trace assembly loading (#78840)

* Add more ETW events to trace assembly loading

* Update src/Compilers/Core/Portable/CodeAnalysisEventSource.Common.cs

Co-authored-by: Joey Robichaud <joseph.robichaud@microsoft.com>

* Put correct alc reference

* Use binary literals

---------

Co-authored-by: Joey Robichaud <joseph.robichaud@microsoft.com>

* Introduce EA layer for TS to integrate with classification

* Simplify

* Add CommandLineResource API (#78679)

* Revert "Revert "Refactoring of extension methods in source packages (#78620)" (#78850)"

This reverts commit e083be9.

* Fix

* Revert "Fix"

This reverts commit 574935d.

* Revert "Revert "Revert "Refactoring of extension methods in source packages (#78620)" (#78850)""

This reverts commit 27ae586.

* Lint

* Remove all progression code

* Revert

* remove code

* Fix

* Reduce allocations under ContextMutableIntervalTree (#78885)

There are some closure allocations unnecessarilly happening during ContextMutableIntervalTree construction. Simply changed a couple methods to static and added a parameter for the extra bit of data they need to get rid of those allocations.

This is a very small improvement, only about 0.1% (6 MB) of allocations during typing in the razor speedometer test.

* Reduce allocations in the ImageElementConverter and ImageIdConverter Read methods (#78881)

* Reduce allocations in the ImageElementConverter and ImageIdConverter Read methods

These methods show up in the typing scenario in the razor speedometer test as about 0.9% (63 MB) of allocations.

1) Changed ImageIdConverter to be more like ImageElementConverter and not create a JsonDocument object to query
2) Changed several Utf8JsonReader.GetText calls to instead use Utf8JsonReader.CopyString
3) Changed JsonElement.GetString and new Guid(...) to instead use Utf8JsonReader.GetGuid()

Note that if this PR is merged, I'll also try to make a change to vslanguageserverclient to also do the same as that code has the same issues.

* Fix issue serializing null options in VB

* Yield in task continuation to prevent stack overflow

* Move to .NET 10 Preview 5

* Remove RemoteControl workaround

* Lint response

* Lint response

* Lint response

* Lint response

* Lint response

* Fix issue with not resetting valueLength (#78890)

* Fix issue with not resetting valueLength

#78881 was just merged with a small bug, in that valueLength wasn't reset before it was used a second time. If the typeName is > 64 chars, then this would have thrown a different exception than it should have down a couple lines.

* remove unused method

* Lint response

* Lint response

* fix compiler side

* Simplify workspace hookup in syntactic tagger

* Move

* Switch to ITextBuffer2

* REvert

* REvert

* Update src/EditorFeatures/Core/InlineDiagnostics/AbstractDiagnosticsTaggerProvider.cs

* Update src/EditorFeatures/Core/StringIndentation/StringIndentationTaggerProvider.cs

* Update src/EditorFeatures/Core/Tagging/AsynchronousViewportTaggerProvider.cs

* REvert

* remove more workspace registration code

* Move to .NET 10 Preview 5 (#78906)

* Move to .NET 10 Preview 5

* Lint response

* Lint response

* Lint response

* Lint response

* Lint response

* remove unused method

* Lint response

* Lint response

* fix compiler side

* more

---------

Co-authored-by: Cyrus Najmabadi <cyrus.najmabadi@gmail.com>

* Fix

* Inline Hints - do not allow double click for collection expression type hint (#78900)

* do not allow double click for collection expression hint

* Update src/EditorFeatures/Test2/InlineHints/CSharpInlineTypeHintsTests.vb

Co-authored-by: Cyrus Najmabadi <cyrus.najmabadi@gmail.com>

* comment

---------

Co-authored-by: Cyrus Najmabadi <cyrus.najmabadi@gmail.com>

* Add tests

* Revert "Update code to use null propagation (#78733)"

This reverts commit d785549, reversing
changes made to a8808be.

* Revert "Move to .NET 10 Preview 5 (#78906)"

This reverts commit a7fa681.

* fix warning

* Revert "Update to using unbound nameof(X<>) expressions (#78731)"

This reverts commit 6a09280, reversing
changes made to a7fa681.

* Revert "Update to using simple untyped lambdas (#78732)"

This reverts commit a8808be, reversing
changes made to 6a09280.

* Fix OOP crash issue with copilot change analysis

* Re-enable IDE0051 (#78919)

This re-enables the unused member analyzer and removes all of the
methods it flagged as unused.

* Extensions: address some follow-up comments (#78847)

* Pass missing Hot Reload result properties (#78929)

* Fix deadlock if an MSBuild task is writing to stdout

When we switched over to communicating over a named pipe rather than
stdin/stdout, we were still redirecting stdin and stdout. This had
the side effect that if a build task was directly writing to standard
out, the build would eventually deadlock since we weren't reading from
the other side.

I thought about simply not redirecting stdin/stdout, but I could imagine
other problems might come up if we were to have multiple build hosts
trying to share stdin/stdout. So now we'll log stdout the same way
we log stderr, and explicitly close stdin so readers won't deadlock
waiting for input.

Fixes #78766

* Revert

* Collect stats

* Extensions: allow cref references to extension members (#78735)

* Fix scoped variance checks involving ref struct interface implementation (#78883)

* Remove now unused Progression references and related hacks

* Expose a couple of things to Razor

* Remove more unneeded references

* Obsolete api

* [main] Source code updates from dotnet/dotnet (#78805)

* [VMR] Codeflow a528f84-a528f84

[[ commit created by automation ]]

* Update dependencies from https://github.com/dotnet/dotnet build 270315
No dependency updates to commit

* [VMR] Codeflow f5faea9-f5faea9

[[ commit created by automation ]]

* Update dependencies from https://github.com/dotnet/dotnet build 270450
No dependency updates to commit

* Update dependencies from https://github.com/dotnet/dotnet build 270603
No dependency updates to commit

* Update dependencies from https://github.com/dotnet/dotnet build 270662
No dependency updates to commit

* [VMR] Codeflow 86826d3-86826d3

[[ commit created by automation ]]

* Update dependencies from https://github.com/dotnet/dotnet build 271018
No dependency updates to commit

* [VMR] Codeflow 32a2620-32a2620

[[ commit created by automation ]]

* Update dependencies from https://github.com/dotnet/dotnet build 271181
No dependency updates to commit

* [VMR] Codeflow 25357a9-25357a9

[[ commit created by automation ]]

* Update dependencies from https://github.com/dotnet/dotnet build 271343
No dependency updates to commit

* Update dependencies from https://github.com/dotnet/dotnet build 271417
No dependency updates to commit

* Revert incorrect Roslyn.sln changes

---------

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: Viktor Hofer <viktor.hofer@microsoft.com>

* Code simplification

* Specify single reducer

* Simplify

* Add test

* Only add annotations to potential references

* :Extract type

* Docs

* move up

* Expose `IsIterator` as a public API (#78813)

* Expose `IsIterator` as a public API

* Fix workspace generated method symbol implementation

* Implement new property in yet another non-compiler-owned method symbol implementation

* SemanticSearch.ReferenceAssemblies

* Verify public code path in C#

* Add negative tests

* Add C# local function tests

* Test VB lambda iterators

* Revert accessibility change

* Disable warnings

* Use explicit type

* Simplify lambda tests

* Test interface property

* Add additional VB case

* Update enum values

* PR Feedback

---------

Co-authored-by: Cyrus Najmabadi <cyrusn@microsoft.com>
Co-authored-by: Cyrus Najmabadi <cyrus.najmabadi@gmail.com>
Co-authored-by: Todd Grunke <toddgrun@microsoft.com>
Co-authored-by: David Barbet <dibarbet@gmail.com>
Co-authored-by: David Barbet <dabarbet@microsoft.com>
Co-authored-by: Jason Malinowski <jason.malinowski@microsoft.com>
Co-authored-by: John Douglas Leitch <JohnLeitch@outlook.com>
Co-authored-by: DoctorKrolic <70431552+DoctorKrolic@users.noreply.github.com>
Co-authored-by: Rikki Gibson <rigibson@microsoft.com>
Co-authored-by: AlekseyTs <AlekseyTs@users.noreply.github.com>
Co-authored-by: Ankita Khera <40616383+akhera99@users.noreply.github.com>
Co-authored-by: Tomáš Matoušek <tmat@users.noreply.github.com>
Co-authored-by: Julien Couvreur <julien.couvreur@gmail.com>
Co-authored-by: Joey Robichaud <jorobich@microsoft.com>
Co-authored-by: Jan Jones <janjones@microsoft.com>
Co-authored-by: DoctorKrolic <mapmyp03@gmail.com>
Co-authored-by: Chris Sienkiewicz <chsienki@microsoft.com>
Co-authored-by: Joey Robichaud <joseph.robichaud@microsoft.com>
Co-authored-by: tmat <tomas.matousek@microsoft.com>
Co-authored-by: Jared Parsons <jared@paranoidcoding.org>
Co-authored-by: David Wengier <david.wengier@microsoft.com>
Co-authored-by: dotnet-maestro[bot] <42748379+dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: Viktor Hofer <viktor.hofer@microsoft.com>
@RikkiGibson RikkiGibson modified the milestones: Next, 18.0 P1 Aug 19, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Area-Compilers Feature - Extension Everything The extension everything feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fail to compile C# 14.0 extension with interface constraint using implicit additional type parameters

5 participants