aiscript
aiscript copied to clipboard
inner?: TypeSource を inner: TypeSource | null に修正
型チェックを実装したいなと思いながら弄っていて、innerはTypeSource|undefiendかと思っていたらnullが飛んできました。
parser.peggyのl584を見ると、型引数がない場合innerはnullになるのが正しそうに見えます。
let x = 1 は
[
{
type: 'def',
name: 'x',
expr: {
type: 'fn',
args: [],
retType: null,
children: [Array],
loc: [Object]
},
mut: false,
attr: [],
loc: { start: 4, end: 13 }
}
]
でvarTypeがnullになっている。
一方、 @f(){1} は
[
{
type: 'def',
name: 'f',
expr: {
type: 'fn',
args: [],
retType: null,
children: [Array],
loc: [Object]
},
mut: false,
attr: [],
loc: { start: 4, end: 13 }
}
]
となり、defだがvarTypeがundefinedとなる。 peggyのl525でvarTypeを入れずにcreateNodeしているのが原因っぽいが、どうやらこういうケースをハンドルするために node.varType != null のような書き方をしていたらしいと理解した。
peggyを気をつけて書けというのは人類には無理な要求なので、Cst.Nodeでは T | undefined | null 、Ast.Nodeでは T | null としてパース後のチェックで正規化するのが丸そう。