Skip to content
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

List pattern syntax #51299

Merged
merged 28 commits into from
Apr 20, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion eng/targets/Settings.props
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,8 @@
and hence suppress this warning until we get closer to release and a more
thorough documentation story
-->
<NoWarn>$(NoWarn);1573;1591;1701</NoWarn>
<!-- PROTOTYPE(list-patterns) PublicAPIs -->
<NoWarn>$(NoWarn);1573;1591;1701;RS0016</NoWarn>
</PropertyGroup>
<PropertyGroup>
<DefineConstants Condition="'$(InitialDefineConstants)' != ''">$(DefineConstants);$(InitialDefineConstants)</DefineConstants>
Expand Down
9 changes: 9 additions & 0 deletions src/Compilers/CSharp/Portable/CSharpResources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -6606,4 +6606,13 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
<data name="ERR_InheritingFromRecordWithSealedToString" xml:space="preserve">
<value>Inheriting from a record with a sealed 'Object.ToString' is not supported in C# {0}. Please use language version '{1}' or greater.</value>
</data>
<data name="IDS_FeatureListPattern" xml:space="preserve">
<value>list pattern</value>
</data>
<data name="IDS_FeatureSlicePattern" xml:space="preserve">
<value>slice pattern</value>
</data>
<data name="IDS_FeatureLengthPattern" xml:space="preserve">
<value>length pattern</value>
</data>
</root>
Original file line number Diff line number Diff line change
Expand Up @@ -4418,6 +4418,7 @@ private SymbolInfo GetNamedArgumentSymbolInfo(IdentifierNameSyntax identifierNam
return (object)tupleElement == null ? SymbolInfo.None : new SymbolInfo(tupleElement, ImmutableArray<ISymbol>.Empty, CandidateReason.None);
}

// PROTOTYPE(list-patterns) SyntaxKind.ListPatternClause
if (parent3.IsKind(SyntaxKind.PropertyPatternClause) || parent3.IsKind(SyntaxKind.PositionalPatternClause))
{
return GetSymbolInfoWorker(identifierNameSyntax, SymbolInfoOptions.DefaultOptions, cancellationToken);
Expand Down
11 changes: 11 additions & 0 deletions src/Compilers/CSharp/Portable/Errors/MessageID.cs
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,11 @@ internal enum MessageID
IDS_FeatureExternLocalFunctions = MessageBase + 12767,
IDS_FeatureMemberNotNull = MessageBase + 12768,

// PROTOTYPE(list-patterns) To reduce conflicts with upstream. Should be moved eventually.
IDS_FeatureListPattern = MessageBase + 12800,
IDS_FeatureSlicePattern,
IDS_FeatureLengthPattern,

IDS_FeatureNativeInt = MessageBase + 12769,
IDS_FeatureImplicitObjectCreation = MessageBase + 12770,
IDS_FeatureTypePattern = MessageBase + 12771,
Expand Down Expand Up @@ -491,6 +496,12 @@ internal static LanguageVersion RequiredVersion(this MessageID feature)

default:
throw ExceptionUtilities.UnexpectedValue(feature);

// PROTOTYPE(list-patterns)
case MessageID.IDS_FeatureListPattern:
case MessageID.IDS_FeatureSlicePattern:
case MessageID.IDS_FeatureLengthPattern:
return LanguageVersion.Preview;
}
}
}
Expand Down
11 changes: 10 additions & 1 deletion src/Compilers/CSharp/Portable/Generated/CSharp.Generated.g4

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,9 @@ public partial class CSharpSyntaxVisitor<TResult>
/// <summary>Called when the visitor visits a RecursivePatternSyntax node.</summary>
public virtual TResult? VisitRecursivePattern(RecursivePatternSyntax node) => this.DefaultVisit(node);

/// <summary>Called when the visitor visits a LengthPatternClauseSyntax node.</summary>
public virtual TResult? VisitLengthPatternClause(LengthPatternClauseSyntax node) => this.DefaultVisit(node);

/// <summary>Called when the visitor visits a PositionalPatternClauseSyntax node.</summary>
public virtual TResult? VisitPositionalPatternClause(PositionalPatternClauseSyntax node) => this.DefaultVisit(node);

Expand Down Expand Up @@ -300,6 +303,9 @@ public partial class CSharpSyntaxVisitor<TResult>
/// <summary>Called when the visitor visits a UnaryPatternSyntax node.</summary>
public virtual TResult? VisitUnaryPattern(UnaryPatternSyntax node) => this.DefaultVisit(node);

