perl editor のpluginを作る ソースコードを区画分けする。

今回はエディタ上のソースコードを区画に分けます。

ここはコメント部分、ここはpod、ここはperlのコードみたいに分けることができます。それぞれを区画にわけて異なるコードアシストなどを設定できます。あとたぶんある程度わけたほうがパフォーマンスがいいんじゃないかなぁ・・・とか思ってます。

まず区分けするためのソースコードをスキャンするスキャナーを作成します。

package com.appspot.charisoku30km.editor.perl.editors;

import org.eclipse.jface.text.rules.IPredicateRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.RuleBasedPartitionScanner;
import org.eclipse.jface.text.rules.SingleLineRule;
import org.eclipse.jface.text.rules.Token;

public class PerlPartitionScanner extends RuleBasedPartitionScanner {
    
    public PerlPartitionScanner() {

        IToken comment = new Token("____perl_comment");

        IPredicateRule[] rules = new IPredicateRule[1];
        rules[0] = new SingleLineRule("#", "", comment);

        setPredicateRules(rules);
    }
}

とりあえずすごく簡単なスキャナを作成しました。

RuleBasedPartitionScannerを継承しコンスタラクタでIPredicateRuleという区分けのためのルールをsetPredicateRulesで設定しています。

new Token("____perl_comment");の____perl_commentはこの区画の識別のため
のものです。

SingleLineRuleはよんでそのままソースコードの1行のためのスキャン用のルールです。

new SingleLineRule("<", ">", comment);

とか書くと<から>までをこのITokenと識別します。

つぎにこのソースコードのドキュメントオブジェクト(IDcument)生成時に上記のスキャナーをセットするFileDocumentProviderを継承したクラスを作成します。

package com.appspot.charisoku30km.editor.perl.editors;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentPartitioner;
import org.eclipse.jface.text.rules.FastPartitioner;
import org.eclipse.ui.editors.text.FileDocumentProvider;

public class PerlDocumentProvider extends FileDocumentProvider {

    protected IDocument createDocument(Object element) throws CoreException {
        IDocument document = super.createDocument(element);
        if (document != null) {
            IDocumentPartitioner partitioner =
                new FastPartitioner(
                    new PerlPartitionScanner(),
                    new String[] {
                        "____perl_comment", //スキャナのトークンとおなじ値
                    }
                );
            partitioner.connect(document);//ドキュメントとパーティショナーを接続 ↓でsetするのにね
            document.setDocumentPartitioner(partitioner);
        }
        return document;
    }
}

FileDocumentProviderのcreateDocumentをオーバーライドし、先ほどのPerlPartitionScannerをつかってFastPartitionerを生成し、setDocumentPartitionerでドキュメントにpartitionerをセットしてあげます。

ではこのDocumentProviderをPeroOreditorのコンストラクタでセットしてあげます。

    public PerlOreditor() {
        super();
        setSourceViewerConfiguration(new PerlConfiguration());
        setDocumentProvider(new PerlDocumentProvider());
    }

ということで区画わけができました!でも区画分けしてあげただけなので何もおこりません。。。

あ、#以降でコンテンツアシストが動作しなければ成功しています。コンテンツアシストは今回作成したコメントの区画ではなくデフォルトの区画に設定しているためです。