Browse files

binaries...

  • Loading branch information...
1 parent a5123a3 commit adefdbf438c6cbc43c98701bb2b126237d326099 @Samsinite committed May 30, 2010
View
54 vendor/rsense-0.3/doc/changes-v0.3.ja.txt
@@ -0,0 +1,54 @@
+Title: RSense - v0.3の変更点
+CSS: style.css
+
+RSense v0.3の変更点
+===================
+
+[Index](index.txt)
+
+\[[English](changes-v0.3.txt)]
+
+v0.2からv0.3の主な変更点は次のようになります。詳しくは[ユーザーマニュアル](manual.ja.txt)をご覧ください。
+
+新機能
+------
+
+* [定義元ジャンプ](manual.ja.txt#Definition_Jump_in_Emacs) (#35)
+* [Where Is](manual.ja.txt#Where_Is_in_Emacs)
+* auto-complete-modeやVimにおけるメソッドシグネチャ表示
+* 部分的な`Proc`, `lambda`対応 (#6)
+* Windowsサービス対応 (#15)
+
+修正されたバグ
+--------------
+
+* スペースを含むディレクトリでの問題 (#14)
+* CRLFのファイルでの問題 (#19)
+* パフォーマンス改善 (#3)
+* メモリ使用量削減 (#4)
+* エディタが固まる問題 (#9)
+* いくつかのクリティカルな問題と多くの問題
+
+Emacsの新しいコマンド
+---------------------
+
+* [`rsense-jump-to-definition`](manual.ja.txt#Definition_Jump_in_Emacs)
+* [`rsense-where-is`](manual.ja.txt#Where_Is_in_Emacs)
+* `rsense-service-start`
+* `rsense-service-stop`
+* `rsense-service-status`
+
+Vimの新しいコマンド
+-------------------
+
+* [`:RSenseTypeHelp`](manual.ja.txt#Type_Help_in_Vim)
+* [`:RSenseDefinitionJump`](manual.ja.txt#Definition_Jump_in_Vim)
+* [`:RSenseWhereIs`](manual.ja.txt#Where_Is_in_Vim)
+* `:RSenseVersion`
+* `:RSenseOpenProject`
+* `:RSenseCloseProject`
+* `:RSenseServiceStart`
+* `:RSenseServiceStop`
+* `:RSenseServiceStatus`
+* `:RSenseClear`
+* `:RSenseExit`
View
54 vendor/rsense-0.3/doc/changes-v0.3.txt
@@ -0,0 +1,54 @@
+Title: RSense - Changes v0.3
+CSS: style.css
+
+RSense Changes v0.3
+===================
+
+[Index](index.txt)
+
+\[[Japanese](changes-v0.3.ja.txt)]
+
+Major changes from v0.2 to v0.3. See also [documentation](manual.txt).
+
+New Features
+------------
+
+* [Definition jump](manual.txt#Definition_Jump_in_Emacs) (#35)
+* [Where Is](manual.txt#Where_Is_in_Emacs)
+* Method signature with auto-complete-mode and Vim
+* `Proc` and `lambda` are partially supported (#6)
+* Support Windows service (#15)
+
+Fixed Bugs
+----------
+
+* White space containing directory bug (#14)
+* CRLF file bug (#19)
+* Improve performance (#3)
+* Reduce memory usage (#4)
+* Stalling editors bug (#9)
+* Some critical bugs and many bugs
+
+New Commands for Emacs
+----------------------
+
+* [`rsense-jump-to-definition`](manual.txt#Definition_Jump_in_Emacs)
+* [`rsense-where-is`](manual.txt#Where_Is_in_Emacs)
+* `rsense-service-start`
+* `rsense-service-stop`
+* `rsense-service-status`
+
+New Commands for Vim
+--------------------
+
+* [`:RSenseTypeHelp`](manual.txt#Type_Help_in_Vim)
+* [`:RSenseDefinitionJump`](manual.txt#Definition_Jump_in_Vim)
+* [`:RSenseWhereIs`](manual.txt#Where_Is_in_Vim)
+* `:RSenseVersion`
+* `:RSenseOpenProject`
+* `:RSenseCloseProject`
+* `:RSenseServiceStart`
+* `:RSenseServiceStop`
+* `:RSenseServiceStatus`
+* `:RSenseClear`
+* `:RSenseExit`
View
11 vendor/rsense-0.3/doc/demo.txt
@@ -0,0 +1,11 @@
+Title: RSense - Demo
+CSS: style.css
+
+RSense Demo
+===========
+
+[Index](index.txt)
+
+[YouTube mirror](http://www.youtube.com/watch?v=V-tpOJgugh4)
+
+<video src="rsense-demo.ogv" controls="true" width="720" height="672" />
View
443 vendor/rsense-0.3/doc/devel.txt
@@ -0,0 +1,443 @@
+Title: RSense Development Guide
+Numbering: yes
+CSS: style.css
+
+RSense Development Guide
+========================
+
+[Index](index.txt)
+
+* * *
+
+{toc}
+
+* * *
+
+Frontend Model
+--------------
+
+RSense provides just a frontend which can be used from a terminal. It means there is no way to embed RSense into other frontends (e.g. Editors, IDE). So how we can use it from other frontends? Let us explain.
+
+RSense has a CLI (command line interface) frontend only. Try type inference from a terminal:
+
+ % cat test.rb
+ 1_|_
+ % bin/rsense --file=test.rb
+ type: Fixnum
+
+`bin/rsense` is wrapper frontend script which provides us a way to operate RSense transparency in server/client model. When `bin/rsense` is executed, `bin/rsense` tries to execute a daemon server if it doesn't live by forking and executing primitive frontend. In a time after forking, it will create an unix domain socket to communicates with a frontend. After executing the daemon, `bin/rsense` tries to open the unix domain socket and sends a given command from a terminal.
+
+Considering a command `bin/rsense --file=test.rb`, first of all, `bin/rsense` executes a daemon server by:
+
+ % java -cp ... org.cx4a.rsense.Main script ...
+
+In a script mode, it reads a command from standard input and executes as it is a command from a terminal. For example,
+
+ % java -cp ... org.cx4a.rsense.Main some-command --some-option1=foo --some-option2=foo
+
+is equivalent to:
+
+ % java -cp ... org.cx4a.rsense.Main script
+ some-command --some-option1=foo --some-option2=foo
+ ^D
+
+A main difference of these ways is that in a script mode you can execute a series of command. It enables us to save initialization time and do continuous processing. Actually, it is used as a test script. See also [testing](#Testing).
+
+After executing the server, as we said, `bin/rsense` sends a command from a terminal to the server. So we can operate RSense transparency as it seems like a single command.
+
+Using from other frontends is very easy. All of they have to do is just a execution `bin/rsense` with arbitrary command and options. For example, a type inspection can be implemented in emacs like
+
+ (message "%s" (shell-command-to-string (format "bin/rsense type-inference --file=%s --location=%s" (buffer-file-name) (1- (point)))))
+
+All complex things will be done automatically.
+
+Type Inference Algorithm
+------------------------
+
+RSense uses a type inference algorithm called *CPA* (Cartesian Product Algorithm) which is developed by Ole Agensen. With some restriction of CPA such like data-polymorphism, RSense uses a modified CPA indeed. We think CPA is very simple to implement and a best way to accomplish what RSense tries to privde.
+
+Type Annotation
+---------------
+
+In RSense, *type annotation* is needed to resolve a data-polymorphism problem and ad-hoc parameter polymorphism.
+
+Type annotation is written as a comment which takes a form of `##% ...`. Type annotation can be written before class declaration and method declaration.
+
+### Method Type Annotation ###
+
+By adding type annotation to method, method call will be analyzed more precissly. Consider a method which takes one argument. If the argument is `String`, it will return `Fixnum`, otherwise returns `Float`. Such strange methods are often seen in Ruby world, you know. Anyway, it is difficult to analyze such methods. In this case, a result of `f()` will be infered as `Fixnum` and `Float` without type annotation.
+
+ # How do we analyze this method?
+ def f(a)
+ if a.instanceof(String)
+ 1
+ else
+ 2.3
+ end
+ end
+
+With type annotation, you can help analyzers to infer precisely. Method type annotation takes a form of:
+
+ ##% method-name ('<' type-vars ('|' constraints)? '>')? '(' arguments ')' block? '->' result
+
+Learn from examples. Adding type annotation for the method above:
+
+ ##% f(String) -> Fixnum
+ ##% f(a) -> Float
+ def f(a)
+ ...
+ end
+
+this method has two method type annotations. One of them is `f(String) -> Fixnum` which can be read as "If first argument is a kind of String, it returns Fixnum object." "a kind of" implies a test satisfied by calling ruby's `kind_of?` method. We call it *guard*. Two of them is `f(a) -> Float` which can be read as "If one polymorphic parameter is given, it returns Float." So now, this method can be analyzed precisely.
+
+A parameter can be optional and rest. If you want to make parameters optional, put "?" before the parameter expressions. If you want to make parameters rest, put "\*" before the parameter expressions. For example,
+
+ ##% f(?a) -> Fixnum
+ def f() end
+
+This can be read as "method f can take no argument or one argument, and in such cases f returns Fixnum." You can also use guard as optional.
+
+ ##% f(?String) -> Fixnum
+ def f() end
+
+This can be read as "method f can take no arugment or a kind of String, and in such cases f returns Fixnum."
+
+As same as optional, you can use rest parameter.
+
+ ##% f(*a) -> Fixnum
+ def f() end
+
+This can be read as "method f can take any arguments and returns Fixnum." Of couse rest parameters with guard is allowed.
+
+ ##% f(*String) -> Fixnum
+ def f() end
+
+If you don't want to write any arguments, just use "()".
+
+ ##% f() -> Fixnum
+ def f() end
+
+If a method call doesn't satisfy any type annotation of the method, RSense call tell the wrong call somehow. Currently, such wrong call will be printed out as warning into log.
+
+OK, continue to learn.
+
+By the way, do you know what is `a` in above examples? It is called *type variable* which can contain any types. Generally, it is used for two ways.
+
+1. Matching any types
+2. Keeping types
+
+In above examples, we just use it as (1) case. Now let's see (2) case.
+
+ ##% f(a) -> a
+ def f() end
+
+When we call `f(1)`, it returns `Fixnum` because type variable `a` contains `Fixnum` given by an argument. Strictly, we should write it as following by using type variable declaration.
+
+ ##% f<a>(a) -> a
+ def f() end
+
+However, in our system, it can be omitted as much as possible. So, when we use type variable declaration? The time to do more complex things.
+
+Consider a method which takes one arguments, which has to be a kind of String, and returns the argument. How can we write?
+
+ # Wrong
+ ##% f(a) -> a
+ def f(a) end
+ # Wrong
+ ##% f(String) -> String
+ def f(a) end
+
+Two examples are both wrong. First case can take any argument, second case can be return *a kind of String*. Now we have to type variable declaration with constraints. *Constraints* gives type variables limit of typing. It takes a form of `a <= b` which means type expression `a` is subclass of type expression `b`. In our system, constraints will be satified as much as possible. In other words, to satify constrains, type expressions will be interpreted as free. For example, `a <= String` constraint can be satisfied by adding `String` to type variable `a` if type varaible `a` has no types. If type variable `a` has types, RSense make sure that the constraint is satisfied by checking each type of type variable `a`. For another example, `a <= b` constraint can be satified by adding types of type variable `a` into type variable `b`.
+
+Now we can resolve the problem.
+
+ ##% f<a | a <= String>(a) -> a
+ def f(a) end
+
+"|" can be read as "where" which means starting of constraints. So this type annotation is correct and can be read as "method f takes one argument which is subclass of String and returns the argument."
+
+For more detail, you should read next secion.
+
+### Class Type Annotation ###
+
+By adding type annotation to class, class can be data-polymorphic. Think following code.
+
+ class C
+ def get() @x end
+ def set(x) @x = x end
+ end
+ a = C.new
+ a.set(1)
+ b = C.new
+ b.set('Hello')
+ b.get # What type of mine?
+
+The answer is `Fixnum` and `String`. Why? It is because of that non data-polymorphic objects shares their instance variables. Why shares instance variables? It is to achieve balance of preciseness and performance and based on hypothesis that programmers rarely use data-polymorphic. However, there is serious problem when we use `Array`, `Hash`, or something else container class.
+
+So, we adopt class type annotation to realize data-polymorphism restrictedly. When you want to create data-polymorphic class, write class type annotation with type variables. Specified type variables will be independent from each instances. That is, with class type annotation and method type annotation, you can realize data-polymorphic class.
+
+ ##% C<t>
+ class C
+ ##% get() -> t
+ def get() @x end
+ ##% set<v | v <= t>(v) -> v
+ def set(x) @x = x end
+ end
+
+First, with class type annotation, class `C` is declared as data-polymorphic class. Second, with method type annotation, method `get` returns type variable `t` of class `C`. Last, with method type annotation, method `set` adds a type of an argument into type variable `t` of class `C` and returns the argument. Now we can use this class correctly.
+
+ a = C.new # a = C<>
+ a.set(1) # a = C<Fixnum>
+ b = C.new # b = C<>
+ b.set('Hello') # b = C<String>
+ b.get # t = String (C<String>)
+
+Type variables of class will be *shared* in methods, included class, inherited class. That is, you should be careful to name type variables. Here are simple rules to name type variables.
+
+* a, b, c
+
+ Used in method type annotation
+
+* t, k, v
+
+ Used in class type annotation
+
+A reason why type variables will be shared is to keep implementation simple. Consider `Enumerable` module.
+
+ ##% Enumerable<t>
+ module Enumerable
+ ##% collect<v>() {t -> v} -> Array<v>
+ def collect() [yield self] end
+ ...
+ end
+ ##% Array<t>
+ class Array
+ include Enumerable
+ end
+
+
+Classes which includes `Enumerable` module will automatically export useful functions. If type variables will not be shared, we have to write all of methods in `Enumerable` module in `Array` class.
+
+Now we give you a lesson. See following code.
+
+ ##% Array<t>
+ class Array
+ ##% push<v | v <= Array<t> >(*v) -> self
+ def push(*obj) self end
+ ...
+ end
+
+This is `Array#push` method type annotation. How do you can read? If you can read it as "push can any arguments as an array and types of the array elements will be added to type variable `t` of class Array, and finally return self.", you are ready to write type annotation!
+
+### Stubs ###
+
+*Stub* is a collection of type annotation. Currently, they are located in `stubs/`. We are hard working to write stubs of builtin library and standard library by refering [Ruby documents](http://doc.okkez.net/187/view/). We welcome any contribution especially about stubs :)
+
+#### Builtin Library Status ####
+
+Mostly done.
+
+#### Standard Library Status ####
+
+**Status meanings**
+
+| Status | Meaning |
+|--------|--------------------------------------------------|
+| Blank | Nothing is started. |
+| - | No need to create a stub, but it should be done. |
+| = | No need to create a stub. |
+| Done | It has done, but a little work remains. |
+| OK | It has fully done. |
+
+| Name | Status |
+|------------------|:------:|
+| abbrev | = |
+| base64 | = |
+| benchmark | |
+| bigdecimal | Done |
+| cgi | Done |
+| cgi-lib | |
+| complex | = |
+| csv | |
+| curses | |
+| date | |
+| date2 | |
+| dbm | |
+| debug | |
+| delegate | |
+| digest | |
+| dl | |
+| drb | |
+| e2mmap | |
+| English | = |
+| Env | |
+| erb | |
+| eregex | |
+| etc | |
+| expect | |
+| fcntl | |
+| fileutils | - |
+| finalize | |
+| find | = |
+| forwardable | |
+| ftools | |
+| gdbm | |
+| generator | |
+| getoptlong | |
+| getopts | |
+| gserver | |
+| iconv | |
+| importenv | |
+| io/nonblock | |
+| io/wait | |
+| ipaddr | |
+| irb | |
+| jcode | |
+| kconv | |
+| logger | |
+| mailread | |
+| mathn | |
+| matrix | - |
+| md5 | |
+| mkmf | |
+| monitor | |
+| mutex_m | |
+| net/ftp | |
+| net/ftptls | |
+| net/http | |
+| net/https | |
+| net/imap | |
+| net/pop | |
+| net/protocol | |
+| net/smtp | |
+| net/telnet | |
+| net/telnets | |
+| nkf | |
+| observer | |
+| open3 | |
+| open-uri | |
+| openssl | |
+| optparse | Done |
+| ostruct | |
+| parsearg | |
+| parsedate | |
+| pathname | |
+| ping | |
+| pp | |
+| prettyprint | |
+| profile | |
+| profiler | |
+| pstore | |
+| pty | |
+| racc/parser | |
+| rational | OK |
+| rbconfig | |
+| readbytes | |
+| readline | |
+| resolv | |
+| resolv-replace | |
+| rexml | |
+| rinda/rinda | |
+| rinda/tuplespace | |
+| rss | |
+| rubyunit | |
+| scanf | - |
+| sdbm | |
+| securerandom | |
+| set | |
+| sha1 | |
+| shell | |
+| shellwords | |
+| singleton | |
+| soap | |
+| socket | |
+| stringio | OK |
+| strscan | |
+| sync | |
+| syslog | |
+| tempfile | |
+| test/unit | |
+| thread | |
+| thwait | |
+| time | |
+| timeout | |
+| tk | |
+| tmpdir | |
+| tracer | |
+| tsort | |
+| un | |
+| uri | |
+| weakref | |
+| webrick | |
+| win32/registry | |
+| win32/resolv | |
+| Win32API | |
+| win32ole | |
+| wsdl | |
+| xmlrpc | |
+| xsd | |
+| yaml | |
+| zlib | |
+
+Partial Update
+--------------
+
+A most important thing for RSense is speed. If users have to wait 10 senconds to do type inspection, it is finally a garbage. So, we have to keep RSense faster as much as possible. One of ways to make RSense faster is a technique called *partial update*. When RSense is requested to do code-completion or type-inference, RSense checks for AST cache. If there is AST cache, RSense analyzes an edit delta and apply updating to modified portion of the source code.
+
+Testing
+-------
+
+You can run test scripts easily:
+
+ % ant test
+
+### Writing Tests ###
+
+Test will be written as a rsense script file. See test scripts which are located in `test/script`. For example, if you want to write a new fixture, add the following code to `test/script/builtin.rsense`.
+
+ type-inference --test=NeedToTest? --should-be=Fixnum
+ 1_|_
+ EOF
+
+After that, do `ant test`. It's very easy.
+
+As we see, special options for testing are available on type-inference and code-completion command. `--test=` option names its fixture. `--should-be=` option verifies a result equals expected data. `--should-be-empty` option verifies a result is empty. `--should-contain=` option verifies a result contains expected data. `--should-not-contain` option verifies a result doesn't contain unexpected data.
+
+Source Tree
+-----------
+
+ rsense/
+ |- bin/ - Pseudo frontend and utilities
+ |- build_lib/ - Libraries needed to build RSense
+ |- doc/ - Documentation
+ |- etc/ - Other frontends and etc files
+ |- lib/ - Libraries needed to run
+ |- src/ - Real frontend source code
+ | |- org/cx4a/rsense/
+ | |- parser/ - Type annotation parser
+ | |- ruby/ - Pseudo ruby runtime
+ | |- typing/ - Type inference
+ | |- util/
+ |- stubs/ - Type annotation stubs
+ |- test/ - Test cases and test scripts
+
+Related Work and Keywords
+-------------------------
+
+CPA
+: Constraint based type inference algorithm.
+
+DCPA
+: Data-polymorphic CPA.
+
+[DDP](http://www.lexspoon.org/ti/)
+: Demand-drived type-inference algorithm.
+
+[Ecstatic](http://zianet.dk/blog/2007/06/19/my-thesis-type-inference-for-ruby/)
+: Static code checking tool and compiler for Ruby based on CPA.
+
+Starkiller
+: Static code checking tool and compiler for Python based on CPA.
+
+[Diamondback Ruby](http://www.cs.umd.edu/projects/PL/druby/)
+: Static code checking tool for Ruby based on constraint-based algorithm.
View
99 vendor/rsense-0.3/doc/index.ja.txt
@@ -0,0 +1,99 @@
+Title: RSense - EmacsやVimなどに特化したRubyのための優れた開発援助ツール
+CSS: style.css
+
+RSense
+======
+
+*EmacsやVimに特化した[Ruby][]のための優れた開発援助ツール*
+
+\[[English](index.txt)]
+
+* * * *
+
+{toc}
+
+* * * *
+
+RSenseとは?
+------------
+
+RSenseは[Emacs][]や[Vim][]などの高機能テキストエディタに特化した[Ruby][]のための開発援助ツールです。[UNIXの思想][UNIX philosophy]に従うことで高い透明性を実現し、ユーザーが簡単に学習・拡張・修正できるように設計されています。また、コピーレフトライセンス(GPLv3+)を採用することで、[自由なソフトウェア](http://www.gnu.org/philosophy/free-sw.html)であり続けることを保証しています。
+
+特徴
+----
+
+* コード補完(メソッド名補完など)
+* 型検査
+* 定義元ジャンプ
+
+将来的には以下の機能も利用可能になる予定です。
+
+* 静的コードチェック
+* 呼び出し元ジャンプ
+* リファクタリング
+
+スクリーンショット
+------------------
+
+![](rsense-emacs-2.png)
+![](rsense-vim.png)
+
+デモ
+----
+
+* [YouTube](http://www.youtube.com/watch?v=V-tpOJgugh4)
+* [Ogg Theora with video tag](demo.txt)
+
+ダウンロード
+------------
+
+### 最新安定板 (v0.3) ###
+
+[v0.3の変更点](changes-v0.3.ja.txt)
+
+* [rsense-0.3.tar.bz2](/pub/rsense/rsense-0.3.tar.bz2)
+* [rsense-0.3.zip](/pub/rsense/rsense-0.3.zip)
+
+### v0.2 ###
+
+* [rsense-0.2.tar.bz2](/pub/rsense/rsense-0.2.tar.bz2)
+* [rsense-0.2.zip](/pub/rsense/rsense-0.2.zip)
+
+ユーザーマニュアル
+------------------
+
+[RSenseユーザーマニュアル](manual.ja.txt)
+
+利用者の声
+----------
+
+利用者の声をぜひお聞かせください。あなたの名前(匿名希望可)とコメントをそえて[tomo@cx4a.org](mailto: tomo@cx4a.org)までメールでお願いします。どんなコメントでも歓迎です。
+
+ソースコード
+------------
+
+ソースコードは以下のGitリポジトリから取得できます。
+
+* <http://cx4a.org/repo/rsense.git>
+* <http://github.com/m2ym/rsense> (GitHubミラー)
+
+バグレポート
+------------
+
+[RSenseのバグトラッキングシステム](http://cx4a.org/redmine/projects/rsense)に新しいチケットを登録してください。
+
+ライセンス
+----------
+
+このソフトウェアは[GPLv3][]+のもとで配布されます。
+
+開発
+----
+
+どのような貢献も歓迎です。RSenseをハックしたい方はまず[開発ガイド](devel.txt)を読むことから始めるとよいでしょう。
+
+[Emacs]: http://www.gnu.org/software/emacs/
+[Vim]: http://www.vim.org/
+[Ruby]: http://www.ruby-lang.org/ "Ruby Programming Language"
+[UNIX philosophy]: http://en.wikipedia.org/wiki/Unix_philosophy
+[GPLv3]: http://gplv3.fsf.org/
View
99 vendor/rsense-0.3/doc/index.txt
@@ -0,0 +1,99 @@
+Title: RSense - A Ruby development tools for Emacs, Vim and others
+CSS: style.css
+
+RSense
+======
+
+*A [Ruby][] development tools for Emacs and Vim*
+
+\[[Japanese](index.ja.txt)]
+
+* * * *
+
+{toc}
+
+* * * *
+
+What is RSense?
+---------------
+
+RSense is a [Ruby][] development tools, which is specialized for high function text editors such as [Emacs][], [Vim][], etc. Following [UNIX philosophy][], RSense has a high transparency and is easy to learn, extend and fix for users. Adopting copyleft license, it also keeps being a [free software](http://www.gnu.org/philosophy/free-sw.html).
+
+Features
+--------
+
+* Code completion
+* Type inspection
+* Definition jump
+
+In the future, the following features will be available:
+
+* Static code checking
+* Caller jump
+* Refactoring
+
+Screenshots
+-----------
+
+![](rsense-emacs-2.png)
+![](rsense-vim.png)
+
+Demo
+----
+
+* [YouTube](http://www.youtube.com/watch?v=V-tpOJgugh4)
+* [Ogg Theora with video tag](demo.txt)
+
+Downloads
+---------
+
+### Latest Stable (v0.3) ###
+
+[Changes v0.3](changes-v0.3.txt)
+
+* [rsense-0.3.tar.bz2](/pub/rsense/rsense-0.3.tar.bz2)
+* [rsense-0.3.zip](/pub/rsense/rsense-0.3.zip)
+
+### v0.2 ###
+
+* [rsense-0.2.tar.bz2](/pub/rsense/rsense-0.2.tar.bz2)
+* [rsense-0.2.zip](/pub/rsense/rsense-0.2.zip)
+
+User Manual
+-----------
+
+[RSense User Manual](manual.txt)
+
+User's Voice
+------------
+
+Please send me a comment with your name (or anonymous) to [tomo@cx4a.org](mailto: tomo@cx4a.org) if you like it. Any comments are welcome.
+
+Source Code
+-----------
+
+Git repositories are available:
+
+* <http://cx4a.org/repo/rsense.git>
+* <http://github.com/m2ym/rsense> (GitHub mirror)
+
+Reporting Bugs
+--------------
+
+Visit [RSense Bug Tracking System](http://cx4a.org/redmine/projects/rsense) and create a new ticket.
+
+License
+-------
+
+This software is distributed under the term of [GPLv3][]+.
+
+Contribution
+------------
+
+We welcome any contribution. Read [development guide](devel.txt).
+
+[Emacs]: http://www.gnu.org/software/emacs/
+[Vim]: http://www.vim.org/
+[Ruby]: http://www.ruby-lang.org/ "Ruby Programming Language"
+[UNIX philosophy]: http://en.wikipedia.org/wiki/Unix_philosophy
+[GPLv3]: http://gplv3.fsf.org/
View
719 vendor/rsense-0.3/doc/manual.ja.txt
@@ -0,0 +1,719 @@
+Title: RSense - ユーザーマニュアル
+Numbering: yes
+CSS: style.css
+
+RSense ユーザーマニュアル
+=========================
+
+[Index](index.txt)
+
+\[[English](manual.txt)]
+
+* * *
+
+{toc}
+
+* * *
+
+はじめに
+--------
+
+### RSenseとは? ###
+
+RSenseは[Emacs][]や[Vim][]などの高機能テキストエディタに特化した[Ruby][]のための開発援助ツールです。[UNIXの思想][UNIX philosophy]に従うことで高い透明性を実現し、ユーザーが簡単に学習・拡張・修正できるように設計されています。また、コピーレフトライセンス(GPLv3+)を採用することで、自由なソフトウェアであり続けることを保証しています。
+
+### 特徴 ###
+
+* コード補完(メソッド名補完など)
+* 型検査
+* 定義元ジャンプ
+
+将来的には以下の機能も利用可能になる予定です。
+
+* 静的コードチェック
+* 呼び出し元ジャンプ
+* リファクタリング
+
+ダウンロード
+------------
+
+[RSenseのトップページ](index.ja.txt)からダウンロードできます。
+
+インストール
+------------
+
+### 要件 ###
+
+* Ruby 1.8.x
+* JRE 1.5 or later
+ * SunJDK or OpenJDK
+* エディタ
+ * Emacs
+ * Vim
+
+### Rubyのインストール ###
+
+[Ruby][]インタプリタをインストールする必要があります。
+
+UNIX系システムを使ってる場合、パッケージマネージャを使ってインストールしてください。例えばDebian GNU/Linuxでは次のようにインストールします。
+
+ apt-get install ruby
+
+Windowsではインストーラを使うのがよいでしょう。インストーラは[Rubyのダウンロードページ](http://www.ruby-lang.org/en/downloads/)から見つかります。RSenseは[Rumix][]を使ってテストしています。
+
+Rubyインタプリタを起動できるよう`PATH`環境変数を変更することを忘れないでください。大抵の場合はインストーラがやってくれます。
+
+インストール後はコマンドプロンプトからRubyインタプリタが起動できることを確認してください。
+
+ > ruby -v
+ ruby 1.8.7 (2009-12-24 patchlevel 248) [i386-mswin32]
+
+### JREのインストール ###
+
+Java Runtime Environment 1.5あるいはそれ以降のバージョンをインストールする必要があります。[SunJDK](http://java.sun.com/javase/downloads/index.jsp)と[OpenJDK](http://openjdk.java.net/)をサポートしています。例えばDebian GNU/Linuxでは次のようにインストールします。
+
+ $ apt-get install openjdk-6-jdk # or openjdk-6-jre
+
+### RSenseのインストール ###
+
+基本的にはパッケージディレクトリをどこかのディレクトリにコピーするだけでインストールできます。
+
+#### UNIX系システム ####
+
+パッケージディレクトリをどこかのディレクトリにコピーしてください。大抵は`~/opt`や`/opt`あるいは`/usr/lib`になるでしょう。
+
+ $ cp -av rsense-0.1 ~/opt
+
+本節以降は`RSENSE_HOME`環境変数を、ここでインストールしたディレクトリに読みかえてください。
+
+ $ echo $RSENSE_HOME
+ /home/tomo/opt/rsense-0.1
+
+インストール後は`bin/rsense`スクリプトが実行できることを確認してください。このスクリプトはサーバー/クライアントモデルの複雑さを隠蔽する役割を持っており、UNIX系システムでは`fork(2)`と`setsid(2)`を利用して必要な時に自動的にサーバーを起動するようになっています。そのためユーザーはサーバー/クライアントを特に意識することなく利用できます。
+
+ $ cd $RSENSE_HOME
+ $ chmod +x bin/rsense
+ $ bin/rsense version
+ RSense 0.1
+
+最後に`~/.rsense`という名前の設定ファイルを作成します。RSenseはこの設定ファイルを読み込み、`load-path`や`gem-path`といった変数を取得します。`etc/config.rb`スクリプトはRubyのランタイムから適切な`load-path`と`gem-path`を取得して、この設定ファイルを作ってくれます。
+
+ $ ruby etc/config.rb > ~/.rsense
+ $ cat ~/.rsense
+ home = /home/tomo/opt/rsense-0.1
+ load-path = /usr/local/lib/site_ruby/1.8:/usr/local/lib/site_ruby/1.8/x86_64-linux:/usr/local/lib/site_ruby:/usr/lib/ruby/vendor_ruby/1.8:/usr/lib/ruby/vendor_ruby/1.8/x86_64-linux:/usr/lib/ruby/vendor_ruby:/usr/lib/ruby/1.8:/usr/lib/ruby/1.8/x86_64-linux:.
+ gem-path = /home/tomo/.gem/ruby/1.8:/usr/lib/ruby/gems/1.8
+
+#### Windows ####
+
+パッケージディレクトリをどこかのディレクトリにコピーしてください。大抵の場合は`C:\\`あるいは`C:\\Program Files`になるでしょう。本節以降は`RSENSE_HOME`環境変数を、ここでインストールしたディレクトリに読みかえてください。
+
+ > echo %RSENSE_HOME%
+ C:\rsense-0.1
+ > cd %RSENSE_HOME%
+
+インストール後は`bin\rsense`スクリプトが実行できることを確認してください。このスクリプトはサーバー/クライアントモデルの複雑さを隠蔽する役割を持っています。ただし、UNIX系システムとは違ってWindowsでは自動的にサーバーを起動する有効な手段がないため、**ユーザーは手動でサーバーを起動する必要があります**。サーバーを起動するには二つの方法があり、一つはコマンドプロンプト内で`bin\rsense`に`server`コマンドを渡して起動する方法、もう一つはRSenseをWindowsサービスとして起動する方法です。**どちらの方法もRSenseの利用に先立ってサーバーあるいはサービスを起動しておく必要があります**。コマンドプロンプト内で起動する場合は次のコマンドを実行します。
+
+ > ruby bin\rsense server
+
+RSenseをWindowsサービスとして動作させるためにはまず、次のようにRubyGemsから`win32-service`をインストールする必要があります。インストールには`gem`プログラムが必要になりますが、大抵のRubyインストーラは同時に`gem`をインストールしてくれます。
+
+ > gem install win32-service
+
+次にRSenseをWindowsサービスとして登録します。この作業は最初に一度だけ行います。
+
+ > ruby bin\rsense service create
+
+サービスの削除は次のようにします。
+
+ > ruby bin\rsense service delete
+
+登録されたサービスを起動するには、「コントロールパネル」>「コンピュータの管理」>「サービス」からRSenseを選択し「起動」するか、次のコマンドを実行します。
+
+ > ruby bin\rsense service start
+ Service started
+
+`net`プログラムを利用することも可能です。
+
+ > net start RSense
+
+サービスを停止するには、同様に「サービス」からRSenseを選択し「停止」するか、次のコマンドを実行します。
+
+ > ruby bin\rsense service stop
+ Service stopped
+
+`net`プログラムを利用することも可能です。
+
+ > net stop RSense
+
+サービスの状態は次のように確認できます。
+
+ > ruby bin\rsense service status
+ Running
+
+サーバーはデフォルトでTCP/77367をリッスンします。サーバーを`ruby bin\rsense server`もしくはサービスで起動した後に、別のコマンドプロンプトからクライアントを実行してみましょう。
+
+ > ruby bin\rsense version
+ RSense 0.1
+
+正しく動作しているのが確認できると思います。最後に`%HOME%\\.rsense`という名前の設定ファイルを作成します。RSenseはこの設定ファイルを読み込み、`load-path`や`gem-path`といった変数を取得します。`HOME`環境変数の値は次のコマンドで見ることができます。
+
+ > echo %HOME%
+ %HOME%
+ > ruby -e "puts ENV['HOME']"
+ C:/Documents And Settings/tomo
+ > set HOME=C:\Documents And Settings\tomo
+
+`etc/config.rb`スクリプトはRubyのランタイムから適切な`load-path`と`gem-path`を取得して、この設定ファイルを作ってくれます。
+
+ > ruby etc\config.rb > %HOME%\.rsense
+ > type %HOME%\.rsense
+ home = C:/rsense
+ load-path = C:/rumix/ruby/lib/ruby/site_ruby/1.8;C:/rumix/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt;C:/rumix/ruby/lib/ruby/site_ruby;C:/rumix/ruby/lib/ruby/vendor_ruby/1.8;C:/rumix/ruby/lib/ruby/vendor_ruby/1.8/i386-msvcrt;C:/rumix/ruby/lib/ruby/vendor_ruby;C:/rumix/ruby/lib/ruby/1.8;C:/rumix/ruby/lib/ruby/1.8/i386-mswin32;.
+ gem-path = C:/rumix/ruby/lib/ruby/gems/1.8
+
+### Emacs拡張のインストール ###
+
+Emacs拡張は`etc/rsense.el`にあります。次のコードを`.emacs`に追加してください。
+
+ ;; $RSENSE_HOMEはRSenseをインストールしたディレクトリのフルパスに置き換えてください
+ (setq rsense-home "$RSENSE_HOME")
+ ;; UNIX系システムでの例
+ ;; (setq rsense-home "/home/tomo/opt/rsense-0.2")
+ ;; あるいは
+ ;; (setq rsense-home (expand-file-name "~/opt/rsense-0.2"))
+ ;; Windowsでの例
+ ;; (setq rsense-home "C:\\rsense-0.2")
+ (add-to-list 'load-path (concat rsense-home "/etc"))
+ (require 'rsense)
+
+`etc/rsense.el`を`load-path`の通ったディレクトリにコピーした場合は`add-to-list`による`load-path`の登録は必要ありません。
+
+[`auto-complete-mode`](http://cx4a.org/software/auto-complete/)と一緒に利用することも可能です。
+
+### Vimプラグインのインストール ###
+
+Vimプラグインは`etc/rsense.vim`にあります。`etc/rsense.vim`をプラグインディレクトリにコピーしてください。UNIX系システムなら
+
+ $ mkdir -p ~/.vim/plugin
+ $ cp etc/rsense.vim ~/.vim/plugin
+
+で、Windowsなら
+
+ > copy etc\rsense.vim "C:\Program Files\Vim\vim72\plugin"
+
+のようになるでしょう。詳しくは`help 'runtimepath'`を参照してください。
+
+最後に`.vimrc`に次のコードを書いてください。
+
+ ;; $RSENSE_HOMEはRSenseをインストールしたディレクトリに置き換えてください
+ let g:rsenseHome = "$RSENSE_HOME"
+
+使い方
+------
+
+**Windowsの場合、はじめにサーバーを起動しておく必要があります**。詳しくは[インストール](#Windows)を参照してください。
+
+### Emacs ###
+
+まず最初に、`M-x rsense-version`でバージョン情報が表示されることを動作していることを確認してください。何も出力がない場合は、おそらく正しく動作していません。[トラブルシューティング](#)を参照してください。
+
+#### コード補完 #### {#Code_Completion_in_Emacs}
+
+`.`あるいは`::`の直後に`M-x rsense-complete`でメソッド名や定数名を補完できます。
+
+![](rsense-emacs-1.png)
+
+次のようにキーバインドを設定するとよいかもしれません。
+
+ ;; C-c .で補完
+ (add-hook 'ruby-mode-hook
+ (lambda ()
+ (local-set-key (kbd "C-c .") 'rsense-complete)))
+
+`auto-complete-mode`を利用している場合、`M-x ac-complete-rsense`でも補完できます。
+
+![](rsense-emacs-2.png)
+
+次のようにキーバインドを設定するとよいかもしれません。
+
+ ;; C-c .で補完
+ (add-hook 'ruby-mode-hook
+ (lambda ()
+ (local-set-key (kbd "C-c .") 'ac-complete-rsense)))
+
+`.`や`::`を入力した直後に自動的に補完を開始したいなら、`ac-sources`に`ac-source-rsense-method`と`ac-source-rsense-contant`を追加してください。
+
+ (add-hook 'ruby-mode-hook
+ (lambda ()
+ (add-to-list 'ac-sources 'ac-source-rsense-method)
+ (add-to-list 'ac-sources 'ac-source-rsense-constant)))
+
+#### 型ヘルプ #### {#Type_Help_in_Emacs}
+
+`M-x rsense-type-help`でポイントしている式の型を見ることができます。
+
+![](rsense-emacs-3.png)
+
+`popup.el`がない場合はミニバッファに表示されます。
+
+#### 定義元ジャンプ #### {#Definition_Jump_in_Emacs}
+
+`M-x rsense-jump-to-definition`でポイントしているメソッドや定数の定義元にジャンプすることができます。
+
+#### Where Is #### {#Where_Is_in_Emacs}
+
+`M-x rsense-where-is`で編集しているクラスやメソッドの名前を確認することができます。自分が今どこを編集しているか確認するのに便利でしょう。
+
+#### その他のコマンド #### {#Other_Commands_in_Emacs}
+
+他にもプロジェクトやRSenseを操作するコマンドがあります。
+
+`rsense-version`
+: RSenseのバージョンを表示します。
+
+`rsense-open-project`
+: 指定されたディレクトリでプロジェクトを開きます。
+
+`rsense-close-project`
+: 指定された名前のプロジェクトを閉じます。
+
+`rsense-service-start`
+: Windowsサービスを起動します。
+
+`rsense-service-stop`
+: Windowsサービスを停止します。
+
+`rsense-service-status`
+: Windowsサービスの状態を表示します。
+
+`rsense-clear`
+: 現在の環境をクリアします。
+
+`rsense-exit`
+: RSenseサーバーを終了します。
+
+### Vim ###
+
+まず最初に、`:RSenseVersion`でバージョン情報が表示されることを確認してください。何も出力がない場合は、おそらく正しく動作していません。[トラブルシューティング](#)を参照してください。
+
+#### コード補完 #### {#Code_Completion_in_Vim}
+
+`.`あるいは`::`の直後に`^X ^U`でメソッド名や定数名を補完できます。
+
+![](rsense-vim.png)
+
+自動的に補完するには次のコードを`.vimrc`に書いてVimを再起動してください。
+
+ let g:rsenseUseOmniFunc = 1
+
+`autocomplpop.vim`や関連するプラグインを利用していない場合は、自動的に補完されないので`^X ^O`でオムニ補完を開始してください。
+
+#### 型ヘルプ #### {#Type_Help_in_Vim}
+
+`:RSenseTypeHelp`でポイントしている式の型を見ることができます。
+
+#### 定義元ジャンプ #### {#Definition_Jump_in_Vim}
+
+`:RSenseJumpToDefinition`でポイントしているメソッドや定数の定義元にジャンプすることができます。
+
+#### Where Is #### {#Where_Is_in_Vim}
+
+`:RSenseWhereIs`で編集しているクラスやメソッドの名前を確認することができます。自分が今どこを編集しているか確認するのに便利でしょう。
+
+#### その他のコマンド #### {#Other_Commands_in_Vim}
+
+他にもプロジェクトやRSenseを操作するコマンドがあります。
+
+`:RSenseVersion`
+: RSenseのバージョンを表示します。
+
+`:RSenseOpenProject`
+: 指定されたディレクトリでプロジェクトを開きます。
+
+`:RSenseCloseProject`
+: 指定された名前のプロジェクトを閉じます。
+
+`:RSenseServiceStart`
+: Windowsサービスを起動します。
+
+`:RSenseServiceStop`
+: Windowsサービスを停止します。
+
+`:RSenseServiceStatus`
+: Windowsサービスの状態を表示します。
+
+`:RSenseClear`
+: 現在の環境をクリアします。
+
+`:RSenseExit`
+: RSenseサーバーを終了します。
+
+### コマンドラインインターフェース ###
+
+RSenseはCLI(command line interface)としてターミナルから使うこともできます。CLIには二つのフロントエンドが存在します。一つは[プリミティブフロントエンド](#)と呼ばれ、コマンドごとにRSenseのプロセスを起動します。もう一つは[ラッパーフロントエンド](#)と呼ばれ、RSenseのプロセスを隠蔽してくれます。つまりラッパーフロントエンドではサーバー/クライアントモデルや初期化時間を気にする必要がないのです。通常はラッパーフロントエンドを利用します。
+
+本節以降のコードはUNIX系システムでのみ有効です。
+
+#### プリミティブフロントエンド ####
+
+プリミティブフロントエンドの主たるコンポーネントは`lib/rsense.jar`です。つまりプリミティブフロントエンドを使うには次のように`java`コマンドで起動しなくてはなりません。
+
+ $ java -cp lib/jruby.jar:lib/antlr-runtime-3.2.jar:lib/rsense.jar org.cx4a.rsense.Main command option...
+
+言うまでもありませんが、クラスパスの設定は必須です。面倒くさいですか?私も面倒xです。とにかくプリミティブフロントエンドで使えるコマンドとオプションを以下に列挙します。
+
+##### `code-completion`コマンド #####
+
+このコマンドは指定されたファイルの指定された場所でコード補完を行います。ファイルは`--file=`オプションで指定し、場所は`--location=`オプションで指定します。`--location=`オプションは次のどれかです。
+
+* ファイルの先頭からのオフセット(ゼロベース)
+* "行:カラム"フォーマット(ワンベース)
+* マーク
+
+例えば、`--location=123`はファイルの先頭から123にあるコード補完を意味し、`--location=10:8`は10行目の8カラム目でのコード補完を意味し、`--location=_|_`はファイルで始めに`_|_`が見つかる場所でのコード補完を意味します。`--location=`オプションが省略された場合は`--location=_|_`が使われます。
+
+オフセットやカラム番号の単位はバイトではなく文字です。ソースコードが非ASCII文字を含む場合は、`--encoding=`オプションで正しいエンコーディンを与える必要があるでしょう。利用可能なエンコーディングについては[Java Supported Encodings][]を参照してください。
+
+処理結果の各行は`completion: <name> <qualified-name> <base-name> <kind>`という形式をとります。`<kind>`は`CLASS`, `MODULE`, `CONSTANT`, `METHOD`のいずれかです。
+
+**例:**
+
+クラスパスオプションは省略されています。
+
+ $ cat test1.rb
+ 1
+ $ java -cp ... org.cx4a.rsense.Main code-completion --file=test1.rb --location=1
+ completion: succ Integer#succ Integer METHOD
+ ...
+ $ java -cp ... org.cx4a.rsense.Main code-completion --file=test1.rb --location=1:1
+ completion: succ Integer#succ Integer METHOD
+ ...
+ $ cat test2.rb
+ 1_|_
+ $ java -cp ... org.cx4a.rsense.Main code-completion --file=test1.rb --location=_|_
+ completion: succ Integer#succ Integer METHOD
+ ...
+
+##### `type-inference`コマンド #####
+
+[`code-completion`コマンド](#)と同じですが、式の型を出力するところが違います。`code-completion`コマンドで利用可能なオプションは、このコマンドでも利用可能です。
+
+**例:**
+
+ $ cat test1.rb
+ 1
+ $ java -cp ... org.cx4a.rsense.Main type-inference --file=test1.rb --location=1
+ type: Fixnum
+ $ java -cp ... org.cx4a.rsense.Main type-inference --file=test1.rb --location=1:1
+ type: Fixnum
+ $ cat test2.rb
+ 1_|_
+ $ java -cp ... org.cx4a.rsense.Main type-inference --file=test1.rb --location=_|_
+ type: Fixnum
+
+##### `find-definition`コマンド #####
+
+このコマンドは`--file=`オプションと`--location=`オプションで指示されたメソッド呼び出しや定数参照の定義元を検索して出力します。出力結果は`location: <line> <filename>`という形式になります。
+
+**例:**
+
+ $ cat test.rb
+ class C
+ def f() end
+ end
+ class D
+ def f() end
+ end
+ D.new.f_|_
+ $ java -cp ... org.cx4a.rsense.Main find-definition --file=test.rb
+ location: 5 test.rb
+
+##### `where`コマンド #####
+
+このコマンドは`--file=`オプションと`--line`オプションで指定された場所の直近のクラス名やメソッド名を出力します。出力結果は`Array`や`String#split`のように修飾された名前になります。
+
+**例:**
+
+ $ cat test.rb
+ class C
+ def f
+ 1
+ end
+ end
+ $ java -cp ... org.cx4a.rsense.Main where --file=test.rb --line=3
+ name: C#f
+
+##### `load`コマンド #####
+
+指定されたファイルを読み込みます。
+
+**例:**
+
+ $ java -cp ... org.cx4a.rsense.Main load --file=test1.rb
+
+##### `script`コマンド #####
+
+このコマンドは一連のコマンドを何度も実行するのに便利です。スクリプトファイルが与えられない場合は標準入力からコマンドを読み込みます。各コマンドの終了は`--end-mark=`で指定されたマークで検出されます。`--end-mark=`オプションが省略された場合は、`--end-mark=EOF`が使われます。
+
+このコマンドではいくつかの特別なコマンドが使えます。`exit`あるいは`quit`コマンドはRSenseを直ちに終了します。
+
+**例:**
+
+ $ java -cp ... org.cx4a.rsense.Main script
+ > type-inference
+ 1_|_
+ EOF
+ type: Fixnum
+ > code-completion
+ 1_|_
+ EOF
+ completion: succ Integer#succ Integer METHOD
+ ...
+ ^D
+ $ cat test.rsense
+ type-inference --test=Foo --should-be=Fixnum
+ 1_|_
+ EOF
+
+ type-inference --test=Bar --should-be=String
+ 'Hello'_|_
+ EOF
+ $ java -cp ... org.cx4a.rsense.Main script test.rsense
+ Foo... [OK]
+ Bar... [OK]
+ test: count=2, success=2, failure=0
+
+##### `clear`コマンド #####
+
+現在の環境をクリアします。このコマンドは主にスクリプトで利用します。
+
+##### `list-project`コマンド #####
+
+現在開いているプロジェクトを一覧します。`--verbose`オプションが与えられた場合はプロジェクトの詳細も出力します。[プロジェクト](#)も参照してください。
+
+##### `open-project`コマンド #####
+
+指定されたディレクトリのプロジェクトを開きます。[プロジェクト](#)も参照してください。
+
+##### `close-project`コマンド #####
+
+指定された名前のプロジェクトを閉じます。[プロジェクト](#)も参照してください。
+
+##### `environment`コマンド #####
+
+現在のRSenseの環境を出力します。
+
+##### `help`コマンド #####
+
+ヘルプを表示します。
+
+##### `version`バージョン #####
+
+バージョンを表示します。
+
+##### `--home`オプション #####
+
+RSenseのホームディレクトリを指定します。`~/.rsense`がある場合は、指定する必要はないでしょう。
+
+##### `--debug`オプション #####
+
+デバッグ用メッセージを表示するためのオプションです。
+
+##### `--log=`オプション #####
+
+ログを出力するファイルを指定します。
+
+##### `--progress=`オプション #####
+
+コマンドの進捗状況を出力します。値が省略された場合は、進捗イベントを受けとるたびに即座に出力します。整数を指定すると、その秒数だけ遅延したのちに出力します。
+
+##### `--format=`オプション #####
+
+出力の形式を指定します。`emacs`と`plain`が利用できます。デフォルトは`plain`です。
+
+##### `--verbose`オプション #####
+
+詳細な出力を行います。
+
+##### `--time`オプション #####
+
+コマンドの実行にかかった時間を出力します。
+
+##### `--encoding=`オプション #####
+
+ファイルのエンコーディングを指定します。エンコーディング文字列は[Java Supported Encodings][]のどれかである必要があります。このオプションが省略された場合は、`--encoding=UTF-8`が使われます。
+
+##### `--load-path=`オプション #####
+
+追加の`load-path`を指定します。
+
+##### `--gem-path=`オプション #####
+
+追加の`gem-path`を指定します。
+
+##### `--config=`オプション #####
+
+指定された設定ファイルを読み込みます。[設定ファイル](#Configuration_File)を参照してください。
+
+##### `--project=`オプション #####
+
+プロジェクトを指定します。RSenseはそのプロジェクトの環境(`load-path`や`gem-path`)でコマンドを処理します。[プロジェクト](#)も参照してください。
+
+##### `--detect-project=`オプション #####
+
+RSenseは`--file`オプションあるいはこのオプションで指定されたファイルからプロジェクトを検出して、コマンドの処理に利用します。[プロジェクト](#)も参照してください。
+
+#### ラッパーフロントエンド ####
+
+`bin/rsense`はサーバー/クライアントモデルの複雑さを隠蔽するためのラッパーフロントエンドです。初期化時間なしで`rsense.jar`と同じように使えます。`bin/rsense`は自動的にプリミティブフロントエンドをバックグラウンドデーモン(サーバー)として起動し、そのデーモンと通信しながら処理を行います[^1]。
+
+[^1]: Windowsの場合はあらかじめサーバーを起動しておく必要があります
+
+利用可能なコマンドはプリミティブフロントエンドと大体同じです。
+
+**例:**
+
+ $ bin/rsense version
+ RSense 0.0.1
+ $ cat test1.rb
+ def f() 1 end
+ $ bin/rsense type-inference --file=test1.rb # define f()
+ $ cat test2.rb
+ f_|_
+ $ bin/rsense type-inference --file=test2.rb # use f()
+ type: Fixnum
+
+設定ファイル
+------------
+
+CLIフロントエンドに設定ファイルを指定することができます。設定ファイルは一連のオプションを列挙したものです。例えば
+
+ $ bin/rsense type-inference --debug --log=/tmp/rsense.log --format=emacs --encoding=UTF-8 --load-path=lib --file=a.rb --location=1
+
+は、次と同等です。
+
+ $ cat config
+ debug
+ log = /tmp/rsense.log
+ format = emacs
+ encoding = UTF-8
+ load-path = lib
+ $ bin/rsense --config=config --file=a.rb --location=1
+
+[ラッパーフロントエンド](#)は`~/.rsense`を特別に読み込みます。このファイルは[インストール](#)時に作成したものです。
+
+プロジェクト
+------------
+
+RSenseは正しい`load-path`を取得するためにプロジェクト管理を行います。各プロジェクトは次のような`.rsense`という設定ファイルをプロジェクトのルートディレクトリに持っておくべきです。
+
+ name = MyProject
+ load-path = lib
+
+`--project`オプションが与えられた場合(上のケースなら`--project=MyProject`)、RSenseは設定ファイルに記述された`load-path`を使ってそのコマンドを処理します。`--detect-project`オプションが与えられた場合は、`.rsense`ファイルを探して自動的にプロジェクトを検出します。
+
+RSenseは`load-path`とプロジェクト名の以上のことに関してはなにもケアしません。とてもシンプルです。
+
+Rubyリファレンスマニュアル
+--------------------------
+
+この節ではRubyリファレンスマニュアル(略してrefm)をRSenseから使う方法を説明します。
+
+まず<http://www.ruby-lang.org/ja/man/archive/>から最新のスナップショットをダウンロードしてください。次にアーカイブを展開して、例えば`~/src/rurema`にコピーしてください。
+
+ $ cd ~/tmp
+ $ wget http://www.ruby-lang.org/ja/man/archive/snapshot/ruby-refm-1.9.1-dynamic-snapshot.tar.bz2
+ $ tar xjf ruby-refm-1.9.1-dynamic-snapshot.tar.bz2
+ $ mv ruby-refm-1.9.1-dynamic-snapshot ~/src/rurema
+
+最後に次のコードを`.emacs`に書いてください。
+
+ (setq rsense-rurema-home "~/src/rurema")
+
+補完ヘルプは自動的に表示されます。現在のところ補完ヘルプはEmacsでのみ対応しています。
+
+制限事項
+--------
+
+現在のところ以下が未対応となっています。
+
+* `eval`
+* ブロックなしでの`proc`と`lambda`
+* `callcc`
+* `raise`と`rescue`のフロー解析
+* `Struct`
+* 多くの標準ライブラリ([ステータス](devel.txt#Standard_Library_Status))
+* 大きいプロジェクト
+* 構文エラー時の補完
+
+トラブルシューティング
+----------------------
+
+チェックリスト:
+
+* サーバーあるいはサービスが起動しているか
+* Rubyインタプリタが実行可能か
+* Javaプログラムが実行可能か
+* プリミティブフロントエンドが正しく動作するか
+
+ UNIX系システム:
+ ~~~~
+ $ java -cp lib/jruby.jar:lib/antlr-runtime-3.2.jar:lib/rsense.jar org.cx4a.rsense.Main version
+ RSense 0.1
+ ~~~~
+
+ Windows:
+ ~~~~
+ > java -cp lib\jruby.jar:lib\antlr-runtime-3.2.jar:lib\rsense.jar org.cx4a.rsense.Main version
+ RSense 0.1
+ ~~~~
+
+* ラッパーフロントエンドが正しく動作するか
+
+ UNIX系システム:
+ ~~~~
+ $ bin/rsense server
+ ...
+ ^C
+ $ bin/rsenes version
+ RSense 0.1
+ ~~~~
+
+ Windows:
+ ~~~~
+ > ruby bin\rsense server
+ ...
+ ^C
+ > ruby bin\rsense version
+ RSense 0.1
+ ~~~~
+
+* EmacsやVimの設定は正しいか
+
+ Emacsにおける`rsense-home`やVimにおける`g:rsenseHome`は**フルパス**である必要があります。例えば、
+ ~~~~
+ (setq rsense-home "~/opt/rsense-0.2")
+ ~~~~
+ という記述は認められていません。`expand-file-name`でフルパスに展開するか、フルパスをハードコードしてください。
+ ~~~~
+ (setq rsense-home (expand-file-name "~/opt/rsense-0.2"))
+ ;; あるいは
+ (setq rsense-home "/home/tomo/opt/rsense-0.2")
+ ~~~~
+
+チェックリストに問題がない場合は、RSenseの`java`と`ruby`のプロセスをキルし、pidファイルを削除したのち、最後試してください。pidファイルはUNIX系システムの場合は`$RSENSE_HOME/rsense-pid`あるいは`/tmp/rsense-pid`、Windowsの場合は`%RSENSE_HOME%\rsense-pid`にあります。
+
+それでも問題が解決できない場合は開発者に連絡してください。
+
+バグレポート
+------------
+
+[RSenseのバグトラッキングシステム](http://cx4a.org/redmine/projects/rsense)に新しいチケットを登録してください。
+
+[Emacs]: http://www.gnu.org/software/emacs/
+[Vim]: http://www.vim.org/
+[Ruby]: http://www.ruby-lang.org/ "Ruby Programming Language"
+[Rumix]: http://ruby.morphball.net/rumix/
+[UNIX philosophy]: http://en.wikipedia.org/wiki/Unix_philosophy
+[Java Supported Encodings]: http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html
View
719 vendor/rsense-0.3/doc/manual.txt
@@ -0,0 +1,719 @@
+Title: RSense - User Manual
+Numbering: yes
+CSS: style.css
+
+RSense User Manual
+==================
+
+[Index](index.txt)
+
+\[[Japanese](manual.ja.txt)]
+
+* * *
+
+{toc}
+
+* * *
+
+Introduction
+------------
+
+### What is RSense? ###
+
+RSense is a [Ruby][] development tools, which is specialized for high function text editors such as [Emacs][], [Vim][], etc. Following [UNIX philosophy][], RSense has a high transparency and is easy to learn, extend and fix for users. Adopting copyleft license, it also keeps being a [free software](http://www.gnu.org/philosophy/free-sw.html).
+
+### Features ###
+
+* Code completion
+* Type inspection
+* Definition jump
+
+In the future, the following features will be available:
+
+* Static code checking
+* Caller jump
+* Refactoring
+
+Downloads
+---------
+
+You can download from [RSense top page](index.txt).
+
+Installation
+------------
+
+### Requirements ###
+
+* Ruby 1.8.x
+* JRE 1.5 or later
+ * SunJDK or OpenJDK
+* Editors
+ * Emacs
+ * Vim
+
+### Install Ruby ###
+
+You need to install [Ruby][] interpreter.
+
+For UNIX-like systems, use package manager. In Debian GNU/Linux, for example:
+
+ apt-get install ruby
+
+For Windows, you can find several installers from [Ruby downloads page](http://www.ruby-lang.org/en/downloads/). We use [Rumix](http://ruby.morphball.net/rumix/) for testing.
+
+Remember to change `PATH` environment variable for Ruby interpreter to be executable. Probably the installers do it automatically.
+
+After installation, make sure that Ruby interpreter can be executed from command prompt:
+
+ > ruby -v
+ ruby 1.8.7 (2009-12-24 patchlevel 248) [i386-mswin32]
+
+### Install JRE ###
+
+You need to install Java Runtime Environment 1.5 or later. [SunJDK](http://java.sun.com/javase/downloads/index.jsp) and [OpenJDK](http://openjdk.java.net/) are supported. In Debian GNU/Linux, for example, you can install like:
+
+ $ apt-get install openjdk-6-jdk # or openjdk-6-jre
+
+### Install RSense ###
+
+Basically, You just copy a package directory to some directory.
+
+#### UNIX-like Systems ####
+
+You may copy the package directory to `~/opt`, `/opt` or `/usr/lib`.
+
+ $ cp -av rsense-0.1 ~/opt
+
+For later sections, `RSENSE_HOME` environment variable should be read as a directory where RSense was installed.
+
+ $ echo $RSENSE_HOME
+ /home/tomo/opt/rsense-0.1
+
+After installation, make sure that you can execute `bin/rsnese` script. This script has a role hiding a complexity about server/client model and executes server on demand automatically by using `fork(2)` and `setsid(2)` in UNIX-like systems. So there is no need to care about server/client model for users.
+
+ $ cd $RSENSE_HOME
+ $ chmod +x bin/rsense
+ $ bin/rsense version
+ RSense 0.1
+
+Finally create a config file named `~/.rsense` that tells RSense `load-path` and `gem-path` of Ruby runtime. A script located at `etc/config.rb` creates a preferred config file automatically:
+
+ $ ruby etc/config.rb > ~/.rsense
+ $ cat ~/.rsense
+ home = /home/tomo/opt/rsense-0.1
+ load-path = /usr/local/lib/site_ruby/1.8:/usr/local/lib/site_ruby/1.8/x86_64-linux:/usr/local/lib/site_ruby:/usr/lib/ruby/vendor_ruby/1.8:/usr/lib/ruby/vendor_ruby/1.8/x86_64-linux:/usr/lib/ruby/vendor_ruby:/usr/lib/ruby/1.8:/usr/lib/ruby/1.8/x86_64-linux:.
+ gem-path = /home/tomo/.gem/ruby/1.8:/usr/lib/ruby/gems/1.8
+
+#### Windows ####
+
+You may copy the package directory to `C:\\` or `C:\\Program Files`. For later secions, `RSENSE_HOME` environment variable should be read as a directory where RSense was installed.
+
+ > echo %RSENSE_HOME%
+ C:\rsense-0.1
+ > echo %RSENSE_HOME%
+
+After installation, make sure that you can execute `bin\rsense` script, which hides a complexity about server/client model. Unlike UNIX-like systems, Windows doesn't have effective ways to execute server in background automatically, so **users need to execute server manually**. There are two ways to execute server. One is to execute `bin\rsense` with passing `server` command in command prompt and another is to execute as Windows service. **You need to execute server before using RSense in both case**. To execute in command prompt, execute the folloing command:
+
+ > ruby bin\rsense server
+
+To execute as Windows service, first of all, you need to install `win32-service` from RubyGems as following. `gem` program must be installed, but almost installers install `gem` program automatically.
+
+ > gem install win32-service
+
+Then, register RSense as a Windows service.
+
+ > ruby bin\rsense service create
+
+To delete service, do
+
+ > ruby bin\rsense service delete
+
+To start the service, click "Start" label in "Services" or do
+
+ > ruby bin\rsense service start
+ Service started
+
+You can also use `net` program.
+
+ > net start RSense
+
+To stop the service, clik "Stop" label in "Services" or do
+
+ > ruby bin\rsense service stop
+ Service stopped
+
+You can also use `net` program.
+
+ > net stop RSense
+
+To see service status, do
+
+ > ruby bin\rsense service status
+ Running
+
+Server will be listening to TCP/77367 by default. Then run client in another command prompt:
+
+ > ruby bin\rsense version
+ RSense 0.1
+
+You may find it is correctly running. Finally create a config file named `%HOME%\\.rsense` that tells RSense `load-path` and `gem-path` of Ruby runtime. If you don't set `HOME` environment variable, you can see its default value and set by:
+
+ > echo %HOME%
+ %HOME%
+ > ruby -e "puts ENV['HOME']"
+ C:/Documents And Settings/tomo
+ > set HOME=C:\Documents And Settings\tomo
+
+A script located at `etc\config.rb` creates a preferred config file automatically:
+
+ > ruby etc\config.rb > %HOME%\.rsense
+ > type %HOME%\.rsense
+ home = C:/rsense
+ load-path = C:/rumix/ruby/lib/ruby/site_ruby/1.8;C:/rumix/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt;C:/rumix/ruby/lib/ruby/site_ruby;C:/rumix/ruby/lib/ruby/vendor_ruby/1.8;C:/rumix/ruby/lib/ruby/vendor_ruby/1.8/i386-msvcrt;C:/rumix/ruby/lib/ruby/vendor_ruby;C:/rumix/ruby/lib/ruby/1.8;C:/rumix/ruby/lib/ruby/1.8/i386-mswin32;.
+ gem-path = C:/rumix/ruby/lib/ruby/gems/1.8
+
+### Install Emacs Extension ###
+
+An Emacs extension for RSense is found at `etc/rsense.el`. Add the following code to `.emacs`:
+
+ ;; Replace $RSENSE_HOME with the directory where RSense was installed in full path
+ ;; Example for UNIX-like systems
+ ;; (setq rsense-home "/home/tomo/opt/rsense-0.2")
+ ;; or
+ ;; (setq rsense-home (expand-file-name "~/opt/rsense-0.2"))
+ ;; Example for Windows
+ ;; (setq rsense-home "C:\\rsense-0.2")
+ (setq rsense-home "$RSENSE_HOME")
+ (add-to-list 'load-path (concat rsense-home "/etc"))
+ (require 'rsense)
+
+There is no need to setup `load-path` with `add-to-list` if you copy `etc/rsense.el` to `load-path` directories.
+
+You also need to install [`auto-complete-mode`](http://cx4a.org/software/auto-complete/) if you want to use with `aut-complete-mode`. See documentation for how to install.
+
+### Install Vim Plugin ###
+
+An Vim plugin for RSense is found at `etc/rsense.vim`. Just copy `etc/rsense.vim` to your plugins directory. For UNIX-like systems:
+
+ $ mkdir -p ~/.vim/plugin
+ $ cp etc/rsense.vim ~/.vim/plugin
+
+For Windows:
+
+ > copy etc\rsense.vim "C:\Program Files\Vim\vim72\plugin"
+
+See `help 'runtimepath'` for more detail.
+
+Then write the following code to `.vimrc`:
+
+ ;; Replace $RSENSE_HOME with the directory where RSense was installed
+ let g:rsenseHome = "$RSENSE_HOME"
+
+Usage
+-----
+
+**For Windows, you have to run server before anytime you use client**, as we said. See [installation](#Windows) section for details.
+
+### Emacs ###
+
+First of all, you should make sure that you can see RSense version information by `M-x rsense-version`. If you see nothing, there is a problem probably. See [trouble shooting](#Trouble_Shooting).
+
+#### Code Completion #### {#Code_Completion_in_Emacs}
+
+You can complete method name and constant name by `M-x rsense-complete` after `.` and `::`.
+
+![](rsense-emacs-1.png)
+
+You may like to bind some key like:
+
+ ;; Complete by C-c .
+ (add-hook 'ruby-mode-hook
+ (lambda ()
+ (local-set-key (kbd "C-c .") 'rsense-complete)))
+
+If you have `auto-complete-mode`, you can also complete method name and constant name by `M-x ac-complete-rsense`.
+
+![](rsense-emacs-2.png)
+
+You may like to bind some key like:
+
+ ;; Complete by C-c .
+ (add-hook 'ruby-mode-hook
+ (lambda ()
+ (local-set-key (kbd "C-c .") 'ac-complete-rsense)))
+
+If you want to start completion automatically after inserting `.` and `::`, add `ac-source-rsense-method` and `ac-source-rsense-constant` to `ac-sources`. This is called omni completion.
+
+ (add-hook 'ruby-mode-hook
+ (lambda ()
+ (add-to-list 'ac-sources 'ac-source-rsense-method)
+ (add-to-list 'ac-sources 'ac-source-rsense-constant)))
+
+#### Type Help #### {#Type_Help_in_Emacs}
+
+You can infer types of an expression at point by `M-x rsense-type-help`
+
+![](rsense-emacs-3.png)
+
+If you don't have `popup.el`, it shows types in minibuffer.
+
+#### Definition Jump #### {#Definition_Jump_in_Emacs}
+
+You can jump to definition of a method or a constant you are pointing at by `M-x rsense-jump-to-definition`.
+
+#### Where Is #### {#Where_Is_in_Emacs}
+
+You can find which class/method you are editing by `M-x rsense-where-is`.
+
+#### Other Commands #### {#Other_Commands_in_Emacs}
+
+There are other commands operating a project and RSense itself.
+
+`rsense-version`
+: See RSense version.
+
+`rsense-open-project`
+: Open a project of specified directory.
+
+`rsense-close-project`
+: Close currently opened project.
+
+`rsense-service-start`
+: Start Windows service.
+
+`rsense-service-stop`
+: STop Windows service.
+
+`rsense-service-status`
+: Show Windows service status.
+
+`rsense-clear`
+: Clear current environment.
+
+`rsense-exit`
+: Exit RSense server.
+
+### Vim ###
+
+First of all, you should make sure that you can see RSense version information by `:RSenseVersion`. If you see nothing, there is a problem probably. See [trouble shooting](#Trouble_Shooting).
+
+#### Code Completion #### {#Code_Completion_in_Vim}
+
+You can complete method name and constant name by `^X ^U` after `.` and `::`.
+
+![](rsense-vim.png)
+
+If you want to start completion automatically, add the following code to `.vimrc` and restart Vim.
+
+ let g:rsenseUseOmniFunc = 1
+
+If you don't use `autocomplpop.vim` or related plugins, you need to type `^X ^O` to start omni completion.
+
+#### Type Help #### {#Type_Help_in_Vim}
+
+You can infer types of an expression at point by `:RSenseTypeHelp`.
+
+#### Definition Jump #### {#Definition_Jump_in_Vim}
+
+You can jump to definition of a method or a constant you are pointing at by `:RSenseJumpToDefinition`.
+
+#### Where Is #### {#Where_Is_in_Vim}
+
+You can find which class/method you are editing by `:RSenseWhereIs`.
+
+#### Other Commands #### {#Other_Commands_in_Vim}
+
+There are other commands operating a project and RSense itself.
+
+`:RSenseVersion`
+: See RSense version.
+
+`:RSenseOpenProject`
+: Open a project of specified directory.
+
+`:RSenseCloseProject`
+: Close currently opened project.
+
+`:RSenseServiceStart`
+: Start Windows service.
+
+`:RSenseServiceStop`
+: STop Windows service.
+
+`:RSenseServiceStatus`
+: Show Windows service status.
+
+`:RSenseClear`
+: Clear current environment.
+
+`:RSenseExit`
+: Exit RSense server.
+
+### Command Line Interface ###
+
+You can also use RSense from terminal as CLI (command line interface). There are two CLI frontends in RSense. The first one is called [*primitive frontend*](#Primitive_Frontend) which means only one process can run once a command. The second one is called [*wrapper frontend*](#Wrapper_Frontend) which means you don't have to care about processes. In other words, in wrapper frontend, you can execute a command regardless server/client model and initialization time. Wrapper frontend would be used in general.
+
+Code examples for later sections are valid only for UNIX-like systems.
+
+#### Primitive Frontend ####
+
+A main component of primitive frontend is `lib/rsense.jar`. So if you want to use primitive frontend, you have to execute `java` command like:
+
+ $ java -cp lib/jruby.jar:lib/antlr-runtime-3.2.jar:lib/rsense.jar org.cx4a.rsense.Main command option...
+
+No need to say, you have to specify a correct classpath in Java. Do you think it's boring? Me too. Anyway, in primitive frontend, you can use following commads and options.
+
+##### `code-completion` command #####
+
+This command collects completions at a specified file location. Specify file name to analyze by `--file=` option and `--location=` option. `--location=` option can be one of:
+
+* Offset number from top of file (0 based)
+* line:col format (1 based)
+* location mark in string
+
+For example, `--location=123` means completions will be collected at an offset 123 from top of file. `--location=10:8` means completions will be collected at line number 10 and column 8. `--location=_|_` means completions will be collected where `_|_` appears. If `--location=` option is omitted, `--location=_|_` will be used instead.
+
+An unit of offset number and column number is not byte based but character based. If a source code contains non-ascii characters, you may have to specify an encoding by `--encoding=` option. An encoding string must follow [Java Supported Encodings][].
+
+The each line of the result takes a form of `comletion: <name> <qualified-name> <base-name> <kind>`. `<kind>` can be one of `CLASS`, `MODULE`, `CONSTANT`, and `METHOD`.
+
+**Example:**
+
+Classpath option is omitted.
+
+ $ cat test1.rb
+ 1
+ $ java -cp ... org.cx4a.rsense.Main code-completion --file=test1.rb --location=1
+ completion: succ Integer#succ Integer METHOD
+ ...
+ $ java -cp ... org.cx4a.rsense.Main code-completion --file=test1.rb --location=1:1
+ completion: succ Integer#succ Integer METHOD
+ ...
+ $ cat test2.rb
+ 1_|_
+ $ java -cp ... org.cx4a.rsense.Main code-completion --file=test1.rb --location=_|_
+ completion: succ Integer#succ Integer METHOD
+ ...
+
+##### `type-inference` command #####
+
+Same to [`code-completion` command](#) except this command collects types of expressions. All of options of code-completion commands can be also used in this command.
+
+**Example:**
+
+ $ cat test1.rb
+ 1
+ $ java -cp ... org.cx4a.rsense.Main type-inference --file=test1.rb --location=1
+ type: Fixnum
+ $ java -cp ... org.cx4a.rsense.Main type-inference --file=test1.rb --location=1:1
+ type: Fixnum
+ $ cat test2.rb
+ 1_|_
+ $ java -cp ... org.cx4a.rsense.Main type-inference --file=test1.rb --location=_|_
+ type: Fixnum
+
+##### `find-definition` command #####
+
+This command will tell you where a definition of the method is by pointing a method call or a constant reference with `--file=` option and `--location=` option. The output will be take a form of `location: <line> <filename>`.
+
+**Example:**
+
+ $ cat test.rb
+ class C
+ def f() end
+ end
+ class D
+ def f() end
+ end
+ D.new.f_|_
+ $ java -cp ... org.cx4a.rsense.Main find-definition --file=test.rb
+ location: 5 test.rb
+
+##### `where` command #####
+
+This commad will tell you where you are editing at by specifying file name with `--file=` option and line number with `--line=`. The output will be a qualified class name or method name like `Array` and `String#split`.
+
+**Example:**
+
+ $ cat test.rb
+ class C
+ def f
+ 1
+ end
+ end
+ $ java -cp ... org.cx4a.rsense.Main where --file=test.rb --line=3
+ name: C#f
+
+##### `load` command #####
+
+Load a specified file without any outputs.
+
+**Example:**
+
+ $ java -cp ... org.cx4a.rsense.Main load --file=test1.rb
+
+##### `script` command #####
+
+This command is useful for processing a series of commands again and again. If no script files are given, this command reads commands from standard input. An end of each command is detected by mark specified by `--end-mark=` option. If `--end-mark=` option is not given, `--end-mark=EOF` will be used instead.
+
+Some extra commands are allowed in script mode. `exit` or `quit` commands exit RSense immediately.
+
+**Example:**
+
+ $ java -cp ... org.cx4a.rsense.Main script
+ > type-inference
+ 1_|_
+ EOF
+ type: Fixnum
+ > code-completion
+ 1_|_
+ EOF
+ completion: succ Integer#succ Integer METHOD
+ ...
+ ^D
+ $ cat test.rsense
+ type-inference --test=Foo --should-be=Fixnum
+ 1_|_
+ EOF
+
+ type-inference --test=Bar --should-be=String
+ 'Hello'_|_
+ EOF
+ $ java -cp ... org.cx4a.rsense.Main script test.rsense
+ Foo... [OK]
+ Bar... [OK]
+ test: count=2, success=2, failure=0
+
+##### `clear` command #####
+
+Clear current environmenta. This command will be used from script usually.
+
+##### `list-project` command #####
+
+List currently opened projects. If `--verbose` option given, print more details about projects. See also [project](#Project).
+
+##### `open-project` command #####
+
+Open a project of specified directory. See also [project](#Project).
+
+##### `close-project` command #####
+
+Close specified project. See also [project](#Project).
+
+##### `environment` command #####
+
+Print current RSense environment.
+
+##### `help` command #####
+
+Show help.
+
+##### `version` command #####
+
+Show version of RSense.
+
+##### `--home` option #####
+
+Specify RSense home directory. You don't need to specify this option maybe if you have `~/.rsense`.
+
+##### `--debug` option #####
+
+You can see debug messages by specifying this option.
+
+##### `--log=` option #####
+
+You can keep log messages into a file by specifying this option.
+
+##### `--progress=` option #####
+
+Specifying this option with/without interval in second, RSense will print progress of the specified command.
+
+##### `--format=` option #####
+
+Specifying this option, a command output will be formatted in the specified rule. Available format are `plain` and `emacs`. Default is `plain`.
+
+##### `--verbose` option #####
+
+Specifying this option, command output will be verbose.
+
+##### `--time` option #####
+
+Report an elapsed time of the specified command.
+
+##### `--encoding=` option #####
+
+Specify a file encoding. An encoding string must follow [Java Supported Encodings][]. If this option is omitted, `--encoding=UTF-8` will be used instead.
+
+##### `--load-path=` option #####
+
+Specify an additional `load-path`.
+
+##### `--gem-path=` option #####
+
+Specify an additional `gem-path`.
+
+##### `--config=` option #####
+
+Specify a config file name. See [configuration file](#Configuration_File).
+
+##### `--project=` option #####
+
+Specify a project. RSense will use this project environment such as `load-path` and `gem-path` for processing.
+
+##### `--detect-project=` option #####
+
+Tell RSense detect a project from `--file` option or from specified file. See also [project](#Project).
+
+#### Wrapper Frontend ####
+
+`bin/rsense` is a wrapper frontend that hides a complex of server/client model. You can use it like `rsense.jar` without initialization time. `bin/rsense` automatically execute a primitive frontend as a background daemon, and starts communication with it[^1].
+
+[^1]: For Windows, you have to start server separately
+
+Available commands and options are mostly same to primitive frontend's. See example.
+
+**Example:**
+
+ $ bin/rsense version
+ RSense 0.0.1
+ $ cat test1.rb
+ def f() 1 end
+ $ bin/rsense type-inference --file=test1.rb # define f()
+ $ cat test2.rb
+ f_|_
+ $ bin/rsense type-inference --file=test2.rb # use f()
+ type: Fixnum
+
+Configuration File
+------------------
+
+You can specify a config file for CLI frontends. A config file takes a form of series of options. For example:
+
+ $ bin/rsense type-inference --debug --log=/tmp/rsense.log --format=emacs --encoding=UTF-8 --load-path=lib --file=a.rb --location=1
+
+is equivalent to:
+
+ $ cat config
+ debug
+ log = /tmp/rsense.log
+ format = emacs
+ encoding = UTF-8
+ load-path = lib
+ $ bin/rsense --config=config --file=a.rb --location=1
+
+Especially, [wrapper frontend](#Wrapper_Frontend) will load a config file located at `~/.rsense` automatically, which may be created on [installation](#Installation).
+
+Project
+-------
+
+RSense manages projects mainly for finding correct `load-path`. Every project should have a config file named `.rsense` at root directory of the project like:
+
+ name = MyProject
+ load-path = lib
+
+If `--project` option is given, `--project=MyProject` in above case, RSense uses its `load-path` for processing the command. If `--detect-project` is given, RSense will look for `.rsenes` file as a project root.
+
+RSense will not care about anything such as files, resource, and etc except for `load-path` and its name. It's very simple.
+
+Ruby Reference Manual
+---------------------
+
+This section describe how to install and use Ruby Reference Manual (refm in abbreviation) from RSense.
+
+Go to <http://www.ruby-lang.org/ja/man/archive/> and download a latest snapshot of refm. Then extract files and rename the directory to `~/src/rurema`, for example.
+
+ $ cd ~/tmp
+ $ wget http://www.ruby-lang.org/ja/man/archive/snapshot/ruby-refm-1.9.1-dynamic-snapshot.tar.bz2
+ $ tar xjf ruby-refm-1.9.1-dynamic-snapshot.tar.bz2
+ $ mv ruby-refm-1.9.1-dynamic-snapshot ~/src/rurema
+
+After installation, if you use Emacs, you need to change `rsense-rurema-home` variable to that directory.
+
+ (setq rsense-rurema-home "~/src/rurema")
+
+Candidate help will be shown automatically. Currently, candidate help can be used only from Emacs.
+
+Limitations
+-----------
+
+Currently the following features are not supported:
+
+* `eval`
+* `proc` and `lambda` without block
+* `callcc`
+* `raise` and `rescue` flow analysis
+* `Struct`
+* Almost standard libraries ([status](devel.txt#Standard_Library_Status))
+* Large project
+* Completion with incorrect syntax
+
+Trouble Shooting
+----------------
+
+Check list:
+
+* Server or service is running?
+* Ruby interpreter is executable?
+* Java program is executable?
+* Primitive frontend works well?
+
+ For UNIX-like systems:
+ ~~~~
+ $ java -cp lib/jruby.jar:lib/antlr-runtime-3.2.jar:lib/rsense.jar org.cx4a.rsense.Main version
+ RSense 0.1
+ ~~~~
+
+ For Windows:
+ ~~~~
+ > java -cp lib\jruby.jar;lib\antlr-runtime-3.2.jar;lib\rsense.jar org.cx4a.rsense.Main version
+ RSense 0.1
+ ~~~~
+
+* Wrapper frontend works well?
+
+ For UNIX-like systems:
+ ~~~~
+ $ bin/rsense server
+ ...
+ ^C
+ $ bin/rsense version
+ RSense 0.1
+ ~~~~
+
+ For Windows:
+ ~~~~
+ > ruby bin\rsense server
+ ...
+ ^C
+ > ruby bin\rsense version
+ RSense 0.1
+ ~~~~
+
+* A configuration of Emacs or Vim is correct?
+
+ `rsense-home` variable in Emacs or `g:rsenseHome` variable in Vim should be full path. For example, the following code is not allowed at now.
+ ~~~~
+ (setq rsense-home "~/opt/rsense-0.2")
+ ~~~~
+ Use `expand-file-name` to expand to full path or write full path directly.
+ ~~~~
+ (setq rsense-home (expand-file-name "~/opt/rsense-0.2"))
+ ;; or
+ (setq rsense-home "/home/tomo/opt/rsense-0.2")
+ ~~~~
+
+If there is no problem in check list, kill `java` and `ruby` processes of RSense and delete pid file located. And then try again. Pid file is located at `$RSENSE_HOME/rsense-pid` or `/tmp/rsense-pid` for UNIX-like systems, and located at `%RSENSE_HOME%\rsense-pid` for Windows.
+
+Please contant me you couldn't resolve the problem.
+
+Reporting Bugs
+--------------
+
+Visit [RSense Bug Tracking System](http://cx4a.org/redmine/projects/rsense) and create a new ticket.
+
+[Emacs]: http://www.gnu.org/software/emacs/
+[Vim]: http://www.vim.org/
+[Ruby]: http://www.ruby-lang.org/ "Ruby Programming Language"
+[Rumix]: http://ruby.morphball.net/rumix/
+[UNIX philosophy]: http://en.wikipedia.org/wiki/Unix_philosophy
+[Java Supported Encodings]: http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html
View
BIN vendor/rsense-0.3/doc/rsense-emacs-1.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN vendor/rsense-0.3/doc/rsense-emacs-2.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN vendor/rsense-0.3/doc/rsense-emacs-3.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN vendor/rsense-0.3/doc/rsense-vim.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
27 vendor/rsense-0.3/doc/style.css
@@ -0,0 +1,27 @@
+body {
+ margin: 1em;
+}
+
+h1, h2, h3 {
+ margin-top: 1em;
+}
+
+pre {
+ margin: 0.5em 2em;
+ padding: 0.5em;
+ background-color: #eee;
+ border: 1px solid #ddd;
+}
+
+table {
+ margin-left: 1em;
+ background-color: lightgray;
+}
+
+td, th {
+ padding: 0.3em;
+}
+
+td {
+ background-color: white;
+}
View
7 vendor/rsense-0.3/etc/config.rb
@@ -0,0 +1,7 @@
+#!/usr/bin/env ruby
+
+require 'rubygems'
+
+puts "home = #{File.expand_path(File.dirname(File.dirname($0)))}"
+puts "load-path = #{$:.join(File::PATH_SEPARATOR)}"
+puts "gem-path = #{Gem.path.join(File::PATH_SEPARATOR)}"
View
270 vendor/rsense-0.3/etc/jruby-1.4.0.patch
@@ -0,0 +1,270 @@
+diff -ruN -x ri -x cache -x DefaultRubyParser.java -x YyTables.java -x PATH ../jruby-1.4.0-orig/src/org/jruby/ast/Node.java ../jruby-1.4.0/src/org/jruby/ast/Node.java
+--- ../jruby-1.4.0-orig/src/org/jruby/ast/Node.java 2009-11-03 03:15:09.000000000 +0900
++++ ../jruby-1.4.0/src/org/jruby/ast/Node.java 2010-01-25 21:30:49.463049702 +0900
+@@ -35,6 +35,7 @@
+
+ import java.util.ArrayList;
+ import java.util.List;
++import java.util.Collections;
+
+ import org.jruby.Ruby;
+ import org.jruby.ast.types.INameNode;
+@@ -45,6 +46,7 @@
+ import org.jruby.runtime.Block;
+ import org.jruby.runtime.ThreadContext;
+ import org.jruby.runtime.builtin.IRubyObject;
++import org.jruby.util.ByteList;
+
+ /**
+ * Base class for all Nodes in the AST
+@@ -54,6 +56,7 @@
+ static final List<Node> EMPTY_LIST = new ArrayList<Node>();
+
+ private ISourcePosition position;
++ private List<ByteList> commentList;
+
+ public Node(ISourcePosition position) {
+ assert position != null;
+@@ -70,7 +73,15 @@
+ public void setPosition(ISourcePosition position) {
+ this.position = position;
+ }
+-
++
++ public List<ByteList> getCommentList() {
++ return commentList == null ? Collections.<ByteList>emptyList() : commentList;
++ }
++
++ public void setCommentList(List<ByteList> commentList) {
++ this.commentList = commentList;
++ }
++
+ public abstract Object accept(NodeVisitor visitor);
+ public abstract List<Node> childNodes();
+
+diff -ruN -x ri -x cache -x DefaultRubyParser.java -x YyTables.java -x PATH ../jruby-1.4.0-orig/src/org/jruby/lexer/yacc/RubyYaccLexer.java ../jruby-1.4.0/src/org/jruby/lexer/yacc/RubyYaccLexer.java
+--- ../jruby-1.4.0-orig/src/org/jruby/lexer/yacc/RubyYaccLexer.java 2009-11-03 03:15:10.000000000 +0900
++++ ../jruby-1.4.0/src/org/jruby/lexer/yacc/RubyYaccLexer.java 2010-01-26 17:56:26.835726305 +0900
+@@ -38,6 +38,8 @@
+ import java.io.IOException;
+
+ import java.math.BigInteger;
++import java.util.List;
++import java.util.ArrayList;
+ import java.util.HashMap;
+
+ import org.jcodings.Encoding;
+@@ -221,6 +223,8 @@
+ // this before use.
+ private StringBuilder tokenBuffer = new StringBuilder(60);
+
++ private List<ByteList> commentList;
++
+ private StackState conditionState = new StackState();
+ private StackState cmdArgumentState = new StackState();
+ private StrTerm lex_strterm;
+@@ -382,6 +386,14 @@
+ this.lex_state = state;
+ }
+
++ public List<ByteList> getCommentList() {
++ return commentList;
++ }
++
++ public void setCommentList(List<ByteList> commentList) {
++ this.commentList = commentList;
++ }
++
+ public StackState getCmdArgumentState() {
+ return cmdArgumentState;
+ }
+@@ -828,6 +840,23 @@
+
+ loop: for(;;) {
+ c = src.read();
++
++ if (c == '#') {
++ if (commentList == null) {
++ commentList = new ArrayList<ByteList>();
++ }
++
++ ByteList buffer = new ByteList();
++ while ((c = src.read()) != EOF) {
++ if (c == '\n') {
++ break;
++ } else {
++ buffer.append((byte) c);
++ }
++ }
++ commentList.add(buffer);
++ }
++
+ switch(c) {
+ case '\000': /* NUL */
+ case '\004': /* ^D */
+diff -ruN -x ri -x cache -x DefaultRubyParser.java -x YyTables.java -x PATH ../jruby-1.4.0-orig/src/org/jruby/parser/DefaultRubyParser.y ../jruby-1.4.0/src/org/jruby/parser/DefaultRubyParser.y
+--- ../jruby-1.4.0-orig/src/org/jruby/parser/DefaultRubyParser.y 2009-11-03 03:15:10.000000000 +0900
++++ ../jruby-1.4.0/src/org/jruby/parser/DefaultRubyParser.y 2010-01-28 00:49:10.412527831 +0900
+@@ -310,9 +310,11 @@
+ stmts : none
+ | stmt {
+ $$ = support.newline_node($1, getPosition($1));
++ lexer.setCommentList(null);
+ }
+ | stmts terms stmt {
+ $$ = support.appendToBlock($1, support.newline_node($3, getPosition($3)));
++ lexer.setCommentList(null);
+ }
+ | error stmt {
+ $$ = $2;
+@@ -1142,10 +1144,13 @@
+ yyerror("class definition in method body");
+ }
+ support.pushLocalScope();
++ support.pushCommentList(lexer.getCommentList());
+ } bodystmt kEND {
+ Node body = $5 == null ? NilImplicitNode.NIL : $5;
+
+- $$ = new ClassNode(getPosition($1), $<Colon3Node>2, support.getCurrentScope(), body, $3);
++ Node node = new ClassNode(getPosition($1), $<Colon3Node>2, support.getCurrentScope(), body, $3);
++ node.setCommentList(support.popCommentList());
++ $$ = node;
+ support.popCurrentScope();
+ }
+ | kCLASS tLSHFT expr {
+@@ -1166,21 +1171,27 @@
+ yyerror("module definition in method body");
+ }
+ support.pushLocalScope();
++ support.pushCommentList(lexer.getCommentList());
+ } bodystmt kEND {
+ Node body = $4 == null ? NilImplicitNode.NIL : $4;
+
+- $$ = new ModuleNode(getPosition($1), $<Colon3Node>2, support.getCurrentScope(), body);
++ Node node = new ModuleNode(getPosition($1), $<Colon3Node>2, support.getCurrentScope(), body);
++ node.setCommentList(support.popCommentList());
++ $$ = node;
+ support.popCurrentScope();
+ }
+ | kDEF fname {
+ support.setInDef(true);
+ support.pushLocalScope();
++ support.pushCommentList(lexer.getCommentList());
+ } f_arglist bodystmt kEND {
+ // TODO: We should use implicit nil for body, but problem (punt til later)
+ Node body = $5; //$5 == null ? NilImplicitNode.NIL : $5;
+
+ /* NOEX_PRIVATE for toplevel */
+- $$ = new DefnNode(getPosition($1), new ArgumentNode($2.getPosition(), (String) $2.getValue()), $<ArgsNode>4, support.getCurrentScope(), body);
++ Node node = new DefnNode(getPosition($1), new ArgumentNode($2.getPosition(), (String) $2.getValue()), $<ArgsNode>4, support.getCurrentScope(), body);
++ node.setCommentList(support.popCommentList());
++ $$ = node;
+ support.popCurrentScope();
+ support.setInDef(false);
+ }
+@@ -1189,12 +1200,15 @@
+ } fname {
+ support.setInSingle(support.getInSingle() + 1);
+ support.pushLocalScope();
++ support.pushCommentList(lexer.getCommentList());
+ lexer.setState(LexState.EXPR_END); /* force for args */
+ } f_arglist bodystmt kEND {
+ // TODO: We should use implicit nil for body, but problem (punt til later)
+ Node body = $8; //$8 == null ? NilImplicitNode.NIL : $8;
+
+- $$ = new DefsNode(getPosition($1), $2, new ArgumentNode($5.getPosition(), (String) $5.getValue()), $<ArgsNode>7, support.getCurrentScope(), body);
++ Node node = new DefsNode(getPosition($1), $2, new ArgumentNode($5.getPosition(), (String) $5.getValue()), $<ArgsNode>7, support.getCurrentScope(), body);
++ node.setCommentList(support.popCommentList());
++ $$ = node;
+ support.popCurrentScope();
+ support.setInSingle(support.getInSingle() - 1);
+ }
+@@ -1882,3 +1896,12 @@
+ return lexer.getPosition();
+ }
+ }
++
++
++
++
++
++
++
++
++
+diff -ruN -x ri -x cache -x DefaultRubyParser.java -x YyTables.java -x PATH ../jruby-1.4.0-orig/src/org/jruby/parser/ParserSupport.java ../jruby-1.4.0/src/org/jruby/parser/ParserSupport.java
+--- ../jruby-1.4.0-orig/src/org/jruby/parser/ParserSupport.java 2009-11-03 03:15:10.000000000 +0900
++++ ../jruby-1.4.0/src/org/jruby/parser/ParserSupport.java 2010-02-05 23:11:47.584267125 +0900
+@@ -35,6 +35,9 @@
+ ***** END LICENSE BLOCK *****/
+ package org.jruby.parser;
+
++import java.util.List;
++import java.util.Stack;
++
+ import org.jruby.CompatVersion;
+ import org.jruby.ast.AndNode;
+ import org.jruby.ast.ArgsPreOneArgNode;
+@@ -191,6 +194,16 @@
+ private ParserConfiguration configuration;
+ private RubyParserResult result;
+
++ private Stack<List<ByteList>> commentListStack = new Stack<List<ByteList>>();
++
++ public void pushCommentList(List<ByteList> commentList) {
++ commentListStack.push(commentList);
++ }
++
++ public List<ByteList> popCommentList() {
++ return commentListStack.pop();
++ }
++
+ public void reset() {
+ inSingleton = 0;
+ inDefinition = false;
+diff -ruN -x ri -x cache -x DefaultRubyParser.java -x YyTables.java -x PATH ../jruby-1.4.0-orig/tool/yytables.el ../jruby-1.4.0/tool/yytables.el
+--- ../jruby-1.4.0-orig/tool/yytables.el 1970-01-01 09:00:00.000000000 +0900
++++ ../jruby-1.4.0/tool/yytables.el 2010-01-21 18:34:36.127027705 +0900
+@@ -0,0 +1,42 @@
++(defun yytables (parser-file yytables-file)
++ (interactive (read-file-name "Location of parser.java: ")
++ (read-file-name "Location of yytables.java: "))
++ (loop with start
++ with end
++ with unit
++ for tabname in '("yyTable" "yyCheck")
++ do
++ (find-file parser-file)
++ (goto-char (point-min))
++ (search-forward (format "%s = " tabname))
++ (setq start (point))
++ (forward-sexp)
++ (backward-char)
++ (setq end (make-marker))
++ (set-marker end (point))
++ (loop with lines = (count-lines start end)
++ with div = 4
++ with unit = (/ lines div)
++ with beg
++ with contents
++ for n below div
++ do
++ (goto-char start)
++ (forward-line)
++ (setq beg (point))
++ (unless (re-search-forward "\n" end t unit)
++ (goto-char end))
++ (setq contents (buffer-substring beg (point)))
++ (delete-region beg (point))
++ (with-current-buffer (find-file-noselect yytables-file)
++ (goto-char (point-min))
++ (search-forward (format "%s%s() {" tabname (1+ n)))
++ (search-forward "short[] ")
++ (kill-sexp)
++ (insert "{\n" contents "}")))
++ (goto-char end)
++ (delete-backward-char 2)
++ (delete-char 1)
++ (insert (format "YyTables.%s()" tabname))))
++
++
View
BIN vendor/rsense-0.3/lib/antlr-runtime-3.2.jar
Binary file not shown.
View
BIN vendor/rsense-0.3/lib/jruby.jar
Binary file not shown.
View
BIN vendor/rsense-0.3/lib/rsense.jar
Binary file not shown.
View
3,006 vendor/rsense-0.3/stubs/1.8/_builtin.rb
3,006 additions, 0 deletions not shown because the diff is too large. Please use a local Git client to view these changes.
View
131 vendor/rsense-0.3/stubs/1.8/bigdecimal.rb
@@ -0,0 +1,131 @@
+class BigDecimal < Numeric
+ BASE = 0
+ EXCEPTION_ALL = 0
+ EXCEPTION_INFINITY = 0
+ EXCEPTION_NaN = 0
+ EXCEPTION_OVERFLOW = 0
+ EXCEPTION_UNDERFLOW = 0
+ EXCEPTION_ZERODIVIDE = 0
+ ROUND_CEILING = 0
+ ROUND_DOWN = 0
+ ROUND_FLOOR = 0
+ ROUND_HALF_DOWN = 0
+ ROUND_HALF_EVEN = 0
+ ROUND_HALF_UP = 0
+ ROUND_MODE = 0
+ ROUND_UP = 0
+ SIGN_NEGATIVE_FINITE = 0
+ SIGN_NEGATIVE_INFINITE = 0
+ SIGN_NEGATIVE_ZERO = 0
+ SIGN_NaN = 0
+ SIGN_POSITIVE_FINITE = 0
+ SIGN_POSITIVE_INFINITE = 0
+ SIGN_POSITIVE_ZERO = 0
+
+ ##% self.double_fig() -> Integer
+ def self.double_fig() 0 end
+ ##% self.induced_from(a) -> BigDecimal
+ def self.induced_from(number) BigDecimal.new('') end
+ ##% self.limit(?Integer) -> Integer
+ def self.limit(n = 0) 0 end
+ ##% self.mode(Integer, ?Boolean) -> Boolean
+ def self.mode(s, v = nil) BOOLEAN end
+ ##% self.new(String, ?Integer) -> BigDecimal
+ def self.new(s, n = 0) super() end
+ ##% self.ver() -> String
+ def self.ver() '' end
+
+ ### Numeric
+ ##% +@() -> self
+ def +@() self end
+ ##% -@() -> BigDecimal
+ def -@() BigDecimal.new('') end
+ ##% "<=>"(other) -> Fixnum
+ def <=>(other) 0 end
+ ##% abs() -> BigDecimal
+ def abs() self end
+ ##% clone() -> self
+ def clone() self end
+ alias :dup :clone
+ ##% coerce(Float) -> (Float, Float)
+ ##% coerce(Numeric) -> (Fixnum, Fixnum)
+ def coerce(other) [0.0, 0.0] end
+ ##% divmod(Numeric) -> (BigDecimal, Numeric)
+ def divmod(other) [BigDecimal.new(''), 0] end
+ ##% eql?(Numeric) -> Boolean
+ def eql?(other) BOOLEAN end
+ ##% quo(Numeric) -> BigDecimal
+ def quo(other) 0.0 end
+ ##% fdiv(Numeric) -> BigDecimal
+ def fdiv(other) 0.0 end
+ ##% integer?() -> Boolean
+ def integer?() BOOLEAN end
+ ##% modulo(Numeric) -> BigDecimal
+ def modulo(other) 0 end
+ ##% nonzero?() -> self
+ def nonzero?() self end
+ ##% remainder(Numeric) -> BigDecimal
+ def remainder(other) 0 end
+ ##% step<a | a <= Numeric>(Numeric, ?a) {self or a or Fixnum -> ?} -> self
+ ##% step<a | a <= Numeric>(Numeric, ?a) -> Enumerator<self, self or a or Fixnum>
+ def step(limit, step = 1) self end
+ ##% zero?() -> Boolean
+ def zero?() BOOLEAN end
+
+ ##% _dump() -> String
+ def _dump() '' end
+ ##% add(Numeric, Integer) -> BigDecimal
+ def add(b, n) BigDecimal.new('') end
+ ##% ceil(?Integer) -> BigDecimal
+ def ceil(n = 0) 0 end
+ ##% div(Numeric, ?Integer) -> BigDecimal
+ def div(other, n = 0) BigDecimal.new('') end
+ ##% exponent() -> Fixnum
+ def exponent() 0 end
+ ##% finite?() -> Boolean
+ def finite?() BOOLEAN end
+ ##% fix() -> Fixnum
+ def fix() 0 end
+ ##% floor(?Integer) -> BigDecimal
+ def floor(n = 0) BigDecimal.new('') end
+ ##% flac() -> BigDecimal
+ def flac() BigDecimal.new('') end
+ ##% infinite?() -> Boolean
+ def infinite?() BOOLEAN end
+ ##% mult(Numeric, Integer) -> BigDecimal
+ def mult(b, n) BigDecimal.new('') end
+ ##% nan?() -> Boolean
+ def nan?() BOOLEAN end
+ ##% nonzero?()