/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Analyzers/CSharp/CodeFixes/UseObjectInitializer/UseInitializerHelpers.cs
64 строки
3 KB
Cyrus Najmabadi
Token work
07 апр 2024, 06:20
07 апр 2024, 06:20
7f623fc
Код
Авторство
О чём код?
// 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 System; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.PooledObjects; namespace Microsoft.CodeAnalysis.CSharp.UseObjectInitializer; using static CSharpSyntaxTokens; using static SyntaxFactory; internal static class UseInitializerHelpers { public static BaseObjectCreationExpressionSyntax GetNewObjectCreation( BaseObjectCreationExpressionSyntax baseObjectCreation, SeparatedSyntaxList<ExpressionSyntax> expressions) { if (baseObjectCreation is ObjectCreationExpressionSyntax { ArgumentList.Arguments.Count: 0 } objectCreation) { baseObjectCreation = objectCreation .WithType(objectCreation.Type.WithTrailingTrivia(objectCreation.ArgumentList.GetTrailingTrivia())) .WithArgumentList(null); } var firstExpression = expressions.First(); var initializerKind = firstExpression is AssignmentExpressionSyntax ? SyntaxKind.ObjectInitializerExpression : SyntaxKind.CollectionInitializerExpression; return baseObjectCreation.WithInitializer(InitializerExpression(initializerKind, expressions)); } public static void AddExistingItems<TMatch, TElementSyntax>( BaseObjectCreationExpressionSyntax objectCreation, ArrayBuilder<SyntaxNodeOrToken> nodesAndTokens, bool addTrailingComma, Func<TMatch?, ExpressionSyntax, TElementSyntax> createElement) where TMatch : struct where TElementSyntax : SyntaxNode { if (objectCreation.Initializer != null) { foreach (var nodeOrToken in objectCreation.Initializer.Expressions.GetWithSeparators()) { if (nodeOrToken.IsToken) nodesAndTokens.Add(nodeOrToken.AsToken()); else nodesAndTokens.Add(createElement(null, (ExpressionSyntax)nodeOrToken.AsNode()!)); } } // If we have an odd number of elements already, add a comma at the end so that we can add the rest of the // items afterwards without a syntax issue. if (addTrailingComma && nodesAndTokens.Count % 2 == 1) { var last = nodesAndTokens.Last(); nodesAndTokens.RemoveLast(); nodesAndTokens.Add(last.WithTrailingTrivia()); nodesAndTokens.Add(CommaToken.WithTrailingTrivia(last.GetTrailingTrivia())); } } }