*javacomplete.txt*	For Vim version 7.0 and above. Last change: 2011-01-30

		    JAVACOMPLETE REFERENCE MANUAL	by cheng fang~
		    					fangread@yahoo.com.cn~


1. Overview					|javacomplete-overview|
   1.1 Features					|javacomplete-features|
   1.2 Requirements				|javacomplete-requirements|
   1.3 Download					|javacomplete-download|
   1.4 Install					|javacomplete-install|
2. Usage    					|javacomplete-usage|
   2.1 Input contexts				|javacomplete-contexts|
   2.2 Kind letter				|javacomplete-kindletter|
   2.3 Options					|javacomplete-options|
   2.4 Commands					|javacomplete-commands|
3. Java parser in Vim    			|javacomplete-parser|
   3.1 Abstract Syntax Tree			|javacomplete-ast|
   3.2 Global Constants				|javacomplete-constants|
   3.3 Parsing Functions			|javacomplete-functions|
   3.4 Sample					|javacomplete-sample|
4. FAQ						|javacomplete-faq|
5. Limitations					|javacomplete-limitations|
6. History					
   6.1 javacomplete				|javacomplete-history|
   6.2 Parser					|java-parser-history|
   6.2 Reflection.java				|javacomplete-reflection|
7. Todo						|javacomplete-todo|
8. Thanks					|javacomplete-thanks|

==============================================================================
1. Overview 					*javacomplete-overview*

This is javacomplete, an omni-completion script of JAVA language for vim 7 and
above. It includes javacomplete.vim, java_parser.vim, Reflection.java, and 
javacomplete.txt.

1.1 Features					*javacomplete-features*

- List members of a class, including (static) fields, (static) methods and ctors.
- List classes or subpackages of a package.
- Provide parameters information of a method, list all overload methods.
- Complete an incomplete word.
- Provide a complete JAVA parser written in Vim script language.
- Use the JVM to obtain most information.
- Use the embedded parser to obtain the class information from source files.
- Tags generated by ctags can also be used.
- JSP is supported, Builtin objects such as request, session can be recognized.
  The classes and jar files in the WEB-INF will be appended automatically to the classpath.

1.2 Requirements				*javacomplete-requirements*

It works on all the platforms wherever
- Vim version 7.0 and above,
- JDK version 1.1 and above, 
exists.

1.3 Download					*javacomplete-download*

You can download the lastest version from this url:
	http://www.vim.org/scripts/script.php?script_id=1785

1.4 Install					*javacomplete-install*

1. Unzip javacomplete.zip to a directory of 'runtimepath', e.g.
$HOME/.vim (unix/linux), $VIM/vimfiles (windows). >
	> unzip javacomplete.zip -d ~/.vim

<   To update Vim help tags, run vim and run command: >
	:helptags $HOME/.vim/doc
<   or >
	:helptags $VIM/vimfiles/doc

NOTE: javacomplete.vim, java_parser.vim and Reflection.java should be in one
autoload directory of 'runtimepath'.
javacomplete.txt should be in one doc directory of 'runtimepath'.

2. Set 'omnifunc' option. e.g. >
	:setlocal omnifunc=javacomplete#Complete
<   Or, use autocmd: >
	:" Only do this part when compiled with support for autocommands.
	:if has("autocmd")
	:  autocmd Filetype java setlocal omnifunc=javacomplete#Complete
	:endif
You can add this command to your .vimrc or _vimrc.

3. Set 'completefunc' option to show parameters information IF YOU LIKE. e.g. >
	:setlocal completefunc=javacomplete#CompleteParamsInfo
You can map as follows for better display: >
	:inoremap <buffer> <C-X><C-U> <C-X><C-U><C-P>
	:inoremap <buffer> <C-S-Space> <C-X><C-U><C-P>

4. Reflection.java will be automatcally compiled and placed to $HOME when you
use first time. Assure that Reflection.java is in the same directory with
javacomplete.vim to be searched in autoload subdirectory of &rtp. 
If no Reflection.class is generated, check that you have the write permission
in $HOME directory.
If a previous Reflection.java is not compatible with the new version
javacomplete.vim, please compile Reflection.java manually.

==============================================================================
2. Usage    					*javacomplete-usage*

You can use it like other omni-completion script. Many samples of input context 
are gived in the following section.

Make sure a JVM launcher (default 'java') can be searched in the PATH enviroment
variable, otherwise Use javacomplete#SetJVMLauncher() to specify one. See option
`javacomplete-launcher`.

