豫言源码浏览器 / Source Browser

浏览项目文件与源码

yuyan · 814 行 · 42952 字节 · UTF-8
§
寻观「编译器核心」之「编译数据」之「编译配置」之「阶段环境」之书。
寻观「标准库」之书。
寻观「标准库」之「操作系统」之「文件系统」之书。
寻观「标准库」之「数据结构」之「字典术」之书。
寻观「癸象工具」之「总集」之书。
寻观「编译器核心」之「编译数据」之「抽象绑定树结构」之「抽象语法树」之「总集」之书。

「:
软件架构说明

本文件是编译器与编辑器扩展之间的语言服务资料层。它不直接响应编辑器请求,
而是在正常编译过程中收集名称与类型资料,再将资料写入构建缓存。编辑器扩展
收到悬停或跳转请求时,只需读取最近一次编译留下的语言服务癸象文件,因此编译器
本身无需常驻,也不需要另设通信进程。

一、整体资料流

一.分布编译步骤在读取某个源文件的抽象语法后,调用「准备语言服务信息」。
   此操作读取原始源码,并清空本文件中属于上一文件的收集状态。

二.名称解析负责确定每个名称究竟引用哪个局部绑定、文件定义或构造器。
   名称一旦解析成功,便调用「标注引用语言服务信息」:一方面记录“引用范围到
   定义范围”的关系,另一方面把原表达式包在「源码范围标注节点」中。跳转到定义
   因而在名称解析这个拥有最准确信息的阶段完成,不依赖之后的类型推断结果。

三.类型检查遇到「源码范围标注节点」时,先照常求得被标注表达式的类型,再调用
   「悬停类型文字」与「记录悬停文字信息」,最后只返回检查后的原表达式。
   标注节点是名称解析与类型检查之间的暂存节点,绝不能流入擦除、优化或代码生成。
   顶层定义和构造器没有普通引用节点包裹,所以文件结构检查会另外调用
   「记录定义悬停」,为定义处补上悬停资料。

四.类型检查结束后,分布编译步骤调用「写语言服务信息」,把本文件收集的资料
   与源文件、检查后定义等产物放在同一个构建缓存目录。编辑器扩展从最新缓存中
   找到对应源文件的“语言服务”产物,按请求筛选覆盖光标且范围最窄的一项。

二、本文件内部的分层

资料模型层由「语言服务信息」与「源码范围」组成。目前只有两种资料:
「定义位置信息」保存引用范围及目标范围;「悬停文字信息」保存范围及显示文字。

源码定位层由「源码搜索状态」及一组“寻找源码……”函数组成。抽象语法树目前
不永久保存词法位置,因此本层从原始源码中重建名称范围。搜索器会跳过字符串和
可嵌套注释,并使用单调向前的游标,使名称解析遍历与源码遍历大体保持线性。
引用搜索与声明搜索各有独立游标,避免寻找声明时消耗引用位置。跨文件定义范围
则存入「定义范围缓存」,防止同一外部定义被反复读取和扫描。

显示层由「内建常量悬停表示」「悬停类型表示」和「悬停类型文字」组成。这里使用
面向使用者的中文类型表示,不调用抽象语法树的调试表示器,避免把内部节点名称、
缓存路径和调试符号泄漏到悬停内容。

收集层以「当前语言服务文件」「当前语言服务信息」及两个搜索状态引用保存一次
文件编译期间的临时状态。并行编译以独立进程处理文件,所以这些进程内引用不会
在不同源文件之间共享;即便如此,每次处理文件仍必须先调用准备函数完成重置。

序列化层把内部资料转换为癸象对象。对外协议只使用中文字段与中文种类值:根对象
包含“版本、源文件、信息”;范围包含“文件、开始行、开始列、结束行、结束列”;
资料种类为“定义”或“悬停”。编辑器扩展会严格检查这些字段,旧协议不会复用。

三、必须保持的约定

所有行列均从零开始,范围采用左闭右开的半开区间。文件路径用于唯一标识源文件,
定义目标可以位于另一文件。收集时使用前衔写入以降低逐项追加成本,序列化前必须
反转,才能恢复源码顺序。若增加新的语言服务资料种类,必须同时更新本文件的资料
模型与序列化分支,以及编辑器扩展的解析和请求处理。若改变名称解析或类型检查中
对标注节点的处理,也必须确认标注节点在类型检查结束时已被完全移除。
:」

「语言服务信息」立「元类型」也。
  「定义位置信息」立化「源码范围」而化「源码范围」而「语言服务信息」也。
  「悬停文字信息」立化「源码范围」而化「字符串」而「语言服务信息」也。

