Skip to content

Extensions: pattern-based constructs #78480

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
May 14, 2025
Merged

Extensions: pattern-based constructs #78480

merged 11 commits into from
May 14, 2025

Conversation

jcouv
Copy link
Member

@jcouv jcouv commented May 7, 2025

This is mostly a test-focused PR which aims to:

  1. validate pattern-based constructs and address problems with those,
  2. address some low-hanging follow-up comments that just need testing.

The product changes are:

  1. block delegate-returning properties in the few scenarios where they accidentally got allowed (for instance, GetEnumerator, MoveNext, Add, ...) to match the behavior of instance members
  2. minor change to handle the extension parameter in ref analysis of positional patterns
  3. adjust an error message
  4. add implicit conversion on receiver in some scenarios

Coverage

Out-of scope for this PR

  • collection/dictionary expressions (need to discuss spec first).
  • dictionary initializer: new C() { [0] = ... }
  • Index/Range indexers in list/spread patterns

Scenarios where extension methods play

  • GetEnumerator/GetAsyncEnumerator in foreach (Nullability_ForEach_01)
  • Deconstruct in deconstruction, in positional pattern and foreach (Nullability_Deconstruct_xx, Nullability_PositionalPattern_xx, Nullability_ForeachDeconstruct_xx)
  • Add in collection initializers (see ExtensionMemberLookup_CollectionInitializer_NoMethod, Nullability_CollectionInitializer_01)
  • GetPinnableReference in fixed (see Nullability_Fixed_01)
  • GetAwaiter in await (see Nullability_Await_GetAwaiter_01)

