CodeQL 文档

用于处理 Go 程序的抽象语法树类

CodeQL 提供了大量用于表示 Go 程序抽象语法树的类。

抽象语法树 (AST) 表示程序的语法结构。AST 上的节点代表语句和表达式等元素。

语句类

此表列出了 Stmt 的所有子类。

语句语法 CodeQL 类 超类 备注
; EmptyStmt    
Expr ExprStmt    
{ Stmt ... } BlockStmt    
if Expr BlockStmt IfStmt    
if Expr BlockStmt else Stmt
if Stmt; Expr BlockStmt
for Expr BlockStmt ForStmt LoopStmt  
for Stmt; Expr; Stmt BlockStmt
for Expr ... = range Expr BlockStmt RangeStmt LoopStmt  
switch Expr { CaseClause ... } ExpressionSwitchStmt SwitchStmt  
switch Stmt; Expr { CaseClause ... }
switch Expr.(type) { CaseClause ... } TypeSwitchStmt SwitchStmt  
switch SimpleAssignStmt.(type) { CaseClause ... }
switch Stmt; Expr.(type) { CaseClause ... }
select { CommClause ... } SelectStmt    
return ReturnStmt    
 
break BreakStmt BranchStmt  
 
continue ContinueStmt BranchStmt  
 
goto LabelName GotoStmt BranchStmt  
fallthrough FallthroughStmt BranchStmt 只能作为 ExpressionSwitchStmtCaseClause 的最后一个非空子项出现
LabelName: Stmt LabeledStmt    
var VariableName TypeName DeclStmt    
const VariableName = Expr
type TypeName TypeExpr
type TypeName = TypeExpr
Expr ... = Expr ... AssignStmt SimpleAssignStmt, Assignment  
VariableName ... := Expr ... DefineStmt SimpleAssignStmt, Assignment  
Expr += Expr AddAssignStmt CompoundAssignStmt, Assignment  
Expr -= Expr SubAssignStmt CompoundAssignStmt, Assignment  
Expr *= Expr MulAssignStmt CompoundAssignStmt, Assignment  
Expr /= Expr QuoAssignStmt CompoundAssignStmt, Assignment  
Expr %= Expr RemAssignStmt CompoundAssignStmt, Assignment  
Expr *= Expr MulAssignStmt CompoundAssignStmt, Assignment  
Expr &= Expr AndAssignStmt CompoundAssignStmt, Assignment  
Expr |= Expr OrAssignStmt CompoundAssignStmt, Assignment  
Expr ^= Expr XorAssignStmt CompoundAssignStmt, Assignment  
Expr <<= Expr ShlAssignStmt CompoundAssignStmt, Assignment  
表达式 >>= 表达式 右移赋值语句 CompoundAssignStmt, Assignment  
表达式 &^= 表达式 按位与非赋值语句 CompoundAssignStmt, Assignment  
表达式 ++ 自增语句 自增自减语句  
表达式 -- 自减语句 自增自减语句  
go 函数调用表达式 启动协程语句    
defer 函数调用表达式 延迟执行语句    
表达式 <- 表达式 发送语句    
case 表达式 ...: 语句 ... 分支语句   只能作为 switch 语句 的子节点
case 类型表达式 ...: 语句 ...
default: 语句 ...
case 发送语句: 语句 ... 通信语句   只能作为 select 语句 的子节点
case 接收语句: 语句 ...
default: 语句 ...
表达式 ... = 接收表达式 接收语句   只能作为 通信语句 的子节点
变量名 ... := 接收表达式
(任何无法解析的代码) 错误语句    

表达式分类

Go 语言中有许多表达式类别,我们按类别列出它们。本节中所有类都是 表达式 的子类。

字面量

表达式语法示例 CodeQL 类 超类
23 整数字面量 基本字面量
4.2 浮点字面量 基本字面量
4.2 + 2.7i 虚数字面量 基本字面量
'a' 字符字面量 基本字面量
"Hello" 字符串字面量 基本字面量
func(x, y int) int { return x + y } 函数字面量 函数定义
map[string]int{"A": 1, "B": 2} 映射字面量 复合字面量
Point3D{0.5, -0.5, 0.5} 结构体字面量 复合字面量

类型表达式

这些类表示不同类型的表达式。它们没有共同的超类。

表达式语法 CodeQL 类 超类
[表达式] 类型表达式 数组类型表达式  
struct { ... } 结构体类型表达式  
func 函数名(...) (...) 函数类型表达式  
interface { ... } 接口类型表达式  
map[TypeExpr]TypeExpr MapTypeExpr  
chan<- TypeExpr SendChanTypeExpr ChanTypeExpr
<-chan TypeExpr RecvChanTypeExpr ChanTypeExpr
chan TypeExpr SendRecvChanTypeExpr ChanTypeExpr

名称表达式

本小节中的所有类都是 Name 的子类。

以下类与名称的结构相关。

表达式语法 CodeQL 类 超类
Ident SimpleName Ident
Ident.Ident QualifiedName SelectorExpr

以下类与名称引用的实体类型相关。

其他

表达式语法 CodeQL 类 超类 备注
foo Ident    
_ BlankIdent    
... Ellipsis    
(Expr) ParenExpr    
Ident.Ident SelectorExpr    
Expr[Expr] IndexExpr    
Expr[Expr:Expr:Expr] SliceExpr    
Expr.(TypeExpr) TypeAssertExpr    
*Expr StarExpr   可以是 ValueExprTypeExpr,取决于上下文
Expr: Expr KeyValueExpr    
TypeExpr(Expr) ConversionExpr CallOrConversionExpr  
Expr(...) CallExpr CallOrConversionExpr  
(任何无法解析的代码) BadExpr    

以下类按表达式引用的实体类型进行组织。

CodeQL 类 解释
TypeExpr 表示类型的表达式
ReferenceExpr 引用变量、常量、函数、字段或数组或切片元素的表达式
ValueExpr 可以计算为值的表达式(与引用包、类型或语句标签的表达式相对)。它是对 ReferenceExpr 的泛化
  • ©GitHub, Inc.
  • 条款
  • 隐私