/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/Core/CodeAnalysisTest/CommonSyntaxTests.cs
249 строк
10 KB
Mykola Balakin
Use SyntaxFactory.IdentifierName to create an instance of SyntaxNode instead of SyntaxToken (#38311) (#69318)
07 авг 2023, 23:45
Не верифицирован
07 авг 2023, 23:45
0fcc408
Код
Авторство
О чём код?
// 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. #nullable disable using System; using System.Linq; using Microsoft.CodeAnalysis.Text; using Roslyn.Test.Utilities; using Xunit; using VB = Microsoft.CodeAnalysis.VisualBasic; using CS = Microsoft.CodeAnalysis.CSharp; namespace Microsoft.CodeAnalysis.UnitTests { public class CommonSyntaxTests { [Fact] public void Kinds() { foreach (CS.SyntaxKind kind in Enum.GetValues(typeof(CS.SyntaxKind))) { Assert.True(CS.CSharpExtensions.IsCSharpKind((int)kind), kind + " should be C# kind"); if (kind != CS.SyntaxKind.None && kind != CS.SyntaxKind.List) { Assert.False(VB.VisualBasicExtensions.IsVisualBasicKind((int)kind), kind + " should not be VB kind"); } } foreach (VB.SyntaxKind kind in Enum.GetValues(typeof(VB.SyntaxKind))) { Assert.True(VB.VisualBasicExtensions.IsVisualBasicKind((int)kind), kind + " should be VB kind"); if (kind != VB.SyntaxKind.None && kind != VB.SyntaxKind.List) { Assert.False(CS.CSharpExtensions.IsCSharpKind((int)kind), kind + " should not be C# kind"); } } } [Fact] public void SyntaxNodeOrToken() { var d = default(SyntaxNodeOrToken); Assert.True(d.IsToken); Assert.False(d.IsNode); Assert.Equal(0, d.RawKind); Assert.Equal("", d.Language); Assert.Equal(default(TextSpan), d.FullSpan); Assert.Equal(default(TextSpan), d.Span); Assert.Equal("", d.ToString()); Assert.Equal("", d.ToFullString()); Assert.Equal("SyntaxNodeOrToken None ", d.GetDebuggerDisplay()); } [Fact] public void SyntaxNodeOrToken1() { var d = (SyntaxNodeOrToken)((SyntaxNode)null); Assert.True(d.IsToken); Assert.False(d.IsNode); Assert.Equal(0, d.RawKind); Assert.Equal("", d.Language); Assert.Equal(default(TextSpan), d.FullSpan); Assert.Equal(default(TextSpan), d.Span); Assert.Equal("", d.ToString()); Assert.Equal("", d.ToFullString()); Assert.Equal("SyntaxNodeOrToken None ", d.GetDebuggerDisplay()); } [Fact] public void CommonSyntaxToString_CSharp() { SyntaxNode node = CSharp.SyntaxFactory.IdentifierName("test"); Assert.Equal("test", node.ToString()); SyntaxNodeOrToken nodeOrToken = node; Assert.Equal("test", nodeOrToken.ToString()); SyntaxToken token = node.DescendantTokens().Single(); Assert.Equal("test", token.ToString()); SyntaxTrivia trivia = CSharp.SyntaxFactory.Whitespace("test"); Assert.Equal("test", trivia.ToString()); } [Fact] public void CommonSyntaxToString_VisualBasic() { SyntaxNode node = VB.SyntaxFactory.IdentifierName("test"); Assert.Equal("test", node.ToString()); SyntaxNodeOrToken nodeOrToken = node; Assert.Equal("test", nodeOrToken.ToString()); SyntaxToken token = node.DescendantTokens().Single(); Assert.Equal("test", token.ToString()); SyntaxTrivia trivia = VB.SyntaxFactory.Whitespace("test"); Assert.Equal("test", trivia.ToString()); } [Fact] public void CommonSyntaxTriviaSpan_CSharp() { var csharpToken = CSharp.SyntaxFactory.ParseExpression("1 + 123 /*hello*/").GetLastToken(); var csharpTriviaList = csharpToken.TrailingTrivia; Assert.Equal(2, csharpTriviaList.Count); var csharpTrivia = csharpTriviaList.ElementAt(1); Assert.Equal(CSharp.SyntaxKind.MultiLineCommentTrivia, CSharp.CSharpExtensions.Kind(csharpTrivia)); var correctSpan = csharpTrivia.Span; Assert.Equal(8, correctSpan.Start); Assert.Equal(17, correctSpan.End); var commonTrivia = (SyntaxTrivia)csharpTrivia; //direct conversion Assert.Equal(correctSpan, commonTrivia.Span); var commonTriviaList = (SyntaxTriviaList)csharpTriviaList; var commonTrivia2 = commonTriviaList[1]; //from converted list Assert.Equal(correctSpan, commonTrivia2.Span); var commonToken = (SyntaxToken)csharpToken; var commonTriviaList2 = commonToken.TrailingTrivia; var commonTrivia3 = commonTriviaList2[1]; //from converted token Assert.Equal(correctSpan, commonTrivia3.Span); var csharpTrivia2 = (SyntaxTrivia)commonTrivia; //direct conversion Assert.Equal(correctSpan, csharpTrivia2.Span); var csharpTriviaList2 = (SyntaxTriviaList)commonTriviaList; var csharpTrivia3 = csharpTriviaList2.ElementAt(1); //from converted list Assert.Equal(correctSpan, csharpTrivia3.Span); } [Fact] public void CommonSyntaxTriviaSpan_VisualBasic() { var vbToken = VB.SyntaxFactory.ParseExpression("1 + 123 'hello").GetLastToken(); var vbTriviaList = (SyntaxTriviaList)vbToken.TrailingTrivia; Assert.Equal(2, vbTriviaList.Count); var vbTrivia = vbTriviaList.ElementAt(1); Assert.Equal(VB.SyntaxKind.CommentTrivia, VB.VisualBasicExtensions.Kind(vbTrivia)); var correctSpan = vbTrivia.Span; Assert.Equal(8, correctSpan.Start); Assert.Equal(14, correctSpan.End); var commonTrivia = (SyntaxTrivia)vbTrivia; //direct conversion Assert.Equal(correctSpan, commonTrivia.Span); var commonTriviaList = (SyntaxTriviaList)vbTriviaList; var commonTrivia2 = commonTriviaList[1]; //from converted list Assert.Equal(correctSpan, commonTrivia2.Span); var commonToken = (SyntaxToken)vbToken; var commonTriviaList2 = commonToken.TrailingTrivia; var commonTrivia3 = commonTriviaList2[1]; //from converted token Assert.Equal(correctSpan, commonTrivia3.Span); var vbTrivia2 = (SyntaxTrivia)commonTrivia; //direct conversion Assert.Equal(correctSpan, vbTrivia2.Span); var vbTriviaList2 = (SyntaxTriviaList)commonTriviaList; var vbTrivia3 = vbTriviaList2.ElementAt(1); //from converted list Assert.Equal(correctSpan, vbTrivia3.Span); } [Fact, WorkItem(824695, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/824695")] public void CSharpSyntax_VisualBasicKind() { var node = CSharp.SyntaxFactory.IdentifierName("a"); Assert.Equal(VB.SyntaxKind.None, VisualBasic.VisualBasicExtensions.Kind(node)); var token = CSharp.SyntaxFactory.Token(CSharp.SyntaxKind.IfKeyword); Assert.Equal(VB.SyntaxKind.None, VisualBasic.VisualBasicExtensions.Kind(token)); var trivia = CSharp.SyntaxFactory.Comment("c"); Assert.Equal(VB.SyntaxKind.None, VisualBasic.VisualBasicExtensions.Kind(trivia)); } [Fact, WorkItem(824695, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/824695")] public void VisualBasicSyntax_CSharpKind() { var node = VisualBasic.SyntaxFactory.IdentifierName("a"); Assert.Equal(CSharp.SyntaxKind.None, CSharp.CSharpExtensions.Kind(node)); var token = VisualBasic.SyntaxFactory.Token(VisualBasic.SyntaxKind.IfKeyword); Assert.Equal(CSharp.SyntaxKind.None, CSharp.CSharpExtensions.Kind(token)); var trivia = VisualBasic.SyntaxFactory.CommentTrivia("c"); Assert.Equal(CSharp.SyntaxKind.None, CSharp.CSharpExtensions.Kind(trivia)); } [Fact] public void TestTrackNodes() { var expr = CSharp.SyntaxFactory.ParseExpression("a + b + c + d"); var exprB = expr.DescendantNodes().OfType<CSharp.Syntax.IdentifierNameSyntax>().First(n => n.Identifier.ToString() == "b"); var trackedExpr = expr.TrackNodes(exprB); // replace each expression with a parenthesized expression trackedExpr = trackedExpr.ReplaceNodes( nodes: trackedExpr.DescendantNodes().OfType<CSharp.Syntax.ExpressionSyntax>(), computeReplacementNode: (node, rewritten) => CSharp.SyntaxFactory.ParenthesizedExpression(rewritten)); trackedExpr = trackedExpr.NormalizeWhitespace(); Assert.Equal("(((a) + (b)) + (c)) + (d)", trackedExpr.ToString()); var trackedB = trackedExpr.GetCurrentNodes(exprB).First(); Assert.Equal(CSharp.SyntaxKind.ParenthesizedExpression, CSharp.CSharpExtensions.Kind(trackedB.Parent)); } [Fact] public void TestTrackNodesWithDuplicateIdAnnotations() { var expr = CSharp.SyntaxFactory.ParseExpression("a + b + c + d"); var exprB = expr.DescendantNodes().OfType<CSharp.Syntax.IdentifierNameSyntax>().First(n => n.Identifier.ToString() == "b"); var trackedExpr = expr.TrackNodes(exprB); var annotation = trackedExpr.GetAnnotatedNodes(SyntaxNodeExtensions.IdAnnotationKind).First() .GetAnnotations(SyntaxNodeExtensions.IdAnnotationKind).First(); // replace each expression with a parenthesized expression trackedExpr = trackedExpr.ReplaceNodes( nodes: trackedExpr.DescendantNodes().OfType<CSharp.Syntax.ExpressionSyntax>(), computeReplacementNode: (node, rewritten) => CSharp.SyntaxFactory.ParenthesizedExpression(rewritten).WithAdditionalAnnotations(annotation)); trackedExpr = trackedExpr.NormalizeWhitespace(); Assert.Equal("(((a) + (b)) + (c)) + (d)", trackedExpr.ToString()); var trackedB = trackedExpr.GetCurrentNodes(exprB).First(); Assert.Equal(CSharp.SyntaxKind.ParenthesizedExpression, CSharp.CSharpExtensions.Kind(trackedB.Parent)); } } }