Skip to content

Commit 633a6e3

Browse files
authored
Block ENC for extension blocks (#79883)
For now, we're blocking ENC for extension blocks. Full support will come post RTM, for now we want to make sure that nothing crashes. Contributes to #78959.
1 parent fe6a0f1 commit 633a6e3

23 files changed

+2289
-7
lines changed

src/Features/CSharp/Portable/CSharpFeaturesResources.resx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,4 +587,4 @@
587587
<data name="Convert_all_extension_methods_in_0_to_extension" xml:space="preserve">
588588
<value>Convert all extension methods in '{0}' to extension</value>
589589
</data>
590-
</root>
590+
</root>

src/Features/CSharp/Portable/EditAndContinue/CSharpEditAndContinueAnalyzer.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -929,7 +929,7 @@ internal override bool IsDeclarationWithInitializer(SyntaxNode declaration)
929929
}
930930

931931
internal override bool IsPrimaryConstructorDeclaration(SyntaxNode declaration)
932-
=> declaration.Parent is TypeDeclarationSyntax { ParameterList: var parameterList } && parameterList == declaration;
932+
=> declaration.Parent is TypeDeclarationSyntax { ParameterList: var parameterList } and not ExtensionBlockDeclarationSyntax && parameterList == declaration;
933933

934934
internal override bool IsConstructorWithMemberInitializers(ISymbol symbol, CancellationToken cancellationToken)
935935
{
@@ -1643,6 +1643,10 @@ private static bool GroupBySignatureEquivalent(IMethodSymbol? oldMethod, IMethod
16431643
return GetDiagnosticSpan(typeDeclaration.Modifiers, typeDeclaration.Keyword,
16441644
typeDeclaration.TypeParameterList ?? (SyntaxNodeOrToken)typeDeclaration.Identifier);
16451645

1646+
case SyntaxKind.ExtensionBlockDeclaration:
1647+
var extensionBlockDeclaration = (ExtensionBlockDeclarationSyntax)node;
1648+
return extensionBlockDeclaration.Keyword.Span;
1649+
16461650
case SyntaxKind.BaseList:
16471651
var baseList = (BaseListSyntax)node;
16481652
return baseList.Types.Span;
@@ -2248,6 +2252,9 @@ internal override string GetDisplayName(IMethodSymbol symbol)
22482252

22492253
return CSharpFeaturesResources.local_variable_declaration;
22502254

2255+
case SyntaxKind.ExtensionBlockDeclaration:
2256+
return FeaturesResources.extension_block;
2257+
22512258
default:
22522259
return null;
22532260
}
@@ -2395,6 +2402,11 @@ private void ClassifyInsert(SyntaxNode node)
23952402
{
23962403
switch (node.Kind())
23972404
{
2405+
case SyntaxKind.ExtensionBlockDeclaration:
2406+
// https://github.com/dotnet/roslyn/issues/78959 Disallowed for now
2407+
ReportError(RudeEditKind.Insert);
2408+
return;
2409+
23982410
case SyntaxKind.ExternAliasDirective:
23992411
ReportError(RudeEditKind.Insert);
24002412
return;
@@ -2425,6 +2437,11 @@ private void ClassifyDelete(SyntaxNode oldNode)
24252437
ReportError(RudeEditKind.Delete);
24262438
return;
24272439

2440+
case SyntaxKind.ExtensionBlockDeclaration:
2441+
// https://github.com/dotnet/roslyn/issues/78959 Disallowed for now
2442+
ReportError(RudeEditKind.Delete);
2443+
return;
2444+
24282445
case SyntaxKind.AttributeList:
24292446
case SyntaxKind.Attribute:
24302447
// To allow removal of attributes we need to check if the removed attribute

src/Features/CSharp/Portable/EditAndContinue/SyntaxComparer.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ internal enum Label
5959

6060
TypeDeclaration,
6161
EnumDeclaration,
62+
ExtensionBlockDeclaration, // tied to parent
6263
BaseList, // tied to parent
6364
PrimaryConstructorBase, // tied to parent
6465
DelegateDeclaration,
@@ -195,6 +196,7 @@ private static int TiedToAncestor(Label label)
195196
case Label.Parameter:
196197
case Label.AttributeList:
197198
case Label.Attribute:
199+
case Label.ExtensionBlockDeclaration:
198200
return 1;
199201

200202
// Statement syntax
@@ -681,6 +683,9 @@ private static Label ClassifyTopSyntax(SyntaxKind kind, SyntaxNode? node, out bo
681683
}
682684

683685
break;
686+
687+
case SyntaxKind.ExtensionBlockDeclaration:
688+
return Label.ExtensionBlockDeclaration;
684689
}
685690

686691
// If we got this far, its an unlabelled node. For top
@@ -917,6 +922,10 @@ protected override bool TryComputeWeightedDistance(SyntaxNode leftNode, SyntaxNo
917922
distance = ComputeDistance((AttributeSyntax)leftNode, (AttributeSyntax)rightNode);
918923
return true;
919924

925+
case SyntaxKind.ExtensionBlockDeclaration:
926+
distance = ComputeDistance((ExtensionBlockDeclarationSyntax)leftNode, (ExtensionBlockDeclarationSyntax)rightNode);
927+
return true;
928+
920929
default:
921930
var leftName = TryGetName(leftNode);
922931
var rightName = TryGetName(rightNode);
@@ -1435,6 +1444,9 @@ private static double CombineOptional(
14351444
case SyntaxKind.DelegateDeclaration:
14361445
return ((DelegateDeclarationSyntax)node).Identifier;
14371446

1447+
case SyntaxKind.ExtensionBlockDeclaration:
1448+
return null;
1449+
14381450
case SyntaxKind.FieldDeclaration:
14391451
case SyntaxKind.EventFieldDeclaration:
14401452
case SyntaxKind.VariableDeclaration:

src/Features/CSharp/Portable/EditAndContinue/SyntaxUtilities.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ CompilationUnitSyntax unit when unit.ContainsGlobalStatements()
5656
when !fieldDeclaration.Modifiers.Any(SyntaxKind.ConstKeyword)
5757
=> new FieldWithInitializerDeclarationBody(variableDeclarator),
5858

59-
ParameterListSyntax { Parent: TypeDeclarationSyntax typeDeclaration }
59+
ParameterListSyntax { Parent: TypeDeclarationSyntax typeDeclaration and not ExtensionBlockDeclarationSyntax }
6060
=> typeDeclaration is { BaseList.Types: [PrimaryConstructorBaseTypeSyntax { }, ..] }
6161
? new PrimaryConstructorWithExplicitInitializerDeclarationBody(typeDeclaration)
6262
: new PrimaryConstructorWithImplicitInitializerDeclarationBody(typeDeclaration),

src/Features/CSharpTest/EditAndContinue/Helpers/EditingTestBase.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ public static string GetResource(string keyword)
105105
"top-level statement" => CSharpFeaturesResources.top_level_statement,
106106
"top-level code" => CSharpFeaturesResources.top_level_code,
107107
"class with explicit or sequential layout" => string.Format(FeaturesResources.class_with_explicit_or_sequential_layout),
108+
"extension block" => FeaturesResources.extension_block,
108109
_ => null
109110
};
110111

0 commit comments

Comments
 (0)