【动态编译】Roslyn中 SyntaxKind 枚举类型

在 Roslyn(.NET 的编译器平台)中,SyntaxKind 是一个枚举类型,定义了 C# 语言中所有可能的语法节点类型。它是 Roslyn 抽象语法树(AST)的基础,用于标识每个 SyntaxNode 的具体种类。SyntaxKind 的值直接对应于 C# 的语法结构,例如关键字、运算符、声明、语句和表达式等。

以下是对 SyntaxKind 枚举的详细说明,包括其分类、常见值及其用途。我会尽量全面且清晰地列出主要类别和示例,并避免过于冗长。如果你需要某个具体部分的深入解释,可以进一步告诉我!


1. SyntaxKind 概述

  • 命名空间Microsoft.CodeAnalysis.CSharp
  • 用途:通过 SyntaxNode.Kind() 方法返回节点的类型,帮助开发者识别和处理特定的语法结构。
  • 数量SyntaxKind 包含数百个值,覆盖 C# 的所有语法元素(截至 C# 12,大约有 800+ 个值)。
  • 分类:可以分为关键字、运算符、声明、语句、表达式等。

2. 主要分类与常见值

以下是 SyntaxKind 的主要分类及其代表性枚举值:

2.1 关键字(Keywords)

这些值对应 C# 的关键字,通常用于标识特定的语法结构。

  • ClassKeywordclass 关键字,用于类声明。
  • NamespaceKeywordnamespace 关键字,用于命名空间声明。
  • PublicKeywordpublic 访问修饰符。
  • VoidKeywordvoid 返回类型。
  • IfKeywordif 关键字,用于条件语句。
  • ReturnKeywordreturn 关键字,用于返回语句。
  • 示例
    public class MyClass { }
    // PublicKeyword, ClassKeyword
    
2.2 运算符(Operators)

这些值表示运算符,通常出现在表达式中。

  • PlusToken+ 加法运算符。
  • MinusToken- 减法运算符。
  • AsteriskToken* 乘法运算符。
  • SlashToken/ 除法运算符。
  • EqualsEqualsToken== 相等运算符。
  • GreaterThanToken> 大于运算符。
  • 示例
    int x = 1 + 2;
    // PlusToken
    
2.3 声明(Declarations)

这些值表示代码中的声明结构。

  • CompilationUnit:整个源文件的根节点。
  • NamespaceDeclaration:命名空间声明。
  • ClassDeclaration:类声明。
  • MethodDeclaration:方法声明。
  • FieldDeclaration:字段声明。
  • VariableDeclaration:变量声明。
  • Parameter:方法参数。
  • 示例
    class MyClass
    {int x;void MyMethod(int p) { }
    }
    // ClassDeclaration, FieldDeclaration, MethodDeclaration, Parameter
    
2.4 语句(Statements)

这些值表示执行语句。

  • Block:代码块({})。
  • ExpressionStatement:表达式语句。
  • IfStatement:if 语句。
  • ElseClause:else 子句。
  • ReturnStatement:return 语句。
  • LocalDeclarationStatement:局部变量声明语句。
  • ForStatement:for 循环。
  • WhileStatement:while 循环。
  • 示例
    if (x > 0) { return x; }
    // IfStatement, Block, ReturnStatement
    
2.5 表达式(Expressions)

这些值表示计算或值的表达式。

  • LiteralExpression:字面量表达式(如数字、字符串)。
  • BinaryExpression:二元表达式(如 x + y)。
  • InvocationExpression:方法调用表达式。
  • ObjectCreationExpression:对象创建表达式(new)。
  • AssignmentExpression:赋值表达式(如 x = 5)。
  • IdentifierName:标识符名称(如变量名、类名)。
  • MemberAccessExpression:成员访问表达式(如 Console.WriteLine)。
  • 示例
    Console.WriteLine(1 + 2);
    // InvocationExpression, BinaryExpression, LiteralExpression
    
2.6 其他结构
  • UsingDirective:using 指令。
  • Argument:方法调用的参数。
  • Attribute:特性(如 [Obsolete])。
  • PredefinedType:预定义类型(如 intstring)。
  • Trivia:语法琐碎内容(如空格、注释,不是严格的节点,但与 SyntaxToken 相关)。
  • 示例
    using System;
    // UsingDirective
    

