Skip to content

Commit 48de68b

Browse files
Merge branch 'main' into dev/sandy/aios-active-document
2 parents 4fc4967 + 52732de commit 48de68b

File tree

93 files changed

+5101
-735
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+5101
-735
lines changed

eng/Directory.Packages.props

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,6 @@
6666
<PackageVersion Include="Microsoft.VisualStudio.Extensibility.JsonGenerators.Sdk" Version="17.12.2037-preview3" />
6767
<PackageVersion Include="Microsoft.VSSDK.Debugger.VSDConfigTool" Version="17.13.1100801-preview" />
6868
<PackageVersion Include="Microsoft.VisualStudio.ProjectSystem" Version="17.0.77-pre-g62a6cb5699" />
69-
<PackageVersion Include="Microsoft.VisualStudio.Progression.CodeSchema" Version="15.8.27812-alpha" />
70-
<PackageVersion Include="Microsoft.VisualStudio.Progression.Common" Version="15.8.27812-alpha" />
71-
<PackageVersion Include="Microsoft.VisualStudio.Progression.Interfaces" Version="15.8.27812-alpha" />
7269
<PackageVersion Include="Microsoft.VisualStudio.CallHierarchy.Package.Definitions" Version="15.8.27812-alpha" />
7370
<PackageVersion Include="Microsoft.VisualStudio.CodeAnalysis.Sdk.UI" Version="15.8.27812-alpha" />
7471
<PackageVersion Include="Microsoft.VisualStudio.Language.CallHierarchy" Version="15.8.27812-alpha" />
@@ -99,14 +96,12 @@
9996
<PackageVersion Include="Microsoft.VisualStudio.CoreUtility" Version="17.14.170-preview" />
10097
<PackageVersion Include="Microsoft.VisualStudio.Editor" Version="17.13.226" />
10198
<PackageVersion Include="Microsoft.VisualStudio.ImageCatalog" Version="17.13.40008" />
102-
<PackageVersion Include="Microsoft.VisualStudio.Imaging.Interop.14.0.DesignTime" Version="17.13.40008" />
10399
<PackageVersion Include="Microsoft.VisualStudio.Language" Version="17.13.226" />
104100
<PackageVersion Include="Microsoft.VisualStudio.Language.NavigateTo.Interfaces" Version="17.13.226" />
105101
<PackageVersion Include="Microsoft.VisualStudio.Language.StandardClassification" Version="17.13.226" />
106102
<PackageVersion Include="Microsoft.VisualStudio.LanguageServer.Client" Version="17.13.33" />
107103
<PackageVersion Include="Microsoft.VisualStudio.RemoteControl" Version="16.3.52" />
108104
<PackageVersion Include="Microsoft.VisualStudio.RpcContracts" Version="17.13.7" />
109-
<PackageVersion Include="Microsoft.VisualStudio.Shell.15.0" Version="17.13.40008" />
110105
<PackageVersion Include="Microsoft.VisualStudio.Telemetry" Version="17.14.8" />
111106
<PackageVersion Include="Microsoft.VisualStudio.Text.Data" Version="17.14.170-preview" />
112107
<PackageVersion Include="Microsoft.VisualStudio.Text.Logic" Version="17.14.170-preview" />

eng/Version.Details.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Dependencies>
3-
<Source Uri="https://github.com/dotnet/dotnet" Mapping="roslyn" Sha="0a01b394b186e190a80cb55740c13f6293cf5446" BarId="269884" />
3+
<Source Uri="https://github.com/dotnet/dotnet" Mapping="roslyn" Sha="25bec1af21db71468c5c2c3a588dd54d0e058e9d" BarId="271417" />
44
<ProductDependencies>
55
<!-- RoslynAnalyzers reference older builds of Roslyn and this is necessary for SourceBuild. -->
66
<Dependency Name="Microsoft.CodeAnalysis" Version="3.11.0">

eng/config/globalconfigs/Common.globalconfig

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,6 @@ dotnet_diagnostic.VSTHRD010.severity = none
127127
# VSTHRD110: Observe result of async calls
128128
dotnet_diagnostic.VSTHRD110.severity = none
129129