See FAQ in time if some problem occurs. When meeting other problems not
described in FAQ, you can contact with the auther by the following e-mail:
fangread@yahoo.com.cn

2.1 Input contexts				|javacomplete-contexts|
It recognize nearly all kinds of Primary Expressions (see langspec-3.0)
except for "Primary.new Indentifier". Casting conversion is also supported.

Samples of input contexts are as following: (Note that '|' indicates cursor)
    (1). after '.', list members of a class or a package
    - package.| 	subpackages and classes of a package
    - Type.| 		static members of the 'Type' class and "class"
    - var.| or field.|	members of a variable or a field
    - method().| 	members of result of method()
    - this.|		members of the current class
    - ClassName.this.|	members of the qualified class
    - super.|		members of the super class
    - array.|		members of an array object
    - array[i].|	array access, return members of the element of array
    - "String".|	String literal, return members of java.lang.String
    - int.| or void.|	primitive type or pseudo-type, return "class"
    - int[].|		array type, return members of a array type and "class"
    - java.lang.String[].|
    - new int[].|	members of the new array instance
    - new java.lang.String[i=1][].|
    - new Type().|	members of the new class instance 
    - Type.class.|	class literal, return members of java.lang.Class
    - void.class.| or int.class.|
    - ((Type)var).|	cast var as Type, return members of Type.
    - (var.method()).|	same with "var.|"
    - (new Class()).|	same with "new Class().|"

   (2). after '(', list matching methods with parameters information.
    - method(|) 	methods matched
    - var.method(|) 	methods matched
    - new ClassName(|)	constructors matched
    - this(|) 		constructors of current class matched
    - super(|) 		constructors of super class matched
    Any place between '(' and ')' will be supported soon.
    Help information of javadoc is not supported yet.

   (3). after an incomplete word, list all the matched beginning with it.
    - var.ab| 	subset of members of var beginning with `ab`
    - ab|	list of all maybes

   (4). import statement
    - " import 	java.util.|"
    - " import 	java.ut|"
    - " import 	ja|"
    - " import 	java.lang.Character.|"	e.g. "Subset"
    - " import static java.lang.Math.|"	e.g. "PI, abs"

   (5). package declaration
    - " package 	com.|"

   The above are in simple expression.
   (6). after compound expression:
    - PrimaryExpr.var.|
    - PrimaryExpr.method().|
    - PrimaryExpr.method(|)
    - PrimaryExpr.var.ab|
    e.g.
    - "java.lang	. System.in .|"
    - "java.lang.System.getenv().|"
    - "int.class.toString().|"
    - "list.toArray().|"
    - "new ZipFile(path).|"
    - "new ZipFile(path).entries().|"

   (7). Nested expression:
    - "System.out.println( str.| )"
    - "System.out.println(str.charAt(| )"
    - "for (int i = 0; i < str.|; i++)"
    - "for ( Object o : a.getCollect| )"


2.2 Kind letter					*javacomplete-kindletter*

A single letter indicates the kind of compeltion item. These kinds are:
	+	ctor
	v	local variable or parameter
	f	nonstatic field
	F	static field
	m	nonstatic method
	M	static method
	P	package
	C	class type
	I	interface type

2.3 Options					*javacomplete-options*

1. Set java compiler (default 'javac') using the following function:
	javacomplete#SetCompiler('javac')	*javacomplete-compiler*

2. Set java launcher (default 'java') using the following function:
	javacomplete#SetJVMLauncher('java')	*javacomplete-launcher*

3. Set classpath using the following function: >
	javacomplete#AddClassPath('jarfile_or_classes_path')
	javacomplete#DelClassPath('jarfile_or_classes_path')
	javacomplete#SetClassPath('semicolon_separated_string')
<
    Another two variables will be used if they are existing:
	|g:java_classpath|	global classpath
	|b:classpath|		associated with current buffer
    In one sense, s:classpath is like a classpath option for a PROJECT.
    If some of them are body set, the priority of these variables is:
	first,  b:classpath first,
	second, s:classpath
	third,  g:java_classpath
	last,   $CLASSPATH

4. Set sourcepath using the following function: >
	javacomplete#AddSourcePath('sources_file_path')
	javacomplete#DelSourcePath('sources_file_path')
	javacomplete#SetSourcePath('sources_file_path')

