/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Workspaces/CSharp/Portable/Simplification/Reducers/CSharpNameReducer.Rewriter.cs
229 строк
7 KB
Cyrus Najmabadi
Make sealed
26 мар 2025, 22:21
26 мар 2025, 22:21
d99b771
Код
Авторство
О чём код?
// 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 Microsoft.CodeAnalysis.CSharp.Extensions; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Formatting; using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Simplification; namespace Microsoft.CodeAnalysis.CSharp.Simplification; internal sealed partial class CSharpNameReducer { private sealed class Rewriter : AbstractReductionRewriter { public Rewriter(ObjectPool<IReductionRewriter> pool) : base(pool) { } public override SyntaxNode VisitPredefinedType(PredefinedTypeSyntax node) { var oldAlwaysSimplify = this.alwaysSimplify; if (!this.alwaysSimplify) { this.alwaysSimplify = node.HasAnnotation(Simplifier.Annotation); } var result = SimplifyNode( node, newNode: base.VisitPredefinedType(node), simplifier: s_simplifyName); this.alwaysSimplify = oldAlwaysSimplify; return result; } public override SyntaxNode VisitAliasQualifiedName(AliasQualifiedNameSyntax node) { var oldAlwaysSimplify = this.alwaysSimplify; if (!this.alwaysSimplify) { this.alwaysSimplify = node.HasAnnotation(Simplifier.Annotation); } var result = SimplifyNode( node, newNode: base.VisitAliasQualifiedName(node), simplifier: s_simplifyName); this.alwaysSimplify = oldAlwaysSimplify; return result; } public override SyntaxNode VisitQualifiedName(QualifiedNameSyntax node) { var oldAlwaysSimplify = this.alwaysSimplify; if (!this.alwaysSimplify) { this.alwaysSimplify = node.HasAnnotation(Simplifier.Annotation); } var result = SimplifyNode( node, newNode: base.VisitQualifiedName(node), simplifier: s_simplifyName); this.alwaysSimplify = oldAlwaysSimplify; return result; } public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyntax node) { var oldAlwaysSimplify = this.alwaysSimplify; if (!this.alwaysSimplify) { this.alwaysSimplify = node.HasAnnotation(Simplifier.Annotation); } var result = SimplifyNode( node, newNode: base.VisitMemberAccessExpression(node), simplifier: s_simplifyName); this.alwaysSimplify = oldAlwaysSimplify; return result; } public override SyntaxNode VisitIdentifierName(IdentifierNameSyntax node) { var oldAlwaysSimplify = this.alwaysSimplify; if (!this.alwaysSimplify) { this.alwaysSimplify = node.HasAnnotation(Simplifier.Annotation); } var result = SimplifyNode( node, newNode: base.VisitIdentifierName(node), simplifier: s_simplifyName); this.alwaysSimplify = oldAlwaysSimplify; return result; } public override SyntaxNode VisitGenericName(GenericNameSyntax node) { var oldAlwaysSimplify = this.alwaysSimplify; if (!this.alwaysSimplify) { this.alwaysSimplify = node.HasAnnotation(Simplifier.Annotation); } var result = SimplifyNode( node, newNode: base.VisitGenericName(node), simplifier: s_simplifyName); this.alwaysSimplify = oldAlwaysSimplify; return result; } public override SyntaxNode VisitQualifiedCref(QualifiedCrefSyntax node) { var oldAlwaysSimplify = this.alwaysSimplify; if (!this.alwaysSimplify) { this.alwaysSimplify = node.HasAnnotation(Simplifier.Annotation); } var result = SimplifyNode( node, newNode: base.VisitQualifiedCref(node), simplifier: s_simplifyName); this.alwaysSimplify = oldAlwaysSimplify; return result; } public override SyntaxNode VisitArrayType(ArrayTypeSyntax node) { var oldAlwaysSimplify = this.alwaysSimplify; if (!this.alwaysSimplify) { this.alwaysSimplify = node.HasAnnotation(Simplifier.Annotation); } var result = SimplifyNode( node, newNode: base.VisitArrayType(node), simplifier: s_simplifyName); this.alwaysSimplify = oldAlwaysSimplify; return result; } public override SyntaxNode VisitNullableType(NullableTypeSyntax node) { var oldAlwaysSimplify = this.alwaysSimplify; if (!this.alwaysSimplify) { this.alwaysSimplify = node.HasAnnotation(Simplifier.Annotation); } var result = SimplifyNode( node, newNode: base.VisitNullableType(node), simplifier: s_simplifyName); this.alwaysSimplify = oldAlwaysSimplify; return result; } public override SyntaxNode VisitTupleType(TupleTypeSyntax node) { var oldAlwaysSimplify = this.alwaysSimplify; if (!this.alwaysSimplify) { this.alwaysSimplify = node.HasAnnotation(Simplifier.Annotation); } var result = SimplifyNode( node, newNode: base.VisitTupleType(node), simplifier: s_simplifyName); this.alwaysSimplify = oldAlwaysSimplify; return result; } public override SyntaxNode VisitBinaryExpression(BinaryExpressionSyntax node) { var isOrAsNode = node.Kind() is SyntaxKind.AsExpression or SyntaxKind.IsExpression; var result = (ExpressionSyntax)base.VisitBinaryExpression(node); if (result != node && isOrAsNode) { // In order to handle cases in which simplifying a name would result in code // that parses different, we pre-emptively add parentheses that will be // simplified away later. // // For example, this code... // // var x = y as Nullable<int> + 1; // // ...should simplify as... // // var x = (y as int?) + 1; return result.Parenthesize().WithAdditionalAnnotations(Formatter.Annotation); } return result; } } }