aiscript icon indicating copy to clipboard operation
aiscript copied to clipboard

inner?: TypeSource を inner: TypeSource | null に修正

Open tsukimizake opened this issue 2 years ago • 1 comments

型チェックを実装したいなと思いながら弄っていて、innerはTypeSource|undefiendかと思っていたらnullが飛んできました。 parser.peggyのl584を見ると、型引数がない場合innerはnullになるのが正しそうに見えます。

tsukimizake avatar Apr 29 '23 01:04 tsukimizake

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 としてパース後のチェックで正規化するのが丸そう。

tsukimizake avatar May 12 '23 08:05 tsukimizake