Skip to content

Commit 1d4a8a9

Browse files
authored
Change Range precedence to be just below unary (#36543)
Fixes #34483, #36112
1 parent 313a3e0 commit 1d4a8a9

File tree

2 files changed

+289
-10
lines changed

2 files changed

+289
-10
lines changed

src/Compilers/CSharp/Portable/Parser/LanguageParser.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8855,10 +8855,10 @@ enum Precedence : uint
88558855
Equality,
88568856
Relational,
88578857
Shift,
8858-
Range,
88598858
Additive,
88608859
Mutiplicative,
88618860
Switch,
8861+
Range,
88628862
Unary,
88638863
Cast,
88648864
PointerIndirection,
@@ -10381,6 +10381,7 @@ private static bool CanFollowCast(SyntaxKind kind)
1038110381
case SyntaxKind.EndOfFileToken:
1038210382
case SyntaxKind.SwitchKeyword:
1038310383
case SyntaxKind.EqualsGreaterThanToken:
10384+
case SyntaxKind.DotDotToken:
1038410385
return false;
1038510386
default:
1038610387
return true;

src/Compilers/CSharp/Test/Syntax/Parsing/ExpressionParsingTests.cs

Lines changed: 287 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4136,7 +4136,7 @@ public void RangeExpression_Binary_WithALowerPrecedenceOperator()
41364136
public void RangeExpression_Binary_WithAHigherPrecedenceOperator()
41374137
{
41384138
UsingExpression("1+2..3-4");
4139-
N(SyntaxKind.RangeExpression);
4139+
N(SyntaxKind.SubtractExpression);
41404140
{
41414141
N(SyntaxKind.AddExpression);
41424142
{
@@ -4145,23 +4145,301 @@ public void RangeExpression_Binary_WithAHigherPrecedenceOperator()
41454145
N(SyntaxKind.NumericLiteralToken, "1");
41464146
}
41474147
N(SyntaxKind.PlusToken);
4148-
N(SyntaxKind.NumericLiteralExpression);
4148+
N(SyntaxKind.RangeExpression);
41494149
{
4150-
N(SyntaxKind.NumericLiteralToken, "2");
4150+
N(SyntaxKind.NumericLiteralExpression);
4151+
{
4152+
N(SyntaxKind.NumericLiteralToken, "2");
4153+
}
4154+
N(SyntaxKind.DotDotToken);
4155+
N(SyntaxKind.NumericLiteralExpression);
4156+
{
4157+
N(SyntaxKind.NumericLiteralToken, "3");
4158+
}
41514159
}
41524160
}
4161+
N(SyntaxKind.MinusToken);
4162+
N(SyntaxKind.NumericLiteralExpression);
4163+
{
4164+
N(SyntaxKind.NumericLiteralToken, "4");
4165+
}
4166+
}
4167+
EOF();
4168+
}
4169+
4170+
[Fact]
4171+
public void RangeExpression_UnaryBadLeft()
4172+
{
4173+
UsingExpression("a*..b");
4174+
N(SyntaxKind.MultiplyExpression);
4175+
{
4176+
N(SyntaxKind.IdentifierName);
4177+
{
4178+
N(SyntaxKind.IdentifierToken, "a");
4179+
}
4180+
N(SyntaxKind.AsteriskToken);
4181+
N(SyntaxKind.RangeExpression);
4182+
{
4183+
N(SyntaxKind.DotDotToken);
4184+
N(SyntaxKind.IdentifierName);
4185+
{
4186+
N(SyntaxKind.IdentifierToken, "b");
4187+
}
4188+
}
4189+
}
4190+
EOF();
4191+
}
4192+
4193+
[Fact]
4194+
public void RangeExpression_BinaryLeftPlus()
4195+
{
4196+
UsingExpression("a + b..c");
4197+
N(SyntaxKind.AddExpression);
4198+
{
4199+
N(SyntaxKind.IdentifierName);
4200+
{
4201+
N(SyntaxKind.IdentifierToken, "a");
4202+
}
4203+
N(SyntaxKind.PlusToken);
4204+
N(SyntaxKind.RangeExpression);
4205+
{
4206+
N(SyntaxKind.IdentifierName);
4207+
{
4208+
N(SyntaxKind.IdentifierToken, "b");
4209+
}
4210+
N(SyntaxKind.DotDotToken);
4211+
N(SyntaxKind.IdentifierName);
4212+
{
4213+
N(SyntaxKind.IdentifierToken, "c");
4214+
}
4215+
}
4216+
}
4217+
EOF();
4218+
}
4219+
4220+
[Fact]
4221+
public void RangeExpression_UnaryLeftPlus()
4222+
{
4223+
UsingExpression("a + b..");
4224+
N(SyntaxKind.AddExpression);
4225+
{
4226+
N(SyntaxKind.IdentifierName);
4227+
{
4228+
N(SyntaxKind.IdentifierToken, "a");
4229+
}
4230+
N(SyntaxKind.PlusToken);
4231+
N(SyntaxKind.RangeExpression);
4232+
{
4233+
N(SyntaxKind.IdentifierName);
4234+
{
4235+
N(SyntaxKind.IdentifierToken, "b");
4236+
}
4237+
N(SyntaxKind.DotDotToken);
4238+
}
4239+
}
4240+
EOF();
4241+
}
4242+
4243+
[Fact]
4244+
public void RangeExpression_UnaryRightMult()
4245+
{
4246+
UsingExpression("a.. && b");
4247+
N(SyntaxKind.LogicalAndExpression);
4248+
{
4249+
N(SyntaxKind.RangeExpression);
4250+
{
4251+
N(SyntaxKind.IdentifierName);
4252+
{
4253+
N(SyntaxKind.IdentifierToken, "a");
4254+
}
4255+
N(SyntaxKind.DotDotToken);
4256+
}
4257+
N(SyntaxKind.AmpersandAmpersandToken);
4258+
N(SyntaxKind.IdentifierName);
4259+
{
4260+
N(SyntaxKind.IdentifierToken, "b");
4261+
}
4262+
}
4263+
EOF();
4264+
}
4265+
4266+
[Fact]
4267+
public void RangeExpression_UnaryRightMult2()
4268+
{
4269+
UsingExpression("..a && b");
4270+
N(SyntaxKind.LogicalAndExpression);
4271+
{
4272+
N(SyntaxKind.RangeExpression);
4273+
{
4274+
N(SyntaxKind.DotDotToken);
4275+
N(SyntaxKind.IdentifierName);
4276+
{
4277+
N(SyntaxKind.IdentifierToken, "a");
4278+
}
4279+
}
4280+
N(SyntaxKind.AmpersandAmpersandToken);
4281+
N(SyntaxKind.IdentifierName);
4282+
{
4283+
N(SyntaxKind.IdentifierToken, "b");
4284+
}
4285+
}
4286+
EOF();
4287+
}
4288+
4289+
[Fact]
4290+
public void RangeExpression_Ambiguity1()
4291+
{
4292+
UsingExpression(".. ..");
4293+
N(SyntaxKind.RangeExpression);
4294+
{
41534295
N(SyntaxKind.DotDotToken);
4154-
N(SyntaxKind.SubtractExpression);
4296+
N(SyntaxKind.RangeExpression);
41554297
{
4156-
N(SyntaxKind.NumericLiteralExpression);
4298+
N(SyntaxKind.DotDotToken);
4299+
}
4300+
}
4301+
EOF();
4302+
}
4303+
4304+
[Fact]
4305+
public void RangeExpression_Ambiguity2()
4306+
{
4307+
UsingExpression(".. .. e");
4308+
N(SyntaxKind.RangeExpression);
4309+
{
4310+
N(SyntaxKind.DotDotToken);
4311+
N(SyntaxKind.RangeExpression);
4312+
{
4313+
N(SyntaxKind.DotDotToken);
4314+
N(SyntaxKind.IdentifierName);
41574315
{
4158-
N(SyntaxKind.NumericLiteralToken, "3");
4316+
N(SyntaxKind.IdentifierToken, "e");
41594317
}
4160-
N(SyntaxKind.MinusToken);
4161-
N(SyntaxKind.NumericLiteralExpression);
4318+
}
4319+
}
4320+
EOF();
4321+
}
4322+
4323+
[Fact(Skip = "https://github.com/dotnet/roslyn/issues/36514")]
4324+
public void RangeExpression_Ambiguity3()
4325+
{
4326+
UsingExpression(".. e ..");
4327+
N(SyntaxKind.RangeExpression);
4328+
{
4329+
N(SyntaxKind.DotDotToken);
4330+
N(SyntaxKind.RangeExpression);
4331+
{
4332+
N(SyntaxKind.IdentifierName);
4333+
{
4334+
N(SyntaxKind.IdentifierToken, "e");
4335+
}
4336+
N(SyntaxKind.DotDotToken);
4337+
}
4338+
}
4339+
EOF();
4340+
}
4341+
4342+
[Fact]
4343+
public void RangeExpression_Ambiguity4()
4344+
{
4345+
UsingExpression("a .. .. b");
4346+
N(SyntaxKind.RangeExpression);
4347+
{
4348+
N(SyntaxKind.IdentifierName);
4349+
{
4350+
N(SyntaxKind.IdentifierToken, "a");
4351+
}
4352+
N(SyntaxKind.DotDotToken);
4353+
N(SyntaxKind.RangeExpression);
4354+
{
4355+
N(SyntaxKind.DotDotToken);
4356+
N(SyntaxKind.IdentifierName);
4357+
{
4358+
N(SyntaxKind.IdentifierToken, "b");
4359+
}
4360+
}
4361+
}
4362+
EOF();
4363+
}
4364+
4365+
[Fact(Skip = "https://github.com/dotnet/roslyn/issues/36514")]
4366+
public void RangeExpression_Ambiguity5()
4367+
{
4368+
UsingExpression("a .. b ..");
4369+
N(SyntaxKind.RangeExpression);
4370+
{
4371+
N(SyntaxKind.IdentifierName);
4372+
{
4373+
N(SyntaxKind.IdentifierToken, "a");
4374+
}
4375+
N(SyntaxKind.DotDotToken);
4376+
N(SyntaxKind.RangeExpression);
4377+
{
4378+
N(SyntaxKind.IdentifierName);
4379+
{
4380+
N(SyntaxKind.IdentifierToken, "b");
4381+
}
4382+
N(SyntaxKind.DotDotToken);
4383+
}
4384+
}
4385+
EOF();
4386+
}
4387+
4388+
[Fact(Skip = "https://github.com/dotnet/roslyn/issues/36514")]
4389+
public void RangeExpression_Ambiguity6()
4390+
{
4391+
UsingExpression("a .. b .. c");
4392+
N(SyntaxKind.RangeExpression);
4393+
{
4394+
N(SyntaxKind.IdentifierName);
4395+
{
4396+
N(SyntaxKind.IdentifierToken, "a");
4397+
}
4398+
N(SyntaxKind.DotDotToken);
4399+
N(SyntaxKind.RangeExpression);
4400+
{
4401+
N(SyntaxKind.IdentifierName);
4402+
{
4403+
N(SyntaxKind.IdentifierToken, "b");
4404+
}
4405+
N(SyntaxKind.DotDotToken);
4406+
}
4407+
}
4408+
EOF();
4409+
}
4410+
4411+
[Fact, WorkItem(36122, "https://github.com/dotnet/roslyn/issues/36122")]
4412+
public void RangeExpression_NotCast()
4413+
{
4414+
UsingExpression("(Offset)..(Offset + Count)");
4415+
N(SyntaxKind.RangeExpression);
4416+
{
4417+
N(SyntaxKind.ParenthesizedExpression);
4418+
{
4419+
N(SyntaxKind.OpenParenToken);
4420+
N(SyntaxKind.IdentifierName);
4421+
{
4422+
N(SyntaxKind.IdentifierToken, "Offset");
4423+
}
4424+
N(SyntaxKind.CloseParenToken);
4425+
}
4426+
N(SyntaxKind.DotDotToken);
4427+
N(SyntaxKind.ParenthesizedExpression);
4428+
{
4429+
N(SyntaxKind.OpenParenToken);
4430+
N(SyntaxKind.AddExpression);
41624431
{
4163-
N(SyntaxKind.NumericLiteralToken, "4");
4432+
N(SyntaxKind.IdentifierName);
4433+
{
4434+
N(SyntaxKind.IdentifierToken, "Offset");
4435+
}
4436+
N(SyntaxKind.PlusToken);
4437+
N(SyntaxKind.IdentifierName);
4438+
{
4439+
N(SyntaxKind.IdentifierToken, "Count");
4440+
}
41644441
}
4442+
N(SyntaxKind.CloseParenToken);
41654443
}
41664444
}
41674445
EOF();

0 commit comments

Comments
 (0)