/// <summary>Called when the visitor visits a SlicePatternSyntax node.</summary>
public virtual TResult? VisitSlicePattern(SlicePatternSyntax node) => this.DefaultVisit(node);

/// <summary>Called when the visitor visits a InterpolatedStringTextSyntax node.</summary>
public virtual TResult? VisitInterpolatedStringText(InterpolatedStringTextSyntax node) => this.DefaultVisit(node);

Expand Down Expand Up @@ -969,6 +975,9 @@ public partial class CSharpSyntaxVisitor
/// <summary>Called when the visitor visits a RecursivePatternSyntax node.</summary>
public virtual void VisitRecursivePattern(RecursivePatternSyntax node) => this.DefaultVisit(node);

/// <summary>Called when the visitor visits a LengthPatternClauseSyntax node.</summary>
public virtual void VisitLengthPatternClause(LengthPatternClauseSyntax node) => this.DefaultVisit(node);

/// <summary>Called when the visitor visits a PositionalPatternClauseSyntax node.</summary>
public virtual void VisitPositionalPatternClause(PositionalPatternClauseSyntax node) => this.DefaultVisit(node);

Expand Down Expand Up @@ -996,6 +1005,9 @@ public partial class CSharpSyntaxVisitor
/// <summary>Called when the visitor visits a UnaryPatternSyntax node.</summary>
public virtual void VisitUnaryPattern(UnaryPatternSyntax node) => this.DefaultVisit(node);

/// <summary>Called when the visitor visits a SlicePatternSyntax node.</summary>
public virtual void VisitSlicePattern(SlicePatternSyntax node) => this.DefaultVisit(node);

/// <summary>Called when the visitor visits a InterpolatedStringTextSyntax node.</summary>
public virtual void VisitInterpolatedStringText(InterpolatedStringTextSyntax node) => this.DefaultVisit(node);

Expand Down Expand Up @@ -1663,7 +1675,10 @@ public partial class CSharpSyntaxRewriter : CSharpSyntaxVisitor<SyntaxNode?>
=> node.Update(VisitToken(node.VarKeyword), (VariableDesignationSyntax?)Visit(node.Designation) ?? throw new ArgumentNullException("designation"));

public override SyntaxNode? VisitRecursivePattern(RecursivePatternSyntax node)
=> node.Update((TypeSyntax?)Visit(node.Type), (PositionalPatternClauseSyntax?)Visit(node.PositionalPatternClause), (PropertyPatternClauseSyntax?)Visit(node.PropertyPatternClause), (VariableDesignationSyntax?)Visit(node.Designation));
=> node.Update((TypeSyntax?)Visit(node.Type), (PositionalPatternClauseSyntax?)Visit(node.PositionalPatternClause), (LengthPatternClauseSyntax?)Visit(node.LengthPatternClause), (PropertyPatternClauseSyntax?)Visit(node.PropertyPatternClause), (VariableDesignationSyntax?)Visit(node.Designation));

public override SyntaxNode? VisitLengthPatternClause(LengthPatternClauseSyntax node)
=> node.Update(VisitToken(node.OpenBracketToken), (PatternSyntax?)Visit(node.Pattern) ?? throw new ArgumentNullException("pattern"), VisitToken(node.CloseBracketToken));

public override SyntaxNode? VisitPositionalPatternClause(PositionalPatternClauseSyntax node)
=> node.Update(VisitToken(node.OpenParenToken), VisitList(node.Subpatterns), VisitToken(node.CloseParenToken));
Expand Down Expand Up @@ -1692,6 +1707,9 @@ public partial class CSharpSyntaxRewriter : CSharpSyntaxVisitor<SyntaxNode?>
public override SyntaxNode? VisitUnaryPattern(UnaryPatternSyntax node)
=> node.Update(VisitToken(node.OperatorToken), (PatternSyntax?)Visit(node.Pattern) ?? throw new ArgumentNullException("pattern"));

public override SyntaxNode? VisitSlicePattern(SlicePatternSyntax node)
=> node.Update(VisitToken(node.DotDotToken), (PatternSyntax?)Visit(node.Pattern));

public override SyntaxNode? VisitInterpolatedStringText(InterpolatedStringTextSyntax node)
=> node.Update(VisitToken(node.TextToken));