「源码搜索状态」即
  (「列」于「字符串」)
  合「整数」
  合「整数」
也。 「:剩余字符、当前行、当前列。:」

「当前语言服务文件」者「新引用」授以「字符串」于『』也。

「当前语言服务信息」者「新引用」授以(「列」于「语言服务信息」)于「罄」也。

「当前名称搜索状态」者「新引用」授以「源码搜索状态」于(「罄」与「零」与「零」)也。

「当前定义搜索状态」者「新引用」授以「源码搜索状态」于(「罄」与「零」与「零」)也。

「定义范围缓存」者「新引用」授以(「串典」于「源码范围」)于「空串典」也。

「当前悬停范围缓存」者「新引用」授以(「串典」于「有」)于「空串典」也。

「构造源码范围」乃
  化「字符串」而
  化「整数」而
  化「整数」而
  化「整数」而
  化「整数」而
  「源码范围」
也。
「构造源码范围」者会「文件」而会「开始行」而会「开始列」而会「结束行」而会「结束列」而
  「文件」与「开始行」与「开始列」与「结束行」与「结束列」
也。

「源码范围文件」乃化「源码范围」而「字符串」也。
「源码范围文件」者会「范围」而
  「范围」中「零」
也。

「源码范围开始行」乃化「源码范围」而「整数」也。
「源码范围开始行」者会「范围」而
  「范围」中「一」
也。

「源码范围开始列」乃化「源码范围」而「整数」也。
「源码范围开始列」者会「范围」而
  「范围」中「二」
也。

「源码范围结束行」乃化「源码范围」而「整数」也。
「源码范围结束行」者会「范围」而
  「范围」中「三」
也。

「源码范围结束列」乃化「源码范围」而「整数」也。
「源码范围结束列」者会「范围」而
  「范围」中「四」
也。

「悬停范围缓存键」乃化「源码范围」而「字符串」也。
「悬停范围缓存键」者会「范围」而
  (「源码范围文件」于「范围」)附『:』附
    (「整数表示」于(「源码范围开始行」于「范围」))附『:』附
      (「整数表示」于(「源码范围开始列」于「范围」))附『:』附
        (「整数表示」于(「源码范围结束行」于「范围」))附『:』附
          (「整数表示」于(「源码范围结束列」于「范围」))
也。

「语言服务信息范围」乃化「语言服务信息」而「源码范围」也。
「语言服务信息范围」者会「信息」而
  鉴「信息」而
    有(「定义位置信息」于「范围」于「忽略目标」)则「范围」
    或有(「悬停文字信息」于「范围」于「忽略内容」)则「范围」
也。

「源码范围开始早于」乃化「源码范围」而化「源码范围」而「爻」也。
「源码范围开始早于」者会「范围」而会「边界」而
  若(「小于」于(「源码范围开始行」于「范围」)于(「源码范围开始行」于「边界」))则
    「阳」
  否则
    「且」
      于(「等」于(「源码范围开始行」于「范围」)于(「源码范围开始行」于「边界」))
      于(「小于」于(「源码范围开始列」于「范围」)于(「源码范围开始列」于「边界」))
也。

「内建常量悬停表示」乃化「内建常量」而「字符串」也。
「内建常量悬停表示」者会「常量」而
  鉴「常量」而
    有「内建类型字符串」则『字符串』
    或有「内建类型整数」则『整数』
    或有「内建类型小数」则『小数』
    或有「内建类型动态分类值」则『动态分类值』
    或有「内建类型有」则『有』
    或有「内建类型爻」则『爻』
    或有「内建类型元类型」则『元类型』
    或有「内建爻阳」则『阳』
    或有「内建爻阴」则『阴』
    或有「内建有元」则『元』
    或有「内建函数抛出异常」则『抛出异常函数』
    或有「内建函数尝试运行」则『尝试运行函数』
    或有「内建函数整数相等」则『整数相等函数』
    或有「内建函数整数大于」则『整数大于函数』
    或有「内建函数整数减」则『整数减法函数』
    或有「内建函数以当前续延调用」则
      『以当前续延调用函数』
也。

