文档符号
通过 textDocument/documentSymbol 提供文件大纲和面包屑导航:嵌套符号树包含范围、选择范围和 detail 字段,该字段用于区分重载并显示所声明的类型。
符号层级
嵌套符号树
符号按代码中书写的作用域嵌套;作用域外的定义以限定名称显示在其实际书写的位置
符号范围和选择范围
符号范围覆盖整个声明;选择范围覆盖完整书写的名称,包括 ~Widget、operator== 和 operator bool 等由多个 Token 组成的名称
按访问说明符分组
访问说明符尚未在大纲中形成分组节点
匿名作用域和内联作用域
匿名命名空间、未命名结构体和联合体的成员归在占位名称下;内联命名空间的成员仍归在该内联命名空间节点下
UTF-16 位置编码
非 ASCII 文本之后的列位置按 UTF-16 代码单元计数
符号种类
核心符号种类
命名空间、类、结构体、联合体、枚举及其成员、函数、变量、字段、结构化绑定(structured bindings)和 Lambda 都会出现在大纲中,并映射到相应的 LSP 符号种类
模板声明
类模板、函数模板和变量模板的详细信息带有 template 前缀;Concept 和简写函数模板(使用 concept auto 参数)也会出现在大纲中
模板特化和推导指引
类模板和变量模板的显式特化与偏特化会在名称中显示模板实参;成员嵌套在所属特化下;推导指引显示推导出的签名
类型别名
typedef、using 别名和别名模板会出现在大纲中,详细信息为 type alias
显式实例化指令
类、函数和变量的显式实例化都显示为没有子节点的符号
宏定义
对象式宏和函数式宏会出现在大纲中,函数式宏的详细信息还会列出参数
Preamble 区域中的宏
对于编辑器发起的请求,文件开头连续预处理指令中的宏尚未列入大纲
模块声明
接口单元的模块声明会在大纲中显示它所定义的模块
符号详细信息
函数签名
detail 字段中的参数类型和返回类型用于区分重载;构造函数省略 void 返回类型
变量和字段类型
变量的详细信息显示声明的类型,Lambda 则显示为 (lambda)
移除默认实参
签名根据函数类型生成,因此参数默认值不会出现在大纲中
详细信息中的基类
派生类的详细信息尚未包含其基类
多行签名范围
符号范围从声明起始处开始,覆盖完整签名,使编辑器的粘性滚动能够正确定位
带作用域的类型
代码中书写的类作用域在详细信息中恰好出现一次,嵌套类、模板标识(template-id)、别名和依赖名称均如此
缺失的符号
包含指令
#include 指令尚未出现在大纲中
局部符号
函数体内声明的变量和类型嵌套在所属函数下
#pragma mark 导航标记
编辑器分节标记尚未显示在大纲中
友元函数定义
在类中内联定义的友元函数显示在该类下
符号标签
弃用标签
已弃用的符号尚未带有 LSP deprecated 符号标签
访问权限与存储属性标识
大纲条目尚未显示访问权限、静态、虚或抽象修饰信息
位置准确性
宏展开生成的符号
宏调用生成的符号定位到宏调用处,而非宏定义处
宏实参中书写的名称
选择范围指向宏实参中书写的名称;对于宏体中书写的名称,则回退到宏调用处
