読者です 読者をやめる 読者になる 読者になる

Haxeのコンパイラのコード補完が面白い件。

開発環境について書く予定だったが、ちょっと予定変更して、Haxeのコンパイラの面白い機能について書く。

Haxeのコンパイラのコード補完について。

http://haxe.org/manual/completion

これに書いてあるままのことを書くのだが、案外面白いので。

実はHaxeのコンパイラには --displayオプションがあって、これでメソッド名や、パッケージ名に関するコードの補完情報をくれる。

メソッド補完

たとえば、なんらかのエディタで以下の部分まで編集したとしよう。

// |はカーソルの位置
class Test {
    public static function main() {
        trace("Hello".|
    }
}

ここで、--displayオプションを使えば、文字列のオブジェクトに関するメソッドを補完してくれる。
この場合以下のようなコマンドをうつ。

$ haxe --display Test.hx@94

ここで、Test.hxはファイル名であり、@94というのは、カーソルの手前のドットまでのファイルのバイト文字列の長さである。(ここでは、Shift-JISのエンコードを利用しているので、94バイトの所にドットがあると、コンパイラに教えている。バイト文字列の長さは文字コードなどに寄るので環境によってバイト文字列の長さを計算してください。)

そうするとコンパイラが以下のようにしてコードヒントを教えてくれる。

<list>
<i n="charAt"><t>index : Int -&gt; String</t><d>
		Returns the character at position [index] of [this] String.
		
		If [index] is negative or exceeds [this].length, the empty String ""
		is returned.
	</d></i>
<i n="charCodeAt"><t>index : Int -&gt; Null&lt;Int&gt;</t><d>
		Returns the character code at position [index] of [this] String.
		
		If [index] is negative or exceeds [this].length, null is returned.
		
		To obtain the character code of a single character, "x".code can be used
		instead to inline the character code at compile time. Note that this
		only works on String literals of length 1.
	</d></i>
<i n="indexOf">
.....
</list>

面白い。

パッケージ名の補完

また、パッケージ名も教えてくれる。以下のようにファイルを編集した。

import haxe.|

そしてまた、同様に、

$ haxe --display Test.hx@12

すると、以下のようにパッケージ名のヒントを教えてくれる。

<list>
<i n="CallStack"><t></t><d></d></i>
<i n="EnumFlags"><t></t><d></d></i>
<i n="EnumTools"><t></t><d></d></i>
....
</list>

Haxeのコンパイラのキャッシュサーバーを立ち上げて補完する!

コンパイルや補完のスピードの為に、haxeはなんと、コンパイラや補完のキャッシュサーバー(Haxe compilation server)まで用意してくれる。

以下のようにしてHaxe compilation serverを立ち上げる。

$ haxe -v --wait 6000
Waiting on 127.0.0.1:6000

そうして、以下のようにHaxe compilation serverにつなぐ

haxe --connect 6000 --display Test.hx@12

これでパッケージの補完のヒントをくれる。

これらの情報を解析して、いろいろなエディタで補完機能が実装できるね!面白い!
けど、よく考えたら、コンパイラがコード補完のためのヒントを出してくれるのは、理にかなってるよね。