「悬停类型表示」乃化「表达式」而「字符串」也。
「悬停类型表示」者会「式」而
  递归虑「表示」其化「表达式」而「字符串」者
    会「当前式」而
      鉴「当前式」而
        有(「自由变量」于「名称」)则「名称」
        或有(「绑定变量」于「序数」)则
          『第』附(「整数表示」于「序数」)附『个绑定类型』
        或有(「绑定」于「可有名称」于「体」)则(
          鉴「可有名称」而
            有(「可有」于「名称」)则
              『承「』附「名称」附『」而』附(「表示」于「体」)
            或有「可无」则
              『承一类型而』附(「表示」于「体」)
        )
        或有(「式节点」于(「内建节点」于「常量」)于「罄」)则「内建常量悬停表示」
          于「常量」
        或有(「式节点」于「箭头类型节点」于「子式们」)则
          『(』附(「间合」于『 → 』于((「态射」授以「表达式」授以「字符串」)于「子式们」于「表示」))附
            『)』
        或有(「式节点」于「元组类型节点」于「子式们」)则
          『(』附(「间合」于『 合 』于((「态射」授以「表达式」授以「字符串」)于「子式们」于「表示」))附
            『)』
        或有(「式节点」于「函数调用」于「子式们」)则
          『(』附(「间合」
            于『 于 』
            于((「态射」授以「表达式」授以「字符串」)
            于「子式们」
            于(会「子式」而
              鉴「子式」而
                有(「式节点」于(「参数节点」于「忽略形式」)于((「列」【「参数」】)))
                则
                  「表示」于「参数」
                或有「其他」则「表示」于「子式」)))附『)』
        或有(「式节点」于(「隐式派类型节点」于「忽略个数」)于((「列」【「体」】)))则
          『隐式(』附(「表示」于「体」)附『)』
        或有(「式节点」于(「文件定义引用节点」于「忽略文件」于「定义名」于「忽略序数」)于「罄」)则「定义名」
        或有(「式节点」于(「唯一构造器节点」于「忽略序数」于「忽略文件」于「构造器名」)于「忽略子式」)则
          「构造器名」
        或有(「式节点」于(「源码范围标注节点」于「忽略范围」)于((「列」【「原式」】)))则「表示」
          于
            「原式」
        或有(「式节点」于(「源码绑定范围标注节点」于「忽略范围」)于((「列」【「原式」】)))则「表示」
          于
            「原式」
        或有「其他」则
          『未识别类型』
  而
  「表示」于「式」
也。

「悬停类型文字」乃化「表达式」而「字符串」也。
「悬停类型文字」者会「类型」而
  『类型:』附(「悬停类型表示」于「类型」)
也。

「源码状态剩余」乃化「源码搜索状态」而(「列」于「字符串」)也。
「源码状态剩余」者会「状态」而
  「状态」中「零」
也。

「源码状态行」乃化「源码搜索状态」而「整数」也。
「源码状态行」者会「状态」而
  「状态」中「一」
也。

「源码状态列」乃化「源码搜索状态」而「整数」也。
「源码状态列」者会「状态」而
  「状态」中「二」
也。

「:文言:字符相比无旁效,异则可止;通用列术之约不改。汉语:这里的比较固定为纯字符串相等,且两列有限;发现不等即可停止,避免继续遍历前缀。带用户比较函数的通用以起否仍保持原来的求值语义。:」
「源码字符前缀匹配」乃
  化(「列」于「字符串」)而
  化(「列」于「字符串」)而
  「爻」
也。
「源码字符前缀匹配」者会「前缀」而会「目标」而
  鉴「前缀」而
    有「罄」则「阳」
    或有(「缀」于「首」于「余」)则(
      鉴「目标」而
        有「罄」则「阴」
        或有(「缀」于「字」于「尾」)则
          若「串相等」于「首」于「字」则
            「源码字符前缀匹配」于「余」于「尾」
          否则
            「阴」
    )
也。

「源码状态以串开头」乃化「源码搜索状态」而化「字符串」而「爻」也。
「源码状态以串开头」者会「状态」而会「串」而
  「源码字符前缀匹配」于(「获取字符」于「串」)于(「源码状态剩余」于「状态」)
也。

「源码状态前进一字」乃化「源码搜索状态」而「源码搜索状态」也。
「源码状态前进一字」者会「状态」而
  鉴(「源码状态剩余」于「状态」)而
    有「罄」则「状态」
    或有(「缀」于「字」于「尾」)则
      若(「串相等」于「字」于『「:换行:」』)
      则
        「尾」与(「加」于(「源码状态行」于「状态」)于「一」)与「零」
      否则
        「尾」与(「源码状态行」于「状态」)与(「加」于(「源码状态列」于「状态」)于「一」)
也。

「源码状态前进」乃化「源码搜索状态」而化「整数」而「源码搜索状态」也。
「源码状态前进」者会「状态」而会「个数」而
  若(「等」于「个数」于「零」)则
    「状态」
  否则
    「源码状态前进」于(「源码状态前进一字」于「状态」)于(「减」于「个数」于「一」)
也。