Scenarios where extension methods don't play

  • Dispose/DisposeAsync in using and foreach (see ExtensionMemberLookup_PatternBased_Dispose_RefStruct, ExtensionMemberLookup_PatternBased_Dispose_Async_NoMethod, TestPatternBasedDisposal_ExtensionMethod, TODO test in foreach)
  • MoveNext/MoveNextAsync in foreach (see TestMoveNextPatternViaExtensions_OnInstanceGetEnumerator, InstanceMethodInvocation_PatternBased_ForEach_MoveNext, TestMoveNextAsyncPatternViaExtensions_01)
  • Slice and int indexers in implicit indexers and list-patterns (see ExtensionMemberLookup_PatternBased_RangeIndexer_..., ExtensionMemberLookup_PatternBased_IndexIndexer_..., ExtensionMemberLookup_PatternBased_ListPattern_...
  • GetResult in await (see ExtensionMemberLookup_PatternBased_Await_ExtensionGetResult)

Scenarios where extension properties play

  • object initializer: new C() { ExtensionProperty = ... } (see ExtensionMemberLookup_ObjectInitializer, Nullability_ObjectInitializer_01, Nullability_ObjectInitializer_02)
  • with: x with { ExtensionProperty = ... } (see ExtensionMemberLookup_With, Nullability_With_xx)
  • property patterns: x is { ExtensionProperty: ... } (see ExtensionMemberLookup_Patterns, ExtensionMemberLookup_Patterns_ExtendedPropertyPattern)

Scenarios where extension properties don't play

  • Current in foreach (see InstanceMethodInvocation_PatternBased_ForEach_Current)
  • IsCompleted in await (see ExtensionMemberLookup_PatternBased_Await_ExtensionIsCompleted)
  • Count/Length properties and indexers in list/spread pattern (see ExtensionMemberLookup_PatternBased_SpreadPattern_..., ExtensionMemberLookup_PatternBased_ListPattern_...)
  • Count/Length properties and indexers in implicit indexers (see ExtensionMemberLookup_PatternBased_IndexIndexer_..., ExtensionMemberLookup_PatternBased_RangeIndexer_...)

Relates to test plan #76130

@jcouv jcouv self-assigned this May 7, 2025
@jcouv jcouv added Area-Compilers Feature - Extension Everything The extension everything feature labels May 7, 2025
@ghost ghost added the untriaged Issues and PRs which have not yet been triaged by a lead label May 7, 2025
@@ -683,7 +683,7 @@ private BoundExpression MakeDeconstructInvocationExpression(
// This prevents, for example, an unused params parameter after the out parameters.
var deconstructMethod = ((BoundCall)result).Method;
var parameters = deconstructMethod.Parameters;
for (int i = (deconstructMethod.IsExtensionMethod ? 1 : 0); i < parameters.Length; i++) // Tracked by https://github.com/dotnet/roslyn/issues/76130: Test this code path with new extensions
Copy link
Member Author

Choose a reason for hiding this comment

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

📝 Covered by Deconstruct_01 and Deconstruct_02

@@ -1058,7 +1058,7 @@ deconstructMethod is null &&
if (deconstructMethod is null)
hasErrors = true;

int skippedExtensionParameters = deconstructMethod?.IsExtensionMethod == true ? 1 : 0; // Tracked by https://github.com/dotnet/roslyn/issues/76130: Test this code path with new extensions
int skippedExtensionParameters = deconstructMethod?.IsExtensionMethod == true ? 1 : 0;
Copy link
Member Author

Choose a reason for hiding this comment

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

📝 Covered by PositionalPattern_01

{
return method.Parameters is [{ } firstParameter, ..] ? firstParameter : null;
}
else if (method.GetIsNewExtensionMember())
Copy link
Member Author

Choose a reason for hiding this comment

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

📝 Covered by Deconstruction_UnscopedRef_ExtensionMethod and Deconstruction_ScopedRef_ExtensionMethod

@@ -652,7 +652,7 @@ private void MakeExplicitParameterTypeInferences(Binder binder, BoundExpression
}
else if (IsUnfixedTypeParameter(target) && !target.NullableAnnotation.IsAnnotated() && kind is ExactOrBoundsKind.LowerBound)
{
var ordinal = GetOrdinal((TypeParameterSymbol)target.Type); // Tracked by https://github.com/dotnet/roslyn/issues/76130 : test nullability scenario where the override of ordinals matters
Copy link
Member Author

Choose a reason for hiding this comment

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

📝 Covered by Nullability_Method_04

@jcouv
Copy link
Member Author

jcouv commented May 7, 2025

public void InstanceMethodInvocation_PatternBased_ForEach_MoveNext()

📝 the test was split (one now focuses on MoveNext() and the other focuses on Current)


Refers to: src/Compilers/CSharp/Test/Emit3/Semantics/ExtensionTests.cs:12760 in 11f86e6. [](commit_id = 11f86e6, deletion_comment = False)

@jcouv jcouv force-pushed the extensions-init branch from 11f86e6 to 107b608 Compare May 8, 2025 21:00
@jcouv jcouv force-pushed the extensions-init branch from 107b608 to 75aa581 Compare May 8, 2025 23:08
@jcouv jcouv changed the title Extensions: validate pattern-based constructs Extensions: pattern-based constructs May 9, 2025
@jcouv jcouv marked this pull request as ready for review May 9, 2025 00:36
@jcouv jcouv requested a review from a team as a code owner May 9, 2025 00:36
{
return method.Parameters is [{ } firstParameter, ..] ? firstParameter : null;
}
else if (method.GetIsNewExtensionMember())
{
return method.ContainingType.ExtensionParameter;
Copy link
Contributor

@AlekseyTs AlekseyTs May 9, 2025

Choose a reason for hiding this comment

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

return method.ContainingType.ExtensionParameter;

It is not clear why do we want to have this parameter at all. How does this align with the language spec? #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.

I'm not sure I understand the question.
From a ref analysis perspective, it should be equivalent to deconstruct via invocation, deconstruction or recursive pattern. So all three need to account for scoped on the receiver parameter. Here's we're looking at a skeleton signature, so this is the parameter we need to check for presence or absence of scoped. See Deconstruction_ScopedRef_ExtensionMethod.
I can adjust the name of the local function (maybe "tryGetReceiverParameter") if that's what bothers you.

@@ -431,6 +431,23 @@ public BoundExpression AssignmentExpression(BoundExpression left, BoundExpressio
return AssignmentExpression(Syntax, left, right, isRef: isRef, wasCompilerGenerated: true);
}

public BoundExpression ConvertReceiverForExtensionMemberIfNeeded(Symbol member, BoundExpression receiver)
{
if (member.GetIsNewExtensionMember())
Copy link
Contributor

@AlekseyTs AlekseyTs May 9, 2025

Choose a reason for hiding this comment

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

member

Should we check !IsStatic? #Closed

@@ -698,9 +698,11 @@ private BoundExpression MakeObjectInitializerMemberAccess(
#if DEBUG
var discardedUseSiteInfo = CompoundUseSiteInfo<AssemblySymbol>.Discarded;
Debug.Assert(_compilation.Conversions.ClassifyConversionFromType(rewrittenReceiver.Type, memberSymbol.ContainingType, isChecked: false, ref discardedUseSiteInfo).IsImplicit ||
(memberSymbol.GetIsNewExtensionMember() && _compilation.Conversions.ClassifyConversionFromType(rewrittenReceiver.Type, memberSymbol.ContainingType.ExtensionParameter!.Type, isChecked: false, ref discardedUseSiteInfo).IsImplicit) ||
Copy link
Contributor

@AlekseyTs AlekseyTs May 9, 2025

Choose a reason for hiding this comment

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

compilation.Conversions.ClassifyConversionFromType

Could we use IsValidExtensionMethodThisArgConversion instead? #Closed

@@ -698,9 +698,11 @@ private BoundExpression MakeObjectInitializerMemberAccess(
#if DEBUG
var discardedUseSiteInfo = CompoundUseSiteInfo<AssemblySymbol>.Discarded;
Debug.Assert(_compilation.Conversions.ClassifyConversionFromType(rewrittenReceiver.Type, memberSymbol.ContainingType, isChecked: false, ref discardedUseSiteInfo).IsImplicit ||
(memberSymbol.GetIsNewExtensionMember() && _compilation.Conversions.ClassifyConversionFromType(rewrittenReceiver.Type, memberSymbol.ContainingType.ExtensionParameter!.Type, isChecked: false, ref discardedUseSiteInfo).IsImplicit) ||
Copy link
Contributor

@AlekseyTs AlekseyTs May 9, 2025

Choose a reason for hiding this comment

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

memberSymbol

Is the member supposed to be an instance member? #Closed

""";
var comp = CreateCompilation(source);
CompileAndVerify(comp, expectedOutput: "True ran ran2").VerifyDiagnostics();
}}
Copy link
Member

@jjonescz jjonescz May 13, 2025

Choose a reason for hiding this comment

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

formatting

Suggested change
}}
}
}
``` #Resolved

// foreach (var i in new C())
Diagnostic(ErrorCode.ERR_BadGetEnumerator, "new C()").WithArguments("C.Enumerator", "C.GetEnumerator()").WithLocation(6, 27)
);
}
Copy link
Member

@jjonescz jjonescz May 13, 2025

Choose a reason for hiding this comment

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

If the intention is to test all patterns including those that don't work, consider testing also Lock pattern (https://github.com/dotnet/csharplang/blob/main/proposals/csharp-13.0/lock-object.md) #Pending

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'll add a test for new Lock, but I'm not planning to cover all well-known APIs that the compiler uses ;-) Those won't be subject to extensions (they are not today).

@@ -876,6 +876,360 @@ public CompilerLoweringPreserveAttribute() { }
}
""";

#region A string containing expression-tree dumping utilities
protected const string ExpressionTestLibrary = """
Copy link
Member

@jjonescz jjonescz May 13, 2025

Choose a reason for hiding this comment

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

Consider making this static readonly instead of const to avoid duplicating the string in each DLL. See #74307 #Resolved

@@ -752,7 +752,6 @@ class extension
}
EOF();

// Tracked by https://github.com/dotnet/roslyn/issues/76130 : report error for declaring type named "extension"
Copy link
Contributor

@AlekseyTs AlekseyTs May 13, 2025

Choose a reason for hiding this comment

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

// Tracked by #76130 : report error for declaring type named "extension"

Has this been addressed? #Resolved

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, this was done in a previous PR, but this comment was missed.


    [Fact]
    public void ReservedTypeName_01()
    {
        string source = """
using extension = int;
class extension { }
class C<extension> { }
""";

        var comp = CreateCompilation(source, parseOptions: TestOptions.Regular13);
        comp.VerifyEmitDiagnostics(
            // (1,1): hidden CS8019: Unnecessary using directive.
            // using extension = int;
            Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using extension = int;").WithLocation(1, 1),
            // (1,7): warning CS8981: The type name 'extension' only contains lower-cased ascii characters. Such names may become reserved for the language.
            // using extension = int;
            Diagnostic(ErrorCode.WRN_LowerCaseTypeName, "extension").WithArguments("extension").WithLocation(1, 7),
            // (2,7): warning CS8981: The type name 'extension' only contains lower-cased ascii characters. Such names may become reserved for the language.
            // class extension { }
            Diagnostic(ErrorCode.WRN_LowerCaseTypeName, "extension").WithArguments("extension").WithLocation(2, 7),
            // (3,9): warning CS8981: The type name 'extension' only contains lower-cased ascii characters. Such names may become reserved for the language.
            // class C<extension> { }
            Diagnostic(ErrorCode.WRN_LowerCaseTypeName, "extension").WithArguments("extension").WithLocation(3, 9));

        comp = CreateCompilation(source, parseOptions: TestOptions.RegularNext);
        comp.VerifyEmitDiagnostics(
            // (1,7): error CS9306: Types and aliases cannot be named 'extension'.
            // using extension = int;
            Diagnostic(ErrorCode.ERR_ExtensionTypeNameDisallowed, "extension").WithLocation(1, 7),
            // (2,7): error CS9306: Types and aliases cannot be named 'extension'.
            // class extension { }
            Diagnostic(ErrorCode.ERR_ExtensionTypeNameDisallowed, "extension").WithLocation(2, 7),
            // (3,9): error CS9306: Types and aliases cannot be named 'extension'.
            // class C<extension> { }
            Diagnostic(ErrorCode.ERR_ExtensionTypeNameDisallowed, "extension").WithLocation(3, 9));

        comp = CreateCompilation(source);
        comp.VerifyEmitDiagnostics(
            // (1,7): error CS9306: Types and aliases cannot be named 'extension'.
            // using extension = int;
            Diagnostic(ErrorCode.ERR_ExtensionTypeNameDisallowed, "extension").WithLocation(1, 7),
            // (2,7): error CS9306: Types and aliases cannot be named 'extension'.
            // class extension { }
            Diagnostic(ErrorCode.ERR_ExtensionTypeNameDisallowed, "extension").WithLocation(2, 7),
            // (3,9): error CS9306: Types and aliases cannot be named 'extension'.
            // class C<extension> { }
            Diagnostic(ErrorCode.ERR_ExtensionTypeNameDisallowed, "extension").WithLocation(3, 9));
    }

@@ -356,7 +357,7 @@ private BoundExpression BindInvocationExpression(
ignoreNormalFormIfHasValidParamsParameter: ignoreNormalFormIfHasValidParamsParameter,
disallowExpandedNonArrayParams: disallowExpandedNonArrayParams,
anyApplicableCandidates: out _,
acceptOnlyMethods: false);
acceptOnlyMethods: acceptOnlyMethods);
Copy link
Contributor

@AlekseyTs AlekseyTs May 13, 2025

Choose a reason for hiding this comment

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

acceptOnlyMethods: acceptOnlyMethods);

Are we testing all call sites that pass true? #Closed

@AlekseyTs
Copy link
Contributor

AlekseyTs commented May 13, 2025

public void ExtensionMemberLookup_PatternBased_Fixed_NoApplicableMethod()

Is the "NoApplicableMethod" suffix still accurate? #Resolved


Refers to: src/Compilers/CSharp/Test/Emit3/Semantics/ExtensionTests.cs:21063 in b6cc211. [](commit_id = b6cc211, deletion_comment = False)

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 7)

@jcouv jcouv requested a review from jjonescz May 13, 2025 17:15
@jcouv jcouv enabled auto-merge (squash) May 14, 2025 05:27
@jcouv jcouv merged commit f95c92c into dotnet:main May 14, 2025
23 of 24 checks passed
@dotnet-policy-service dotnet-policy-service bot added this to the Next milestone May 14, 2025
333fred added a commit that referenced this pull request May 29, 2025
* Add XML Solution (SLNX) support to MSBuildWorkspace

* Update `AbstractImplementAbstractClassCodeFixProvider.cs` source

Signed-off-by: Emmanuel Ferdman <[email protected]>

* IN progress

* IN progress

* in progress

* in progress

* Simplify

* Simplify

* Cleanup

* Rename

* Push through initial description

* Rename

* Removed

* Add back disposal

* Linked source

* Rename

* Update docs

* Remove

* Add comment

* Add comment

* Fix

* Delay loading of CodeRefactoringProvider's till absolutely needed

* CR feedback and tests.

* Fix comment

* CR feedback

* Fix crash in 'introduce variable' on top-level statements

* CR feedback

* Seal certain types in LSP layer

* Seal certain types in LSP layer

* Publish PR validation to internal feeds

* PooledObjects cleanup (#78382)

* moved condition above top-level statements

* REvert

* Seal

* Gracefully handle span mapping failing

* Fix information logs getting logged as debug in VSCode

* Don't unnecessarily create a document when only the document state is needed. (#78463)

Cyrus noticed this during a chat where I was considering a larger change to this code. Might as well make the simple/safe change while I consider the larger change too.

Other small changes:
1) Early exit if no changed documents
2) Unrelated change adding Checksum overload as I noticed a high frequency caller during solution load (ProjectSystemProjectOptionsProcessor.ReparseCommandLineIfChanged_NoLock) had an ImmutableArray and it was getting boxed and enumerator alloced.

* Ensure loghub collects the now verbose level logs

* Adjust some more logging messages

* Cancel running requests when the connection terminates

* Shorten log category name

* Extensions: handle extensions in VB SymbolDisplay (#78512)

* Switch to non-scouting queue to unblock CI (#78521)

* Fix test helper message to avoid NRE (#78532)

* Collect data about which code fixes end up making changes that conflict with other code fixes

* docs

* Revert

* Source package fixes (#78534)

* Extract helper to make it easier for other features to request copilot analysis

* lint

* lint

* Extensions: only count extensions for determining identifier (#78523)

* Cache extension method import info per project ID

* Remove telemetry

* Use pattern matching

* Lint

* Add VB ref assembly to semantic search (#78537)

* Add support for FieldRva to EnC delta (#78033)

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

* [VMR] Codeflow c53bdd8-c53bdd8

[[ commit created by automation ]]

* Update dependencies from https://github.com/dotnet/dotnet build 267468

* [VMR] Codeflow b422f78-b422f78

[[ commit created by automation ]]

* Update dependencies from https://github.com/dotnet/dotnet build 267725

* Update dependencies from https://github.com/dotnet/dotnet build 267776

---------

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>

* Introduce -productBuild and -sourceBuild switches (#78519)

* Introduce -productBuild and -sourceBuild switches

* Update eng/build.sh

Co-authored-by: Viktor Hofer <[email protected]>

* Update build.sh

* Add new options for SB and PB switches

* Remove leftover SB arg

---------

Co-authored-by: Viktor Hofer <[email protected]>

* Document more steps in our C# release process (#78539)

* Extensions: analyzer actions (#78319)

* Update XAML EA to use DocumentUri instead of System.Uri

* Update field value for NavBar Integration Tests (#78553)

* fix

* fix

* Update GetFirstRelatedDocumentId to not return documents with the same path within the same project (#78475)

GetFirstRelatedDocumentId had a mismatch in behavior for files within the same project that have the same path (shouldn't really happen, would cause compile errors). Previously, the code would return files from the same proejct when searching the cache, but not when doing the linear walk. Talked with Jason, and he indicated that it was better to have the code not return files from the same project, as callers wouldn't expect that.

* Implement PDG.WithProjectsRemoved (#78428)

This allows batch removal of projects from the ProjectDependencyGraph. This should eventually give us a small perf benefit, but only at the point where our projects can be disposed (or processed) in batches, which is not something we currently do.

* Selectively persist the commandline to temporary storage (#78441)

Only write command lines to temporary storage when they may later be needed.

Persisting project command line arguments is surprisingly costly, as evidenced by the profile image below. As this storage is only needed when there is an effective ruleset path, we can limit when we persist to storage to be limited to that scenario.

See PR for detailed performance information.

* File based programs IDE support (#78488)

Co-authored-by: Cyrus Najmabadi <[email protected]>
Co-authored-by: Jason Malinowski <[email protected]>

* Update dependencies from https://github.com/dotnet/arcade build 20250513.2

Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.Helix.Sdk , Microsoft.DotNet.XliffTasks
 From Version 9.0.0-beta.25255.5 -> To Version 9.0.0-beta.25263.2

* Extensions: pattern-based constructs (#78480)

* Unset CompilerType from Csc (#78483)

* Unset CompilerType from Csc

* Remove CompilerType logic

* Add Microsoft.CodeAnalysis.Extensions package (#78388)

* Fix MoveType to create debuggable documents (#78554)

* Move SpecializedCollections to Microsoft.CodeAnalysis.Collections namespace (#78466)

* Add a reference to the tracking bug for a workaround

* Fix embedded language classification inside multi-line string

* Remove 'Opt' suffixes

* Unify resource strings for special case checks

* NRT

* mIn progress

* Simplify

* Simplify

* Remove localized strings from Collections source package (#78576)

* Revert "Update XAML EA to use DocumentUri instead of System.Uri (#78555)"

This reverts commit 2611c9a, reversing
changes made to f4e6964.

* Implement `Enum.IsDefined` check refactoring

* Rename LSP messages for VisualStudio.Extensibility integration (#78598)

Co-authored-by: Matteo Prosperi <[email protected]>

* More improvements to source packages (#78587)

* Editor configs for source packages

* Add nullable enable

* Include linked files in source packages

* Suppress RS1024

* Remove duplicate nullability directives

* Remove unnecessary extensions

* Move FatalError and FailFast to Contracts package

* Add disclaimer

* Ensure we pass unique binlog paths to each BuildHost

Otherwise if we launch multiple processes, they might step atop
each other and cause locking issues.

* Clean up our SpellingExclusions

Somehow almost every line started with a UTF-8 BOM. This fixes it.

* Track used assemblies of data section string literals (#78552)

* Track used assemblies of data section string literals

* Move reporting to module

* Fix a failing test

* Improve test

* Add a comment

* Support local functions in breadcrumbs

* hotfix to fix restore and stop including bin/obj artifacts in directory with loose files (#78615)

* Fix angle brackets in generics in hover

* more directly walk the tree for local functions and add tests

* Give .NET Framework build task in sdk different identity (#78584)

closes #78565

* [VMR] Codeflow 015a854-015a854

[[ commit created by automation ]]

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

* [VMR] Codeflow 604dfc7-170498a

[[ commit created by automation ]]

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

* review feedback

* Fix option reading

* Simplify equivalence keys

* Make refactoring resilient against absence of `InvalidEnumArgumentException` type

* Fix formatting

* Update Workspace.MSBuild to reference Microsoft.Build.Framework.

* LSP: Fix batch builds for file-based programs and fix `"dotnet.projects.binaryLogPath"` throwing an exception (#78644)

Co-authored-by: Joey Robichaud <[email protected]>

* Convert operand of `true`/`false` operator invoked as part of `&&`/`||`operator evaluation (#78629)

Fixes #78609.

* Extensions: rename syntax node (#78625)

* Simplify

* Use SolutionFileReader instead of calling out to BuildHost

Removes the GetProjectsInSolution BuildHost API. Instead we can use the SolutionPersister library in processes to parse the projects from a solution file.

* StaticLogMessage isn't pooling correctly

Noticed this when looking at a profile and was curious why there were 3 MB of allocations of the StaticLogMessage type.

LogMessage.Free sets _message to null before calling FreeCore, thus StaticLogMessage.FreeCore was never adding items back to it's pool. The ordering of LogMessage setting _message to null and calling FreeCore is important, so that can't be changed. Instead, add a flag to StaticLogMessage to indicate whether it's in a constructed state or not.

* Fixing symbol publishing (#78650)

These need to be manually listed given that they aren't published directly as a NuPkg

* Compare symbols by metadata name when searching for eqivalent symbols in FAR engine

* Extensions: disallow indexers (#78626)

* Add untriaged label to all new issues (#78658)

* Update resourceManagement.yml

* Update resourceManagement.yml

* Fixed crash in CSharpConvertToRecordRefactoringProvider.

* Return arity check for method symbols

* Fix doc comment

* Update src/Features/Core/Portable/SymbolSearch/SymbolSearchOptions.cs

* Fix

* Make solution file reading async

* Fix storage

* Hot Reload: Handle document deletes (#78516)

* Use SBRP version of M.CA for analyzers in the context of source build (#78668)

* fix symbol publishing? (#78671)

* Cleanup

* Use ThrowIfFalse when resolving paths

* Add test assertions

* Applied code review suggestions.

* Update Microsoft.Build.Tasks.CodeAnalysis.Sdk.csproj (#78681)

* Fix nullable crash for field keyword in partial property (#78672)

* Use VerifyDiagnostics format to report CompileAndVerify diagnostics (#78666)

* Revert "Update Microsoft.Build.Tasks.CodeAnalysis.Sdk.csproj (#78681)" (#78687)

This reverts commit 6d490de.

* Revert "fix symbol publishing? (#78671)" (#78686)

This reverts commit 2b6024e.

* Add comment

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

* [VMR] Codeflow c3c7ad6-c3c7ad6

[[ commit created by automation ]]

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

* [VMR] Codeflow d219c4f-d219c4f

[[ commit created by automation ]]

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

---------

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>

* Add a test to verify that behavior is expected and bug no longer occurs

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

* [VMR] Codeflow 2b6024e-2b6024e

[[ commit created by automation ]]

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

---------

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>

* Modify ABWQ.AddWork to take in a ROS instead of an IEnumerable (#78691)

I'm seeing this enumerator allocation as account for 50 MB (0.9%) in a customer trace for feedback ticket https://developercommunity.visualstudio.com/t/Razor-Development:-30-Second-CPU-Churn-A/10904811

This shows up a bit smaller in the C# editing speedometer test, but does show as 2.3 MB. Test insertion showed allocations were removed.

See PR for more numbers and speedometer test results.

* Add assert

* Add test

* Add support for 'fixed'

* Fix crash with introduce local within a compilation unit

* Sort

* Handle error case: static ref field (No NullReferenceException) (#78707)

* Organize

* Run on UI thread

* fix: RS2007 table borders

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

* [VMR] Codeflow 533fde8-533fde8

[[ commit created by automation ]]

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

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

---------

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>

* Make operator glyph consistent witht eh rest of the members

* Fix

* avoid not needed compilationUnit clone (#78676)

* Always log PID

* Update MicrosoftVisualStudioExtensibilityTestingVersion (#78661)

* update extensibility version

* remove added package?

* update minversion

* test

* update vswhere version

* update versions.props vswhere

* update min version

* update coreeditor version ranges

* Add IsNull property to IAsyncToken (#78718)

* Extensions: nullability analysis for property access (#78646)

* Add helper for mapping between documents and hierarchy+itemids

* Updat epersistence version

* Do not convert tuple expression with error to a bad expression too early (#78645)

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

* [VMR] Codeflow f5705c8-57b0396

[[ commit created by automation ]]

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

---------

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>

* [main] Update dependencies from dotnet/arcade (#78578)

* Update dependencies from https://github.com/dotnet/arcade build 20250513.5

Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.Helix.Sdk , Microsoft.DotNet.XliffTasks
 From Version 9.0.0-beta.25263.2 -> To Version 9.0.0-beta.25263.5

* Update dependencies from https://github.com/dotnet/arcade build 20250516.2

Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.Helix.Sdk , Microsoft.DotNet.XliffTasks
 From Version 9.0.0-beta.25263.2 -> To Version 9.0.0-beta.25266.2

* Update dependencies from https://github.com/dotnet/arcade build 2025052.1

Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.Helix.Sdk , Microsoft.DotNet.XliffTasks
 From Version 9.0.0-beta.25263.2 -> To Version 9.0.0-beta.25271.1

---------

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>

* Invoke `dotnet run-api` to obtain virtual project (#78648)

Co-authored-by: David Barbet <[email protected]>

---------

Signed-off-by: Emmanuel Ferdman <[email protected]>
Co-authored-by: Deepak Rathore (ALLYIS INC) <[email protected]>
Co-authored-by: Emmanuel Ferdman <[email protected]>
Co-authored-by: Cyrus Najmabadi <[email protected]>
Co-authored-by: Cyrus Najmabadi <[email protected]>
Co-authored-by: Evgeny Tvorun <[email protected]>
Co-authored-by: Victor Pogor <[email protected]>
Co-authored-by: David Barbet <[email protected]>
Co-authored-by: Tomáš Matoušek <[email protected]>
Co-authored-by: Jason Malinowski <[email protected]>
Co-authored-by: Andrew Hall <[email protected]>
Co-authored-by: Todd Grunke <[email protected]>
Co-authored-by: Julien Couvreur <[email protected]>
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: Joey Robichaud <[email protected]>
Co-authored-by: Ella Hathaway <[email protected]>
Co-authored-by: Viktor Hofer <[email protected]>
Co-authored-by: Ankita Khera <[email protected]>
Co-authored-by: Rikki Gibson <[email protected]>
Co-authored-by: Jason Malinowski <[email protected]>
Co-authored-by: Jan Jones <[email protected]>
Co-authored-by: DoctorKrolic <[email protected]>
Co-authored-by: Matteo Prosperi <[email protected]>
Co-authored-by: Matteo Prosperi <[email protected]>
Co-authored-by: Jared Parsons <[email protected]>
Co-authored-by: Joey Robichaud <[email protected]>
Co-authored-by: AlekseyTs <[email protected]>
Co-authored-by: John Douglas Leitch <[email protected]>
Co-authored-by: Matt Thalman <[email protected]>
Co-authored-by: Bernd Baumanns <[email protected]>
Co-authored-by: Thomas Shephard <[email protected]>
Co-authored-by: DoctorKrolic <[email protected]>
Co-authored-by: David Barbet <[email protected]>
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 untriaged Issues and PRs which have not yet been triaged by a lead
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants