[05] [Syntax] Trivia squash - omochi/swift GitHub Wiki
libSyntaxのTriviaはTriviaPiece によってRun Length Encodingによってデータを保持する。 そのためLexerでは記号の連続する数を調べてからTriviaPieceを生成している。
しかし、記号の連続する数を事前に調べなくとも、 TriviaPieceを追加する際に、末尾のTriviaPieceと比較して、 同じ種類であれば1つのTriviaPieceとして合成すれば、 Lexerの実装をシンプルにすることができる。
この機能をTriviaにメソッドとして追加しておけば、 後にUTF-8 BOMとshebangをどちらもgarbageTextとしてTrivia化する際や、 改行コードを LF, CR, CRLF の3種類に区別する際にも、 コードがシンプルに保てるだろう。
このPRではこの機能をTriviaにpush_back_or_squash
メソッドとして追加する。
また、LexerでTriviaList
を使っているが、これをTrivia
に置き換えることで、これを利用する。
OwnedStringは文字列バッファを参照している場合と自身でヒープ上にメモリを持っている場合がある。 TriviaPieceを連結する際に、それらの内部のOwnedStringが同じメモリ上の連続した領域を指している場合、 長さを増やしたOwnedStringを作るほうが効率的である。 現状のLexerは結果的にそのようなTriviaPieceオブジェクトを構築するようにもなっている。
そこで、trySquash
には
いや、 garbageText は連結しないというのでも良いか。