3. SyntaxKind 的层级关系

SyntaxKind 的值与 SyntaxNode 的派生类一一对应。例如:

  • SyntaxKind.ClassDeclaration 对应 ClassDeclarationSyntax
  • SyntaxKind.BinaryExpression 对应 BinaryExpressionSyntax
  • SyntaxKind.IfStatement 对应 IfStatementSyntax

这种对应关系允许开发者通过 Kind() 判断节点类型,然后转换为具体的派生类以访问特定属性。


4. 示例:遍历并识别 SyntaxKind

以下代码展示如何解析 C# 代码并打印每个节点的 SyntaxKind

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System;class Program
{static void Main(){string code = @"using System;class Program{static void Main(){int x = 1 + 2;Console.WriteLine(x);}}";SyntaxTree tree = CSharpSyntaxTree.ParseText(code);var root = tree.GetRoot();PrintSyntaxTree(root, 0);}static void PrintSyntaxTree(SyntaxNode node, int depth){Console.WriteLine(new string(' ', depth * 2) + node.Kind());foreach (var child in node.ChildNodes()){PrintSyntaxTree(child, depth + 1);}}
}
输出(简化版)
CompilationUnitUsingDirectiveQualifiedNameIdentifierNameClassDeclarationIdentifierNameMethodDeclarationPredefinedTypeIdentifierNameBlockLocalDeclarationStatementVariableDeclarationPredefinedTypeVariableDeclaratorBinaryExpressionLiteralExpressionLiteralExpressionExpressionStatementInvocationExpressionMemberAccessExpressionIdentifierNameIdentifierNameArgumentListArgumentIdentifierName

5. SyntaxKind 的具体值(部分列举)

以下是一些常见的 SyntaxKind 值及其含义:

关键字
  • ClassKeywordclass
  • PublicKeywordpublic
  • StaticKeywordstatic
  • IntKeywordint
运算符
  • PlusToken+
  • EqualsToken=
  • SemicolonToken;
  • OpenBraceToken{
声明
  • NamespaceDeclaration:命名空间声明
  • ClassDeclaration:类声明
  • MethodDeclaration:方法声明
语句
  • IfStatement:if 语句
  • ReturnStatement:return 语句
  • Block:代码块
表达式
  • LiteralExpression:字面量
  • BinaryExpression:二元表达式
  • InvocationExpression:方法调用
其他
  • UsingDirective:using 指令
  • EndOfFileToken:文件结束标记

完整列表可以在 Roslyn 源代码的 SyntaxKind.cs 文件中找到(位于 Microsoft.CodeAnalysis.CSharp 命名空间)。


6. 使用场景

  • 代码分析:通过 Kind() 判断节点类型,提取特定结构。
    var methods = root.DescendantNodes().OfType<MethodDeclarationSyntax>().Where(m => m.Modifiers.Any(SyntaxKind.PublicKeyword));
    
  • 代码生成:使用 SyntaxFactory 创建节点时指定 SyntaxKind
    var literal = SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(42));
    
  • 重构:替换或修改特定类型的节点。

7. 注意事项

  • 区分 Token 和 NodeSyntaxKind 既用于节点(如 ClassDeclaration),也用于标记(如 PlusToken)。标记通常是 SyntaxTokenKind,而非完整的 SyntaxNode
  • 版本差异:随着 C# 语言更新(如 C# 11、12),SyntaxKind 会新增值(如 RawStringLiteralToken)。
  • 性能:频繁使用 Kind() 检查时,考虑缓存或使用类型转换。

8. 总结

  • SyntaxKind 是 Roslyn 中标识语法节点类型的核心枚举。
  • 分类:包括关键字、运算符、声明、语句、表达式等。
  • 用途:用于解析、分析和生成 C# 代码。

如果你需要某个具体 SyntaxKind 值(如 SwitchExpression)的详细说明,或想结合具体场景使用,请告诉我,我会进一步展开!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/42670.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫的第三天——爬动态网页