Expand Down Expand Up @@ -3552,14 +3570,27 @@ public static VarPatternSyntax VarPattern(VariableDesignationSyntax designation)
=> SyntaxFactory.VarPattern(SyntaxFactory.Token(SyntaxKind.VarKeyword), designation);

/// <summary>Creates a new RecursivePatternSyntax instance.</summary>
public static RecursivePatternSyntax RecursivePattern(TypeSyntax? type, PositionalPatternClauseSyntax? positionalPatternClause, PropertyPatternClauseSyntax? propertyPatternClause, VariableDesignationSyntax? designation)
public static RecursivePatternSyntax RecursivePattern(TypeSyntax? type, PositionalPatternClauseSyntax? positionalPatternClause, LengthPatternClauseSyntax? lengthPatternClause, PropertyPatternClauseSyntax? propertyPatternClause, VariableDesignationSyntax? designation)
{
return (RecursivePatternSyntax)Syntax.InternalSyntax.SyntaxFactory.RecursivePattern(type == null ? null : (Syntax.InternalSyntax.TypeSyntax)type.Green, positionalPatternClause == null ? null : (Syntax.InternalSyntax.PositionalPatternClauseSyntax)positionalPatternClause.Green, propertyPatternClause == null ? null : (Syntax.InternalSyntax.PropertyPatternClauseSyntax)propertyPatternClause.Green, designation == null ? null : (Syntax.InternalSyntax.VariableDesignationSyntax)designation.Green).CreateRed();
return (RecursivePatternSyntax)Syntax.InternalSyntax.SyntaxFactory.RecursivePattern(type == null ? null : (Syntax.InternalSyntax.TypeSyntax)type.Green, positionalPatternClause == null ? null : (Syntax.InternalSyntax.PositionalPatternClauseSyntax)positionalPatternClause.Green, lengthPatternClause == null ? null : (Syntax.InternalSyntax.LengthPatternClauseSyntax)lengthPatternClause.Green, propertyPatternClause == null ? null : (Syntax.InternalSyntax.PropertyPatternClauseSyntax)propertyPatternClause.Green, designation == null ? null : (Syntax.InternalSyntax.VariableDesignationSyntax)designation.Green).CreateRed();
}

/// <summary>Creates a new RecursivePatternSyntax instance.</summary>
public static RecursivePatternSyntax RecursivePattern()
=> SyntaxFactory.RecursivePattern(default, default, default, default);
=> SyntaxFactory.RecursivePattern(default, default, default, default, default);

/// <summary>Creates a new LengthPatternClauseSyntax instance.</summary>
public static LengthPatternClauseSyntax LengthPatternClause(SyntaxToken openBracketToken, PatternSyntax pattern, SyntaxToken closeBracketToken)
{
if (openBracketToken.Kind() != SyntaxKind.OpenBracketToken) throw new ArgumentException(nameof(openBracketToken));
if (pattern == null) throw new ArgumentNullException(nameof(pattern));
if (closeBracketToken.Kind() != SyntaxKind.CloseBracketToken) throw new ArgumentException(nameof(closeBracketToken));
return (LengthPatternClauseSyntax)Syntax.InternalSyntax.SyntaxFactory.LengthPatternClause((Syntax.InternalSyntax.SyntaxToken)openBracketToken.Node!, (Syntax.InternalSyntax.PatternSyntax)pattern.Green, (Syntax.InternalSyntax.SyntaxToken)closeBracketToken.Node!).CreateRed();
}

/// <summary>Creates a new LengthPatternClauseSyntax instance.</summary>
public static LengthPatternClauseSyntax LengthPatternClause(PatternSyntax pattern)
=> SyntaxFactory.LengthPatternClause(SyntaxFactory.Token(SyntaxKind.OpenBracketToken), pattern, SyntaxFactory.Token(SyntaxKind.CloseBracketToken));