5. Set option for using JDK1.1 if you meet the problem described in FAQ 3: >
	javacomplete#UseJDK11()

6. Set methods to search declaration: >
	" 1 - by builtin searchdecl(), quickest but inaccurate in many cases.
	" 2 - by special Searchdecl(), work NOT WELL YET.
	" 4 - by java_parser, slowest but accurate in most cases. Not for JSP.
	javacomplete#SetSearchdeclMethod()

2.4 Commands					*javacomplete-commands*

==============================================================================
3. Java parser in Vim    			*javacomplete-parser*

3.1 Abstract Syntax Tree			*javacomplete-ast*

3.2 Global Constants				*javacomplete-constants*

3.3 Parsing Functions				*javacomplete-functions*

3.4 Sample Codes					*javacomplete-sample*
This parser can be a good candidate for anyone who needs a java parser to get 
a abstract syntax tree for many use. The following are sample codes: >

  " NOTE: The script contains a single parser instance. You cannot create 
  " another parser! The only way to parse another JAVA code is reset the
  " parser by calling java_parser#InitParser().

  " 1. Initialize the parser
  " for a code snippet,
  call java_parser#InitParser(['for (int i = 0; i < N; i++) {', '', '}'])
  " or for the current buffer,
  call java_parser#InitParser(getline('^', '$'))
  " or for a whole source file
  call java_parser#InitParser(readfile('java/util/Arrays.java'))

  " 2. Get the result tree
  call java_parser#compilationUnit()
  " or others according to the input code
  call java_parser#expression()
  call java_parser#block()
  call java_parser#statement()

  " 3. Use the tree as you like

  " 4. The default scan strategy is scanning only sklenton. 
  " You can change it by set the option 'scanStrategy'.
  " The values for 'scanStrategy' option are:
  "	0 - only class members when parse full file; 
  "	1 - keep statement as a whole string; 
  "	2 - all 
  call java_parser#InitParser(getline('^', '$'), {'scanStrategy': 2})

  " 5. I recommend that keeping scanStrategy as default. 
  " If you want to parse a code snippet such as a method body of the whole
  " file, you can call java_parser#GotoPosition() to go to what you are going 
  " to start parsing.
  " Then, call java_parser#block(), java_parser#statement() or 
  " java_parser#expression() to parse the smaller snippet.
  " NOTE: This way will keep the result tree reserved.
  call java_parser#GotoPosition(def.body.pos)
  call java_parser#block()

==============================================================================
4. FAQ						*javacomplete-faq*

(1). When you meets the following problem: >
	omni-completion error: Exception in thread "main" 
	java.lang.NoClassDefFoundError: Reflection
It is Reflection.class not found in autoload directory or $HOME that cause
this problem.
There are several reasons causing this problem:
    o	No compiler. Use javacomplete#SetCompiler() to specify one.
    o	No write permission for $HOME directory.

(2). Reflection.java should be searched in autoload subdirectory of &rtp.
Reflection.class should be searched in $HOME or autoload subdirectory of &rtp.
If not found, javacomplete try to compile it and place the generated class
file in $HOME.

(3). A error when using JDK1.1:
    Unable to initialize threads: cannot find class java/lang/Thread
When I tested JDK1.1.8 on Windows XP, I found -classpath options cause it.
There are two way to avoid it is:
    o	Add the runtime classes to classpath, like
	"${JDK118}\classes;${JDK118}\lib\classes.zip;${JDK118}\lib\classes.jar;"
    o	Add Reflection.class and others to the CLASSPATH enviroment variable.
	And call javacomplete#UseJDK11() to set option.

==============================================================================
5. Limitations					*javacomplete-limitations*

The embedded parser works a bit slower than expected.

==============================================================================
6. History					

6.1 javacomplete				*javacomplete-history*

v0.77.1.2
    2011-01-30	Fixed to adapt globpath() (vim < 7.2). Patched by Sam Lidder.

v0.77.1.1
    2010-11-12	Fixed to ignore the 'suffixes' and 'wildignore' options which 
    		make Reflection.class can not be found.

v0.77.1
    2007-09-19	Supported showing method parameters information in any place
    		between parenthesises.

