Vim Intellisense -Java Plugin

by Madan Ganesh

 

Overview:

Java plug-in for Vim Intellisense provides intellisense for a java file. The insen executable invokes the javaft.dll to get method-list, tool-tip, documentation etc., The javaft.dll in-turn delegate the calls to javaft.jar component via JNI mechanism. The javaft.jar is the work-horse for java intellisense plug-in. This document explains the design of java insen package and describe its components. This is depicted in figure below.

 

 

 

 

 

 

 

Requirement:

The insen executable writes the insen parameters in the VimHelperParam.txt file in the %TEMP% folder and invokes the plug-in based on the file type being typed. For a .java file the executable invokes the javaft.dll which implements the interface published for plug-in.  The implementation requires to implement below mentioned functions,

                    

Published Methods   Invoked when... Implementation Requirement for a java file
GetMethodList When a . is typed

If 'dot' is typed after a variable, list the members of the type corresponding to that variable. If 'dot' is typed after a TypeName list the static members of that type. If 'dot' is typed after a package name list the TypeNames under that package.

GetTooltip When a ( is typed

List the overloaded signatures of the method for which the tool-tip is invoked.

GetDoc When the documentation has to be displayed for member listed thru GetMethodList

Give the documentation corresponding to the member (listed via the GetMethodList method)

GetGenList When a Ctrl-Space is typed

List all the imported TypeNames and all members in the current scope.

       

Design:

The insen package splits the line where insen is invoked to know the token typed before the '.' or '(' .  The token is identified for a variable name or TypeName or Package name. Based on the identification a Lister is instantiated. The lister can be a MemberLister or PackageLister. The MemberLister is initialized with a Type whose members have to be listed. The lister finds the TypeInfo from which the members information is obtained.

Components:

Class

Description

VimHelper

This class is called from the javaft.dll. The static methods are invoked for listing member variables, tool-tip and ctrl space.

This class acts like a main method for the java insen package. It reads the param file, instantiates the appropriate lister and invokes the list method on it.

The lister object last invoked is stored as member static variable sm_lister, and the same is used when the insen is called back to  retrieve the documentation

Parser

This class is designed to abstract the parsing of the source file from  which the insen is  invoked. This class parses the java source file to know about the  packages imported, TypeName of a declared variable etc., 

ListerFactory

 This class acts as a factory to create a lister based on the expression typed  before the 'dot'. Two types of listers are identified in insen,

                a) MemberLister

                                lists the members of a specific type. It has 2 variants; one

                                lists only static method and the other lists both static and

                                non-static members.

 

                b) PackageLister

                                lists the sub packages and the TypeNames of a parent package.

 

  On a high level, this class creates one of the lister (based on what for

  the insen is invoked) and gives it back to the caller.

 

MemberLister

This class encapsulates the functionality of enlisting the class members.

The MemberLister takes the types whose members is to be listed when the  list is called.

PackageLister

This class is designed to list the contents of a package or partial package  name. This class is initialzed with a name that can be,

                1. Full Package name. ("java.lang.")

                2. Prefix of package name. ("java.")

                                               

Based on case it lists either the type names or next part of the package  name respectively.

ClassInfoFactory

This class acts as a factory to create a ClassInfo object. See

 ClassInfo.java for more information about ClassInfo class. There a 2 types of classinfo identified. They are,

            a) Reflection ClassInfo

                        ClassInfo implementation that gives a type's  information using the   

                       Java’s Reflection mechanism. 

           b) Local Class Info                                                                                       

                          ClassInfo implementation that gives a type's information by parsing the type’s  java source file.

 

 This class tries to get a class info in the following order,

                First Assumption

                         Given type 'TypeA' is a class defined in current editing file. 

                Second Assumption

                           Given type 'TypeA' is a public class defined in one of the java files in            current Folder 

                Third Assumption

                         Given type 'TypeA' is a runtime loadable class available in classpath.         

                Fourth Assumption

           Given type 'TypeA' is a class defined in one of the java files  in the             current folder (it need not be a public class).

 

Based on the assumption the class tries to creates the ClassInfo as  following,

                A hit for First, Second and Fourth Assumptions results in

                LocalClassInfo. A hit for Second Assumption result in a ReflectionClassInfo.

 

ReflectionClassInfo

This  class implements the ClassInfo interface to provide information about

a class using reflection mechanism.

 

LocalClassInfo

This class implements the ClassInfo interface providing class information

parsing the java source file.

 

DocReaderFactory

 This class acts as a factory to create a DocReader. See DocReader.java to

 know about the DocReader interface.

 

 There are 2 types of DocReader implementation available

                HtmlDocReader

                                DocReader that gives documentation parsing the HTML file.

                SourceDocReader

                                DocReader that gives documentation parsing the source file.

 

This class instantiates one of the DocReader.

 

HtmlDocReader

This class implements DocReader interface and provides documentation

information parsing a HTML file.

 

SourceDocReader

 This class implements DocReader interface providing the documentation info

 by parsing the java source file.

 

 

Model:

Source:

The source for javaft.dll and insen package can be downloaded from here.

To-Dos:

Feedback / Bug:

If there is bug, suggestion, question, compliment please post it to mganesh@baan.com

Acknowledgements:

To Swarna and Shrishti for thier continuing support and putting up with me for the time I worked in this project. To Bert Roos who taught VIM (and many good things) to me.

Return Home