一、基本概念 动态网页是指网页内容可以根据用户的操作或者预设条件而实时发生变化的网页。 特点&#xff1a; 用户交互&#xff1a;动态网页能够根据用户的请求而生成不同的内容。内容动态生成&#xff1a;数据来自数据库、API或用户输入。客户端动态渲染&#xff1a;浏览器…

【MATLAB例程】三维环境,基于TOA的动态轨迹定位,轨迹使用UKF(无迹卡尔曼滤波)进行滤波,模拟TOA/IMU的数据融合

本代码实现了一个基于到达时间&#xff08;TOA&#xff09;测距的三维定位系统&#xff0c;结合无迹卡尔曼滤波&#xff08;UKF&#xff09;对移动目标的轨迹进行优化。代码通过多锚节点&#xff08;>3&#xff09;的TOA测量数据&#xff0c;先进行初步定位解算&#xff0c;…

旋转变换原理

旋转变换原理 旋转是仿射变换的一种&#xff0c;通过变换矩阵实现图像绕指定中心旋转&#xff0c;保持直线和平行性不变。其数学表示为&#xff1a; 其中&#xff1a; ( c x , c y ) (c_x, c_y) (cx​,cy​) 是旋转中心。 θ \theta θ 是旋转角度&#xff08;逆时针为正&…

【计算机网络】DHCP工作原理

DHCP(动态主机配置协议) Dynamic Host Configuration Protocol 基于UDP协议传输 DHCP分配IP地址的过程 &#xff08;1&#xff09;DHCP DISCOVER客户机请求 IP 地址&#xff1a; 当一个 DHCP 客户机启动时&#xff0c;客户机还没有 IP 地址&#xff0c;所以客户机要通过 DHC…

应用于汽车车灯电路中的电感产品选型及质量管控标准

随着汽车的智能化与电动化发展&#xff0c;汽车车灯系统逐渐从单一照明功能向集成化、智能化和高能效方向演进。汽车车灯的性能关系着行车安全和驾驶体验&#xff0c;而车规级电感器作为车灯驱动电源电路中的核心元件&#xff0c;其性能直接决定了汽车车灯的效率、可靠性及环境…

MinGW下编译ffmpeg源码时生成compile_commands.json

在前面的博文MinGW下编译nginx源码中&#xff0c;有介绍到使用compiledb工具在MinGW环境中生成compile_commands.json&#xff0c;以为compiledb是捕获的make时的输出&#xff0c;而nginx生成时控制台是有输出编译时的命令行信息的&#xff0c;笔者之前编译过ffmpeg的源码&…

JDBC FetchSize不生效,批量变全量致OOM问题分析

背景 一个简单的基于 JDBC 采集数据库表的功能&#xff0c;当采集 Postgre SQL 某表&#xff0c;其数据量达到 500万左右的时候&#xff0c;程序一启动就将 JVM 堆内存「6G」干满了。 问题是程序中使用了游标的只前进配置&#xff0c;且设置了 fetchSize 属性&#xff1a; q…

OpenCV 图形API(或称G-API)

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 引言 OpenCV 图形API&#xff08;或称G-API&#xff09;是一个新的OpenCV模块&#xff0c;旨在使常规图像处理更快且更便携。通过引入一种新的基于图的执行…

注意!ChatGPT 全新 AI 图像功能延迟对免费用户开放

2025 年 3 月 25 日&#xff0c;OpenAI 正式宣布在 ChatGPT 中推出基于 GPT-4o 模型的全新原生图像生成功能。 这一功能允许用户通过对话生成和编辑图像&#xff0c;支持从写实风格到插图风格的多种形式。OpenAI 首席执行官萨姆・奥特曼&#xff08;Sam Altman&#xff09;在社…

方阵幂次(矩阵快速幂)

#include <bits/stdc.h> using namespace std;int n; vector<vector<int>> fuc(vector<vector<int>> a,vector<vector<int>> b){ // 矩阵乘法函数vector<vector<int>> f(n,vector<int>(n));for(int i0;i<n;i){…

MySQL-- 多表查询的分类,SQL92与SQL99,7种JOIN的实现,SQL99语法的新特性

