搜索词
解析器选项编译器API
建议
为CLI解析器添加一种传递额外自定义选项的方法。
用例
我们目前正在开发一个将Typescript转换为Lua的工具。
这通过使用编译器API进行类型检查来实现。
然后将AST转换为Lua而不是JS。
我们希望用户通过CLI或tsconfig文件传递类型检查选项。目前我们通过使用parseCommandLine
和readConfigFile
/parseJsonConfigFileContent
来实现这一点,它们都由编译器API公开。这样用户就可以像使用tsc一样使用Lua编译器。
问题是很难将自定义选项添加到解析过程中,因为parseCommandLine在选项无效时会报告错误。目前我们只是忽略由于我们的自定义选项引起的错误,但这不是一个真正干净的解决方法。对于parseJsonConfigFileContent
的问题,我们目前在compilerOptions{}
之外添加选项,例如:
{
"luaTarget": "5.1",
"compilerOptions": {...}
}
这对我们来说也不是很理想。
我们并不真的想为我们所有的tsc选项编写自己的解析器,或者除了使用parseCommandLine之外还要使用一些第三方CLI解析器。
我们也并不真的想使用我们自己的Typescript分支。
实现
如果我们可以根据const optionDeclarations: CommandLineOption[]
或OptionNameMap
将自己的optionDeclarations传递给parseCommandLine和parseJsonConfigFileContent,那就太理想了。
一种可能的方法是在这些函数中添加一个可选参数,该参数包含一个OptionMap,而不仅仅是通过getOptionMap/getOptionFromMap获取选项,传递的参数将被用于此目的。
这需要在将这些附加选项传递给函数之前将它们与默认选项合并。另一种选择是仅让参数获取附加选项,并在解析器函数内部完成合并,这样optionDeclarations就不需要暴露了。
此外,一些与选项相关的const/函数/枚举可能需要公开。
TL;DR:这个功能可以在不改变任何功能的情况下实现,只需要对commandLineParser.ts
进行一点重构(编辑:实际上我认为这需要大量的重构)。我也可以为您提供一个PR。
示例
我们现在所做的:
https://github.com/Perryvw/TypescriptToLua/blob/master/src/CommandLineParser.ts
我们基本上可以用以下代码替换大部分内容:
let typescriptToLuaOptions: OptionNameMap = {
// our custom options
}
let commandLine = ts.parseCommandLine(args, typescriptToLuaOptions);
待办事项清单
我的建议满足以下指导原则:
- 这不会对现有的TypeScript / JavaScript代码造成破坏性更改
- 这不会改变现有JavaScript代码的运行时行为
- 这可以在不根据表达式的类型生成不同的JS的情况下实现
- 这不是一个运行时特性(例如新的表达式级语法)
3条答案
按热度按时间ni65a41a1#
了解在
compilerOptions
之外的选项有什么次优之处会很好 - 今天有很多工具都这样做,而且没有抱怨,但我们在这里欢迎反馈。3gtaxfhh2#
你仍然需要使用一些自定义逻辑来验证它们,因为它们只是以解析后的JSON格式存储在
ParsedCommandLine.raw
中。这不是一个大问题。主要的问题是,我们必须将
raw
中的附加选项合并回CompilerOptions
,因为我们需要从两者中获取值来进行转译过程。ux6nzvsh3#
一年过去了...