JScript IntelliSense 用ファイルを作る の続き。これって.NETのコードからReflection使って作れそうですよね。
こんなクラスがあったとして。
Public Class Sample
Public Shared Function GetString(ByVal i As Integer) As String
End Function
End Class
ここでは、世の中はSharedなメソッドしかないとします。次のように、Publicな静的メソッドを取り出して、さらにその引数も取り出して、戻り値も取り出して……と、コードを生成します。オーバーロードは考えてません。
Dim sb = New System.Text.StringBuilder
Dim t = GetType(Sample)
' Static method
For Each i In t.GetMethods(BindingFlags.Static Or BindingFlags.Public)
sb.Append(String.Format("{0}.{1} = function({2}) {{" & vbCrLf, _
t.Name, _
i.Name, _
String.Join(", ", (From p In i.GetParameters Select p.Name).ToArray)))
sb.Append(String.Format("/// <summary></summary>" & vbCrLf))
For Each p In i.GetParameters
sb.Append(String.Format("/// <param name=""{0}"" type=""{1}""></param>" & vbCrLf, p.Name, p.ParameterType.JScriptName))
Next
If i.ReturnType IsNot GetType(System.Void) Then
sb.Append(String.Format("/// <returns type=""{0}""></returns>" & vbCrLf, i.ReturnType.JScriptName))
End If
sb.Append("}" & vbCrLf & vbCrLf)
Next
Dim js = sb.ToString
JScriptにはIntegerなどはないので、適当な型名変換のメソッドを作ってます。拡張メソッドを使ったりして。JScriptにはない型をparam type属性に書いても、IntelliSenseでその名前が表示されるだけなので必ず変換しないといけないというものではないです。
<Extension()> _
Public Function JScriptName(ByVal t As Type) As String
Dim numbers As Type() = {GetType(Byte), GetType(Decimal), GetType(Double), GetType(Int32), GetType(Int64), GetType(SByte), GetType(Int16), GetType(Single), GetType(UInt32), GetType(UInt64), GetType(UInt16)}
If numbers.Contains(t) Then
Return "Number"
ElseIf t Is GetType(String) Then
Return "String"
ElseIf t Is GetType(Boolean) Then
Return "Boolean"
ElseIf t Is GetType(DateTime) Then
Return "Data"
Else
Return t.Name
End If
End Function
実行して得られる文字列は、こんな感じ。できました。
Sample.GetString = function(i) {
/// <summary></summary>
/// <param name="i" type="Number"></param>
/// <returns type="String"></returns>
}
こういうふうにJScript IntelliSense用のコードを生成してくれるライブラリってないんですかね? 実用用途が乏しいからでしょうか。少しさがしてみたところ(いうほどさがしていないけど)、こちら。Silverlight 1.0 Javascript Intellisense は、もう古いけども Silverlight 1.0 向けのIntelliSenseファイル。これは、同じような考えで、DLLファイルからJScriptのコードを生成しているようです。生成されたコードを見てみると、nullや空のfunctionだけでなく、一部コードも生成していますね。IntelliSenseとして利用されるときのテクニックが何かあるのかな。