目录 一&#xff0c;多表查询的分类 角度1&#xff1a;等值连接 vs 非等值连接 角度2&#xff1a;自连接 vs 非自连接 角度3&#xff1a;内连接 vs 外连接 二&#xff0c;SQL92语法实现内连接&#xff1a;见上&#xff0c;略SQL92语法实现外连接&#xff1a;使用 -…

IEEE PDF Xpress校验出现 :字体无法嵌入问题以及pdf版本问题

文章目录 问题描述一、字体嵌入问题首先查看一下&#xff0c;哪些字体没有被嵌入查看window的font文件夹里的字体下载字体的网站修复字体嵌入问题 二、pdf版本不对 问题描述 在处理IEEE的camera ready的时候&#xff0c;提交到IEEE express的文件没有办法通过validate&#xf…

产生式系统的完整示例——医疗诊断系统(附python代码)

产生式系统在现实社会中依然有很重要的应用价值&#xff0c;为了更好的理解它的构建、推理以及完整的实现过程&#xff0c;本文一医疗诊断系统为例&#xff0c;进行详细说明。以下是一个包含10条规则的医疗诊断产生式系统示例&#xff0c;包含完整的规则定义、推理流程图、Pyth…

【CSS3】02-选择器 + CSS特性 + 背景属性 + 显示模式

本文主要介绍&#xff1a;选择器、CSS属性、背景属性和显示模式的操作写法。 目录 1. 复合选择器 1.1 后代选择器 1.2 子代选择器 1.3 并集选择器 1.4 交集选择器 2. 伪类选择器 2.1 超链接&#xff08;拓展&#xff09; 3. CSS特性 3.1 继承性 3.2 层叠性 3.3 优先…

清华大学第10讲:迈向未来的AI教学实验396页PPT 探索未来教育的无限可能|附PPT下载方法

导 读INTRODUCTION 今天跟大家分享的是清华大学新闻与传播学院、人工智能学院双聘教授沈阳教授团队出品的《迈向未来的AI教学实验》课程作业集&#xff0c;随着人工智能技术的飞速发展&#xff0c;教育领域也迎来了前所未有的变革。该报告为沈阳教授与学生们在“迈向未来的AI教…

亮数据爬取API爬取亚马逊电商平台实战教程

前言 在当今数据驱动的商业环境中&#xff0c;企业需要快速、精准地获取互联网上的公开数据以支持市场分析、竞品调研和用户行为研究。然而&#xff0c;传统的手动网页爬取方式面临着诸多挑战&#xff1a;IP封锁、验证码干扰、网站结构频繁变更&#xff0c;以及高昂的运维成本…

【新手初学】读取服务器敏感文件数据

一、引言 想要让利用注入点让SQL语句能执行读取相关文件的操作&#xff0c;需要一个非常重要的条件&#xff0c;即在MySql数据库的配置文件my.ini中一定要有 secure file priv" " 二、读取文件配置 ①在虚拟机中查看my.ini文件中有没有secure file priv" &qu…

央视少儿APP V2.6.2

安装好软件就能直接看&#xff0c;界面干净&#xff0c;播放流畅得很。里面的内容都是经过严格筛选的&#xff0c;动画、纪录片、教育课程这些资源应有尽有 这款软件的画质高清到让人惊艳&#xff0c;就算不登录也丝毫不影响观看体验&#xff0c;播放的时候几乎不用缓冲&#…

mysqlworkbench导入.sql文件

1、MySQL Workbench 新建数据库 或者 在左侧导航栏的 ​Schemas 区域右键选择 ​Create Schema...输入数据库名称&#xff08;例如 mydatabase&#xff09;&#xff0c;点击 ​Apply确认创建&#xff0c;点击 ​Finish 2、选择目标数据库 在左侧导航栏的 ​Schemas 列表中&a…

比较4点结构和4次函数

在行列可自由变换的平面上3点结构只有6个 设与之对应的函数分别是 3a1 x*x*y y*y*x 3a2 xy*y*y 3a3 x*x*y y*y*y 3a4 x*x*x y*y*x 3a5 x*x*xy*y*y 3a6 x*x*xy 用同样的办法计算4点结构的16个函数 4(4a1-1)2*3a32*3a1 4(4a2-1)3a43a33a53a1 4(4a3-1)3a23a3…