bitclust icon indicating copy to clipboard operation
bitclust copied to clipboard

サンプルコード内の `class Foo; end` が `class ;Foo end` と表示される

Open ysjj opened this issue 2 years ago • 0 comments

概要

Rubyリファレンスマニュアルのサンプルコードで、class Foo; endclass ;Foo end と表示されています。

具体例: Module#private_constant image

ソースを確認したところ、 class Foo; end (相当)で書かれていました。 image

再現確認

irb 上の次のコードで再現することが確認できました。

irb> require 'bitclust'
irb> BitClust::SyntaxHighlighter.new('class A; end').highlight
=> "<span class=\"k\">class</span> ;<span class=\"nn\"></span><span class=\"o\"></span><span class=\"nc\">A</span> <span class=\"k\">end</span>"

原因分析

この状態は on_const;on_default で処理されることが関係しているようです。

https://github.com/rurema/bitclust/blob/fd203d14a7e8a982f413085312e2621558f8ffa7/lib/bitclust/syntax_highlighter.rb#L178-L191

クラス名(and/or モジュール名; 以下、同様)をトリガーとする on_const ではトークンが data ではなく @name_buffer に保存されます。 ですが、次の ; をトリガーとする on_default ではトークンが data に保存されます。 この時点で data にはクラス名の前に ; が保存された状態となっています。

対処案

基本的に ; は改行と同様に扱えば良いと考えています。 つまり on_nl と同等の on_semicolon を設ければ良さそうです。

https://github.com/rurema/bitclust/blob/fd203d14a7e8a982f413085312e2621558f8ffa7/lib/bitclust/syntax_highlighter.rb#L256-L276

対処コード

フォーク リポジトリにて上述の対処案で修正されることを確認しています:

https://github.com/rurema/bitclust/compare/b853df0...ysjj:rurema-bitclust:da05f15

ysjj avatar Nov 08 '22 14:11 ysjj