【動態編譯】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.pswp.cn/pingmian/73718.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73718.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73718.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【SpringCloud】Eureka的使用

3. Eureka 3.1 Eureka 介紹 Eureka主要分為兩個部分&#xff1a; EurekaServer: 作為注冊中心Server端&#xff0c;向微服務應用程序提供服務注冊&#xff0c;發現&#xff0c;健康檢查等能力。 EurekaClient: 服務提供者&#xff0c;服務啟動時&#xff0c;會向 EurekaS…

前端知識點---window.location.assign() 和 window.location.href 的區別(javascript)

window.location.assign() 和 window.location.href 的主要區別&#xff1a; 讀取和設置 window.location.href&#xff1a;既可以讀取當前 URL&#xff0c;也可以通過賦值更改 URL。 window.location.assign()&#xff1a;只能用于跳轉到新的 URL&#xff0c;不能讀取當前地…

OpenCV圖像拼接(3)圖像拼接類cv::detail::MultiBandBlender

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::detail::MultiBandBlender 是 OpenCV 中用于圖像拼接&#xff08;stitching&#xff09;模塊的一個類&#xff0c;主要用于將多張重疊的圖像…

王者榮耀服務器突然崩了

就在剛剛王者榮耀服務器突然崩了 #王者榮耀崩了#的話題毫無預兆地沖上熱搜&#xff0c;許多玩家發現游戲登錄界面反復彈出異常提示&#xff0c;匹配成功后卡在加載界面&#xff0c;甚至出現對局數據丟失的情況。根據官方公告&#xff0c;目前技術團隊已在全力搶修服務器 #王者…

【JavaScript】JavaScript Promises實踐指南

【JavaScript】JavaScript Promises實踐指南 你了解JavaScript中的Promises嗎&#xff1f;這是一個很多人一開始就放棄的主題&#xff0c;但我會盡量讓它變得盡可能簡單。 1. “Promise”到底是什么&#xff1f; “Promise”是異步編程中的一個基本概念&#xff0c;特別是在J…

計算機視覺總結

以下是針對上述問題的詳細解答,并結合代碼示例進行說明: 1. 改進YOLOv5人臉檢測模塊,復雜光照場景準確率從98.2%提升至99.5% 優化具體過程: 光照補償:在數據預處理階段,采用自適應光照補償算法,對圖像進行實時增強,以減少光照變化對人臉檢測的影響。數據增強:在訓練…

ExpTimerApcRoutine函數分析之作用是ActiveTimerListHead里面移除定時器_etimer

第一部分&#xff1a; VOID ExpTimerApcRoutine ( IN PKAPC Apc, IN PKNORMAL_ROUTINE *NormalRoutine, IN PVOID *NormalContext, IN PVOID *SystemArgument1, IN PVOID *SystemArgument2 ) /* Routine Description: This function is the special …

算法分析與設計 專題三

目錄 一、實驗目的 二、實驗內容 三、問題分析與求解 四、AC源代碼、截圖 五、實驗小結 一、實驗目的 1、了解貪心算法的分析過程&#xff0c;學會用貪心算法解決一些具體的問題。 2、了解廣度優先算法和深度優先算法。 二、實驗內容 1992 當然&#xff0c;我們的收藏中…

1688商品詳情接口:深度解析與應用實踐

在電商領域&#xff0c;1688作為中國領先的B2B平臺&#xff0c;擁有海量的商品信息。對于開發者、商家和數據分析師來說&#xff0c;獲取1688商品的詳細信息是實現數據分析、競品研究、自動化管理和精準營銷的重要手段。本文將詳細介紹1688商品詳情接口的使用方法、技術細節以及…

每日算法-250328

記錄今天學習和解決的LeetCode算法題。 92. 反轉鏈表 II 題目 思路 本題要求反轉鏈表中從 left 到 right 位置的節點。我們可以采用 頭插法 的思路來反轉指定區間的鏈表。 具體來說&#xff0c;我們首先定位到 left 位置節點的前一個節點 prev。然后&#xff0c;從 left 位置…

C語言中的位域:節省內存的標志位管理技術

