Kinkのドキュメンテーションシステム

KinkのドキュメンテーションシステムをKinkで作りました。Javadocとかgodocみたいなやつです。

いずれ 1) JSON出力 2) JSONから各種フォーマットへの変換 の2つに分けるつもりですが、今はまだJSONモジュールがないので、Sphinx用の.rstファイルを直接出力しています。

最終的な結果はこんな感じ。

http://doc.kink-lang.org/manual/api/kink-NUM.html

元となるソースは、典型的にはこんな感じ

##
# Companion mod for atomic vals.

:JAVA.require_from('kink/host_lang/java/')

:AtomicReference_class <- JAVA.class('java.util.concurrent.atomic.AtomicReference')
:Object_class <- JAVA.class('java.lang.Object')

## type atomic
#
# An atomic is a container of a single val, which provides serialization of
# data access among multiple threads,
# and atomic operations such as compare-and-set.
#
# Example:
#
#   :ATOMIC.require_from('kink/thread/')
#   :THREAD.require_from('kink/thread/')
#
#   # atomic reference with 0 as the initial val
#   :Counter <- ATOMIC.new(0)
#
#   # thread-safe counter
#   :make_uniq_num <- {()
#     [:Cur :Next] = Counter.update{(:N) N + 1 }
#     Cur
#   }
#
# get, set, and compare_and_set operations are serialized for a single atomic.
:Atomic_trait <- [

  ## Atomic.get
  #
  # Atomic.get returns the val contained in the Atomic reference.
  'get' {[:A]()
    A.Ref.call_method('get').unwrap
  }

  ...

「メソッド」や「型」に相当する要素が言語仕様上存在せず、静的解析では見出しが決定できないので、自分で書く必要があります。本文については、行頭の空白が3文字以上のブロックをコードとみなします。

他にマークアップ要素はありません。個条書きしたければ「•」とか「1)」とか自分で書いてください、という設計です。このあたりはgodocの影響を強く受けています。

データモデルはこんな感じ。

f:id:miyakawa_taku:20190204231142p:plain
Kink Doc Datamodel