Gauche:ドキュメントがあるかどうか調べる

Gauche:ドキュメントがあるかどうか調べる

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) ) ) ) )

More ...