Java 用 tags ファイルの生成No.03848
安久津 さん 03/08/19 00:05
 
Java 用 tags ファイルの生成。

(1) Foo.java
public class Foo extends Hoge{
    private bar;
    Foo(){}
    public void setBar(Bar bar){ this.bar = bar; }
    public Bar getBar(){ return this.bar; }
}
class Hoge {
    Hoge(){}
}
class Bar {
    Bar(){}
}

(2) tags
    「C 言語の関数一覧」で tags ファイルを作成すると以下のようになる。

C:\jdk1.3.1_02\demo\applets\foo.java(3) :     Foo(){}
C:\jdk1.3.1_02\demo\applets\foo.java(4) :     public void setBar(Bar bar){ t
his.bar = bar; }
C:\jdk1.3.1_02\demo\applets\foo.java(5) :     public Bar getBar(){ return th
is.bar; }
C:\jdk1.3.1_02\demo\applets\foo.java(8) :     Hoge(){}
C:\jdk1.3.1_02\demo\applets\foo.java(11) :     Bar(){}

(3) Bar のダイレクトタグジャンプ
    別のファイルの中、Bar にカーソルを置いて、directtagjump すると
    ジャンプ先候補は、次の2つです。

C:\jdk1.3.1_02\demo\applets\foo.java(5) :     public Bar getBar(){ return th
is.bar; }
C:\jdk1.3.1_02\demo\applets\foo.java(11) :     Bar(){}

    もし、戻り値が Bar であるメソッドが、他にも存在すれば、
    それらは全て、ジャンプ先候補に挙がってしまいます。

(4) hidetags.js
// ============================================================================
// hidetags.js は、独自の Java 用 tags を作成します。
// ジャンプ先候補を絞るために、ジャンプに無関係な識別子を
// 取り除いた tags ファイルを作成します。
// 実行には WSH が必要です。
// 大抵の Windows には標準でインストールされています。
// Note:
//       クラス定義用のタグを含みます。
//       コンストラクタのタグは含みません。
// ============================================================================

function Find(strdir){
    var folder = FSO.GetFolder( strdir );

    var fname;
    var files = new Enumerator( folder.Files );
    while( ! files.atEnd() ){
        fname = FSO.BuildPath( folder.Path, files.item().Name );
        PutTag( fname );
        files.moveNext();
    }
    if( ! SUBDIR ) return;
    var folders = new Enumerator( folder.SubFolders );
    while( ! folders.atEnd() ){
        Find( folders.item().Path ); // recursively
        folders.moveNext();
    }
}
function PutTag(fname){
    if( /.\.java$/i.test(fname)==false ) return;
    var fin=null;
    try{
        fin =  FSO.OpenTextFile(fname, 1, false);
    }catch(e){ return; }
    var line="";
    var lineno=0;
    while( ! fin.AtEndOfStream ){
        line = fin.ReadLine();
        lineno++;
        if( RE2.test(line)==false && RE3.test(line)==false ) continue;

        if( /\S+\s*\(/.test(line) ){
            line = RegExp.lastMatch;
        }else if( /\b(?:extends|implements)\b/.test(line) ){
            line = RegExp.leftContext;
        }
        WScript.Echo(fname + "(" + lineno + ") : " + line);
    }
    fin.Close();
}

// main

var
RE2=/^\s*(?:(?:public|protected|private|static|abstract|final|native|synchro
nized)\s+)*(?:void|boolean|char|byte|short|int|long|floa
t|double|(?:[A-Za-z_][\w$]*\.)*[A-Z][\w$]*)(?:\[\])*\s+[a-z][\w$]*\s*\(/;

//var RE3=/\b(?:class|interface)\s+[A-Za-z_][^(]*$/
var RE3=/^\s*(?:[a-z]+\s+)*\b(?:class|interface)\s+[A-Za-z_][^(]*$/;
var FSO = new ActiveXObject( "Scripting.FileSystemObject" );
var SUBDIR=false;
var args=WScript.Arguments;
if( args.length > 0 && /^-r$/i.test(args.item(0)) ){ SUBDIR=true; }
Find( "." );
// ============================================================================

(5) 使い方。

c:\where>cscript hidetags.js >tags
c:\where>cscript hidetags.js -r >tags
    後者は、サブディレクトリを再帰的に処理します。
    実際は、以下のように、バッチファイルを使ってください。

C:\WINDOWS\COMMAND>dir hidetags*
-- 省略 --
HIDETAGS JS          1,569  03-08-16   8:33 hidetags.js
HIDETAGS BAT            48  03-08-16   5:27 hidetags.bat
-- 省略 --
C:\WINDOWS\COMMAND>type hidetags.bat
@echo off
cscript c:\windows\command\hidetags.js %1 >tags

C:\WINDOWS\COMMAND>cd c:\jdk1.3.1_02\demo\applets

C:\jdk1.3.1_02\demo\applets>hidetags -r

[ ]