v0.77
    2007-09-19	bug fix
    2007-09-18	Added GetCurrentFileKey() avoid empty key of s:files for current buffer.
    2007-09-16	Use a new strategy for searching inherited members.
    2007-09-11
    -	Supported new contexts "jav|", "var|", just after an incomplete word.
    -	Supported new context "abs(|)", a imported static method.
    2007-09-10
    -	Improved FoundClassDeclaration()
    -	Fixed bug calling cursor(0, 0)
    2007-09-09	Rewrote DoGetClassInfo(), GetFQN() and IsFQN()ĄŁ
    2007-09-08	Fixed a bug when merging superclass's members
    2007-09-05 -- 07
    -	Improved s:MergeLines() and s:ExtractCleanExpr().
    -	Rewrote CompleteAfterDot(). Added ParseExpr(). Removed s:GetNextSubexprType()
    -	Supported accessible static imported members.
    -	Supported accessible inherited members.

    2007-09-04	Used b:changedtick and getftime() to check buffer (or other file) for changing.
    2007-09-01	Supported not-file-name toplevel or static member class in source files.

v0.76.8
    2007-08-30
    -	Created the s:TreeVisitor to search type or symbol names.
    -	Supported local and anonymous class.

    2007-08-29
    -	Supported appending automatically classpath under WEB-INF for jsp files.

v0.76.7
    2007-08-28
    -	Fixed case of "new java.util.zip.ZipFile().|"
    -	Improved process of type arguments and method parameters. JAVA5+
    -	Reorganize codes in javacomplete#Complete()
    -	Added CONTEXT_NEED_TYPE, removed CONTEXT_INCOMPLETE_WORD

    2007-08-24	Add Context types for type declaration: CONTEXT_NEED_TYPE

v0.76.6
    2007-08-23	Improved GetStatement() and related. Bug fixed.

v0.76.5
    2007-08-21
    -	Fixed bug: "foo().|", "getFoo().foo().|", 
	"for (Enumeration entries = ; entries.|; )".
    -	Supported input contexts: "((Object)o).|", "((Object)o).getClass().|",
	"new ZipFile(path).|", "(new String().)|".

v0.76.4
    2007-08-17
    -	Improved input contexts: "int.class.toString().|", "list.toArray().|".
    -	Fixed recognizing "this(|)", "method1(|)"
    -	Added the 'kind' letter to distinguish between classes and packages.
    2007-08-14
    -	Support accessible nested classes.
    -	Support import static members and import accessible nested classes.
    2007-08-11
    -	Fixed a bug when Reflection.java is in the path which contains space.
    -	Improved process of this and super in JSP.
    -	Fixed an severe bug parsing current jsp file.

v0.76.3
    2007-08-10
    -	Add an option 'searchdecl' set by javacomplete#SetSearchdeclMethod().
    -	Make an improvement for jsp file.
    -	Clear cache when set options affecting classpath.
    -	Improved DoGetPackageList() and s:GenerateImports().
    -	Replace codes searching list of string with index().

v0.76.2
    2007-08-08
    -	Fix failing to list members of nested class.
    -	Combine members of local packages and loadable packages.
    -	Add quick recognition of package or import. 
    2007-08-06	Add inherited fields and methods to local class.

v0.76.1
    2007-08-04
    -	Fix using a: in javacomplete#SetClassPath()
    -	Fix a bug in javacomplete#GetClassPath()

v0.76 2007-08-04
    2007-08-04
    -	Fix a infinite loop bug in s:GetMatchedIndexEx()
    -	Fix that array type not recognised in compound expression.
    -	Add a option for JDK1.1. See FAQ 3.
    2007-08-03
    -	Improve for 'this' or 'super'.
    -	Support searching toplevel class in sourcepath.
    -	Clean
    2007-08-02  
    -	Improve the process of checking a class in one of packages.
    2007-08-01
    -	Add Searchdecl() using java_parser.vim to provide quick information.
    -	Supports input context: "StringLiteral".|, "int.|", "void.|"
    2007-07-28
    -	Automatcally compile Reflection.java and place it to $HOME.
    -	Add option 'javacompiler', default 'javac'
    -	Add option 'java', default 'java'

v0.75 2007-02-13
    -	Add java_parser.vim.
    -	Add b:sourcepath option.
    -	Improve recognition of classes defined in current buffer or in source path.
    -	Support generating class information from tags instead of returning list directly.

v0.74 2007-02-03
    -	Support jre1.2 (and above).
    -	Support input context like "boolean.class.|"
    -	Handle java primitive types like 'int'.

v0.73 2007-02-01
    -	Fix bug that CLASSPATH not used when b:classpath or g:java_classpath not set.
    -	Fix bug that call filter() without making a copy for incomplete.
    -	Improve recognition of declaration of this class

