[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 は連結しないというのでも良いか。