/// <summary>Creates a new PositionalPatternClauseSyntax instance.</summary>
public static PositionalPatternClauseSyntax PositionalPatternClause(SyntaxToken openParenToken, SeparatedSyntaxList<SubpatternSyntax> subpatterns, SyntaxToken closeParenToken)
Expand All @@ -3574,16 +3605,22 @@ public static PositionalPatternClauseSyntax PositionalPatternClause(SeparatedSyn
=> SyntaxFactory.PositionalPatternClause(SyntaxFactory.Token(SyntaxKind.OpenParenToken), subpatterns, SyntaxFactory.Token(SyntaxKind.CloseParenToken));

/// <summary>Creates a new PropertyPatternClauseSyntax instance.</summary>
public static PropertyPatternClauseSyntax PropertyPatternClause(SyntaxToken openBraceToken, SeparatedSyntaxList<SubpatternSyntax> subpatterns, SyntaxToken closeBraceToken)
public static PropertyPatternClauseSyntax PropertyPatternClause(SyntaxKind kind, SyntaxToken openBraceToken, SeparatedSyntaxList<SubpatternSyntax> subpatterns, SyntaxToken closeBraceToken)
{
switch (kind)
{
case SyntaxKind.PropertyPatternClause:
case SyntaxKind.ListPatternClause: break;
default: throw new ArgumentException(nameof(kind));
}
if (openBraceToken.Kind() != SyntaxKind.OpenBraceToken) throw new ArgumentException(nameof(openBraceToken));
if (closeBraceToken.Kind() != SyntaxKind.CloseBraceToken) throw new ArgumentException(nameof(closeBraceToken));
return (PropertyPatternClauseSyntax)Syntax.InternalSyntax.SyntaxFactory.PropertyPatternClause((Syntax.InternalSyntax.SyntaxToken)openBraceToken.Node!, subpatterns.Node.ToGreenSeparatedList<Syntax.InternalSyntax.SubpatternSyntax>(), (Syntax.InternalSyntax.SyntaxToken)closeBraceToken.Node!).CreateRed();
return (PropertyPatternClauseSyntax)Syntax.InternalSyntax.SyntaxFactory.PropertyPatternClause(kind, (Syntax.InternalSyntax.SyntaxToken)openBraceToken.Node!, subpatterns.Node.ToGreenSeparatedList<Syntax.InternalSyntax.SubpatternSyntax>(), (Syntax.InternalSyntax.SyntaxToken)closeBraceToken.Node!).CreateRed();
}

/// <summary>Creates a new PropertyPatternClauseSyntax instance.</summary>
public static PropertyPatternClauseSyntax PropertyPatternClause(SeparatedSyntaxList<SubpatternSyntax> subpatterns = default)
=> SyntaxFactory.PropertyPatternClause(SyntaxFactory.Token(SyntaxKind.OpenBraceToken), subpatterns, SyntaxFactory.Token(SyntaxKind.CloseBraceToken));
public static PropertyPatternClauseSyntax PropertyPatternClause(SyntaxKind kind, SeparatedSyntaxList<SubpatternSyntax> subpatterns = default)
=> SyntaxFactory.PropertyPatternClause(kind, SyntaxFactory.Token(SyntaxKind.OpenBraceToken), subpatterns, SyntaxFactory.Token(SyntaxKind.CloseBraceToken));

/// <summary>Creates a new SubpatternSyntax instance.</summary>
public static SubpatternSyntax Subpattern(NameColonSyntax? nameColon, PatternSyntax pattern)
Expand Down Expand Up @@ -3684,6 +3721,17 @@ public static UnaryPatternSyntax UnaryPattern(SyntaxToken operatorToken, Pattern
public static UnaryPatternSyntax UnaryPattern(PatternSyntax pattern)
=> SyntaxFactory.UnaryPattern(SyntaxFactory.Token(SyntaxKind.NotKeyword), pattern);

/// <summary>Creates a new SlicePatternSyntax instance.</summary>
public static SlicePatternSyntax SlicePattern(SyntaxToken dotDotToken, PatternSyntax? pattern)
{
if (dotDotToken.Kind() != SyntaxKind.DotDotToken) throw new ArgumentException(nameof(dotDotToken));
return (SlicePatternSyntax)Syntax.InternalSyntax.SyntaxFactory.SlicePattern((Syntax.InternalSyntax.SyntaxToken)dotDotToken.Node!, pattern == null ? null : (Syntax.InternalSyntax.PatternSyntax)pattern.Green).CreateRed();
}

/// <summary>Creates a new SlicePatternSyntax instance.</summary>
public static SlicePatternSyntax SlicePattern(PatternSyntax? pattern = default)
=> SyntaxFactory.SlicePattern(SyntaxFactory.Token(SyntaxKind.DotDotToken), pattern);

/// <summary>Creates a new InterpolatedStringTextSyntax instance.</summary>
public static InterpolatedStringTextSyntax InterpolatedStringText(SyntaxToken textToken)
{
Expand Down
Loading