AS2 Language Support (CrazyFlashNight Fork)
基于 admvx/as2-language-support 的 Fork 版本,针对大型 AS2 游戏项目(CrazyFlashNight / CF7)进行了大量增强。
功能
语法高亮
- 完整的 ActionScript 2.0 语法高亮
- Unicode/中文标识符支持 — 类名、方法名、变量名、import 路径、类型标注中的中文字符均可正确着色
LSP 功能
- 自动补全 —
. 触发的成员补全和环境符号补全
- 悬停信息 — 显示类型信息和方法签名
- 方法签名提示 — 在
( 和 , 时显示参数提示
- 跳转到定义 — Ctrl+Click / F12 跳转到类或成员的定义位置
- 文档符号大纲 — 文件内的类、方法、属性结构大纲(Ctrl+Shift+O)
- 查找所有引用 — 查找符号在工作区内的所有使用位置
- 重命名 — 工作区范围内的符号重命名
- 实时诊断 — 花括号不匹配、重复成员声明等错误提示
解析器能力
- class、interface、extends、implements 声明
- 方法和属性声明(public / private / static)
- getter / setter 属性
- 构造函数检测
- 方法体内局部变量追踪
#include 指令展开,附带行号映射以保证 LSP 位置准确还原
- 脚本文件支持 — 没有
class 声明的 .as 文件(帧脚本、#include 目标文件)也能获得完整的 LSP 支持,包括跨文件类型解析
- 通配符 import 解析 —
import org.package.* 自动解析为目录下所有类
工作区功能
- 启动时自动索引工作区内所有
.as 文件
- 分批索引(每批 20 个文件),避免大型项目内存压力
- 内容变更防抖(150ms),减少频繁重解析
- 基于 import 的跨文件类型解析
- 从已注册的类文件自动推断 classpath 根目录
内置类定义
预置了 Flash Player 内置类定义,包括:
- 核心:Object, Array, String, Number, Boolean, Date, Math, Function
- 显示:MovieClip, TextField, Button
- 媒体:Sound, Video, Camera, Microphone
- 网络:XML, XMLSocket, XMLNode, LoadVars, SharedObject
- 绘图:BitmapData, ExternalInterface
- 滤镜:BlurFilter, ColorMatrixFilter, DropShadowFilter, GlowFilter 等
- 几何:Point, Rectangle, Matrix, ColorTransform
- 其他:Accessibility, Selection, Stage, Key, Mouse, System 等
已知限制
- 解析器基于正则表达式(非完整 AST 解析器)—— 深层嵌套表达式和条件编译可能无法正确解析
with(target){} 作用域不追踪
prototype 链赋值(MyClass.prototype.foo = function(){})不被索引
- 同一文件多个 class 只解析第一个
- 复杂属性链的类型推断(
this._root.someClip.someChild)可能无法完全解析
- 脚本文件的跨文件解析需要等待工作区索引完成
后续计划
- [ ] 补全内置类定义(从 Flash CS6 导入完整集合)
- [ ] 可配置 classpath(目前仅自动检测)
- [ ] 增强诊断(未定义变量警告、类型不匹配提示)
- [ ] 注释感知解析(#42 — 块注释中的代码模式干扰解析器)
- [ ] 多行方法签名支持(#37)
- [ ] 针对 1000+ 文件工作区的性能优化
开发
环境要求
- Node.js 16+(已在 20.x 测试通过)
- npm
构建
npm install
npm run compile
测试
cd server && npx jest
调试
在 VSCode 中按 F5 启动 Extension Development Host。
原项目
基于 admvx 的 AS2 Language Support。原版更新日志见 changelog。
| |