Gauche:マニュアルにアクセスとGauche:モジュールの列挙の成果をつかい、ドキュメントの有無をチェックする試みです。yamasushi(2013/04/23 22:06:11 UTC)
(use gauche.dictionary)
(use util.match)
(use textj.gauche-info)
(use gauche-modules)
(use gauche-exports)
(use gauche-classes)
; TODO autoloadのモジュールをはねる処理
(let [[mod-index-node (info-node-module-jp)]
[var-index-node (info-node-variable-jp)]
[fun-index-node (info-node-function-jp)]
[cls-index-node (info-node-class-jp) ] ]
; モジュールのドキュメントをチェック
;
(define (mod-checker str mod)
(let1 modsym (module-name mod)
(if-let1 v (dict-get mod-index-node (symbol->string modsym) #f)
(format #t "OK[~a] ~a ----> ~a\n" str modsym v)
(format #t "!![~a] undocumented : ~a\n" str modsym )
) ) )
(define (obj-checker str mod sym obj)
(let [[name (symbol->string sym)]
[modsym (module-name mod) ]]
(unless (or
(dict-get var-index-node name #f)
(dict-get fun-index-node name #f)
(dict-get cls-index-node name #f) )
(format #t "!![~a][~a] undocumented : ~a [~a]\n" modsym str sym ($ class-name $ class-of obj) ) ) ) )
(for-each
(match-lambda [(mod sym obj)
(mod-checker "predef" mod )
(obj-checker "predef" mod sym obj) ])
(predefined-objects-lseq) )
(for-each
(match-lambda [(mod sym obj)
(mod-checker "lib" mod )
(obj-checker "lib" mod sym obj) ])
(library-objects-lseq) )
(for-each
(match-lambda [(mod sym obj)
(mod-checker "lib @ predef" mod )
(obj-checker "lib @ predef" mod sym obj) ])
(default-library-objects-lseq) )
;
; クラスのドキュメントをチェック
; モジュール列挙の方法がgauche-modules-for-eachとは異なる
(gauche-classes-for-each
( ^(mod sym cls)
;(print mod " " cls)
(if-let1 cls-name (and (slot-exists? cls 'name) ($ symbol->string $ class-name cls) )
(if-let1 mod-node (dict-get mod-index-node (symbol->string (module-name mod) ) #f)
(begin
(format #t "OK ~a ----> ~a\n" (module-name mod) mod-node)
(if-let1 cls-node (dict-get cls-index-node cls-name #f)
(begin
;#?=cls-node
(format #t "OK ~a ----> ~a\n" cls-name cls-node))
(rxmatch-case cls-name
[#/<\S+-meta>/ (_)
(format #t "! metaクラス(~a) ~a に索引がない\n" (module-name mod) cls-name ) ]
[#/<\S+-error>/ (_)
(format #t "! errorクラス(~a) ~a に索引がない\n" (module-name mod) cls-name ) ]
[else
(format #t "!! (~a) クラス ~a に索引がない\n" (module-name mod) cls-name ) ] ) ) )
(format #t "!! undocumented : ~a\n" (module-name mod) ) )
(format #t "?? ~aがnameスロットをもたない !!??\n" cls) ) ) ) )