「源码状态前进字符串」乃化「源码搜索状态」而化「字符串」而「源码搜索状态」也。
「源码状态前进字符串」者会「状态」而会「串」而
  「源码状态前进」于「状态」于(「串长度」于「串」)
也。

「源码状态是注释开头」乃化「源码搜索状态」而「爻」也。
「源码状态是注释开头」者会「状态」而
  鉴(「源码状态剩余」于「状态」)而
    有(「缀」于『「』于(「缀」于『:』于「忽略尾」))则「阳」
    或有「其他」则「阴」
也。

「源码状态是注释结尾」乃化「源码搜索状态」而「爻」也。
「源码状态是注释结尾」者会「状态」而
  鉴(「源码状态剩余」于「状态」)而
    有(「缀」于『:』于(「缀」于『」』于「忽略尾」))则「阳」
    或有「其他」则「阴」
也。

「跳过源码注释」乃化「源码搜索状态」而化「整数」而「源码搜索状态」也。
「跳过源码注释」者会「状态」而会「深度」而
  鉴(「源码状态剩余」于「状态」)而
    有「罄」则「状态」
    或有「其他」则
      若(「源码状态是注释开头」于「状态」)
      则
        「跳过源码注释」于(「源码状态前进」于「状态」于「二」)
        于(「加」于「深度」于「一」)
      否则若(「源码状态是注释结尾」于「状态」)
      则
        (
          若(「等」于「深度」于「一」)
          则
            「源码状态前进」于「状态」于「二」
          否则
            「跳过源码注释」
              于(「源码状态前进」于「状态」于「二」)
              于(「减」于「深度」于「一」)
        )
      否则
        「跳过源码注释」于(「源码状态前进一字」于「状态」)于「深度」
也。

「跳过源码字符串」乃化「源码搜索状态」而「源码搜索状态」也。
「跳过源码字符串」者会「状态」而
  鉴(「源码状态剩余」于「状态」)而
    有「罄」则「状态」
    或有「其他」则
      若(「源码状态以串开头」于「状态」于『「:』:」』)
      则
        「源码状态前进字符串」于「状态」于『「:』:」』
      否则
        「跳过源码字符串」于(「源码状态前进一字」于「状态」)
也。

「读取源码引号名称」乃
  化「字符串」而
  化「源码搜索状态」而
  化(「列」于「字符串」)而
  化「整数」而
  化「整数」而
  「或可有」于(「字符串」合「源码范围」合「源码搜索状态」)
也。
「读取源码引号名称」者会「文件」而会「状态」而会「反名称」而会「开始行」而会「开始列」而
  鉴(「源码状态剩余」于「状态」)而
    有「罄」则「可无」
    或有(「缀」于「字」于「忽略尾」)则
      若(「串相等」于「字」于『」』)
      则
        (
          虑「名称」者「串组合并」于(「反转」于「反名称」)而
          虑「范围」者
            「构造源码范围」
              于「文件」
              于「开始行」
              于「开始列」
              于(「源码状态行」于「状态」)
              于(「源码状态列」于「状态」)
          而
          「可有」于(「名称」与「范围」与(「源码状态前进一字」于「状态」))
        )
      否则
        「读取源码引号名称」
          于「文件」
          于(「源码状态前进一字」于「状态」)
          于(「缀」于「字」于「反名称」)于
            「开始行」于「开始列」
也。

「声明后缀」乃化「源码搜索状态」而「爻」也。
「声明后缀」者会「状态」而
  「:文言:十式皆定,直验其首,毋屡造字符之列。汉语:按原来的十种声明后缀匹配已有源码字符列表,不在每次名称查询时重新拆分固定字符串;允许后续还有任意字符,保持前缀判断语义。:」
  鉴(「源码状态剩余」于「状态」)而
    有(「缀」
      于『的』
      于(「缀」于『类』于(「缀」于『型』于(「缀」于『可』于(「缀」于『以』于(「缀」于『是』于「余」))))))则
        「阳」
    或有(「缀」于『的』于(「缀」于『类』于(「缀」于『型』于(「缀」于『是』于「余」))))则「阳」
    或有(「缀」于『的』于(「缀」于『定』于(「缀」于『义』于(「缀」于『是』于「余」))))则「阳」
    或有(「缀」于『其』于(「缀」于『实』于(「缀」于『就』于(「缀」于『是』于「余」))))则「阳」
    或有(「缀」于『是』于(「缀」于『一』于(「缀」于『种』于「余」)))则「阳」
    或有(「缀」于『乃』于「余」)则「阳」
    或有(「缀」于『者』于「余」)则「阳」
    或有(「缀」于『立』于「余」)则「阳」
    或有(「缀」于『即』于「余」)则「阳」
    或有(「缀」于『号』于「余」)则「阳」
    或有「其他」则「阴」
