编译数据/语言服务信息。豫
yuyan · 814 行 · 42952 字节 · UTF-8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814
寻观「编译器核心」之「编译数据」之「编译配置」之「阶段环境」之书。
寻观「标准库」之书。
寻观「标准库」之「操作系统」之「文件系统」之书。
寻观「标准库」之「数据结构」之「字典术」之书。
寻观「癸象工具」之「总集」之书。
寻观「编译器核心」之「编译数据」之「抽象绑定树结构」之「抽象语法树」之「总集」之书。
「:
软件架构说明
本文件是编译器与编辑器扩展之间的语言服务资料层。它不直接响应编辑器请求,
而是在正常编译过程中收集名称与类型资料,再将资料写入构建缓存。编辑器扩展
收到悬停或跳转请求时,只需读取最近一次编译留下的语言服务癸象文件,因此编译器
本身无需常驻,也不需要另设通信进程。
一、整体资料流
一.分布编译步骤在读取某个源文件的抽象语法后,调用「准备语言服务信息」。
此操作读取原始源码,并清空本文件中属于上一文件的收集状态。
二.名称解析负责确定每个名称究竟引用哪个局部绑定、文件定义或构造器。
名称一旦解析成功,便调用「标注引用语言服务信息」:一方面记录“引用范围到
定义范围”的关系,另一方面把原表达式包在「源码范围标注节点」中。跳转到定义
因而在名称解析这个拥有最准确信息的阶段完成,不依赖之后的类型推断结果。
三.类型检查遇到「源码范围标注节点」时,先照常求得被标注表达式的类型,再调用
「悬停类型文字」与「记录悬停文字信息」,最后只返回检查后的原表达式。
标注节点是名称解析与类型检查之间的暂存节点,绝不能流入擦除、优化或代码生成。
顶层定义和构造器没有普通引用节点包裹,所以文件结构检查会另外调用
「记录定义悬停」,为定义处补上悬停资料。
四.类型检查结束后,分布编译步骤调用「写语言服务信息」,把本文件收集的资料
与源文件、检查后定义等产物放在同一个构建缓存目录。编辑器扩展从最新缓存中
找到对应源文件的“语言服务”产物,按请求筛选覆盖光标且范围最窄的一项。
二、本文件内部的分层
资料模型层由「语言服务信息」与「源码范围」组成。目前只有两种资料:
「定义位置信息」保存引用范围及目标范围;「悬停文字信息」保存范围及显示文字。
源码定位层由「源码搜索状态」及一组“寻找源码……”函数组成。抽象语法树目前
不永久保存词法位置,因此本层从原始源码中重建名称范围。搜索器会跳过字符串和
可嵌套注释,并使用单调向前的游标,使名称解析遍历与源码遍历大体保持线性。
引用搜索与声明搜索各有独立游标,避免寻找声明时消耗引用位置。跨文件定义范围
则存入「定义范围缓存」,防止同一外部定义被反复读取和扫描。
显示层由「内建常量悬停表示」「悬停类型表示」和「悬停类型文字」组成。这里使用
面向使用者的中文类型表示,不调用抽象语法树的调试表示器,避免把内部节点名称、
缓存路径和调试符号泄漏到悬停内容。
收集层以「当前语言服务文件」「当前语言服务信息」及两个搜索状态引用保存一次
文件编译期间的临时状态。并行编译以独立进程处理文件,所以这些进程内引用不会
在不同源文件之间共享;即便如此,每次处理文件仍必须先调用准备函数完成重置。
序列化层把内部资料转换为癸象对象。对外协议只使用中文字段与中文种类值:根对象
包含“版本、源文件、信息”;范围包含“文件、开始行、开始列、结束行、结束列”;
资料种类为“定义”或“悬停”。编辑器扩展会严格检查这些字段,旧协议不会复用。
三、必须保持的约定
所有行列均从零开始,范围采用左闭右开的半开区间。文件路径用于唯一标识源文件,
定义目标可以位于另一文件。收集时使用前衔写入以降低逐项追加成本,序列化前必须
反转,才能恢复源码顺序。若增加新的语言服务资料种类,必须同时更新本文件的资料
模型与序列化分支,以及编辑器扩展的解析和请求处理。若改变名称解析或类型检查中
对标注节点的处理,也必须确认标注节点在类型检查结束时已被完全移除。
:」
「语言服务信息」立「元类型」也。
「定义位置信息」立化「源码范围」而化「源码范围」而「语言服务信息」也。
「悬停文字信息」立化「源码范围」而化「字符串」而「语言服务信息」也。
「源码搜索状态」即
(「列」于「字符串」)
合「整数」
合「整数」
也。 「:剩余字符、当前行、当前列。:」
「当前语言服务文件」者「新引用」授以「字符串」于『』也。
「当前语言服务信息」者「新引用」授以(「列」于「语言服务信息」)于「罄」也。
「当前名称搜索状态」者「新引用」授以「源码搜索状态」于(「罄」与「零」与「零」)也。
「当前定义搜索状态」者「新引用」授以「源码搜索状态」于(「罄」与「零」与「零」)也。
「定义范围缓存」者「新引用」授以(「串典」于「源码范围」)于「空串典」也。
「当前悬停范围缓存」者「新引用」授以(「串典」于「有」)于「空串典」也。
「构造源码范围」乃
化「字符串」而
化「整数」而
化「整数」而
化「整数」而
化「整数」而
「源码范围」
也。
「构造源码范围」者会「文件」而会「开始行」而会「开始列」而会「结束行」而会「结束列」而
「文件」与「开始行」与「开始列」与「结束行」与「结束列」
也。
「源码范围文件」乃化「源码范围」而「字符串」也。
「源码范围文件」者会「范围」而
「范围」中「零」
也。
「源码范围开始行」乃化「源码范围」而「整数」也。
「源码范围开始行」者会「范围」而
「范围」中「一」
也。
「源码范围开始列」乃化「源码范围」而「整数」也。
「源码范围开始列」者会「范围」而
「范围」中「二」
也。
「源码范围结束行」乃化「源码范围」而「整数」也。
「源码范围结束行」者会「范围」而
「范围」中「三」
也。
「源码范围结束列」乃化「源码范围」而「整数」也。
「源码范围结束列」者会「范围」而
「范围」中「四」
也。
「悬停范围缓存键」乃化「源码范围」而「字符串」也。
「悬停范围缓存键」者会「范围」而
(「源码范围文件」于「范围」)附『:』附
(「整数表示」于(「源码范围开始行」于「范围」))附『:』附
(「整数表示」于(「源码范围开始列」于「范围」))附『:』附
(「整数表示」于(「源码范围结束行」于「范围」))附『:』附
(「整数表示」于(「源码范围结束列」于「范围」))
也。
「语言服务信息范围」乃化「语言服务信息」而「源码范围」也。
「语言服务信息范围」者会「信息」而
鉴「信息」而
有(「定义位置信息」于「范围」于「忽略目标」)则「范围」
或有(「悬停文字信息」于「范围」于「忽略内容」)则「范围」
也。
「源码范围开始早于」乃化「源码范围」而化「源码范围」而「爻」也。
「源码范围开始早于」者会「范围」而会「边界」而
若(「小于」于(「源码范围开始行」于「范围」)于(「源码范围开始行」于「边界」))则
「阳」
否则
「且」
于(「等」于(「源码范围开始行」于「范围」)于(「源码范围开始行」于「边界」))
于(「小于」于(「源码范围开始列」于「范围」)于(「源码范围开始列」于「边界」))
也。
「内建常量悬停表示」乃化「内建常量」而「字符串」也。
「内建常量悬停表示」者会「常量」而
鉴「常量」而
有「内建类型字符串」则『字符串』
或有「内建类型整数」则『整数』
或有「内建类型小数」则『小数』
或有「内建类型动态分类值」则『动态分类值』
或有「内建类型有」则『有』
或有「内建类型爻」则『爻』
或有「内建类型元类型」则『元类型』
或有「内建爻阳」则『阳』
或有「内建爻阴」则『阴』
或有「内建有元」则『元』
或有「内建函数抛出异常」则『抛出异常函数』
或有「内建函数尝试运行」则『尝试运行函数』
或有「内建函数整数相等」则『整数相等函数』
或有「内建函数整数大于」则『整数大于函数』
或有「内建函数整数减」则『整数减法函数』
或有「内建函数以当前续延调用」则
『以当前续延调用函数』
也。
「悬停类型表示」乃化「表达式」而「字符串」也。
「悬停类型表示」者会「式」而
递归虑「表示」其化「表达式」而「字符串」者
会「当前式」而
鉴「当前式」而
有(「自由变量」于「名称」)则「名称」
或有(「绑定变量」于「序数」)则
『第』附(「整数表示」于「序数」)附『个绑定类型』
或有(「绑定」于「可有名称」于「体」)则(
鉴「可有名称」而
有(「可有」于「名称」)则
『承「』附「名称」附『」而』附(「表示」于「体」)
或有「可无」则
『承一类型而』附(「表示」于「体」)
)
或有(「式节点」于(「内建节点」于「常量」)于「罄」)则「内建常量悬停表示」
于「常量」
或有(「式节点」于「箭头类型节点」于「子式们」)则
『(』附(「间合」于『 → 』于((「态射」授以「表达式」授以「字符串」)于「子式们」于「表示」))附
『)』
或有(「式节点」于「元组类型节点」于「子式们」)则
『(』附(「间合」于『 合 』于((「态射」授以「表达式」授以「字符串」)于「子式们」于「表示」))附
『)』
或有(「式节点」于「函数调用」于「子式们」)则
『(』附(「间合」
于『 于 』
于((「态射」授以「表达式」授以「字符串」)
于「子式们」
于(会「子式」而
鉴「子式」而
有(「式节点」于(「参数节点」于「忽略形式」)于((「列」【「参数」】)))
则
「表示」于「参数」
或有「其他」则「表示」于「子式」)))附『)』
或有(「式节点」于(「隐式派类型节点」于「忽略个数」)于((「列」【「体」】)))则
『隐式(』附(「表示」于「体」)附『)』
或有(「式节点」于(「文件定义引用节点」于「忽略文件」于「定义名」于「忽略序数」)于「罄」)则「定义名」
或有(「式节点」于(「唯一构造器节点」于「忽略序数」于「忽略文件」于「构造器名」)于「忽略子式」)则
「构造器名」
或有(「式节点」于(「源码范围标注节点」于「忽略范围」)于((「列」【「原式」】)))则「表示」
于
「原式」
或有(「式节点」于(「源码绑定范围标注节点」于「忽略范围」)于((「列」【「原式」】)))则「表示」
于
「原式」
或有「其他」则
『未识别类型』
而
「表示」于「式」
也。
「悬停类型文字」乃化「表达式」而「字符串」也。
「悬停类型文字」者会「类型」而
『类型:』附(「悬停类型表示」于「类型」)
也。
「源码状态剩余」乃化「源码搜索状态」而(「列」于「字符串」)也。
「源码状态剩余」者会「状态」而
「状态」中「零」
也。
「源码状态行」乃化「源码搜索状态」而「整数」也。
「源码状态行」者会「状态」而
「状态」中「一」
也。
「源码状态列」乃化「源码搜索状态」而「整数」也。
「源码状态列」者会「状态」而
「状态」中「二」
也。
「:文言:字符相比无旁效,异则可止;通用列术之约不改。汉语:这里的比较固定为纯字符串相等,且两列有限;发现不等即可停止,避免继续遍历前缀。带用户比较函数的通用以起否仍保持原来的求值语义。:」
「源码字符前缀匹配」乃
化(「列」于「字符串」)而
化(「列」于「字符串」)而
「爻」
也。
「源码字符前缀匹配」者会「前缀」而会「目标」而
鉴「前缀」而
有「罄」则「阳」
或有(「缀」于「首」于「余」)则(
鉴「目标」而
有「罄」则「阴」
或有(「缀」于「字」于「尾」)则
若「串相等」于「首」于「字」则
「源码字符前缀匹配」于「余」于「尾」
否则
「阴」
)
也。
「源码状态以串开头」乃化「源码搜索状态」而化「字符串」而「爻」也。
「源码状态以串开头」者会「状态」而会「串」而
「源码字符前缀匹配」于(「获取字符」于「串」)于(「源码状态剩余」于「状态」)
也。
「源码状态前进一字」乃化「源码搜索状态」而「源码搜索状态」也。
「源码状态前进一字」者会「状态」而
鉴(「源码状态剩余」于「状态」)而
有「罄」则「状态」
或有(「缀」于「字」于「尾」)则
若(「串相等」于「字」于『「:换行:」』)
则
「尾」与(「加」于(「源码状态行」于「状态」)于「一」)与「零」
否则
「尾」与(「源码状态行」于「状态」)与(「加」于(「源码状态列」于「状态」)于「一」)
也。
「源码状态前进」乃化「源码搜索状态」而化「整数」而「源码搜索状态」也。
「源码状态前进」者会「状态」而会「个数」而
若(「等」于「个数」于「零」)则
「状态」
否则
「源码状态前进」于(「源码状态前进一字」于「状态」)于(「减」于「个数」于「一」)
也。
「源码状态前进字符串」乃化「源码搜索状态」而化「字符串」而「源码搜索状态」也。
「源码状态前进字符串」者会「状态」而会「串」而
「源码状态前进」于「状态」于(「串长度」于「串」)
也。
「源码状态是注释开头」乃化「源码搜索状态」而「爻」也。
「源码状态是注释开头」者会「状态」而
鉴(「源码状态剩余」于「状态」)而
有(「缀」于『「』于(「缀」于『:』于「忽略尾」))则「阳」
或有「其他」则「阴」
也。
「源码状态是注释结尾」乃化「源码搜索状态」而「爻」也。
「源码状态是注释结尾」者会「状态」而
鉴(「源码状态剩余」于「状态」)而
有(「缀」于『:』于(「缀」于『」』于「忽略尾」))则「阳」
或有「其他」则「阴」
也。
「跳过源码注释」乃化「源码搜索状态」而化「整数」而「源码搜索状态」也。
「跳过源码注释」者会「状态」而会「深度」而
鉴(「源码状态剩余」于「状态」)而
有「罄」则「状态」
或有「其他」则
若(「源码状态是注释开头」于「状态」)
则
「跳过源码注释」于(「源码状态前进」于「状态」于「二」)
于(「加」于「深度」于「一」)
否则若(「源码状态是注释结尾」于「状态」)
则
(
若(「等」于「深度」于「一」)
则
「源码状态前进」于「状态」于「二」
否则
「跳过源码注释」
于(「源码状态前进」于「状态」于「二」)
于(「减」于「深度」于「一」)
)
否则
「跳过源码注释」于(「源码状态前进一字」于「状态」)于「深度」
也。
「跳过源码字符串」乃化「源码搜索状态」而「源码搜索状态」也。
「跳过源码字符串」者会「状态」而
鉴(「源码状态剩余」于「状态」)而
有「罄」则「状态」
或有「其他」则
若(「源码状态以串开头」于「状态」于『「:』:」』)
则
「源码状态前进字符串」于「状态」于『「:』:」』
否则
「跳过源码字符串」于(「源码状态前进一字」于「状态」)
也。
「读取源码引号名称」乃
化「字符串」而
化「源码搜索状态」而
化(「列」于「字符串」)而
化「整数」而
化「整数」而
「或可有」于(「字符串」合「源码范围」合「源码搜索状态」)
也。
「读取源码引号名称」者会「文件」而会「状态」而会「反名称」而会「开始行」而会「开始列」而
鉴(「源码状态剩余」于「状态」)而
有「罄」则「可无」
或有(「缀」于「字」于「忽略尾」)则
若(「串相等」于「字」于『」』)
则
(
虑「名称」者「串组合并」于(「反转」于「反名称」)而
虑「范围」者
「构造源码范围」
于「文件」
于「开始行」
于「开始列」
于(「源码状态行」于「状态」)
于(「源码状态列」于「状态」)
而
「可有」于(「名称」与「范围」与(「源码状态前进一字」于「状态」))
)
否则
「读取源码引号名称」
于「文件」
于(「源码状态前进一字」于「状态」)
于(「缀」于「字」于「反名称」)于
「开始行」于「开始列」
也。
「声明后缀」乃化「源码搜索状态」而「爻」也。
「声明后缀」者会「状态」而
「:文言:十式皆定,直验其首,毋屡造字符之列。汉语:按原来的十种声明后缀匹配已有源码字符列表,不在每次名称查询时重新拆分固定字符串;允许后续还有任意字符,保持前缀判断语义。:」
鉴(「源码状态剩余」于「状态」)而
有(「缀」
于『的』
于(「缀」于『类』于(「缀」于『型』于(「缀」于『可』于(「缀」于『以』于(「缀」于『是』于「余」))))))则
「阳」
或有(「缀」于『的』于(「缀」于『类』于(「缀」于『型』于(「缀」于『是』于「余」))))则「阳」
或有(「缀」于『的』于(「缀」于『定』于(「缀」于『义』于(「缀」于『是』于「余」))))则「阳」
或有(「缀」于『其』于(「缀」于『实』于(「缀」于『就』于(「缀」于『是』于「余」))))则「阳」
或有(「缀」于『是』于(「缀」于『一』于(「缀」于『种』于「余」)))则「阳」
或有(「缀」于『乃』于「余」)则「阳」
或有(「缀」于『者』于「余」)则「阳」
或有(「缀」于『立』于「余」)则「阳」
或有(「缀」于『即』于「余」)则「阳」
或有(「缀」于『号』于「余」)则「阳」
或有「其他」则「阴」
也。
「寻找源码名称范围」乃
化「字符串」而
化「字符串」而
化「源码搜索状态」而
「或可有」于(「源码范围」合「源码搜索状态」)
也。
「寻找源码名称范围」者会「文件」而会「名称」而会「状态」而
鉴(「源码状态剩余」于「状态」)而
有「罄」则「可无」
或有「其他」则
若(「源码状态是注释开头」于「状态」)
则
「寻找源码名称范围」于「文件」于「名称」于(「跳过源码注释」于(「源码状态前进」于「状态」于「二」)于「一」)
否则若(「源码状态以串开头」于「状态」于『『』)
则
「寻找源码名称范围」于「文件」于「名称」于(「跳过源码字符串」于(「源码状态前进字符串」于「状态」于『『』))
否则若(「源码状态以串开头」于「状态」于『「』)
则
(
虑「名称开始」者「源码状态前进一字」于「状态」而
鉴(「读取源码引号名称」
于「文件」
于「名称开始」
于「罄」
于(「源码状态行」于「名称开始」)
于(「源码状态列」于「名称开始」))而
有「可无」则「可无」
或有(「可有」于(「所得名称」与「范围」与「后状态」))则
若(「且」于(「串相等」于「所得名称」于「名称」)于(「非」于(「声明后缀」于「后状态」)))
则
「可有」于(「范围」与「后状态」)
否则
「寻找源码名称范围」于「文件」于「名称」于「后状态」
)
否则若(「源码状态以串开头」于「状态」于「名称」)
则
(
虑「后状态」者「源码状态前进字符串」于「状态」于「名称」
而
若(「声明后缀」于「后状态」)
则
「寻找源码名称范围」于「文件」于「名称」于「后状态」
否则
「可有」于((「构造源码范围」
于「文件」
于(「源码状态行」于「状态」)
于(「源码状态列」于「状态」)
于(「源码状态行」于「后状态」)
于(「源码状态列」于「后状态」))与「后状态」)
)
否则
「寻找源码名称范围」于「文件」于「名称」于(「源码状态前进一字」于「状态」)
也。
「寻找源码绑定范围」乃
化「字符串」而
化「字符串」而
化「源码搜索状态」而
「或可有」于(「源码范围」合「源码搜索状态」)
也。
「寻找源码绑定范围」者会「文件」而会「名称」而会「状态」而
鉴(「源码状态剩余」于「状态」)而
有「罄」则「可无」
或有「其他」则
若(「源码状态是注释开头」于「状态」)
则
「寻找源码绑定范围」于「文件」于「名称」于(「跳过源码注释」于(「源码状态前进」于「状态」于「二」)于「一」)
否则若(「源码状态以串开头」于「状态」于『『』)
则
「寻找源码绑定范围」于「文件」于「名称」于(「跳过源码字符串」于(「源码状态前进字符串」于「状态」于『『』))
否则若(「源码状态以串开头」于「状态」于『「』)
则
(
虑「名称开始」者「源码状态前进一字」于「状态」而
鉴(「读取源码引号名称」
于「文件」
于「名称开始」
于「罄」
于(「源码状态行」于「名称开始」)
于(「源码状态列」于「名称开始」))而
有「可无」则「可无」
或有(「可有」于(「所得名称」与「范围」与「后状态」))则
若(「串相等」于「所得名称」于「名称」)
则
「可有」于(「范围」与「后状态」)
否则
「寻找源码绑定范围」于「文件」于「名称」于「后状态」
)
否则若(「源码状态以串开头」于「状态」于「名称」)
则
(
虑「后状态」者「源码状态前进字符串」于「状态」于「名称」而
「可有」于((「构造源码范围」
于「文件」
于(「源码状态行」于「状态」)
于(「源码状态列」于「状态」)
于(「源码状态行」于「后状态」)
于(「源码状态列」于「后状态」))与「后状态」)
)
否则
「寻找源码绑定范围」于「文件」于「名称」于(「源码状态前进一字」于「状态」)
也。
「寻找源码声明范围」乃
化「字符串」而
化「字符串」而
化「源码搜索状态」而
「或可有」于(「源码范围」合「源码搜索状态」)
也。
「寻找源码声明范围」者会「文件」而会「名称」而会「状态」而
鉴(「源码状态剩余」于「状态」)而
有「罄」则「可无」
或有「其他」则
若(「源码状态是注释开头」于「状态」)
则
「寻找源码声明范围」于「文件」于「名称」于(「跳过源码注释」于(「源码状态前进」于「状态」于「二」)于「一」)
否则若(「源码状态以串开头」于「状态」于『『』)
则
「寻找源码声明范围」于「文件」于「名称」于(「跳过源码字符串」于(「源码状态前进字符串」于「状态」于『『』))
否则若(「源码状态以串开头」于「状态」于『「』)
则
(
虑「名称开始」者「源码状态前进一字」于「状态」而
鉴(「读取源码引号名称」
于「文件」
于「名称开始」
于「罄」
于(「源码状态行」于「名称开始」)
于(「源码状态列」于「名称开始」))而
有「可无」则「可无」
或有(「可有」于(「所得名称」与「范围」与「后状态」))则
若(「且」于(「串相等」于「所得名称」于「名称」)于(「声明后缀」于「后状态」))
则
「可有」于(「范围」与「后状态」)
否则
「寻找源码声明范围」于「文件」于「名称」于「后状态」
)
否则若(「源码状态以串开头」于「状态」于「名称」)
则
(
虑「后状态」者「源码状态前进字符串」于「状态」于「名称」
而
若(「声明后缀」于「后状态」)
则
「可有」于((「构造源码范围」
于「文件」
于(「源码状态行」于「状态」)
于(「源码状态列」于「状态」)
于(「源码状态行」于「后状态」)
于(「源码状态列」于「后状态」))与「后状态」)
否则
「寻找源码声明范围」
于「文件」于「名称」
于(「源码状态前进一字」于「状态」)
)
否则
「寻找源码声明范围」于「文件」于「名称」于(「源码状态前进一字」于「状态」)
也。
「是阿拉伯数字」乃化「字符串」而「爻」也。
「是阿拉伯数字」者会「字」而
(「存在吗」授以「字符串」)
于(会「数字」而「串相等」于「字」于「数字」)
于(「列」【『0』,『1』,『2』,『3』,『4』,『5』,『6』,『7』,『8』,『9』】)
也。
「去除名称末尾序数」乃化「字符串」而「字符串」也。
「去除名称末尾序数」者会「名称」而
递归虑「去除」其化(「列」于「字符串」)而(「列」于「字符串」)者
会「反字们」而
鉴「反字们」而
有(「缀」于「字」于「尾」)则
若(「是阿拉伯数字」于「字」)则
「去除」于「尾」
否则
「反字们」
或有「罄」则「罄」
而
「串组合并」于(「反转」于(「去除」于(「反转」于(「获取字符」于「名称」))))
也。
「定义范围缓存键」乃化「字符串」而化「字符串」而「字符串」也。
「定义范围缓存键」者会「文件」而会「名称」而
「文件」附『「:换行:」』附「名称」
也。
「准备语言服务信息」乃化「字符串」而「有」也。
「准备语言服务信息」者会「文件」而
虑「内容」者「读取编译源码」于「文件」而
虑「初态」者(「获取字符」于「内容」)与「零」与「零」而
(「写引用」于「当前语言服务文件」于「文件」);
(「写引用」于「当前语言服务信息」于「罄」);
(「写引用」于「当前名称搜索状态」于「初态」);
(「写引用」于「当前定义搜索状态」于「初态」);
(「写引用」授以(「串典」于「有」)于「当前悬停范围缓存」于「空串典」)
也。
「查找下个名称源码范围」乃
化「字符串」而
「或可有」于(「字符串」合「源码范围」)
也。
「查找下个名称源码范围」者会「原名称」而
虑「文件」者「读引用」于「当前语言服务文件」而
虑「状态」者「读引用」于「当前名称搜索状态」而
虑「源码名称」者「去除名称末尾序数」于「原名称」而
鉴(「寻找源码名称范围」于「文件」于「源码名称」于「状态」)而
有「可无」则「可无」
或有(「可有」于(「范围」与「后状态」))则
(「写引用」于「当前名称搜索状态」于「后状态」);
(「可有」于(「源码名称」与「范围」))
也。
「查找下个绑定源码范围」乃
化「字符串」而
「或可有」于(「字符串」合「源码范围」)
也。
「查找下个绑定源码范围」者会「原名称」而
虑「文件」者「读引用」于「当前语言服务文件」而
虑「状态」者「读引用」于「当前名称搜索状态」而
虑「源码名称」者「去除名称末尾序数」于「原名称」而
鉴(「寻找源码绑定范围」于「文件」于「源码名称」于「状态」)而
有「可无」则「可无」
或有(「可有」于(「范围」与「后状态」))则
(「写引用」于「当前名称搜索状态」于「后状态」);
(「可有」于(「源码名称」与「范围」))
也。
「查找并记录当前定义范围」乃化「字符串」而「或可有」于「源码范围」也。
「查找并记录当前定义范围」者会「名称」而
虑「文件」者「读引用」于「当前语言服务文件」而
鉴(「寻找源码声明范围」于「文件」于「名称」于(「读引用」于「当前定义搜索状态」))而
有「可无」则「可无」
或有(「可有」于(「范围」与「后状态」))
则(
虑「无」者「写引用」于「当前定义搜索状态」于「后状态」而
虑「无」者「写引用」于「当前名称搜索状态」于「后状态」而
虑「无」者
(「写引用」授以(「串典」于「有」)于「当前悬停范围缓存」于「空串典」)而
虑「无」者
(「写引用」授以(「列」于「语言服务信息」))
于
「当前语言服务信息」
于((「滤」授以「语言服务信息」)
于(会「信息」而「源码范围开始早于」于(「语言服务信息范围」于「信息」)于「范围」)
于(「读引用」于「当前语言服务信息」))
而
虑「无」者
(「串典引用更新」授以「源码范围」)
于「定义范围缓存」
于(「定义范围缓存键」于「文件」于「名称」)于「范围」
而
「可有」于
「范围」
)
也。
「查找文件定义范围」乃化「字符串」而化「字符串」而「或可有」于「源码范围」也。
「查找文件定义范围」者会「文件」而会「名称」而
虑「键」者「定义范围缓存键」于「文件」于「名称」而
鉴((「串典查找」授以「源码范围」)于(「读引用」于「定义范围缓存」)于「键」)而
有(「可有」于「已缓存」)则「可有」于「已缓存」
或有「可无」则(
虑「初态」者(「获取字符」于(「读取编译源码」于「文件」))与「零」与「零」而
鉴(「寻找源码声明范围」于「文件」于「名称」于「初态」)而
有「可无」则「可无」
或有(「可有」于(「范围」与「忽略状态」))则
虑「无」者
(「串典引用更新」授以「源码范围」)
于「定义范围缓存」于「键」于「范围」
而
「可有」于「范围」
)
也。
「记录定义位置信息」乃化「源码范围」而化「源码范围」而「有」也。
「记录定义位置信息」者会「范围」而会「目标」而
「列引用前衔」于「当前语言服务信息」于(「定义位置信息」于「范围」于「目标」)
也。
「记录悬停文字信息」乃化「源码范围」而化「字符串」而「有」也。
「记录悬停文字信息」者会「范围」而会「内容」而
虑「键」者「悬停范围缓存键」于「范围」而
鉴((「串典查找」授以「有」)于(「读引用」于「当前悬停范围缓存」)于「键」)而
有(「可有」于「忽略已有」)则「元」
或有「可无」则(
虑「无」者
(「串典引用更新」授以「有」)于「当前悬停范围缓存」于「键」于「元」
而
「列引用前衔」于「当前语言服务信息」于(「悬停文字信息」于「范围」于「内容」)
)
也。
「表达式定义范围」乃化「表达式」而「或可有」于「源码范围」也。
「表达式定义范围」者会「式」而
鉴「式」而
有(「式节点」于(「文件定义引用节点」于「文件」于「名称」于「忽略序数」)于「罄」)则「查找文件定义范围」
于
「文件」于「名称」
或有(「式节点」于(「文件引用节点」于「文件」)于「罄」)则「可有」
于(「构造源码范围」于「文件」于「零」于「零」于「零」于「零」)
或有「其他」则「可无」
也。
「标注引用语言服务信息」乃化「源码范围」而化「表达式」而「表达式」也。
「标注引用语言服务信息」者会「范围」而会「式」而
虑「无」者鉴(「表达式定义范围」于「式」)而
有(「可有」于「目标」)则
「记录定义位置信息」于「范围」于「目标」
或有「可无」则「元」而
鉴「式」而
有(「式节点」于(「文件引用节点」于「忽略文件」)于「罄」)则「式」
或有「其他」则
「式节点」于(「源码范围标注节点」于「范围」)
于(「列」【「式」】)
也。
「记录定义悬停」乃化「字符串」而化「字符串」而化「表达式」而「有」也。
「记录定义悬停」者会「文件」而会「名称」而会「类型」而
鉴(「查找文件定义范围」于「文件」于「名称」)而
有(「可有」于「范围」)则
「记录悬停文字信息」于「范围」于(「悬停类型文字」于「类型」)
或有「可无」则「元」
也。
「源码范围转癸象」乃化「源码范围」而「癸象」也。
「源码范围转癸象」者会「范围」而
「癸象对象」于(「列」【
『文件』与(「癸象字符串」于(「源码范围文件」于「范围」)),
『开始行』与(「癸象整数」于(「源码范围开始行」于「范围」)),
『开始列』与(「癸象整数」于(「源码范围开始列」于「范围」)),
『结束行』与(「癸象整数」于(「源码范围结束行」于「范围」)),
『结束列』与(「癸象整数」于(「源码范围结束列」于「范围」))
】)
也。
「语言服务信息转癸象」乃化「语言服务信息」而「癸象」也。
「语言服务信息转癸象」者会「信息」而
鉴「信息」而
有(「定义位置信息」于「范围」于「目标」)则
「癸象对象」于(「列」【
『种类』与(「癸象字符串」于『定义』),
『范围』与(「源码范围转癸象」于「范围」),
『目标』与(「源码范围转癸象」于「目标」)
】)
或有(「悬停文字信息」于「范围」于「内容」)则
「癸象对象」于(「列」【
『种类』与(「癸象字符串」于『悬停』),
『范围』与(「源码范围转癸象」于「范围」),
『内容』与(「癸象字符串」于「内容」)
】)
也。
「写语言服务信息」乃化「字符串」而「有」也。
「写语言服务信息」者会「输出路径」而
虑「文件」者「读引用」于「当前语言服务文件」而
虑「信息们」者
(「态射」授以「语言服务信息」授以「癸象」)
于(「反转」于(「读引用」于「当前语言服务信息」))
于
「语言服务信息转癸象」而
虑「根」者
「癸象对象」于(「列」【
『版本』与(「癸象整数」于「一」),
『源文件』与(「癸象字符串」于「文件」),
『信息』与(「癸象数组」于「信息们」)
】)
而
「文件系统」之「写文件」于「输出路径」于(「癸象表示」于「根」)
也。
「:文言:名解所记,存而复之,毋失跳转。汉语:名称解析与类型检查分进程后,仍保留名称解析收集的定义位置资料。:」
「语言服务阶段快照」乃化「有」而「表达式树组」也。
「语言服务阶段快照」者会「无」而
「列」【
『名称解析资料』与「阴」
与(「式节点」
于「元组构造节点」
于(「态射」授以「语言服务信息」授以「表达式」
于(「读引用」于「当前语言服务信息」)
于(会「项」而鉴「项」而
有「定义位置信息」于「范围」于「目标」则
「式节点」
于(「源码范围标注节点」于「范围」)
于(「列」【「式节点」于(「源码范围标注节点」于「目标」)于「罄」】)
或有「悬停文字信息」于「范围」于「内容」则
「式节点」
于(「源码范围标注节点」于「范围」)
于(「列」【「式节点」于(「字符串节点」于「内容」)于「罄」】))))
】
也。
「恢复语言服务阶段快照」乃化「表达式树组」而「有」也。
「恢复语言服务阶段快照」者会「组」而
鉴「组」而
有(「列」【「名」与「公开」与(「式节点」于「元组构造节点」于「项」)】)则
「写引用」
于「当前语言服务信息」
于(「态射」授以「表达式」授以「语言服务信息」
于「项」
于(会「式」而鉴「式」而
有「式节点」
于(「源码范围标注节点」于「范围」)
于(「列」【「式节点」于(「源码范围标注节点」于「目标」)于「罄」】)则
「定义位置信息」
于「范围」
于「目标」
或有「式节点」
于(「源码范围标注节点」于「范围」)
于(「列」【「式节点」于(「字符串节点」于「内容」)于「罄」】)则
「悬停文字信息」于「范围」于「内容」
或有「其他」则
「发生事故」于『语言服务阶段资料不合法』))
或有「其他」则
「发生事故」于『语言服务阶段快照不合法』
也。