位域&#xff08;Bit-field&#xff09; 是 C 語言中的一種特性&#xff0c;允許在結構體&#xff08;struct&#xff09;中定義占用特定位數的成員變量。通過位域&#xff0c;可以更精細地控制內存的使用&#xff0c;尤其是在需要存儲多個布爾值或小范圍整數時&#xff0c;可以…

【AI編程學習之Python】第一天:Python的介紹

Python介紹 簡介 Python是一種解釋型、面向對象的語言。由吉多范羅蘇姆(Guido van Rossum)于1989年發明,1991年正式公布。官網:www.python.org Python單詞是"大蟒蛇”的意思。但是龜叔不是喜歡蟒蛇才起這個名字,而是正在追劇:英國電視喜劇片《蒙提派森的飛行馬戲團》(Mo…

【openstack系列】虛擬化技術

OpenStack 是一個開源的云計算管理平臺,它本身并不直接提供虛擬化技術,而是通過集成不同的虛擬化解決方案來管理和編排計算、存儲和網絡資源。OpenStack 的核心優勢在于其靈活性和可擴展性,支持多種虛擬化技術(Hypervisor),使企業可以根據需求選擇合適的底層虛擬化方案。…

保姆級教程:Vue3 + Django + MySQL 前后端聯調(PyCharm+VSCode版)

一、環境準備與驗證 這里為減少篇幅&#xff0c;默認大家都安裝好了這些軟件。不會下載安裝的&#xff0c;教程也很多&#xff0c;這里不再做贅述。話不多說&#xff0c;咱們開始&#xff1a; 1. 安裝驗證 確保已安裝以下軟件并驗證版本&#xff1a; # 驗證Node.js node -v…

Spring Data審計利器:@LastModifiedDate詳解!!!

&#x1f552; Spring Data審計利器&#xff1a;LastModifiedDate詳解&#x1f525; &#x1f31f; 簡介 在數據驅動的應用中&#xff0c;記錄數據的最后修改時間是常見需求。Spring Data的LastModifiedDate注解讓這一過程自動化成為可能&#xff01;本篇帶你掌握它的核心用法…

洛谷題單1-P1001 A+B Problem-python-流程圖重構

題目描述 輸入兩個整數 a,b&#xff0c;輸出它們的和&#xff08;∣a∣,∣b∣≤109&#xff09;。 輸入格式 兩個以空格分開的整數。 輸出格式 一個整數。 輸入輸出樣例 輸入 20 30輸出 50方式-print class Solution:staticmethoddef oi_input():"""從…

CCF CSP 第33次(2024.03)(2_相似度計算_C++)(字符串中字母大小寫轉換+哈希集合)

CCF CSP 第33次&#xff08;2024.03&#xff09;&#xff08;2_相似度計算_C&#xff09; 題目背景&#xff1a;題目描述&#xff1a;輸入格式&#xff1a;輸出格式&#xff1a;樣例1輸入&#xff1a;樣例1輸出&#xff1a;樣例1解釋&#xff1a;樣例2輸入&#xff1a;樣例2輸出…

Windows .gitignore文件不生效的情況排查

概述 今天下班在家里搗騰自己的代碼&#xff0c;在配置.gitignore文件忽略部分文件的時候&#xff0c;發現死活不生效 問題根源 經過一通分析和排查才發現&#xff0c;是.gitignore文件的編碼錯了&#xff0c;剛開始還沒注意到&#xff0c;因為是在Windows下開發&#xff0c…

Uniapp自定義TabBar組件全封裝實踐與疑難問題解決方案

前言 在當前公司小程序項目中&#xff0c;我們遇到了一個具有挑戰性的需求&#xff1a;根據不同用戶身份動態展示差異化的底部導航欄&#xff08;TabBar&#xff09; 。這種多角色場景下的UI適配需求&#xff0c;在提升用戶體驗和實現精細化運營方面具有重要意義。 在技術調研…

四川省汽車加氣站操作工備考題庫及答案分享

1.按壓力容器的設計壓力分為&#xff08; &#xff09;個壓力等級。 A. 三 B. 四 C. 五 D. 六 答案&#xff1a;B。解析&#xff1a;按壓力容器的設計壓力分為低壓、中壓、高壓、超高壓四個壓力等級。 2.緩沖罐的安裝位置在天然氣壓縮機&#xff08; &#xff09;。 A. 出口處 …