也。

「寻找源码名称范围」乃
  化「字符串」而
  化「字符串」而
  化「源码搜索状态」而
  「或可有」于(「源码范围」合「源码搜索状态」)
也。
「寻找源码名称范围」者会「文件」而会「名称」而会「状态」而
  鉴(「源码状态剩余」于「状态」)而
    有「罄」则「可无」
    或有「其他」则
      若(「源码状态是注释开头」于「状态」)
      则
        「寻找源码名称范围」于「文件」于「名称」于(「跳过源码注释」于(「源码状态前进」于「状态」于「二」)于「一」)
      否则若(「源码状态以串开头」于「状态」于『『』)
      则
        「寻找源码名称范围」于「文件」于「名称」于(「跳过源码字符串」于(「源码状态前进字符串」于「状态」于『『』))
      否则若(「源码状态以串开头」于「状态」于『「』)
      则
        (
          虑「名称开始」者「源码状态前进一字」于「状态」而
          鉴(「读取源码引号名称」
            于「文件」
            于「名称开始」
            于「罄」
            于(「源码状态行」于「名称开始」)
            于(「源码状态列」于「名称开始」))而
            有「可无」则「可无」
            或有(「可有」于(「所得名称」与「范围」与「后状态」))则
              若(「且」于(「串相等」于「所得名称」于「名称」)于(「非」于(「声明后缀」于「后状态」)))
              则
                「可有」于(「范围」与「后状态」)
              否则
                「寻找源码名称范围」于「文件」于「名称」于「后状态」
        )
      否则若(「源码状态以串开头」于「状态」于「名称」)
      则
        (
          虑「后状态」者「源码状态前进字符串」于「状态」于「名称」
          而
          若(「声明后缀」于「后状态」)
          则
            「寻找源码名称范围」于「文件」于「名称」于「后状态」
          否则
            「可有」于((「构造源码范围」
              于「文件」
              于(「源码状态行」于「状态」)
              于(「源码状态列」于「状态」)
              于(「源码状态行」于「后状态」)
              于(「源码状态列」于「后状态」))与「后状态」)
        )
      否则
        「寻找源码名称范围」于「文件」于「名称」于(「源码状态前进一字」于「状态」)
也。

「寻找源码绑定范围」乃
  化「字符串」而
  化「字符串」而
  化「源码搜索状态」而
  「或可有」于(「源码范围」合「源码搜索状态」)
也。
「寻找源码绑定范围」者会「文件」而会「名称」而会「状态」而
  鉴(「源码状态剩余」于「状态」)而
    有「罄」则「可无」
    或有「其他」则
      若(「源码状态是注释开头」于「状态」)
      则
        「寻找源码绑定范围」于「文件」于「名称」于(「跳过源码注释」于(「源码状态前进」于「状态」于「二」)于「一」)
      否则若(「源码状态以串开头」于「状态」于『『』)
      则
        「寻找源码绑定范围」于「文件」于「名称」于(「跳过源码字符串」于(「源码状态前进字符串」于「状态」于『『』))
      否则若(「源码状态以串开头」于「状态」于『「』)
      则
        (
          虑「名称开始」者「源码状态前进一字」于「状态」而
          鉴(「读取源码引号名称」
            于「文件」
            于「名称开始」
            于「罄」
            于(「源码状态行」于「名称开始」)
            于(「源码状态列」于「名称开始」))而
            有「可无」则「可无」
            或有(「可有」于(「所得名称」与「范围」与「后状态」))则
              若(「串相等」于「所得名称」于「名称」)
              则
                「可有」于(「范围」与「后状态」)
              否则
                「寻找源码绑定范围」于「文件」于「名称」于「后状态」
        )
      否则若(「源码状态以串开头」于「状态」于「名称」)
      则
        (
          虑「后状态」者「源码状态前进字符串」于「状态」于「名称」而
          「可有」于((「构造源码范围」
            于「文件」
            于(「源码状态行」于「状态」)
            于(「源码状态列」于「状态」)
            于(「源码状态行」于「后状态」)
            于(「源码状态列」于「后状态」))与「后状态」)
        )
      否则
        「寻找源码绑定范围」于「文件」于「名称」于(「源码状态前进一字」于「状态」)
也。

「寻找源码声明范围」乃
  化「字符串」而
  化「字符串」而
  化「源码搜索状态」而
  「或可有」于(「源码范围」合「源码搜索状态」)