v0.72 2007-01-31	Handle nested expression.
v0.71 2007-01-28	Add Basic support for class in current folder.
v0.70 2007-01-27	Complete the reflection part.
v0.60 2007-01-25	Design TClassInfo, etc.
v0.50 2007-01-21	Use java and Reflection.class directly.


6.2 Parser					*java-parser-history*

v0.67
    2007-09-11	Append a error string to imported qid when error occurs.
    2007-09-10	Improved regexp constants.
    2007-09-07	Fixed type2Str(). Removed qualident2Str(). 

v0.66.1	08-30	Changed classCreatorRest().
v0.66	08-27	Minor changes

v0.65
    2007-08-23
    -	Improved s:scanComment(), s:Strpart(), s:String2Flags().
    -	Improved recognizing methods, ctors, and variable declarators declared in most common form.
    -	Added s:optFinalParameter(), s:methodDeclaratorRest_opt(). 
    -	Removed s:GetLine() and s:GetCol().
    -	Rewrote binary functions.

v0.64
    2007-08-21
    -	Added quick recognizing fields or methods declared in most common form.
    -	Optimized code: s:modeAndEXPR(), formalParameter(), and others.

v0.63
    2007-08-10	
    -	Removed the unclear s:tokens and s:modifier_keywords.
    -	Add java_parser#GetSnapshot() and java_parser#Restore().
    2007-08-09	Fixed a bug when no top level class defined

v0.62 2007-08-08
    2007-08-08	Fix values in s:Flags and s:modifiersOpt() and the related.
    2007-08-07	Optimize code of scanDoubleQuote() and importDeclaration().

v0.61 2007-08-04
    2007-08-01 Fix a bug typetag(). return a:token -> return tolower(a:token)
    2007-07-31
    -	Rename all script functions matching "s:Java_\(\i\+\)" to "s:\1".
    -	Change s:EOI = ''
    -	Use get() instead of s:GetOption(). Remove it.
    -	Use repeat() instead of s:PrependChar(). Remove it.
    -	Improve scanChar()

v0.60 2007-07-31	Now it nearly is a complete parser and support Java5,6.
			And tested correctly on all java files in jdk6 src.zip.
    2007-07-19	Support new language features in java 5 and above.
    2007-07-25	Add supports for parsing statement, block or expression
    2007-07-28	Place it to autoload directory. 
    2007-07-30	Clean this script.

v0.51 2007-02-13	Optimize several scan function.
v0.50 2007-02-10	Complete the skeleton.


6.3 Reflection.java			*javacomplete-reflection*

v0.77
    2007-09-14	Improved generating information of all packages in jar files.
    2007-09-06	
    -	Improved getting paths of all system jar files for different JDKs 
	in different platforms.
    2007-08-14	Major improvement. Support nontoplevel classes.

v0.76.3
    2007-08-09	Redefined '-P' option for returning all packages and subpackages info in one time.

v0.76.2
    2007-08-06	Return a modifier value as a string because it more than 32bit.

v0.76
    2007-08-04	Support checking and reading package members for '-E'.
    2007-08-02
    -	Add an option '-E'.
    -	Use ZipFile and ZipEntry instead of JarFile and JarEntry,
	so that it can be compiled by and run on JDK1.1 and above.
v0.7  2007-02-17	

==============================================================================
7. Todo						*javacomplete-todo*

-  Improve performance of the embedded parser. Incremental parser.
-  Add quick information using balloonexpr, ballooneval, balloondelay.
-  Add javadoc
-  Give a hint for class name conflict in different packages.
-  Support parameter information for template

==============================================================================
8. Thanks					*javacomplete-thanks*
        * Bram Moolenaar and all Vim contributors for Vim
        * The insenvim project
        * The javac and gjc sources
        * All of you for using this script :)

        * For help, documentation, bug report :
	 	Martin Stubenschrott	author of IComplete
		Vissale NEANG		author of OmniCppComplete
		David Fishburn		author of SQLComplete and others
		Nico Weber		testing on the Mac
		Thomas Link		testing on cygwin+bash
		Zhixing Yu
	* For the bug of 'wildignore' options
		Rodrigo Rosenfeld Rosas
		Alexandru Mo?oi

FeedBack:
Any problem, bug or suggest are welcome to send to fangread@yahoo.com.cn

==============================================================================
 vim:tw=78:ts=8:ft=help:norl:
