【动态编译】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# 的关键字,通常用于标识特定的语法结构。
ClassKeyword:class关键字,用于类声明。NamespaceKeyword:namespace关键字,用于命名空间声明。PublicKeyword:public访问修饰符。VoidKeyword:void返回类型。IfKeyword:if关键字,用于条件语句。ReturnKeyword:return关键字,用于返回语句。- 示例:
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:预定义类型(如int、string)。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 值及其含义:
关键字
ClassKeyword:classPublicKeyword:publicStaticKeyword:staticIntKeyword:int
运算符
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 和 Node:
SyntaxKind既用于节点(如ClassDeclaration),也用于标记(如PlusToken)。标记通常是SyntaxToken的Kind,而非完整的SyntaxNode。 - 版本差异:随着 C# 语言更新(如 C# 11、12),
SyntaxKind会新增值(如RawStringLiteralToken)。 - 性能:频繁使用
Kind()检查时,考虑缓存或使用类型转换。
8. 总结
SyntaxKind是 Roslyn 中标识语法节点类型的核心枚举。- 分类:包括关键字、运算符、声明、语句、表达式等。
- 用途:用于解析、分析和生成 C# 代码。
如果你需要某个具体 SyntaxKind 值(如 SwitchExpression)的详细说明,或想结合具体场景使用,请告诉我,我会进一步展开!
相关文章:
【动态编译】Roslyn中 SyntaxKind 枚举类型
在 Roslyn(.NET 的编译器平台)中,SyntaxKind 是一个枚举类型,定义了 C# 语言中所有可能的语法节点类型。它是 Roslyn 抽象语法树(AST)的基础,用于标识每个 SyntaxNode 的具体种类。SyntaxKind 的…...
getID3获取本地或远程视频时长
音频文件也可使用,使用ffmeg安装太复杂了 附ffmpeg方式:centos下安装ffmpeg_yum安装ffmpeg-CSDN博客 使用composer先安装 composer require james-heinrich/getid3 获取本地视频 //获取本地视频$video_path $_SERVER[DOCUMENT_ROOT].$params[video];…...
【211】线上教学系统
--基于SSM线上教学平添 主要实现的功能有: 管理员 : 首页、个人中心、学员管理、资料类型管理、学习资料管理、交流论坛、我的收藏管理、试卷管理、留言板管理、试题管理、系统管理、考试管理。 学员 : 首页、个人中心、我的收藏管理、留言板管理、考试管理。 前台…...
从混乱思绪到清晰表达:记录想法如何改变你的学习人生
关键要点 • 记录想法似乎是发现自己想法并将其组织成可传播形式的最佳理由,研究表明写作和教学能增强学习和理解。 • 证据倾向于支持写作有助于澄清思想,而教学通过“教授效应”深化知识。 • 教学和分享被认为是最有效的学习方法,这与记录…...
uvm sequence
UVM Sequence 是验证环境中生成和控制事务(Transaction)流的核心机制,它通过动态生成、随机化和调度事务,实现灵活多样的测试场景。以下是Sequence的详细解析: Sequence 的核心作用 事务流生成:通过 uvm_s…...
CMake ERROR: arm-none-eabi-gcc is not able to compile a simple test program.
用 cmake 构建 STM32 工程问题【已解决】 环境信息 os: ubuntu22.04gcc: arm-none-eabi-gcc (Arm GNU Toolchain 13.2.rel1 (Build arm-13.7)) 13.2.1 20231009cmake: cmake version 3.22.1ninja: 1.10.1 问题 log [main] 正在配置项目: Olidy [driver] 删除 /home/pomegr…...
地图项目入手学习
如果你目前对自己的地图项目实现原理不太了解,周末可以通过以下方法进行高效学习: ⸻ 第一步:梳理项目相关代码(3 小时) 目标:先大致了解你的地图项目代码,找到核心实现逻辑。 具体做法&…...
电机控制常见面试问题(二十)
文章目录 一.整流电路绕组接法二.电机为什么需要转速器三.电机转矩产生原理四.电机控制中载波频率大小的确定五.开关周期 Tpwm 一.整流电路绕组接法 为了引出直流的输出,一定要在整流变压器的二次侧引出零线,所以二次侧绕组必须接成星形 一次绕组必须要…...
小爱控制via电视浏览器搜索图片-Homeassistant重制上一个自动化
制作自动化详情 为了完成图片搜,暂定指令找找{描述} 在执行脚本的adb地方输入以下指令,百度 因安全不让在图片地址直接搜转用bing >- >am start -n mark.via.gp/mark.via.Shell -a android.intent.action.VIEW -d https://cn.bing.com/images/…...
unity一个图片的物体,会有透明的效果
如图 想要去掉这个透明效果 选择一个高层级的layer即可。...
docker网桥问题导致ldap组件安装失败分析解决
使用pass_install_x86_64_0124版部署k8s底座、kem; 问题:一台kem节点部署ldap组件失败 解决:恢复问题主机的docker0网卡,重新部署kem相关组件 二、问题详情 现象描述 ansible部署kem组件 TASK [kem : start ldap] **********…...
面试的时候问到了HTML5的新特性有哪些
HTML5 是对 HTML 的重要更新,它引入了许多新特性和改进,使 Web 开发变得更加灵活和强大。以下是一些 HTML5 的关键新特性: 1. 新的文档结构元素 HTML5 引入了一些新的语义化元素,帮助开发者更清晰地结构化网页内容,改…...
AI: 文生视频的主流产品
当前主流的5个文生视频(Text-to-Video)产品及其核心特点,综合技术能力、应用场景及市场影响力: 1. Sora(OpenAI) 核心能力:支持通过文本指令生成最长60秒的高质量视频,包含复杂场景、…...
【Python】pillow库学习笔记1-Image类
《Python语言程序设计基础 》第3版,嵩天 黄天羽 杨雅婷著,P293 1.pillow库概述 Pillow 库是Python图像处理重要的第三方库。 Pillow库是PIL (Python image library) 库的一个扩展,需要通过pip工具安装。安装PIL库需要注意,安装…...
智能网联交通加速落地,光路科技TSN技术助推车路云一体化发展
今日,为期两天的第二十七届高速公路信息化大会在青岛国际会展中心(红岛馆)圆满落幕。本次大会以“数智转型安全”为主题,聚焦高速公路数字化转型、车路云协同以及新一代信息技术的融合应用。会议汇聚了交通行业的专家学者、企业代…...
node-imap-sync-client, imap 客户端, 例子
说明 本文是 node-imap-sync-client imap客户端库的使用例子 https://blog.csdn.net/eli960/article/details/146049717 例子 import { imapSyncClient, imapUtf7ToUtf8, utf8ToImapUtf7 } from "imap-sync-client"const sleep async (t) > {return new Promi…...
定时自启动与自关闭一些python脚本
是windows系统,要是linux就好了. 思路是这样的, 首先到早上6点整启动脚本或某个软件,然后记录下对应的pid,等到了晚上18点整的时候,自动根据pid再杀死对应进程. 定时开启与关闭用apscheduler, 示例代码如下: from apscheduler.schedulers.blocking import BlockingSchedule…...
boost.asio
as(async):异步 同步io: reactor (非阻塞)(需要注册一次,在等待消息时可以干别的事) 阻塞io网络模型 接口:read\accept\connect\write 接口返回时,io完成 异步…...
当贝AI知识库评测 AI如何让知识检索快人一步
近日,国内领先的人工智能服务商当贝AI正式推出“个人知识库”功能,这一创新性工具迅速引发行业关注。在信息爆炸的时代,如何高效管理个人知识资产、快速获取精准答案成为用户的核心需求。当贝AI通过将“闭卷考试”变为“开卷考试”的独特设计,为用户打造了一个高度个性化的智能…...
格雷码、汉明码,CRC校验的区别
格雷码、汉明码和CRC校验都是用于数据传输和存储中的编码技术。 它们在原理、功能和应用场景上存在显著区别。 1.格雷码(Gray Code) • 定义:格雷码是一种特殊的二进制编码,任意两个相邻的码字之间仅有一位不同。 • 功能&#x…...
uvm configuration
UVM Configuration 机制详解 UVM 的 配置机制(Configuration Mechanism) 是验证环境中实现参数传递和动态配置的核心方法,通过 uvm_config_db 类实现跨组件的数据共享和灵活配置。以下是其核心概念、使用方法和最佳实践的详细解析࿱…...
nginx配置页面缓存,前端每次打包生成新的js文件
前端需要处理的:使用时间戳作为文件名 // nuxt.config.js export default {build: {filenames: {app: ({ isDev }) > isDev ? [name].js : [name].${Date.now()}.js, // 生产环境用时间戳chunk: ({ isDev }) > isDev ? [name].js : [name].${Date.now()}.j…...
Google开源机器学习框架TensorFlow探索更多ViT优化
一、在边缘设备优化ViTa 在边缘设备上优化 ViT(Vision Transformer)模型,主要目标是减少计算量、降低功耗、提升推理速度。以下是几种关键优化策略: 1.轻量级 ViT 变体 部分 ViT 变体专为边缘设备优化,包括…...
深度解读:智能体2.0 AI Agent多推演进
AI Agent即AI 代理,长期以来,研究人员一直在追求更完美的AI,可以与人类相当、甚至是超越人类。在1950年代,AIan Turing就将“智能”的概念扩展到了人工实体,并提出了著名的图灵测试。这些人工智能实体就被称为——Agen…...
Docker Swarm 和 docker composer 需要 的yaml 文件有什么区别
Docker Compose 和 Docker Swarm 都使用 YAML 文件来定义服务、网络和卷的配置,但它们的 YAML 文件格式和功能有一些关键区别。以下是它们的主要区别: 1. 文件格式 Docker Compose: 使用 docker-compose.yml 文件。支持的版本号通常为 2.x 或…...
Golang 的 GMP 调度机制常见问题及解答
文章目录 Golang GMP 调度模型详解常见问题基础概念1. GMP 各组件的作用是什么?2. 为什么 Go 需要自己的调度器?3. GOMAXPROCS 的作用是什么? 调度流程4. Goroutine 如何被调度到 M 上执行?5. 系统调用会阻塞整个线程吗࿱…...
项目-苍穹外卖(十五) Apache ECharts+数据统计
一、介绍 二、营业额统计 需求分析和设计: Controller: Service: /*** 营业额统计* param begindate* param enddate* return* */Overridepublic TurnoverReportVO turnoverStatistics(LocalDate begindate, LocalDate enddate) {//创建时间集合List<LocalDate&…...
Windows 10/11 使用 VSCode + SSH 免密远程连接 Ubuntu 服务器(指定端口)
摘要: 本文详细介绍如何在 Windows 系统上通过 VSCode Remote-SSH 免密登录远程 Ubuntu 服务器(SSH 端口 2202),避免每次输入密码的繁琐操作,提高开发效率。 1. 环境准备 本地系统:Windows 10/11远程服务…...
【9】Strongswan collections —— enumerator
//以目录枚举为例子,说明enumerator,从源码剥离可运行 #include <stdio.h> #include <stdbool.h> #include <dirent.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h&…...
大数据学习(88)-zookeeper实现的高可用(HA)
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