也。
「寻找源码声明范围」者会「文件」而会「名称」而会「状态」而
  鉴(「源码状态剩余」于「状态」)而
    有「罄」则「可无」
    或有「其他」则
      若(「源码状态是注释开头」于「状态」)
      则
        「寻找源码声明范围」于「文件」于「名称」于(「跳过源码注释」于(「源码状态前进」于「状态」于「二」)于「一」)
      否则若(「源码状态以串开头」于「状态」于『『』)
      则
        「寻找源码声明范围」于「文件」于「名称」于(「跳过源码字符串」于(「源码状态前进字符串」于「状态」于『『』))
      否则若(「源码状态以串开头」于「状态」于『「』)
      则
        (
          虑「名称开始」者「源码状态前进一字」于「状态」而
          鉴(「读取源码引号名称」
            于「文件」
            于「名称开始」
            于「罄」
            于(「源码状态行」于「名称开始」)
            于(「源码状态列」于「名称开始」))而
            有「可无」则「可无」
            或有(「可有」于(「所得名称」与「范围」与「后状态」))则
              若(「且」于(「串相等」于「所得名称」于「名称」)于(「声明后缀」于「后状态」))
              则
                「可有」于(「范围」与「后状态」)
              否则
                「寻找源码声明范围」于「文件」于「名称」于「后状态」
        )
      否则若(「源码状态以串开头」于「状态」于「名称」)
      则
        (
          虑「后状态」者「源码状态前进字符串」于「状态」于「名称」
          而
          若(「声明后缀」于「后状态」)
          则
            「可有」于((「构造源码范围」
              于「文件」
              于(「源码状态行」于「状态」)
              于(「源码状态列」于「状态」)
              于(「源码状态行」于「后状态」)
              于(「源码状态列」于「后状态」))与「后状态」)
          否则
            「寻找源码声明范围」
              于「文件」于「名称」
              于(「源码状态前进一字」于「状态」)
        )
      否则
        「寻找源码声明范围」于「文件」于「名称」于(「源码状态前进一字」于「状态」)
也。

「是阿拉伯数字」乃化「字符串」而「爻」也。
「是阿拉伯数字」者会「字」而
  (「存在吗」授以「字符串」)
  于(会「数字」而「串相等」于「字」于「数字」)
  于(「列」【『0』,『1』,『2』,『3』,『4』,『5』,『6』,『7』,『8』,『9』】)
也。

「去除名称末尾序数」乃化「字符串」而「字符串」也。
「去除名称末尾序数」者会「名称」而
  递归虑「去除」其化(「列」于「字符串」)而(「列」于「字符串」)者
    会「反字们」而
      鉴「反字们」而
        有(「缀」于「字」于「尾」)则
          若(「是阿拉伯数字」于「字」)则
            「去除」于「尾」
          否则
            「反字们」
        或有「罄」则「罄」
  而
  「串组合并」于(「反转」于(「去除」于(「反转」于(「获取字符」于「名称」))))
也。

「定义范围缓存键」乃化「字符串」而化「字符串」而「字符串」也。
「定义范围缓存键」者会「文件」而会「名称」而
  「文件」附『「:换行:」』附「名称」
也。

「准备语言服务信息」乃化「字符串」而「有」也。
「准备语言服务信息」者会「文件」而
  虑「内容」者「读取编译源码」于「文件」而
  虑「初态」者(「获取字符」于「内容」)与「零」与「零」而
  (「写引用」于「当前语言服务文件」于「文件」);
  (「写引用」于「当前语言服务信息」于「罄」);
  (「写引用」于「当前名称搜索状态」于「初态」);
  (「写引用」于「当前定义搜索状态」于「初态」);
  (「写引用」授以(「串典」于「有」)于「当前悬停范围缓存」于「空串典」)
也。

「查找下个名称源码范围」乃
  化「字符串」而
  「或可有」于(「字符串」合「源码范围」)
也。
「查找下个名称源码范围」者会「原名称」而
  虑「文件」者「读引用」于「当前语言服务文件」而
  虑「状态」者「读引用」于「当前名称搜索状态」而
  虑「源码名称」者「去除名称末尾序数」于「原名称」而
  鉴(「寻找源码名称范围」于「文件」于「源码名称」于「状态」)而
    有「可无」则「可无」
    或有(「可有」于(「范围」与「后状态」))则
      (「写引用」于「当前名称搜索状态」于「后状态」);
      (「可有」于(「源码名称」与「范围」))
也。

「查找下个绑定源码范围」乃
  化「字符串」而
  「或可有」于(「字符串」合「源码范围」)
