`ImportDeclaration.moduleSpecifier`应该始终是StringLiterial吗?

时间:2016-12-05 21:10:04

标签: typescript typescript-compiler-api

interface ImportDeclaration extends Statement {
    kind: SyntaxKind.ImportDeclaration;
    importClause?: ImportClause;
    moduleSpecifier: Expression;
}

我找不到moduleSpecifier不是StringLiteral

的用例

1 个答案:

答案 0 :(得分:1)

它必须是编译器的其余部分,但更一般地指定为Expression类型,以便解析器可以正常地恢复并将其存储在其树中。

查看this comment from the source

// We allow arbitrary expressions here, even though the grammar only allows string
// literals.  We check to ensure that it is only a string literal later in the grammar
// check pass.

The text <code>import foo from wat</code>, where <code>wat</code> has a red underline indicating a syntax error (i.e. "String literal expected.")

文件中的所有文本都必须属于其对应树中的某个节点。在上述情况下,我们希望在名为Identifier的{​​{1}}上报告错误。

由于我们在解析后报告语法错误,因此无论表达式是什么,都需要在wat上。否则,我们怎么知道应该的节点是什么?由importSpecifier拥有的上下文允许我们在解析之后知道我们需要报告解析错误。

正如您所提到的,这需要付出代价 - ImportDeclaration的所有用户都必须处理importSpecifier是表达式的更一般情况。这绝对是痛苦的,遗憾的是,我没有为你提供很好的解决方法。