/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/CSharp/Test/Syntax/Parsing/RangeExpressionParsingTests.cs
318 строк
9 KB
Cyrus Najmabadi
Do not lex `..` as a single DotDotToken (#75549)
25 окт 2024, 09:56
Не верифицирован
25 окт 2024, 09:56
09a7b38
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using Xunit; using Xunit.Abstractions; namespace Microsoft.CodeAnalysis.CSharp.UnitTests; public sealed class RangeExpressionParsingTests(ITestOutputHelper output) : ParsingTests(output) { [Fact] public void CastingRangeExpressionWithoutStartOrEnd() { UsingExpression("(int).."); N(SyntaxKind.CastExpression); { N(SyntaxKind.OpenParenToken); N(SyntaxKind.PredefinedType); { N(SyntaxKind.IntKeyword); } N(SyntaxKind.CloseParenToken); N(SyntaxKind.RangeExpression); { N(SyntaxKind.DotDotToken); } } EOF(); } [Fact] public void CastingRangeExpressionWithoutStart() { UsingExpression("(int)..0"); N(SyntaxKind.CastExpression); { N(SyntaxKind.OpenParenToken); N(SyntaxKind.PredefinedType); { N(SyntaxKind.IntKeyword); } N(SyntaxKind.CloseParenToken); N(SyntaxKind.RangeExpression); { N(SyntaxKind.DotDotToken); N(SyntaxKind.NumericLiteralExpression); { N(SyntaxKind.NumericLiteralToken, "0"); } } } EOF(); } [Fact] public void ConditionalExpressionWithEmptyRangeForWhenTrue() { UsingExpression("a ? .. : b"); N(SyntaxKind.ConditionalExpression); { N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "a"); } N(SyntaxKind.QuestionToken); N(SyntaxKind.RangeExpression); { N(SyntaxKind.DotDotToken); } N(SyntaxKind.ColonToken); N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "b"); } } EOF(); } [Fact] public void ConditionalExpressionWithEmptyRangeForWhenFalse() { UsingExpression("a ? b : .."); N(SyntaxKind.ConditionalExpression); { N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "a"); } N(SyntaxKind.QuestionToken); N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "b"); } N(SyntaxKind.ColonToken); N(SyntaxKind.RangeExpression); { N(SyntaxKind.DotDotToken); } } EOF(); } [Fact] public void ConditionalExpressionWithEmptyRangeForWhenTrueAndWhenFalse() { UsingExpression("a ? .. : .."); N(SyntaxKind.ConditionalExpression); { N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "a"); } N(SyntaxKind.QuestionToken); N(SyntaxKind.RangeExpression); { N(SyntaxKind.DotDotToken); } N(SyntaxKind.ColonToken); N(SyntaxKind.RangeExpression); { N(SyntaxKind.DotDotToken); } } EOF(); } [Fact] public void ConditionalExpressionWithEmptyStartRangeForWhenTrue() { UsingExpression("a ? ..b : c"); N(SyntaxKind.ConditionalExpression); { N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "a"); } N(SyntaxKind.QuestionToken); N(SyntaxKind.RangeExpression); { N(SyntaxKind.DotDotToken); N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "b"); } } N(SyntaxKind.ColonToken); N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "c"); } } EOF(); } [Fact] public void ConditionalExpressionWithEmptyStartRangeForWhenFalse() { UsingExpression("a ? b : ..c"); N(SyntaxKind.ConditionalExpression); { N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "a"); } N(SyntaxKind.QuestionToken); N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "b"); } N(SyntaxKind.ColonToken); N(SyntaxKind.RangeExpression); { N(SyntaxKind.DotDotToken); N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "c"); } } } EOF(); } [Fact] public void ConditionalExpressionWithEmptyStartRangeForWhenTrueAndFalse() { UsingExpression("a ? ..b : ..c"); N(SyntaxKind.ConditionalExpression); { N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "a"); } N(SyntaxKind.QuestionToken); N(SyntaxKind.RangeExpression); { N(SyntaxKind.DotDotToken); N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "b"); } } N(SyntaxKind.ColonToken); N(SyntaxKind.RangeExpression); { N(SyntaxKind.DotDotToken); N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "c"); } } } EOF(); } [Fact] public void CastingRangeExpressionInPattern1() { UsingExpression("x is (int).."); N(SyntaxKind.IsPatternExpression); { N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "x"); } N(SyntaxKind.IsKeyword); N(SyntaxKind.ConstantPattern); { N(SyntaxKind.CastExpression); { N(SyntaxKind.OpenParenToken); N(SyntaxKind.PredefinedType); { N(SyntaxKind.IntKeyword); } N(SyntaxKind.CloseParenToken); N(SyntaxKind.RangeExpression); { N(SyntaxKind.DotDotToken); } } } } EOF(); } [Fact] public void CastingRangeExpressionInPattern2() { UsingExpression("x is (int).", // (1,1): error CS1073: Unexpected token '.' // x is (int). Diagnostic(ErrorCode.ERR_UnexpectedToken, "x is (int)").WithArguments(".").WithLocation(1, 1)); N(SyntaxKind.IsPatternExpression); { N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "x"); } N(SyntaxKind.IsKeyword); N(SyntaxKind.ParenthesizedPattern); { N(SyntaxKind.OpenParenToken); N(SyntaxKind.TypePattern); { N(SyntaxKind.PredefinedType); { N(SyntaxKind.IntKeyword); } } N(SyntaxKind.CloseParenToken); } } EOF(); } [Fact] public void CastingRangeExpressionInPattern3() { UsingExpression("x is (int).Length", // (1,1): error CS1073: Unexpected token '.' // x is (int).Length Diagnostic(ErrorCode.ERR_UnexpectedToken, "x is (int)").WithArguments(".").WithLocation(1, 1)); N(SyntaxKind.IsPatternExpression); { N(SyntaxKind.IdentifierName); { N(SyntaxKind.IdentifierToken, "x"); } N(SyntaxKind.IsKeyword); N(SyntaxKind.ParenthesizedPattern); { N(SyntaxKind.OpenParenToken); N(SyntaxKind.TypePattern); { N(SyntaxKind.PredefinedType); { N(SyntaxKind.IntKeyword); } } N(SyntaxKind.CloseParenToken); } } EOF(); } }