也。
「查找下个绑定源码范围」者会「原名称」而
  虑「文件」者「读引用」于「当前语言服务文件」而
  虑「状态」者「读引用」于「当前名称搜索状态」而
  虑「源码名称」者「去除名称末尾序数」于「原名称」而
  鉴(「寻找源码绑定范围」于「文件」于「源码名称」于「状态」)而
    有「可无」则「可无」
    或有(「可有」于(「范围」与「后状态」))则
      (「写引用」于「当前名称搜索状态」于「后状态」);
      (「可有」于(「源码名称」与「范围」))
也。

「查找并记录当前定义范围」乃化「字符串」而「或可有」于「源码范围」也。
「查找并记录当前定义范围」者会「名称」而
  虑「文件」者「读引用」于「当前语言服务文件」而
  鉴(「寻找源码声明范围」于「文件」于「名称」于(「读引用」于「当前定义搜索状态」))而
    有「可无」则「可无」
    或有(「可有」于(「范围」与「后状态」))
    则(
      虑「无」者「写引用」于「当前定义搜索状态」于「后状态」而
      虑「无」者「写引用」于「当前名称搜索状态」于「后状态」而
      虑「无」者
        (「写引用」授以(「串典」于「有」)于「当前悬停范围缓存」于「空串典」)而
        虑「无」者
          (「写引用」授以(「列」于「语言服务信息」))
          于
            「当前语言服务信息」
              于((「滤」授以「语言服务信息」)
              于(会「信息」而「源码范围开始早于」于(「语言服务信息范围」于「信息」)于「范围」)
              于(「读引用」于「当前语言服务信息」))
        而
        虑「无」者
          (「串典引用更新」授以「源码范围」)
          于「定义范围缓存」
          于(「定义范围缓存键」于「文件」于「名称」)于「范围」
        而
        「可有」于
        「范围」
    )
也。

「查找文件定义范围」乃化「字符串」而化「字符串」而「或可有」于「源码范围」也。
「查找文件定义范围」者会「文件」而会「名称」而
  虑「键」者「定义范围缓存键」于「文件」于「名称」而
  鉴((「串典查找」授以「源码范围」)于(「读引用」于「定义范围缓存」)于「键」)而
    有(「可有」于「已缓存」)则「可有」于「已缓存」
    或有「可无」则(
      虑「初态」者(「获取字符」于(「读取编译源码」于「文件」))与「零」与「零」而
      鉴(「寻找源码声明范围」于「文件」于「名称」于「初态」)而
        有「可无」则「可无」
        或有(「可有」于(「范围」与「忽略状态」))则
          虑「无」者
            (「串典引用更新」授以「源码范围」)
            于「定义范围缓存」于「键」于「范围」
          而
          「可有」于「范围」
    )
也。

「记录定义位置信息」乃化「源码范围」而化「源码范围」而「有」也。
「记录定义位置信息」者会「范围」而会「目标」而
  「列引用前衔」于「当前语言服务信息」于(「定义位置信息」于「范围」于「目标」)
也。

「记录悬停文字信息」乃化「源码范围」而化「字符串」而「有」也。
「记录悬停文字信息」者会「范围」而会「内容」而
  虑「键」者「悬停范围缓存键」于「范围」而
  鉴((「串典查找」授以「有」)于(「读引用」于「当前悬停范围缓存」)于「键」)而
    有(「可有」于「忽略已有」)则「元」
    或有「可无」则(
      虑「无」者
        (「串典引用更新」授以「有」)于「当前悬停范围缓存」于「键」于「元」
      而
      「列引用前衔」于「当前语言服务信息」于(「悬停文字信息」于「范围」于「内容」)
    )
也。

「表达式定义范围」乃化「表达式」而「或可有」于「源码范围」也。
「表达式定义范围」者会「式」而
  鉴「式」而
    有(「式节点」于(「文件定义引用节点」于「文件」于「名称」于「忽略序数」)于「罄」)则「查找文件定义范围」
      于
      「文件」于「名称」
    或有(「式节点」于(「文件引用节点」于「文件」)于「罄」)则「可有」
      于(「构造源码范围」于「文件」于「零」于「零」于「零」于「零」)
    或有「其他」则「可无」
也。

「标注引用语言服务信息」乃化「源码范围」而化「表达式」而「表达式」也。
「标注引用语言服务信息」者会「范围」而会「式」而
  虑「无」者鉴(「表达式定义范围」于「式」)而
    有(「可有」于「目标」)则
      「记录定义位置信息」于「范围」于「目标」
    或有「可无」则「元」而
  鉴「式」而
    有(「式节点」于(「文件引用节点」于「忽略文件」)于「罄」)则「式」
    或有「其他」则
      「式节点」于(「源码范围标注节点」于「范围」)
      于(「列」【「式」】)