130-
# Workaround for old Microsoft.VisualStudio.Progression.* packages: https://github.com/dotnet/roslyn/issues/71404
131-
dotnet_diagnostic.VSIXCompatibility1001.severity = none
132-
133130
dotnet_diagnostic.HAA0101.severity = none
134131
dotnet_diagnostic.HAA0102.severity = none
135132
dotnet_diagnostic.HAA0201.severity = none

eng/targets/Settings.props

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@
1111

1212
<VSSDKTargetPlatformRegRootSuffix>RoslynDev</VSSDKTargetPlatformRegRootSuffix>
1313

14-
<!-- Workaround for old Microsoft.VisualStudio.Progression.* packages -->
15-
<NoWarn>$(NoWarn);VSIXCompatibility1001</NoWarn>
16-
1714
<!-- TODO: https://github.com/dotnet/roslyn/issues/71667 -->
1815
<NoWarn>$(NoWarn);NU1507</NoWarn>
1916

src/Compilers/CSharp/Portable/Binder/Binder_Conversions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2286,7 +2286,7 @@ private static void CheckParameterModifierMismatchMethodConversion(SyntaxNode sy
22862286
return;
22872287
}
22882288

2289-
if (SourceMemberContainerTypeSymbol.RequiresValidScopedOverrideForRefSafety(delegateMethod))
2289+
if (SourceMemberContainerTypeSymbol.RequiresValidScopedOverrideForRefSafety(delegateMethod, lambdaOrMethod.TryGetThisParameter(out var thisParameter) ? thisParameter : null))
22902290
{
22912291
SourceMemberContainerTypeSymbol.CheckValidScopedOverride(
22922292
delegateMethod,

src/Compilers/CSharp/Portable/Binder/Binder_Crefs.cs

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ private ImmutableArray<Symbol> BindCrefInternal(CrefSyntax syntax, out Symbol? a
3535
case SyntaxKind.IndexerMemberCref:
3636
case SyntaxKind.OperatorMemberCref:
3737
case SyntaxKind.ConversionOperatorMemberCref:
38+
case SyntaxKind.ExtensionMemberCref:
3839
return BindMemberCref((MemberCrefSyntax)syntax, containerOpt: null, ambiguityWinner: out ambiguityWinner, diagnostics: diagnostics);
3940
default:
4041
throw ExceptionUtilities.UnexpectedValue(syntax.Kind());
@@ -125,6 +126,9 @@ private ImmutableArray<Symbol> BindMemberCref(MemberCrefSyntax syntax, Namespace
125126
case SyntaxKind.ConversionOperatorMemberCref:
126127
result = BindConversionOperatorMemberCref((ConversionOperatorMemberCrefSyntax)syntax, containerOpt, out ambiguityWinner, diagnostics);
127128
break;
129+
case SyntaxKind.ExtensionMemberCref:
130+
result = BindExtensionMemberCref((ExtensionMemberCrefSyntax)syntax, containerOpt, out ambiguityWinner, diagnostics);
131+
break;
128132
default:
129133
throw ExceptionUtilities.UnexpectedValue(syntax.Kind());
130134
}
@@ -216,6 +220,142 @@ private ImmutableArray<Symbol> BindIndexerMemberCref(IndexerMemberCrefSyntax syn
216220
diagnostics: diagnostics);
217221
}
218222

223+
private ImmutableArray<Symbol> BindExtensionMemberCref(ExtensionMemberCrefSyntax syntax, NamespaceOrTypeSymbol? containerOpt, out Symbol? ambiguityWinner, BindingDiagnosticBag diagnostics)
224+
{
225+
// Tracked by https://github.com/dotnet/roslyn/issues/76130 : handle extension operators
226+
CheckFeatureAvailability(syntax, MessageID.IDS_FeatureExtensions, diagnostics);
227+
228+
if (containerOpt is not NamedTypeSymbol namedContainer)
229+
{
230+
ambiguityWinner = null;
231+
return ImmutableArray<Symbol>.Empty;
232+
}
233+
234+
ImmutableArray<Symbol> sortedSymbols = default;
235+
int arity = 0;
236+
TypeArgumentListSyntax? typeArgumentListSyntax = null;
237+
CrefParameterListSyntax? parameters = null;
238+
239+
if (syntax.Member is NameMemberCrefSyntax { Name: SimpleNameSyntax simpleName } nameMember)
240+
{
241+
arity = simpleName.Arity;
242+
typeArgumentListSyntax = simpleName is GenericNameSyntax genericName ? genericName.TypeArgumentList : null;
243+
parameters = nameMember.Parameters;
244+
245+
TypeArgumentListSyntax? extensionTypeArguments = syntax.TypeArgumentList;
246+
int extensionArity = extensionTypeArguments?.Arguments.Count ?? 0;
247+
sortedSymbols = computeSortedAndFilteredCrefExtensionMembers(namedContainer, simpleName.Identifier.ValueText, extensionArity, arity, extensionTypeArguments, diagnostics, syntax);
248+
}
249+
250+
if (sortedSymbols.IsDefaultOrEmpty)
251+
{
252+
ambiguityWinner = null;
253+
return [];
254+
}
255+
256+
Debug.Assert(sortedSymbols.All(s => s.GetIsNewExtensionMember()));
257+
258+
return ProcessCrefMemberLookupResults(sortedSymbols, arity, syntax, typeArgumentListSyntax, parameters, out ambiguityWinner, diagnostics);
259+
260+
ImmutableArray<Symbol> computeSortedAndFilteredCrefExtensionMembers(NamedTypeSymbol container, string name, int extensionArity, int arity, TypeArgumentListSyntax? extensionTypeArguments, BindingDiagnosticBag diagnostics, ExtensionMemberCrefSyntax syntax)
261+
{
262+
Debug.Assert(name is not null);
263+
264+
Debug.Assert(syntax.Parameters is not null);
265+
ImmutableArray<ParameterSymbol> extensionParameterSymbols = BindCrefParameters(syntax.Parameters, diagnostics);
266+
267+
// Use signature method symbols to match extension blocks
268+
var providedExtensionSignature = new SignatureOnlyMethodSymbol(
269+
methodKind: MethodKind.Ordinary,
270+
typeParameters: IndexedTypeParameterSymbol.TakeSymbols(extensionArity),
271+
parameters: extensionParameterSymbols,
272+
callingConvention: Cci.CallingConvention.Default,
273+
// These are ignored by this specific MemberSignatureComparer.
274+
containingType: null,
275+
name: null,
276+
refKind: RefKind.None,
277+
isInitOnly: false,
278+
isStatic: false,
279+
returnType: default,
280+
refCustomModifiers: [],
281+
explicitInterfaceImplementations: []);
282+
283+
LookupOptions options = LookupOptions.AllMethodsOnArityZero | LookupOptions.MustNotBeParameter;
284+
CompoundUseSiteInfo<AssemblySymbol> useSiteInfo = this.GetNewCompoundUseSiteInfo(diagnostics);
285+
ArrayBuilder<Symbol>? sortedSymbolsBuilder = null;
286+
287+
foreach (var nested in container.GetTypeMembers())
288+
{
289+
if (!nested.IsExtension || nested.Arity != extensionArity || nested.ExtensionParameter is null)
290+
{
291+
continue;
292+
}
293+
294+
var constructedNested = (NamedTypeSymbol)ConstructWithCrefTypeParameters(extensionArity, extensionTypeArguments, nested);
295+
296+
var candidateExtensionSignature = new SignatureOnlyMethodSymbol(
297+
methodKind: MethodKind.Ordinary,
298+
typeParameters: IndexedTypeParameterSymbol.TakeSymbols(constructedNested.Arity),
299+
parameters: [constructedNested.ExtensionParameter],
300+
callingConvention: Cci.CallingConvention.Default,
301+
// These are ignored by this specific MemberSignatureComparer.
302+
containingType: null,
303+
name: null,
304+
refKind: RefKind.None,
305+
isInitOnly: false,
306+
isStatic: false,
307+
returnType: default,
308+
refCustomModifiers: [],
309+
explicitInterfaceImplementations: []);
310+
311+
if (!MemberSignatureComparer.CrefComparer.Equals(candidateExtensionSignature, providedExtensionSignature))
312+
{
313+
continue;
314+
}
315+
316+
var candidates = constructedNested.GetMembers(name);
317+
318+
foreach (var candidate in candidates)
319+
{
320+
if (!SourceMemberContainerTypeSymbol.IsAllowedExtensionMember(candidate))
321+
{
322+
continue;
323+
}
324+
325+
if (arity != 0 && candidate.GetArity() != arity)
326+
{
327+
continue;
328+
}
329+
330+
// Note: we bypass the arity check here, as it would check for total arity (extension + member arity)
331+
SingleLookupResult result = this.CheckViability(candidate, arity: 0, options, accessThroughType: null, diagnose: true, useSiteInfo: ref useSiteInfo);
332+
333+
if (result.Kind == LookupResultKind.Viable)
334+
{
335+
sortedSymbolsBuilder ??= ArrayBuilder<Symbol>.GetInstance();
336+
sortedSymbolsBuilder.Add(result.Symbol);
337+
}
338+
}
339+
}
340+
341+
diagnostics.Add(syntax, useSiteInfo);
342+
343+
if (sortedSymbolsBuilder is null)
344+
{
345+
return ImmutableArray<Symbol>.Empty;
346+
}
347+
348+
// Since we resolve ambiguities by just picking the first symbol we encounter,
349+
// the order of the symbols matters for repeatability.
350+
if (sortedSymbolsBuilder.Count > 1)
351+
{
352+
sortedSymbolsBuilder.Sort(ConsistentSymbolOrder.Instance);
353+
}
354+
355+
return sortedSymbolsBuilder.ToImmutableAndFree();
356+
}
357+
}
358+
219359
// NOTE: not guaranteed to be a method (e.g. class op_Addition)
220360
// NOTE: constructor fallback logic applies
221361
private ImmutableArray<Symbol> BindOperatorMemberCref(OperatorMemberCrefSyntax syntax, NamespaceOrTypeSymbol? containerOpt, out Symbol? ambiguityWinner, BindingDiagnosticBag diagnostics)

src/Compilers/CSharp/Portable/Binder/WithCrefTypeParametersBinder.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ private void AddTypeParameters(TypeSyntax typeSyntax, MultiDictionary<string, Ty
9090
AddTypeParameters(qualifiedNameSyntax.Left, map);
9191
break;
9292
case SyntaxKind.GenericName:
93-
AddTypeParameters((GenericNameSyntax)typeSyntax, map);
93+
AddTypeParameters(((GenericNameSyntax)typeSyntax).TypeArgumentList.Arguments, map);
9494
break;
9595
case SyntaxKind.IdentifierName:
9696
case SyntaxKind.PredefinedType:
@@ -103,20 +103,28 @@ private void AddTypeParameters(TypeSyntax typeSyntax, MultiDictionary<string, Ty
103103
private void AddTypeParameters(MemberCrefSyntax memberSyntax, MultiDictionary<string, TypeParameterSymbol> map)
104104
{
105105
// Other members have arity 0.
106-
if (memberSyntax.Kind() == SyntaxKind.NameMemberCref)
106+
if (memberSyntax is NameMemberCrefSyntax nameMemberCref)
107107
{
108-
AddTypeParameters(((NameMemberCrefSyntax)memberSyntax).Name, map);
108+
AddTypeParameters(nameMemberCref.Name, map);
109+
}
110+
else if (memberSyntax is ExtensionMemberCrefSyntax extensionCref)
111+
{
112+
if (extensionCref.TypeArgumentList is { } extensionTypeArguments)
113+
{
114+
AddTypeParameters(extensionTypeArguments.Arguments, map);
115+
}
116+
117+
AddTypeParameters(extensionCref.Member, map);
109118
}
110119
}
111120

112-
private static void AddTypeParameters(GenericNameSyntax genericNameSyntax, MultiDictionary<string, TypeParameterSymbol> map)
121+
private static void AddTypeParameters(SeparatedSyntaxList<TypeSyntax> typeArguments, MultiDictionary<string, TypeParameterSymbol> map)
113122
{
114123
// NOTE: Dev11 does not warn about duplication, it just matches parameter types to the
115124
// *last* type parameter with the same name. That's why we're iterating backwards and
116125
// skipping subsequent symbols with the same name. This can result in some surprising
117126
// behavior. For example, both 'T's in "A<T>.B<T>" bind to the second implicitly
118127
// declared type parameter.
119-
SeparatedSyntaxList<TypeSyntax> typeArguments = genericNameSyntax.TypeArgumentList.Arguments;
120128
for (int i = typeArguments.Count - 1; i >= 0; i--)
121129
{
122130
// Other types (non-identifiers) are allowed in error scenarios, but they do not introduce new

src/Compilers/CSharp/Portable/CSharpResources.resx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8096,7 +8096,7 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
80968096
<value>Extension declarations may not have a name.</value>
80978097
</data>
80988098
<data name="ERR_ExtensionDisallowsMember" xml:space="preserve">
8099-
<value>Extension declarations can include only methods or properties</value>
8099+
<value>This member is not allowed in an extension block</value>
81008100
</data>
81018101
<data name="ERR_BadExtensionContainingType" xml:space="preserve">
81028102
<value>Extensions must be declared in a top-level, non-generic, static class</value>
@@ -8185,4 +8185,7 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
81858185
<data name="ERR_PPShebangInProjectBasedProgram" xml:space="preserve">
81868186
<value>'#!' directives can be only used in scripts or file-based programs</value>
81878187
</data>
8188+
<data name="ERR_MisplacedExtension" xml:space="preserve">
8189+
<value>An extension member syntax is disallowed in nested position within an extension member syntax</value>
8190+
</data>
81888191
</root>

src/Compilers/CSharp/Portable/Compilation/CSharpSemanticModel.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,8 @@ internal static bool HasParameterList(CrefSyntax crefSyntax)
357357
return ((OperatorMemberCrefSyntax)crefSyntax).Parameters != null;
358358
case SyntaxKind.ConversionOperatorMemberCref:
359359
return ((ConversionOperatorMemberCrefSyntax)crefSyntax).Parameters != null;
360+
case SyntaxKind.ExtensionMemberCref:
361+
return HasParameterList(((ExtensionMemberCrefSyntax)crefSyntax).Member);
360362
}
361363

362364
return false;
@@ -379,7 +381,7 @@ private static SymbolInfo GetCrefSymbolInfo(OneOrMany<Symbol> symbols, SymbolInf
379381

380382
LookupResultKind resultKind = LookupResultKind.Ambiguous;
381383

382-
// The boundary between Ambiguous and OverloadResolutionFailure is let clear-cut for crefs.
384+
// The boundary between Ambiguous and OverloadResolutionFailure is less clear-cut for crefs.
383385
// We'll say that overload resolution failed if the syntax has a parameter list and if
384386
// all of the candidates have the same kind.
385387
SymbolKind firstCandidateKind = symbols[0].Kind;

src/Compilers/CSharp/Portable/Compiler/DocumentationCommentCompiler.DocumentationCommentWalker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public override void DefaultVisit(SyntaxNode node)
151151

152152
// Do this for the diagnostics, even if it won't be written.
153153
BindingDiagnosticBag diagnostics = diagnose ? _diagnostics : BindingDiagnosticBag.GetInstance(withDiagnostics: false, withDependencies: _diagnostics.AccumulatesDependencies);
154-
string docCommentId = GetDocumentationCommentId(cref, binder, diagnostics);
154+
string docCommentId = GetEscapedDocumentationCommentId(cref, binder, diagnostics);
155155

156156
if (!diagnose)
157157
{

0 commit comments

Comments
 (0)