也。

「记录定义悬停」乃化「字符串」而化「字符串」而化「表达式」而「有」也。
「记录定义悬停」者会「文件」而会「名称」而会「类型」而
  鉴(「查找文件定义范围」于「文件」于「名称」)而
    有(「可有」于「范围」)则
      「记录悬停文字信息」于「范围」于(「悬停类型文字」于「类型」)
    或有「可无」则「元」
也。

「源码范围转癸象」乃化「源码范围」而「癸象」也。
「源码范围转癸象」者会「范围」而
  「癸象对象」于(「列」【
    『文件』与(「癸象字符串」于(「源码范围文件」于「范围」)),
    『开始行』与(「癸象整数」于(「源码范围开始行」于「范围」)),
    『开始列』与(「癸象整数」于(「源码范围开始列」于「范围」)),
    『结束行』与(「癸象整数」于(「源码范围结束行」于「范围」)),
    『结束列』与(「癸象整数」于(「源码范围结束列」于「范围」))
  】)
也。

「语言服务信息转癸象」乃化「语言服务信息」而「癸象」也。
「语言服务信息转癸象」者会「信息」而
  鉴「信息」而
    有(「定义位置信息」于「范围」于「目标」)则
      「癸象对象」于(「列」【
        『种类』与(「癸象字符串」于『定义』),
        『范围』与(「源码范围转癸象」于「范围」),
        『目标』与(「源码范围转癸象」于「目标」)
      】)
    或有(「悬停文字信息」于「范围」于「内容」)则
      「癸象对象」于(「列」【
        『种类』与(「癸象字符串」于『悬停』),
        『范围』与(「源码范围转癸象」于「范围」),
        『内容』与(「癸象字符串」于「内容」)
      】)
也。

「写语言服务信息」乃化「字符串」而「有」也。
「写语言服务信息」者会「输出路径」而
  虑「文件」者「读引用」于「当前语言服务文件」而
  虑「信息们」者
    (「态射」授以「语言服务信息」授以「癸象」)
    于(「反转」于(「读引用」于「当前语言服务信息」))
    于
      「语言服务信息转癸象」而
      虑「根」者
        「癸象对象」于(「列」【
          『版本』与(「癸象整数」于「一」),
          『源文件』与(「癸象字符串」于「文件」),
          『信息』与(「癸象数组」于「信息们」)
        】)
      而
      「文件系统」之「写文件」于「输出路径」于(「癸象表示」于「根」)
也。

「:文言:名解所记,存而复之,毋失跳转。汉语:名称解析与类型检查分进程后,仍保留名称解析收集的定义位置资料。:」
「语言服务阶段快照」乃化「有」而「表达式树组」也。
「语言服务阶段快照」者会「无」而
  「列」【
    『名称解析资料』与「阴」
      与(「式节点」
        于「元组构造节点」
        于(「态射」授以「语言服务信息」授以「表达式」
          于(「读引用」于「当前语言服务信息」)
          于(会「项」而鉴「项」而
            有「定义位置信息」于「范围」于「目标」则
              「式节点」
                于(「源码范围标注节点」于「范围」)
                于(「列」【「式节点」于(「源码范围标注节点」于「目标」)于「罄」】)
            或有「悬停文字信息」于「范围」于「内容」则
              「式节点」
                于(「源码范围标注节点」于「范围」)
                于(「列」【「式节点」于(「字符串节点」于「内容」)于「罄」】))))
  】
也。

「恢复语言服务阶段快照」乃化「表达式树组」而「有」也。
「恢复语言服务阶段快照」者会「组」而
  鉴「组」而
    有(「列」【「名」与「公开」与(「式节点」于「元组构造节点」于「项」)】)则
      「写引用」
        于「当前语言服务信息」
        于(「态射」授以「表达式」授以「语言服务信息」
          于「项」
          于(会「式」而鉴「式」而
            有「式节点」
              于(「源码范围标注节点」于「范围」)
              于(「列」【「式节点」于(「源码范围标注节点」于「目标」)于「罄」】)则
                「定义位置信息」
                  于「范围」
                  于「目标」
            或有「式节点」
              于(「源码范围标注节点」于「范围」)
              于(「列」【「式节点」于(「字符串节点」于「内容」)于「罄」】)则
                「悬停文字信息」于「范围」于「内容」
            或有「其他」则
              「发生事故」于『语言服务阶段资料不合法』))
    或有「其他」则
      「发生事故」于『语言服务阶段快照不合法』
也。