Some refactoring in Java parser and highlighter - full Java parser based on PetitParser checked in jk_new_structure
authorvranyj1
Fri, 09 Mar 2012 22:56:58 +0000
branchjk_new_structure
changeset 1403 1740f7ba7015
parent 1402 6ac8931d0174
child 1404 edf0b1f10e9e
Some refactoring in Java parser and highlighter - full Java parser based on PetitParser checked in
src/tools/JavaArrayTypeNode.st
src/tools/JavaBooleanTypeNode.st
src/tools/JavaCharTypeNode.st
src/tools/JavaClassOrInterfaceTypeNode.st
src/tools/JavaCommentNode.st
src/tools/JavaDocNode.st
src/tools/JavaDoubleTypeNode.st
src/tools/JavaFloatTypeNode.st
src/tools/JavaFormalParameterNode.st
src/tools/JavaIntTypeNode.st
src/tools/JavaJavaDocNode.st
src/tools/JavaLongTypeNode.st
src/tools/JavaMethodDeclaratorNode.st
src/tools/JavaMethodNode.st
src/tools/JavaParseNode.st
src/tools/JavaParseNodeBuilder.st
src/tools/JavaParseResult.st
src/tools/JavaParser.st
src/tools/JavaParserI.st
src/tools/JavaParserII.st
src/tools/JavaParserIITests.st
src/tools/JavaParserITests.st
src/tools/JavaParserTestCase.st
src/tools/JavaParserTests.st
src/tools/JavaParser_Eclipse.st
src/tools/JavaParser_Old.st
src/tools/JavaSyntaxHighlighter.st
src/tools/JavaSyntaxHighlighter_Eclipse.st
src/tools/JavaSyntaxHighlighter_Old.st
src/tools/JavaTypeNode.st
src/tools/JavaVoidTypeNode.st
src/tools/Make.proto
src/tools/Make.spec
src/tools/abbrev.stc
src/tools/bc.mak
src/tools/libInit.cc
src/tools/stx_libjava_tools.st
src/tools/tools.rc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaArrayTypeNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,68 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaTypeNode subclass:#JavaArrayTypeNode
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaArrayTypeNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaArrayTypeNode methodsFor:'accessing'!
+
+selector
+    ^ '['
+
+    "Created: / 17-12-2010 / 16:37:59 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaArrayTypeNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaBooleanTypeNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,68 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaTypeNode subclass:#JavaBooleanTypeNode
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaBooleanTypeNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaBooleanTypeNode methodsFor:'accessing'!
+
+selector
+    ^ $b
+
+    "Created: / 17-12-2010 / 18:07:12 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaBooleanTypeNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaCharTypeNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,68 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaTypeNode subclass:#JavaCharTypeNode
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaCharTypeNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaCharTypeNode methodsFor:'accessing'!
+
+selector
+    ^  'c'
+
+    "Created: / 17-12-2010 / 16:38:08 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaCharTypeNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaClassOrInterfaceTypeNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,68 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaTypeNode subclass:#JavaClassOrInterfaceTypeNode
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaClassOrInterfaceTypeNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaClassOrInterfaceTypeNode methodsFor:'accessing'!
+
+selector
+    ^ 'L'
+
+    "Created: / 17-12-2010 / 16:38:17 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaClassOrInterfaceTypeNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaCommentNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,70 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaParseNode subclass:#JavaCommentNode
+	instanceVariableNames:'value'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaCommentNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaCommentNode methodsFor:'accessing'!
+
+value
+    ^ value
+!
+
+value:something
+    value := something.
+! !
+
+!JavaCommentNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaDocNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,60 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaCommentNode subclass:#JavaDocNode
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaDocNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaDocNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaDoubleTypeNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,68 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaTypeNode subclass:#JavaDoubleTypeNode
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaDoubleTypeNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaDoubleTypeNode methodsFor:'accessing'!
+
+selector
+    ^ $d
+
+    "Created: / 17-12-2010 / 18:29:07 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaDoubleTypeNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaFloatTypeNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,68 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaTypeNode subclass:#JavaFloatTypeNode
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaFloatTypeNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaFloatTypeNode methodsFor:'accessing'!
+
+selector
+    ^ $f
+
+    "Created: / 17-12-2010 / 18:13:00 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaFloatTypeNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaFormalParameterNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,76 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaParseNode subclass:#JavaFormalParameterNode
+	instanceVariableNames:'variableDeclaratorId'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaFormalParameterNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaFormalParameterNode methodsFor:'accessing'!
+
+selector
+    ^ type selector,  variableDeclaratorId first value
+
+    "Created: / 17-12-2010 / 16:50:07 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+type:something
+    type := something.
+!
+
+variableDeclaratorId:something
+    variableDeclaratorId := something.
+! !
+
+!JavaFormalParameterNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaIntTypeNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,68 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaTypeNode subclass:#JavaIntTypeNode
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaIntTypeNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaIntTypeNode methodsFor:'accessing'!
+
+selector
+    ^ 'i'
+
+    "Created: / 17-12-2010 / 16:38:25 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaIntTypeNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaJavaDocNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,60 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaCommentNode subclass:#JavaJavaDocNode
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaJavaDocNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaJavaDocNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaLongTypeNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,68 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaTypeNode subclass:#JavaLongTypeNode
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaLongTypeNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaLongTypeNode methodsFor:'accessing'!
+
+selector
+    ^ 'l'
+
+    "Created: / 17-12-2010 / 16:38:31 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaLongTypeNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaMethodDeclaratorNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,90 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaParseNode subclass:#JavaMethodDeclaratorNode
+	instanceVariableNames:'identifier formalParameterList'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaMethodDeclaratorNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaMethodDeclaratorNode methodsFor:'accessing'!
+
+formalParameterList
+    ^ formalParameterList
+!
+
+formalParameterList:something
+    formalParameterList := something.
+!
+
+identifier
+    ^ identifier
+!
+
+identifier:something
+    identifier := something.
+!
+
+parameterSelector
+
+    ^String streamContents:
+        [:s|
+        self formalParameterList 
+            do:[:p|s nextPutAll: (p selector)]
+            separatedBy:[s nextPutAll:'; ']
+        ]
+
+    "Created: / 17-12-2010 / 16:15:36 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaMethodDeclaratorNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaMethodNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,144 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaParseNode subclass:#JavaMethodNode
+	instanceVariableNames:'modifiers declarator javadoc'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaMethodNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaMethodNode methodsFor:'accessing'!
+
+declarator
+    ^ declarator
+!
+
+declarator:something
+    declarator := something.
+!
+
+javadoc
+    ^ javadoc
+!
+
+javadoc:something
+    javadoc := something.
+!
+
+modifiers
+    ^ modifiers
+!
+
+modifiers:something
+    modifiers := something.
+!
+
+selector
+    | name |
+"/    self halt: 'does not work properly ;('.
+    name := self declarator identifier.
+    name := name, '('.
+    name := name, (self declarator parameterSelector).
+    name := name, ')', (self type selector).
+
+    ^name.
+
+    "Created: / 13-12-2010 / 14:35:06 / Jan Kurs <kurs.jan@post.cz>"
+    "Modified: / 17-12-2010 / 17:47:10 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+startPosition
+    startPosition ifNil: [ startPosition := self determineStartPosition. ].
+    ^ startPosition
+
+    "Modified: / 13-12-2010 / 10:35:47 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+type
+    ^ type
+!
+
+type:something
+    type := something.
+! !
+
+!JavaMethodNode methodsFor:'printing & storing'!
+
+printOn:aStream
+    aStream nextPutAll: self selector.
+
+    "Created: / 17-12-2010 / 17:38:20 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaMethodNode methodsFor:'private'!
+
+determineStartPosition
+    self javadoc ifNotNil: [ ^ self javadoc lineNumber].
+    (self modifiers size > 0) ifTrue:[
+        ^ self modifiers first lineNumber
+    ].
+    ^ self type lineNumber.
+
+    "Created: / 13-12-2010 / 10:34:01 / Jan Kurs <kurs.jan@post.cz>"
+    "Modified: / 17-12-2010 / 18:19:30 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaMethodNode methodsFor:'queries'!
+
+isMethodDeclaration
+    ^ true.
+
+    "Created: / 13-12-2010 / 14:34:14 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaMethodNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaParseNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,87 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+ParseNode subclass:#JavaParseNode
+	instanceVariableNames:'lineNumber'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaParseNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaParseNode class methodsFor:'instance creation'!
+
+from: start to: end
+
+    ^self new startPosition: start endPosition: end.
+
+    "Created: / 08-03-2012 / 21:44:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParseNode methodsFor:'accessing'!
+
+lineNumber
+    ^ lineNumber
+!
+
+lineNumber:something
+    lineNumber := something.
+! !
+
+!JavaParseNode methodsFor:'queries'!
+
+isMethodDeclaration
+    ^ false.
+
+    "Created: / 13-12-2010 / 14:34:14 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaParseNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaParseNodeBuilder.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,80 @@
+"{ Package: 'stx:libjava/tools' }"
+
+Object subclass:#JavaParseNodeBuilder
+	instanceVariableNames:'start stop line'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaParseNodeBuilder class methodsFor:'documentation'!
+
+documentation
+"
+    documentation to be added.
+
+    [author:]
+        Jan Vrany <jan.vrany@fit.cvut.cz>
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+
+"
+! !
+
+!JavaParseNodeBuilder methodsFor:'accessing'!
+
+start: startPos stop: stopPos
+
+    start := startPos.
+    stop := stopPos.
+
+    "Created: / 09-03-2012 / 16:52:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+start: startPos stop: stopPos line: lineNr
+
+    start := startPos.
+    stop := stopPos.
+    line := lineNr
+
+    "Created: / 09-03-2012 / 16:53:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParseNodeBuilder methodsFor:'building'!
+
+newComment: text
+
+    ^(self new: JavaCommentNode) value: text
+
+    "Created: / 09-03-2012 / 17:01:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+newJavaDoc: text
+
+    ^(self new: JavaDocNode) value: text
+
+    "Created: / 09-03-2012 / 17:06:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParseNodeBuilder methodsFor:'building-private'!
+
+new: nodeClass
+
+    ^nodeClass new
+        startPosition: start;
+        endPosition: stop;
+        lineNumber: line;
+        yourself
+
+    "Created: / 09-03-2012 / 16:54:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParseNodeBuilder class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaParseResult.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,87 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+Object subclass:#JavaParseResult
+	instanceVariableNames:'collection'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser'
+!
+
+!JavaParseResult class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaParseResult class methodsFor:'instance creation'!
+
+from: aCollection
+    ^ self new
+        collection: aCollection.
+
+    "Created: / 08-01-2011 / 16:06:01 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaParseResult methodsFor:'accessing'!
+
+collection
+    ^ collection
+!
+
+collection:something
+    collection := something.
+! !
+
+!JavaParseResult methodsFor:'instance creation'!
+
+methods
+    ^ self collection at: 6.
+
+    "Created: / 08-01-2011 / 16:06:25 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaParseResult class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- a/src/tools/JavaParser.st	Fri Mar 09 22:51:51 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,134 +0,0 @@
-"
- Copyright (c) 2010-2011 Jan Vrany, Jan Kurs & Marcel Hlopko,
-                         SWING Research Group, Czech Technical University 
-                         in Prague
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the 'Software'), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following
- conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
-"
-"{ Package: 'stx:libjava/tools' }"
-
-Object subclass:#JavaParser
-	instanceVariableNames:'tree'
-	classVariableNames:'ParseTreeCache'
-	poolDictionaries:''
-	category:'Languages-Java-Tools'
-!
-
-!JavaParser class methodsFor:'documentation'!
-
-copyright
-"
- Copyright (c) 2010-2011 Jan Vrany, Jan Kurs & Marcel Hlopko,
-                         SWING Research Group, Czech Technical University 
-                         in Prague
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the 'Software'), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following
- conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
-
-"
-! !
-
-!JavaParser class methodsFor:'class initialization'!
-
-initialize
-
-    ParseTreeCache := CacheDictionary new: 128.
-
-    "Created: / 15-02-2012 / 00:58:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaParser methodsFor:'accessing'!
-
-tree
-    ^ tree
-! !
-
-!JavaParser methodsFor:'parsing'!
-
-parseClass: class
-
-    self assert: class isJavaClass.
-
-    self parseClassSource: class source.
-
-    "Created: / 16-12-2011 / 21:48:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-parseClassSource: source
-
-    ^ParseTreeCache at: source ifAbsentPut:[self parse: source kind: #K_COMPILATION_UNIT].
-
-    "Created: / 16-12-2011 / 21:49:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaParser methodsFor:'parsing-private'!
-
-parse: source kind: kindSym
-
-    | kind astParser |
-
-    kindSym == #K_EXPRESSION ifTrue:[
-        kind := 1
-    ] ifFalse:[kindSym == #K_STATEMENTS ifTrue:[
-        kind := 2        
-    ] ifFalse:[kindSym == #K_CLASS_BODY_DECLARATIONS ifTrue:[
-        kind := 4
-    ] ifFalse:[kindSym == #K_COMPILATION_UNIT ifTrue:[
-        kind := 8
-    ] ifFalse:[
-        self error: 'Unknown source kind'
-    ]]]].
-
-    astParser := (JavaVM classForName:'org.eclipse.jdt.core.dom.ASTParser') newParser: 3"AST.JLS3". 
-    astParser setSource: source string.
-    astParser setKind: kind.
-    tree := astParser createAST: nil.
-    ^tree
-
-    "Created: / 16-12-2011 / 21:43:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaParser class methodsFor:'documentation'!
-
-version_SVN
-    ^ '$Id$'
-! !
-
-JavaParser initialize!
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaParserI.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,655 @@
+"{ Package: 'stx:libjava/tools' }"
+
+PPCompositeParser subclass:#JavaParserI
+	instanceVariableNames:'unicodeEscape rawInputCharacter unicodeMarker hexDigit
+		lineTerminator unicodeInputCharacter inputElements sub
+		inputElement whiteSpace comment javaToken keyword literal
+		separator operator identifier traditionalComment endOfLineComment
+		commentTail charactersInLine commentTailStar notStar
+		notStarNotSlash inputCharacter booleanLiteral nullLiteral
+		identifierChars javaLetter javaLetterOrDigit keywords
+		floatingPointLiteral integerLiteral characterLiteral
+		stringLiteral hexIntegerLiteral octalIntegerLiteral
+		decimalIntegerLiteral decimalNumeral integerTypeSuffix hexNumeral
+		octalNumeral nonZeroDigit digits hexDigits octalDigits octalDigit
+		hexadecimalFloatingPointLiteral decimalFloatingPointLiteral
+		exponentPart floatTypeSuffix exponentIndicator signedInteger sign
+		hexSignificand binaryExponent binaryExponentIndicator
+		escapeSequence singleCharacter stringCharacters stringCharacter
+		octalEscape zeroToThree input operators separators'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser'
+!
+
+JavaParser_Old::SubParser subclass:#MultiLineCommentParser
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:JavaParserI
+!
+
+JavaParser_Old::SubParser subclass:#SingleLineCommentParser
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:JavaParserI
+!
+
+JavaParserI comment:''
+!
+
+
+!JavaParserI class methodsFor:'instance creation'!
+
+new
+    "return an initialized instance"
+
+    ^ self basicNew initialize.
+! !
+
+!JavaParserI class methodsFor:'accessing'!
+
+ignoredNames
+	"Answer a collection of instance-variables that should not be automatically initialized with productions, but that are used internal to the composite parser."
+
+	| newArray |	
+	newArray := Array new: ((self namesToIgnore size) + (super ignoredNames size)).
+	newArray
+		replaceFrom: 1
+		to: self namesToIgnore size
+		with: self namesToIgnore.
+	newArray
+		replaceFrom: (self namesToIgnore size + 1)
+		to: newArray size
+		with: super ignoredNames.	
+	^newArray
+!
+
+namesToIgnore
+
+	^#('keywords' 'operators' 'separators')
+! !
+
+!JavaParserI methodsFor:'accessing'!
+
+start
+	"Default start production."
+
+	^ input end
+! !
+
+!JavaParserI methodsFor:'grammar-comments'!
+
+charactersInLine   
+
+	^ inputCharacter plus
+!
+
+comment
+	"traditional -> /*
+	 endOfLine -> //"
+	^ traditionalComment / endOfLineComment
+!
+
+commentTail
+
+	^ 	('*' asParser , commentTailStar ) /
+		(notStar , commentTail)
+!
+
+commentTailStar 
+
+	^ ('/' asParser ) /
+	  ('*' asParser , commentTailStar ) /
+	  (notStarNotSlash , commentTail )
+!
+
+endOfLineComment 
+
+        ^ (SingleLineCommentParser for: self) trim
+
+    "Modified: / 09-03-2012 / 20:28:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+notStar
+
+	^ lineTerminator / ('*' asParser not , inputCharacter)
+!
+
+notStarNotSlash  
+
+	^ lineTerminator / ((PPPredicateObjectParser anyOf: '*/') not , inputCharacter )
+!
+
+traditionalComment
+
+        ^ (SingleLineCommentParser for: self) trim
+
+    "Modified: / 09-03-2012 / 20:27:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParserI methodsFor:'grammar-identifiers'!
+
+identifier 
+
+	^  self asToken: (((keyword not) , (booleanLiteral not) , (nullLiteral not) , identifierChars ))
+!
+
+identifierChars
+	
+	^ javaLetter plus , javaLetterOrDigit star
+!
+
+javaLetter
+
+	^ (#letter asParser) / (PPPredicateObjectParser anyOf: '_$')
+!
+
+javaLetterOrDigit
+
+	^ javaLetter / (#digit asParser)
+! !
+
+!JavaParserI methodsFor:'grammar-input'!
+
+input
+
+	^ (inputElements optional) , (sub optional)
+!
+
+inputElement
+
+	^ whiteSpace / comment / javaToken
+!
+
+inputElements
+
+	^ inputElement plus
+!
+
+javaToken
+        "/self flag: 'TODO: check order'.
+
+        ^ keyword / literal / separator / operator / identifier
+
+    "Modified: / 23-08-2011 / 00:17:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+sub
+
+	^ (Character value: 26) asParser 
+! !
+
+!JavaParserI methodsFor:'grammar-keywords'!
+
+keyword
+
+        | keywordParsers keywordParser |
+        
+        keywordParsers := keywords keys asSortedCollection "/SortedSafely 
+                                                                collect: [:eachKey | keywords at: eachKey ].
+        keywordParser := nil.
+        keywordParsers do:[:each|
+            keywordParser notNil ifTrue:[
+                keywordParser := keywordParser / each
+            ] ifFalse:[
+                keywordParser := each
+            ]
+        ].
+
+        ^ "self asToken: "keywordParser
+
+    "Modified: / 09-03-2012 / 20:48:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+operator
+
+        | operatorParsers operatorParser |
+        
+        operatorParsers := operators keys asSortedCollection "/SortedSafely 
+                                                                collect: [:eachKey | operators at: eachKey ].
+        operatorParser := nil.
+        operatorParsers do:[:each|
+            operatorParser notNil ifTrue:[
+                operatorParser := operatorParser / each
+            ] ifFalse:[
+                operatorParser := each
+            ]
+        ].
+
+        ^ "self asToken: "operatorParser
+
+    "Modified: / 09-03-2012 / 20:50:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParserI methodsFor:'grammar-lineTerminators'!
+
+inputCharacter 
+
+	^(lineTerminator not) , unicodeInputCharacter ==> #second
+!
+
+lineTerminator
+
+	^ (Character lf asParser) / (Character cr asParser , (Character lf asParser ) optional )
+! !
+
+!JavaParserI methodsFor:'grammar-literals'!
+
+literal
+        "a literal must be a single token. Whitespaces are not allowed inside the literal"
+        
+        ^" self asToken: "(nullLiteral / booleanLiteral / floatingPointLiteral / integerLiteral / characterLiteral / stringLiteral)
+
+    "Modified: / 09-03-2012 / 20:49:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParserI methodsFor:'grammar-literals-boolean'!
+
+booleanLiteral 
+
+ ^ ('true' asParser) / ('false' asParser)
+! !
+
+!JavaParserI methodsFor:'grammar-literals-character'!
+
+characterLiteral 
+
+ ^ $' asParser , ( escapeSequence / singleCharacter ), $' asParser
+!
+
+singleCharacter 	
+
+	^( PPPredicateObjectParser anyOf: '''\') not , inputCharacter ==> #second
+! !
+
+!JavaParserI methodsFor:'grammar-literals-escape'!
+
+escapeSequence 
+
+	^ ($\ asParser , (PPPredicateObjectParser anyOf: 'btnfr""''\' ) ) /
+	   octalEscape 
+!
+
+octalEscape
+
+	^ $\ asParser , ( (zeroToThree , octalDigit , octalDigit) / (octalDigit , octalDigit optional) )
+!
+
+zeroToThree
+
+	^PPPredicateObjectParser anyOf: '0123'
+! !
+
+!JavaParserI methodsFor:'grammar-literals-floating'!
+
+binaryExponent
+
+ ^ binaryExponentIndicator , signedInteger
+!
+
+binaryExponentIndicator
+
+  ^ PPPredicateObjectParser anyOf: 'pP'
+!
+
+decimalFloatingPointLiteral
+
+	|dot|
+	dot := $. asParser.
+
+ ^ ( ( (dot , digits) 
+        / 
+        (digits , dot , digits optional)) , 
+			exponentPart optional , floatTypeSuffix optional ) 
+  	/ 
+  	(digits , 
+		( (exponentPart , floatTypeSuffix optional) 
+		  /
+		  (exponentPart optional , floatTypeSuffix) ))
+!
+
+exponentIndicator
+
+  ^ PPPredicateObjectParser anyOf: 'eE'
+!
+
+exponentPart
+
+ ^ exponentIndicator , signedInteger
+!
+
+floatTypeSuffix
+
+	^ PPPredicateObjectParser anyOf: 'fFdD'
+!
+
+floatingPointLiteral
+
+  ^ hexadecimalFloatingPointLiteral / decimalFloatingPointLiteral
+!
+
+hexSignificand 
+	|dot|
+	dot := $. asParser.
+
+ ^  (hexNumeral , dot optional) /
+    ($0 asParser , (PPPredicateObjectParser anyOf: 'xX') , hexDigits optional , dot , hexDigits )
+!
+
+hexadecimalFloatingPointLiteral
+
+ ^ hexSignificand , binaryExponent , floatTypeSuffix optional
+!
+
+sign
+
+  ^PPPredicateObjectParser anyOf: '-+'
+!
+
+signedInteger
+
+  ^ sign optional , digits
+! !
+
+!JavaParserI methodsFor:'grammar-literals-integer'!
+
+decimalIntegerLiteral
+
+ ^ decimalNumeral , (integerTypeSuffix optional)
+!
+
+decimalNumeral 
+
+	^($0 asParser) / (nonZeroDigit , digits optional) 
+!
+
+digits 
+	"digit is already defined, no need to redefine it"
+	^#digit asParser plus
+!
+
+hexDigits 
+
+	^hexDigit plus
+!
+
+hexIntegerLiteral 
+
+  ^ hexNumeral , (integerTypeSuffix optional)
+!
+
+hexNumeral 
+
+	^$0 asParser, (PPPredicateObjectParser anyOf: 'xX' ), hexDigits
+!
+
+integerLiteral
+
+  ^ hexIntegerLiteral / octalIntegerLiteral / decimalIntegerLiteral
+!
+
+integerTypeSuffix
+
+	^ PPPredicateObjectParser anyOf: 'lL'
+!
+
+nonZeroDigit 
+
+	^PPPredicateObjectParser anyOf: '123456789'.
+!
+
+octalDigit 
+
+	^PPPredicateObjectParser anyOf: '01234567'
+!
+
+octalDigits
+
+	^ octalDigit plus
+!
+
+octalIntegerLiteral 
+
+ ^ octalNumeral , (integerTypeSuffix optional)
+!
+
+octalNumeral 
+
+	^($0 asParser) , octalDigits
+! !
+
+!JavaParserI methodsFor:'grammar-literals-null'!
+
+nullLiteral 
+
+ ^ 'null' asParser
+! !
+
+!JavaParserI methodsFor:'grammar-literals-string'!
+
+stringCharacter
+		
+	^ ( ( PPPredicateObjectParser anyOf: '"\') not , inputCharacter ==> #second ) /
+	   escapeSequence 
+!
+
+stringCharacters
+
+	^ stringCharacter plus
+!
+
+stringLiteral 
+
+ ^ $" asParser , stringCharacters optional , $" asParser
+! !
+
+!JavaParserI methodsFor:'grammar-separators'!
+
+separator
+
+        "should it be:
+        
+        | separatorParsers |
+        separatorParsers := separators keysSortedSafely 
+                                                                collect: [:eachKey | separators at: eachKey ].
+        ^ (separatorParsers reduce: [ :a :b | a / b ]) token trimBlanks
+        
+        for consistency to keywords and operators ?"
+        
+        ^"self asToken: "(PPPredicateObjectParser anyOf: '(){}[];,.' )
+
+    "Modified: / 09-03-2012 / 20:49:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParserI methodsFor:'grammar-unicode-escapes'!
+
+hexDigit 
+
+	^#hex asParser
+!
+
+rawInputCharacter
+
+	^#any asParser
+!
+
+unicodeEscape
+
+	^ $\ asParser , unicodeMarker , hexDigit , hexDigit , hexDigit , hexDigit
+!
+
+unicodeInputCharacter
+
+	 ^ unicodeEscape / rawInputCharacter
+!
+
+unicodeMarker
+
+	^$u asParser plus
+! !
+
+!JavaParserI methodsFor:'grammar-whiteSpace'!
+
+whiteSpace
+
+	^ (Character space asParser ) /
+	  (Character tab asParser ) /
+	  ((Character value: 12) asParser ) /
+		lineTerminator 
+! !
+
+!JavaParserI methodsFor:'initialization'!
+
+initialize
+
+	super initialize.
+	
+	self initializeKeywords.
+	self initializeOperators.
+	self initializeSeparators.
+!
+
+initializeKeywords
+
+	| values |
+	keywords := Dictionary new.
+	values := #('abstract' 'assert' 'boolean' 'break' 'byte' 'case'  'catch' 'char' 'class' 'const'
+	   'continue' 'default' 'do' 'double' 'else' 'enum' 'extends' 'final'  'finally' 'float'
+	   'for' 'if' 'goto' 'implements' 'import' 'instanceof' 'int' 'interface' 'long' 'native'
+	   'new' 'package' 'private' 'protected' 'public' 'return' 'short' 'static' 'strictfp' 'super'
+	   'switch' 'synchronized' 'this' 'throw' 'throws' 'transient' 'try' 'void' 'volatile' 'while').
+	
+	values do: [:eachKeyword |
+		keywords at: eachKeyword 
+			put: (PPUnresolvedParser named: ('keyword', eachKeyword first asUppercase asString , eachKeyword allButFirst))		
+		].
+	
+	keywords keysAndValuesDo:  [:key :value |
+		(keywords at: key) def: (key asParser ,  #word asParser not)]
+!
+
+initializeOperators
+
+	| values |
+	operators := Dictionary new.
+	values := #(	'>>>=' '>>>' '>>=' '>>' '>=' '>'	'<<=' '<<' '<=' '<'	'++' '+=' '+'	'--' '-=' '-'	'&&' '&=' '&'
+					'||' '|=' '|'	'*=' '*'	'%=' '%'	'/=' '/'	'^=' '^'	'!!=' '!!'	'==' '='	'~'	'?'	':'	'@' ).
+	
+	values do: [:eachOperator |
+		operators at: eachOperator 
+			put: (PPUnresolvedParser named: ('operator', eachOperator asString))		
+		].
+	
+	operators  keysAndValuesDo:  [:key :value |
+		(operators at: key) def: (key asParser)]
+!
+
+initializeSeparators
+
+	| values |
+	separators := Dictionary new.
+	values := #( '(' ')' '{' '}' '[' ']' ';' ',' '.' ).
+	
+	values do: [:eachSeparator |
+		separators at: eachSeparator 
+			put: (PPUnresolvedParser named: ('separator', eachSeparator asString))		
+		].
+	
+	separators  keysAndValuesDo:  [:key :value |
+		(separators at: key) def: (key asParser)]
+! !
+
+!JavaParserI methodsFor:'utility'!
+
+asToken: aParser
+
+        ^aParser "javaToken"
+
+    "Modified: / 09-03-2012 / 20:50:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+emptySquaredParenthesis
+
+	^ self asToken: (((self tokenFor: '['), (self tokenFor: ']')))
+!
+
+tokenFor: aString
+
+	^self asToken: (keywords at: aString 
+						ifAbsent: [separators at: aString 
+							ifAbsent: [operators at: aString] ])
+! !
+
+!JavaParserI::MultiLineCommentParser methodsFor:'parsing'!
+
+buildNodeFrom: start to: end line: line text: text
+
+    ^self builder
+        start: start stop: end line: line;
+        newComment: text.
+
+    "Modified: / 29-12-2010 / 21:29:26 / Jan Kurs <kurs.jan@post.cz>"
+    "Created: / 09-03-2012 / 17:05:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+checkStart: aStream
+	^ (aStream next: self startSequence size) = self startSequence 
+!
+
+parseOn:aStream 
+    | literal  wasStar  line  start  end |
+
+    wasStar := false.
+    line := aStream lineNumber.
+    start := aStream position + 1.
+    (self checkStart:aStream) ifFalse:[
+        ^ PPFailure message:self startSequence , ' expected' at:aStream position.
+    ].
+    [
+        literal := aStream next.
+        aStream atEnd ifTrue:[
+            ^ PPFailure message:'unexpected end of input' at:aStream position.
+        ].
+        wasStar and:[ literal = $/ ]
+    ] whileFalse:[ wasStar := literal = $* ].
+    end := aStream position.
+    ^ self buildNodeFrom: start to: end line: nil text: nil.
+
+    "Modified: / 29-12-2010 / 21:29:26 / Jan Kurs <kurs.jan@post.cz>"
+    "Modified: / 09-03-2012 / 19:37:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+startSequence 
+	^ '/*'
+! !
+
+!JavaParserI::SingleLineCommentParser methodsFor:'parsing'!
+
+parseOn: aStream
+        | literal wasStar start end|
+        wasStar := false.
+        start := aStream position + 1.
+        
+        (aStream next: 2) = '//' ifFalse: [
+                ^ PPFailure message: '// expected' at: aStream position.
+        ].
+        
+        [literal := aStream next.
+                literal = (Character cr) or: [ aStream atEnd ]
+        ] whileFalse.
+        end := aStream position.
+        
+        ^ self builder 
+            start: start stop: end;
+            newComment: '<lost comment, fix in CcmmentParser>>parseOn: >'
+
+    "Modified: / 09-03-2012 / 19:37:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParserI class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaParserII.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,1046 @@
+"{ Package: 'stx:libjava/tools' }"
+
+JavaParserI subclass:#JavaParserII
+	instanceVariableNames:'compilationUnit annotations packageDeclaration importDeclaration
+		typeDeclaration qualifiedName annotation
+		classOrInterfaceDeclaration classDeclaration interfaceDeclaration
+		normalClassDeclaration enumDeclaration classModifiers
+		typeParameters type typeList classBody jsuper interfaces
+		typeParameter typeBound enumBody enumConstants
+		enumBodyDeclarations enumConstant arguments classBodyDeclaration
+		normalInterfaceDeclaration annotationTypeDeclaration
+		interfaceModifiers interfaceBody interfaceBodyDeclaration block
+		fieldDeclaration methodDeclaration methodModifiers
+		formalParameters throws qualifiedNameList
+		explicitConstructorInvocation blockStatement fieldModifiers
+		variableDeclarators variableDeclarator variableInitializer
+		interfaceFieldDeclaration interfaceMethodDeclaration
+		classOrInterfaceType primitiveType typeArguments typeArgument
+		formalParameterDecls ellipsisParameterDecl normalParameterDecl
+		variableModifiers nonWildcardTypeArguments primary
+		elementValuePairs elementValue elementValuePair
+		conditionalExpression elementValueArrayInitializer
+		annotationTypeBody annotationTypeElementDeclaration
+		annotationMethodDeclaration localVariableDeclarationStatement
+		statement localVariableDeclaration expression parExpression
+		ifStatement assertStatement basicForStatement
+		enhancedForStatement forInit expressionList forStatement
+		whileStatement catches catchClause formalParameter doStatement
+		tryStatement switchBlockStatementGroup switchLabel
+		switchStatement synchronizedStatement returnStatement
+		throwStatement breakStatement continueStatement
+		expressionStatement labeledStatement emptyStatement
+		assignmentOperator conditionalOrExpression
+		conditionalAndExpression inclusiveOrExpression
+		exclusiveOrExpression andExpression equalityExpression
+		instanceofExpression relationalExpression shiftExpression
+		relationalOperator additiveExpression shiftOperator
+		multiplicativeExpression unaryExpression
+		unaryExpressionNotPlusMinus castExpression selector innerCreator
+		superSuffix identifierSuffix creator classCreatorRest
+		arrayCreator createdName arrayInitializer constructorDeclaration
+		constructorModifiers methodNotConstructorDeclaration wildcard
+		emptySquaredParenthesis methodModifierNotAnnotation
+		classModifierNotAnnotation'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser'
+!
+
+JavaParserII comment:''
+!
+
+
+!JavaParserII methodsFor:'accessing'!
+
+start
+        "Default start production."
+
+        ^ compilationUnit ,self end
+
+    "Modified: / 09-03-2012 / 20:38:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParserII methodsFor:'as yet unclassified'!
+
+explicitConstructorInvocation
+
+	^ (
+		(	nonWildcardTypeArguments optional,
+			((self tokenFor: 'this') / (self tokenFor: 'super')))
+		
+		/	(primary ,
+			(self tokenFor: '.') ,
+			nonWildcardTypeArguments optional,
+			(self tokenFor: 'super'))) ,
+		
+		arguments , 
+		(self tokenFor: ';')
+! !
+
+!JavaParserII methodsFor:'grammar'!
+
+arguments 
+
+	^(self tokenFor: '('),
+		expressionList optional,
+	(self tokenFor: ')')
+!
+
+arrayCreator
+
+	^ 	(	(self tokenFor: 'new') , createdName ,
+			emptySquaredParenthesis plus,
+			arrayInitializer)
+			
+		/(	(self tokenFor: 'new'), createdName ,
+			((self tokenFor: '['), expression , (self tokenFor: ']')) plus,
+			emptySquaredParenthesis star)
+!
+
+arrayInitializer 
+
+	^ (self tokenFor: '{'),
+		(variableInitializer , ((self tokenFor: ','), variableInitializer ) star) optional,
+		(self tokenFor: ',') optional,
+	   (self tokenFor: '}')
+!
+
+block 
+
+	^ (self tokenFor: '{') ,
+		blockStatement star,
+	 (self tokenFor: '}')
+!
+
+classCreatorRest 
+
+	^	arguments , classBody optional
+!
+
+compilationUnit 
+
+	^ (annotations optional, packageDeclaration) optional , importDeclaration star , typeDeclaration plus
+!
+
+createdName 
+
+	^ classOrInterfaceType 
+	/	primitiveType 
+!
+
+creator
+		
+	^	(	(self tokenFor: 'new'), nonWildcardTypeArguments optional , classOrInterfaceType , classCreatorRest)
+		/	arrayCreator
+!
+
+elementValue 
+
+	^conditionalExpression
+	/ annotation 
+	/ elementValueArrayInitializer
+!
+
+elementValueArrayInitializer
+
+	^ (self tokenFor: '{') ,
+		(elementValue , 
+			((self tokenFor: ',') , elementValue ) star
+		) optional ,
+		((self tokenFor: ',') optional ),
+	  (self tokenFor: '}')
+!
+
+elementValuePair 
+
+	^ identifier , (self tokenFor: '=') , elementValue 
+!
+
+elementValuePairs 
+
+	^ elementValuePair , ((self tokenFor: ',') , elementValuePair ) star
+!
+
+importDeclaration 
+
+^	((self tokenFor: 'import') , (self tokenFor: 'static') optional , identifier),
+	(	(	(self tokenFor: '.') , (self tokenFor: '*'))
+		/(	((self tokenFor: '.') , identifier) plus , ((self tokenFor: '.') , (self tokenFor: '*')) optional)
+	),
+	(self tokenFor: ';')
+!
+
+innerCreator 
+
+	^	(self tokenFor: '.'), (self tokenFor: 'new'),
+		nonWildcardTypeArguments optional,
+		identifier ,
+		typeArguments optional,
+		classCreatorRest 
+!
+
+interfaces
+
+	^ (self tokenFor: 'implements') , typeList
+!
+
+jsuper
+
+	^ (self tokenFor: 'extends') , type
+!
+
+nonWildcardTypeArguments 
+
+	^(self tokenFor: '<'),
+		typeList ,
+	(self tokenFor: '>')
+!
+
+packageDeclaration 
+
+	^ (self tokenFor: 'package') , qualifiedName , (self tokenFor: ';')
+!
+
+primary 
+
+	^		parExpression 
+		/(	(self tokenFor: 'this'),
+			((self tokenFor: '.'), identifier ) star,
+			identifierSuffix optional)
+		/(	identifier,
+			((self tokenFor: '.'), identifier ) star,
+			 identifierSuffix optional)
+		/(	(self tokenFor: 'super'), superSuffix )
+		/	literal
+		/	creator
+		/(	primitiveType,
+			emptySquaredParenthesis star,
+			(self tokenFor: '.'), (self tokenFor: 'class'))
+		/(	(self tokenFor: 'void'), (self tokenFor: '.'), (self tokenFor: 'class'))
+			
+!
+
+qualifiedName 
+
+	^ identifier , ((self tokenFor: '.'), identifier ) star
+!
+
+typeBound 
+
+	^ type , ((self tokenFor: '&') , type) star
+!
+
+typeDeclaration
+
+	^ (self tokenFor: ';') / classOrInterfaceDeclaration
+!
+
+typeList 
+
+	^ type , ((self tokenFor: ','), type) star
+!
+
+typeParameter 
+
+	^ identifier , ((self tokenFor: 'extends') , typeBound) optional
+!
+
+typeParameters 
+
+	^ (self tokenFor: '<') , 
+			typeParameter , 
+			((self tokenFor: ',') , typeParameter) star , 
+		(self tokenFor: '>')
+!
+
+variableInitializer 
+
+	^	arrayInitializer 
+	/	expression	
+! !
+
+!JavaParserII methodsFor:'grammar-annotations'!
+
+annotation 
+
+	^(self tokenFor: '@') , qualifiedName ,
+	((self tokenFor: '(') , 
+		(elementValuePairs / elementValue) optional , 
+		(self tokenFor: '(') ) optional
+!
+
+annotationMethodDeclaration
+        "/self flag: 'check whether method modifiers are the right modifiers to use'.
+        
+        ^ methodModifiers ,
+        type ,
+        identifier ,
+        (self tokenFor: '('), (self tokenFor: ')'),
+        ((self tokenFor: 'default'), elementValue ) optional ,
+        (self tokenFor: ';')
+
+    "Modified: / 23-08-2011 / 00:24:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+annotationTypeBody
+
+	^ (self tokenFor: '{') ,
+	(annotationTypeElementDeclaration star),
+	(self tokenFor: '}')
+!
+
+annotationTypeDeclaration 
+
+	^ interfaceModifiers , (self tokenFor: '@'),
+	(self tokenFor: 'interface') ,
+	identifier ,
+	annotationTypeBody
+!
+
+annotationTypeElementDeclaration
+	
+	^ annotationMethodDeclaration
+	/ interfaceFieldDeclaration 
+	/ normalClassDeclaration
+	/ enumDeclaration 
+	/ annotationTypeDeclaration 
+	/ (self tokenFor: ';')
+!
+
+annotations 
+	
+	^ annotation plus
+! !
+
+!JavaParserII methodsFor:'grammar-classes'!
+
+classBody 
+
+	^ (self tokenFor: '{') , classBodyDeclaration star , (self tokenFor: '}')
+!
+
+classBodyDeclaration 
+
+	^ (self tokenFor: ';')
+	/ ((self tokenFor: 'static') optional , block)
+	/ fieldDeclaration
+	/ methodDeclaration
+	/ classDeclaration 
+	/ interfaceDeclaration 
+	
+!
+
+classDeclaration 
+
+	^ normalClassDeclaration 
+	/ enumDeclaration
+!
+
+classOrInterfaceDeclaration
+
+	^ classDeclaration 
+	/ interfaceDeclaration
+!
+
+classOrInterfaceType 
+
+	^ identifier ,
+	typeArguments optional,
+	((self tokenFor: '.'), identifier , typeArguments optional ) star
+!
+
+ellipsisParameterDecl
+
+	^ variableModifiers ,
+	type ,
+	('...' asParser token trim) ,
+	identifier
+!
+
+fieldDeclaration
+		
+		^ fieldModifiers , type , variableDeclarators , (self tokenFor: ';')
+!
+
+fieldModifiers
+
+	^ ((self tokenFor: 'volatile') /
+		(self tokenFor: 'final') /
+		(self tokenFor: 'protected') /
+		(self tokenFor: 'private') /
+		(self tokenFor: 'public') /
+		(self tokenFor: 'static') /
+		(self tokenFor: 'transient') /
+		annotation) star
+!
+
+formalParameter 
+
+	^ variableModifiers ,
+	type ,
+	identifier ,
+	emptySquaredParenthesis star
+!
+
+formalParameterDecls
+	
+	^ ellipsisParameterDecl
+
+    /   ((normalParameterDecl , 
+		(self tokenFor: ',')) plus , 
+		ellipsisParameterDecl)
+		
+    /   (normalParameterDecl , 
+		((self tokenFor: ',') , normalParameterDecl) star)
+!
+
+formalParameters 
+
+	^ (self tokenFor: '(') ,
+	formalParameterDecls optional ,
+	(self tokenFor: ')')
+!
+
+normalClassDeclaration 
+
+	^ classModifiers , (self tokenFor: 'class') , identifier ,
+		typeParameters optional,
+		jsuper optional,
+		interfaces optional ,
+		classBody
+!
+
+normalParameterDecl
+
+	^ variableModifiers ,
+	type ,
+	identifier ,
+	emptySquaredParenthesis star
+!
+
+primitiveType 
+
+	^ (self tokenFor: 'boolean')  
+		"numeric types"
+		/ (self tokenFor: 'byte')
+		/ (self tokenFor: 'short')
+		/ (self tokenFor: 'int')
+		/ (self tokenFor: 'long')
+		/ (self tokenFor: 'char')
+		/ (self tokenFor: 'float')
+		/ (self tokenFor: 'double')
+!
+
+type 
+
+	^ (	classOrInterfaceType 
+		/ primitiveType
+	), 
+	emptySquaredParenthesis star
+!
+
+typeArgument 
+
+	^ type
+	/ wildcard
+!
+
+typeArguments 
+
+	^ (self tokenFor: '<') , 
+		(typeArgument , ((self tokenFor: ','), typeArgument) star ) , 
+	(self tokenFor: '>')
+!
+
+variableDeclarator 
+
+	^ identifier ,
+	((self tokenFor: '[') , (self tokenFor: ']')) star ,
+	((self tokenFor: '=') , variableInitializer) optional
+!
+
+variableDeclarators
+
+	^ variableDeclarator , ((self tokenFor: ','), variableDeclarator) star
+!
+
+wildcard 
+
+	^ (self tokenFor: '?') ,
+		(	((self tokenFor: 'extends')/(self tokenFor: 'super')), 
+			type 
+		) optional
+! !
+
+!JavaParserII methodsFor:'grammar-classes-enum'!
+
+enumBody 
+
+	^ (self tokenFor: '{') ,
+		enumConstants optional ,
+		(self tokenFor: ',') optional ,
+		enumBodyDeclarations optional ,
+		(self tokenFor: '}')
+!
+
+enumBodyDeclarations 
+
+	^ (self tokenFor: ';') , classBodyDeclaration star
+!
+
+enumConstant
+
+	^ annotations optional , identifier , arguments optional , classBody optional 
+!
+
+enumConstants 
+
+	^ enumConstant , ((self tokenFor: ',') , enumConstant) star
+!
+
+enumDeclaration 
+
+	^ classModifiers ,
+	   (self tokenFor: 'enum'),
+	   identifier ,
+	   interfaces optional,
+	   enumBody
+! !
+
+!JavaParserII methodsFor:'grammar-classes-interface'!
+
+interfaceBody
+
+	^ (self tokenFor: '{') , interfaceBodyDeclaration star , (self tokenFor: '}')
+!
+
+interfaceBodyDeclaration 
+
+	^ interfaceFieldDeclaration
+	/ interfaceMethodDeclaration
+	/ interfaceDeclaration 
+	/ classDeclaration 
+	/ (self tokenFor: ';')
+!
+
+interfaceDeclaration 
+
+	^normalInterfaceDeclaration 
+	/ annotationTypeDeclaration
+!
+
+interfaceFieldDeclaration 
+
+	^ fieldModifiers , 
+	type ,
+	variableDeclarators ,
+	(self tokenFor: ';')
+!
+
+interfaceMethodDeclaration 
+
+	^ methodModifiers ,
+	typeParameters optional,
+	((self tokenFor: 'void') / type) ,
+	identifier ,
+	formalParameters ,
+	emptySquaredParenthesis star ,
+	throws optional ,
+	(self tokenFor: ';')
+!
+
+interfaceModifiers
+
+	^ ((self tokenFor: 'abstract')
+		/(self tokenFor: 'protected') 
+		/(self tokenFor: 'private') 
+		/(self tokenFor: 'public') 
+		/(self tokenFor: 'static')
+		/(self tokenFor: 'strictfp') 
+		/annotation) star
+!
+
+normalInterfaceDeclaration
+
+	^ interfaceModifiers , 
+	(self tokenFor: 'interface') , 
+	identifier , 
+	typeParameters optional , 
+	((self tokenFor: 'extends') , typeList ) optional ,
+	interfaceBody
+! !
+
+!JavaParserII methodsFor:'grammar-classes-method'!
+
+constructorDeclaration
+
+	^ constructorModifiers optional , 
+	   typeParameters optional , 
+	   identifier,
+	   formalParameters ,
+	   throws optional , 
+	   (self tokenFor: '{' ) , 
+			explicitConstructorInvocation optional ,
+			blockStatement star ,
+	   (self tokenFor: '}')
+	
+!
+
+constructorModifiers 
+
+	^ ((self tokenFor: 'protected')
+		/ (self tokenFor: 'private')
+		/ (self tokenFor: 'public')
+		/ annotation) plus
+!
+
+methodDeclaration
+
+	^ constructorDeclaration 
+	/ methodNotConstructorDeclaration
+!
+
+methodModifierNotAnnotation
+
+	^ (self tokenFor: 'abstract')
+		/ (self tokenFor: 'final')
+		/ (self tokenFor: 'native')
+		/ (self tokenFor: 'protected')
+		/ (self tokenFor: 'private')
+		/ (self tokenFor: 'public')
+		/ (self tokenFor: 'static')
+		/ (self tokenFor: 'strictfp') 
+		/ (self tokenFor: 'synchronized') 
+!
+
+methodModifiers 
+
+	^ (	methodModifierNotAnnotation
+		/ annotation) star
+!
+
+methodNotConstructorDeclaration
+
+	^ methodModifiers,
+	   typeParameters optional,
+	   ((self tokenFor: 'void') / type),
+	   identifier,
+	   formalParameters ,
+	   emptySquaredParenthesis star ,
+	   throws optional,
+	   (block / (self tokenFor: ';'))
+!
+
+qualifiedNameList 
+
+	^ qualifiedName , ((self tokenFor: ',') , qualifiedName ) star
+!
+
+throws 
+
+	^ (self tokenFor: 'throws') , qualifiedNameList
+! !
+
+!JavaParserII methodsFor:'grammar-expressions'!
+
+additiveExpression
+
+	^ multiplicativeExpression , 
+	(( (self tokenFor: '+') / (self tokenFor: '-') ) , multiplicativeExpression ) star
+!
+
+andExpression
+
+	^ equalityExpression , ((self tokenFor: '&') , equalityExpression) star
+!
+
+assignmentOperator 
+
+	^ (self tokenFor: '=')
+	/ (self tokenFor: '>>>=')
+	/	(self tokenFor: '>>=')
+	/	(self tokenFor: '<<=')
+	/	(self tokenFor: '&=')
+	/	(self tokenFor: '^=')
+	/	(self tokenFor: '|=')
+	/	(self tokenFor: '-=')
+	/	(self tokenFor: '+=')
+	/	(self tokenFor: '%=')
+	/	(self tokenFor: '/=')
+	/	(self tokenFor: '*=')
+		
+!
+
+castExpression
+
+	^ ((self tokenFor: '('), 
+			primitiveType ,
+		(self tokenFor: ')'), unaryExpression )
+		
+	/ ((self tokenFor: '('),
+			type,
+		(self tokenFor: ')'), unaryExpressionNotPlusMinus )
+!
+
+conditionalAndExpression 
+
+	^inclusiveOrExpression ,
+	((self tokenFor: '&&'), inclusiveOrExpression ) star
+!
+
+conditionalExpression 
+
+	^conditionalOrExpression ,
+	((self tokenFor: '?'), expression , (self tokenFor: ':'), conditionalExpression ) optional
+!
+
+conditionalOrExpression 
+
+	^conditionalAndExpression ,
+	((self tokenFor: '||'), conditionalAndExpression ) star
+!
+
+equalityExpression
+
+	^ instanceofExpression , 
+	(((self tokenFor: '!!=') / (self tokenFor: '==')) , instanceofExpression) star
+!
+
+exclusiveOrExpression
+
+	^ andExpression , ((self tokenFor: '^') , andExpression) star
+!
+
+expression 
+
+	^ conditionalExpression , 
+	(assignmentOperator , expression) optional
+!
+
+identifierSuffix 
+
+	^ (		emptySquaredParenthesis plus , (self tokenFor: '.'), (self tokenFor: 'class'))
+		/	(((self tokenFor: '[') , expression , (self tokenFor: ']')) plus)
+		/	arguments 
+		/	((self tokenFor: '.'),
+			(	(self tokenFor: 'class')
+			/	(self tokenFor: 'this')
+			/	((self tokenFor: 'super'), arguments)
+			/	(nonWildcardTypeArguments , identifier , arguments)))
+		/	innerCreator
+!
+
+inclusiveOrExpression
+
+	^ exclusiveOrExpression , 
+	((self tokenFor: '|') , exclusiveOrExpression) star
+!
+
+instanceofExpression
+
+	^  relationalExpression , 
+	((self tokenFor: 'instanceof') , type) optional
+!
+
+multiplicativeExpression
+
+	^ unaryExpression , 
+	(( (self tokenFor: '*') 
+	   / (self tokenFor: '/') 
+	   / (self tokenFor: '%') ) , unaryExpression ) star
+!
+
+parExpression
+
+	^ (self tokenFor: '(') , expression , (self tokenFor: ')')
+!
+
+relationalExpression
+
+	^  shiftExpression , 
+	(relationalOperator , shiftExpression) star
+!
+
+relationalOperator
+
+	^ (self tokenFor: '<=')
+	/ (self tokenFor: '>=')
+	/	(self tokenFor: '<')
+	/	(self tokenFor: '>')
+!
+
+selector 
+
+	^	(	(self tokenFor: '.') , identifier, arguments optional )
+		/(	(self tokenFor: '.'), (self tokenFor: 'this'))
+		/(	(self tokenFor: '.'), (self tokenFor: 'super'), superSuffix)
+		/	innerCreator 
+		/(	(self tokenFor: '['), expression , (self tokenFor: ']'))
+!
+
+shiftExpression
+
+	^ additiveExpression,
+	(shiftOperator , additiveExpression) star
+!
+
+shiftOperator 
+        "/self flag: 'maybe it should be detokenized, check the behavior with javac'.
+
+        ^ (self tokenFor: '<<')
+        / (self tokenFor: '>>>')
+        /       (self tokenFor: '>>')
+
+    "Modified: / 23-08-2011 / 00:25:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+superSuffix 
+
+	^ arguments 
+	/ (	(self tokenFor: '.'), typeArguments optional ,
+		identifier ,
+		arguments optional)
+!
+
+unaryExpression 
+
+	^ (((self tokenFor: '++')
+		/(self tokenFor: '+')
+		/(self tokenFor: '--')
+		/(self tokenFor: '-')),
+			unaryExpression)
+	/unaryExpressionNotPlusMinus
+!
+
+unaryExpressionNotPlusMinus 
+	
+	^ ( ( 	(self tokenFor: '~') 
+			/(self tokenFor: '!!') ) , unaryExpression )
+	/castExpression
+	/ (	primary,
+		selector star,
+		(	(self tokenFor: '++')
+			/(self tokenFor: '--')) optional)
+! !
+
+!JavaParserII methodsFor:'grammar-modifiers'!
+
+classModifierNotAnnotation
+
+	^	(self tokenFor: 'abstract') 
+	/	(self tokenFor: 'final') 
+	/	(self tokenFor: 'protected') 
+	/	(self tokenFor: 'private') 
+	/	(self tokenFor: 'public') 
+	/	(self tokenFor: 'static')
+	/	(self tokenFor: 'strictfp') 
+		
+!
+
+classModifiers
+
+	^ (classModifierNotAnnotation 
+		/annotation) star
+!
+
+variableModifiers 
+
+	^((self tokenFor: 'final') 
+	  / annotation) star
+! !
+
+!JavaParserII methodsFor:'grammar-statements'!
+
+assertStatement 
+
+	^ (self tokenFor: 'assert') , expression , 
+	((self tokenFor: ':'), expression ) optional ,
+	(self tokenFor: ';')
+!
+
+basicForStatement
+
+	^ (self tokenFor: 'for') ,
+	(self tokenFor: '('),
+		forInit optional, (self tokenFor: ';'),
+		expression , (self tokenFor: ';'),
+		expressionList optional,
+	(self tokenFor: ')'),
+	statement
+		
+!
+
+blockStatement  
+
+	^ localVariableDeclarationStatement
+	/ classOrInterfaceDeclaration 
+	/ statement
+!
+
+breakStatement 
+
+	^ (self tokenFor: 'break') , identifier optional , (self tokenFor: ';')
+!
+
+catchClause
+
+	^ (self tokenFor: 'catch') ,
+	(self tokenFor: '(') ,
+		formalParameter ,
+	(self tokenFor: ')'), 
+	block
+	
+!
+
+catches 
+
+	^ catchClause , catchClause star
+!
+
+continueStatement 
+
+	^ (self tokenFor: 'continue') , identifier optional , (self tokenFor: ';')
+!
+
+doStatement
+
+	^(self tokenFor: 'do') , statement ,
+	(self tokenFor: 'while') , parExpression ,
+	(self tokenFor: ';')
+!
+
+emptyStatement 
+
+	^ (self tokenFor: ';')
+!
+
+enhancedForStatement
+
+	^ (self tokenFor: 'for') , 
+	(self tokenFor: '(') , 
+		variableModifiers , 
+		type , 
+		identifier , 
+		(self tokenFor: ':'),
+		expression,
+	(self tokenFor: ')'),
+	statement
+!
+
+expressionList 
+
+	^ expression , ((self tokenFor: ','), expression ) star
+!
+
+expressionStatement 
+
+	^ expression , (self tokenFor: ';')
+!
+
+forInit
+
+	^ localVariableDeclaration 
+	/ expressionList 
+!
+
+forStatement
+
+	^ enhancedForStatement 
+	/ basicForStatement
+!
+
+ifStatement
+
+	^(self tokenFor: 'if') , parExpression , statement , 
+	((self tokenFor: 'else'), statement ) optional
+!
+
+labeledStatement 
+
+	^ identifier , (self tokenFor: ':') , statement 
+!
+
+localVariableDeclaration
+
+	^ variableModifiers , type , variableDeclarators 
+!
+
+localVariableDeclarationStatement
+
+	^ localVariableDeclaration , (self tokenFor: ';')
+!
+
+returnStatement 
+
+	^ (self tokenFor: 'return') , expression optional , (self tokenFor: ';')
+!
+
+statement 
+
+	^ block
+	/ assertStatement
+	/ ifStatement
+	/ forStatement
+	/ whileStatement
+	/ doStatement
+	/ tryStatement
+	/ switchStatement
+	/ synchronizedStatement
+	/ returnStatement
+	/ throwStatement
+	/ breakStatement
+	/ continueStatement
+	/ expressionStatement
+	/ labeledStatement
+	/ emptyStatement
+!
+
+switchBlockStatementGroup
+	
+	^ switchLabel , blockStatement star
+!
+
+switchLabel 
+
+	^ ((self tokenFor: 'case') , expression , (self tokenFor: ':'))
+	/ ((self tokenFor: 'default'), (self tokenFor: ':'))
+!
+
+switchStatement
+
+	^(self tokenFor: 'switch') , parExpression , 
+	(self tokenFor: '{'),
+		switchBlockStatementGroup star ,
+	(self tokenFor: '}')
+!
+
+synchronizedStatement 
+
+	^ (self tokenFor: 'synchronized') , parExpression , block
+!
+
+throwStatement 
+
+	^ (self tokenFor: 'throw') , expression , (self tokenFor: ';')
+!
+
+tryStatement 
+
+	^ (self tokenFor: 'try') , block ,
+	(	(catches , (self tokenFor: 'finally') , block)
+		/ catches
+		/ ((self tokenFor: 'finally'), block)
+	)
+!
+
+whileStatement
+
+	^(self tokenFor: 'while') , parExpression , statement
+! !
+
+!JavaParserII class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaParserIITests.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,209 @@
+"{ Package: 'stx:libjava/tools' }"
+
+PPCompositeParserTest subclass:#JavaParserIITests
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Tests-Parser'
+!
+
+
+!JavaParserIITests methodsFor:'accessing'!
+
+parserClass
+        ^ JavaParserII
+
+    "Modified: / 09-03-2012 / 23:27:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParserIITests methodsFor:'testing'!
+
+testCompilationUnit1
+
+	self parse: 'package foo;
+				public class CU1 {}'
+	rule: #compilationUnit
+!
+
+testCompilationUnit2
+
+	self parse: 'package foo;
+				import foo.Bar;
+				public class CU2 {
+				}'
+	rule: #compilationUnit
+!
+
+testCompilationUnit3
+
+	self parse: 'class myfirstjavaprog
+{  
+        public static void main(String args[])
+        {
+           System.out.println("Hello World!!");
+        }
+}'
+	rule: #compilationUnit
+!
+
+testCompilationUnit4
+
+	self parse: '
+					public class OddEven {
+ 						private int input;
+ 					  public static void main(String[] args) {
+     					OddEven number = new OddEven();
+					        number.showDialog(); }
+					public void showDialog() {
+       
+        try {
+          
+            input = Integer.parseInt(JOptionPane.showInputDialog("Please Enter A Number"));
+            calculate();
+        } catch (NumberFormatException e) {
+            
+            System.err.println("ERROR: Invalid input. Please type in a numerical value.");
+        }
+    }
+
+private void calculate() {
+        if (input % 2 == 0) {
+            System.out.println("Even");
+        } else {
+            System.out.println("Odd");
+        }
+    }
+					}'
+	rule: #compilationUnit
+!
+
+testCompilationUnit5
+
+	self parse: 'class myfirstjavaprog
+{  
+
+		public myfirstjavaprog() {
+			
+		}
+	
+        public static void main(String args[])
+        {
+           System.out.println("Hello World!!");
+        }
+}'
+	rule: #compilationUnit
+!
+
+testFormalParameters1
+
+	self 
+		parse: '
+    (String s, Object parameterType)
+'
+	rule: #formalParameters
+!
+
+testFormalParameters2
+
+	self 
+		parse: '
+    (Object ... parameterType)
+'
+	rule: #formalParameters
+!
+
+testFormalParameters3
+
+	self 
+		parse: '(String name, Class<?>... parameterTypes)
+'
+	rule: #formalParameters
+!
+
+testImportDeclaration1
+
+	self parse: 'import foo.Top;'
+		rule: #importDeclaration
+!
+
+testImportDeclaration2
+
+	self parse: 'import foo.Top2.*;'
+		rule: #importDeclaration
+!
+
+testMethodDeclaration3
+
+	self 
+		parse: '
+    public void getMethod(String s, Object ... parameterType)
+    {
+    }
+'
+	rule: #methodDeclaration
+!
+
+testPackageDeclaration1
+
+	self parse: 'package foo;'
+		rule: #packageDeclaration
+!
+
+testPackageDeclaration2
+
+	self parse: 'package foo.Bar;'
+		rule: #packageDeclaration
+!
+
+testPackageDeclaration3
+
+	self fail: 'package ;'
+		rule: #packageDeclaration
+!
+
+testQualifiedName1
+
+	self parse: 'a.a'
+		rule: #qualifiedName
+!
+
+testUnaryExpression1
+
+	self parse: 'a'
+		rule: #unaryExpression
+! !
+
+!JavaParserIITests methodsFor:'testing-classes'!
+
+testClassDeclaration1
+
+	self parse: '//comment
+	class myfirstjavaprog
+{  
+        public static void main(String args[])
+        {
+           System.out.println("Hello World!!");
+        }
+}'
+	rule: #classDeclaration
+!
+
+testMethodDeclaration1
+
+	self 
+		parse: 'public void aMethod() {	}'
+			rule: #methodDeclaration
+!
+
+testMethodDeclaration2
+
+	self 
+		parse: 'public aMethod() {	}'
+			rule: #methodDeclaration
+! !
+
+!JavaParserIITests class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaParserITests.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,691 @@
+"{ Package: 'stx:libjava/tools' }"
+
+PPCompositeParserTest subclass:#JavaParserITests
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Tests-Parser'
+!
+
+
+!JavaParserITests methodsFor:'accessing'!
+
+parserClass
+        ^ JavaParserI
+
+    "Modified: / 09-03-2012 / 23:27:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParserITests methodsFor:'testing'!
+
+testIdentifier6
+
+	self
+		fail: 'super'
+		rule: #identifier
+!
+
+testIdentifier7
+
+	self
+		fail: 'super'
+		rule: #identifier
+! !
+
+!JavaParserITests methodsFor:'testing-comments'!
+
+testComment1
+
+	self 
+		parse: '//'
+		rule: #comment
+!
+
+testComment2
+
+	self 
+		parse: '//comment'
+		rule: #comment
+!
+
+testComment3
+
+	self 
+		parse: '// comment'
+		rule: #comment
+!
+
+testComment4
+
+	self 
+		parse: '/* comment */'
+		rule: #comment
+!
+
+testComment5
+
+	self 
+		fail: '/* comment '
+		rule: #comment
+!
+
+testComment6
+
+	self 
+		parse: '/* this comment /* // /** ends here: */'
+		rule: #comment
+!
+
+testTraditionalComment1
+
+	self 
+		parse: '/* this comment */'
+		rule: #traditionalComment
+!
+
+testTraditionalComment2
+
+	self 
+		parse: '/* this comment / */'
+		rule: #comment
+! !
+
+!JavaParserITests methodsFor:'testing-identifiers'!
+
+testIdentifier                                             
+!
+
+testIdentifier1
+
+	self
+		parse: 'String'
+		rule: #identifier
+!
+
+testIdentifier2
+
+	self
+		parse: 'i3'
+		rule: #identifier
+!
+
+testIdentifier4
+
+	self
+		parse: 'MAX_VALUE'
+		rule: #identifier
+!
+
+testIdentifier5
+
+	self
+		parse: 'isLetterOrDigit'
+		rule: #identifier
+! !
+
+!JavaParserITests methodsFor:'testing-input'!
+
+testInput1
+
+	self parse: 'package testPackage;
+						class Test {
+        				public static void main(String[] args) {
+                			String hello = "Hello", lo = "lo";
+                			System.out.print((hello == "Hello") + " ");
+                			System.out.print((Other.hello == hello) + " ");
+                			System.out.print((other.Other.hello == hello) + " ");
+                			System.out.print((hello == ("Hel"+"lo")) + " ");
+                			System.out.print((hello == ("Hel"+lo)) + " ");
+                			System.out.println(hello == ("Hel"+lo).intern());
+        				}
+						}
+						class Other { static String hello = "Hello"; }'
+	rule: #input
+!
+
+testInput2
+
+	self parse: 'package other;
+						public class Other { static String hello = "Hello"; }'
+	rule: #input
+!
+
+testInput3
+
+	self parse: 'class Value { int val; }	
+						class Test {
+        				public static void main(String[] args) {
+              			int i1 = 3;
+                		int i2 = i1;
+                		i2 = 4;
+                		System.out.print("i1==" + i1);
+                		System.out.println(" but i2==" + i2);
+                		Value v1 = new Value();
+                		v1.val = 5;
+                		Value v2 = v1;
+                		v2.val = 6;
+                		System.out.print("v1.val==" + v1.val);
+                		System.out.println(" and v2.val==" + v2.val);
+        				}
+						}'
+	rule: #input
+! !
+
+!JavaParserITests methodsFor:'testing-lineTerminators'!
+
+testInputCharacter1
+
+	self
+		parse: '\'
+		rule: #inputCharacter
+!
+
+testInputCharacter2
+
+	self
+		fail: (Character cr asString)
+		rule: #inputCharacter
+!
+
+testInputCharacter3
+
+	self
+		fail: (Character lf asString)
+		rule: #inputCharacter
+!
+
+testLineTerminator1
+
+	self
+		parse: (Character lf asString)
+		rule: #lineTerminator
+!
+
+testLineTerminator2
+
+	self
+		parse: (Character cr asString)
+		rule: #lineTerminator
+!
+
+testLineTerminator3
+
+	self
+		parse: (Character cr asString , Character lf asString)
+		rule: #lineTerminator
+!
+
+testLineTerminator4
+
+	self
+		fail: (Character space asString)
+		rule: #lineTerminator
+! !
+
+!JavaParserITests methodsFor:'testing-literal-float'!
+
+testFloatLiteral1
+	self 
+		parse: '1e1f'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral10
+	self 
+		parse: '0.0'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral11
+	self 
+		parse: '3.14'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral12
+	self 
+		parse: '1e-9d'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral13
+	self 
+		parse: '1e137'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral2
+	self 
+		parse: '2.f'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral3
+	self 
+		parse: '.3f'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral4
+	self 
+		parse: '0f'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral5
+	self 
+		parse: '3.14f'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral6
+	self 
+		parse: '6.022137e+23f'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral7
+	self 
+		parse: '1e1'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral8
+	self 
+		parse: '2.'
+		rule: #floatingPointLiteral
+!
+
+testFloatLiteral9
+	self 
+		parse: '.3'
+		rule: #floatingPointLiteral
+! !
+
+!JavaParserITests methodsFor:'testing-literals'!
+
+testBooleanLiteral1
+	self 
+		parse: 'true'
+		rule: #booleanLiteral
+!
+
+testBooleanLiteral2
+	self 
+		parse: 'false'
+		rule: #booleanLiteral
+!
+
+testLiteral1
+
+	self 
+		parse: 'null'
+		rule: #literal
+!
+
+testLiteral10
+
+	self 
+		fail: '0777 L'
+		rule: #literal
+!
+
+testLiteral11
+
+	self 
+		fail: '0777 0'
+		rule: #literal
+!
+
+testLiteral12
+
+	self 
+		fail: '0 x'
+		rule: #literal
+!
+
+testLiteral2
+
+	self 
+		parse: 'false'
+		rule: #literal
+!
+
+testLiteral3
+
+	self 
+		parse: '6.022137e+23f'
+		rule: #literal
+!
+
+testLiteral4
+
+	self 
+		parse: '1e1'
+		rule: #literal
+!
+
+testLiteral5
+
+	self 
+		parse: '0x100000000L'
+		rule: #literal
+!
+
+testLiteral6
+
+	self 
+		parse: '0372'
+		rule: #literal
+!
+
+testLiteral7
+
+	self 
+		parse: '0xDadaCafe'
+		rule: #literal
+!
+
+testLiteral8
+
+	self 
+		parse: '0x00FF00FF'
+		rule: #literal
+!
+
+testLiteral9
+
+	self 
+		parse: '0777L'
+		rule: #literal
+!
+
+testNullLiteral1
+
+	self 
+		parse: 'null'
+		rule: #nullLiteral
+!
+
+testStringLiteral1
+
+	self 
+		parse: '""'
+		rule: #stringLiteral
+!
+
+testStringLiteral10
+
+	self 
+		fail: '"This is a \\
+				two lines Java string"'
+		rule: #stringLiteral
+!
+
+testStringLiteral11
+
+	self 
+		parse: '"null"'
+		rule: #stringLiteral
+!
+
+testStringLiteral2
+
+	self 
+		parse: '"\""'
+		rule: #stringLiteral
+!
+
+testStringLiteral3
+
+	self 
+		parse: '"This is a Java string"'
+		rule: #stringLiteral
+!
+
+testStringLiteral4
+
+	self 
+		fail: '"This is a 
+				two lines Java string"'
+		rule: #stringLiteral
+!
+
+testStringLiteral5
+
+	self 
+		fail: '"This is a \b
+				two lines Java string"'
+		rule: #stringLiteral
+!
+
+testStringLiteral6
+
+	self 
+		fail: '"This is a \t
+				two lines Java string"'
+		rule: #stringLiteral
+!
+
+testStringLiteral7
+
+	self 
+		fail: '"This is a \n
+				two lines Java string"'
+		rule: #stringLiteral
+!
+
+testStringLiteral8
+
+	self 
+		fail: '"This is a \f
+				two lines Java string"'
+		rule: #stringLiteral
+!
+
+testStringLiteral9
+
+	self 
+		fail: '"This is a \r
+				two lines Java string"'
+		rule: #stringLiteral
+! !
+
+!JavaParserITests methodsFor:'testing-literals-characters'!
+
+testCharacterLiteral1
+	self 
+		parse: '''a'''
+		rule: #characterLiteral
+!
+
+testCharacterLiteral2
+	self 
+		parse: '''%'''
+		rule: #characterLiteral
+!
+
+testCharacterLiteral3
+	self 
+		parse: '''\t'''
+		rule: #characterLiteral
+!
+
+testCharacterLiteral4
+	self 
+		parse: '''\\'''
+		rule: #characterLiteral
+!
+
+testCharacterLiteral5
+	self 
+		parse: '''\'''''
+		rule: #characterLiteral
+!
+
+testCharacterLiteral6
+	"not clear how this must be supported
+	(see http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.6)"
+	
+	"self 
+		parse: '''\u03a9'''
+		rule: #characterLiteral"
+!
+
+testCharacterLiteral7
+	"not clear how this must be supported
+	(see http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.6)"
+	
+	"self 
+		parse: '''\uFFFF'''
+		rule: #characterLiteral"
+!
+
+testCharacterLiteral8
+	self 
+		parse: '''\177'''
+		rule: #characterLiteral
+!
+
+testCharacterLiteral9
+	self 
+		parse: '''\177'''
+		rule: #characterLiteral
+! !
+
+!JavaParserITests methodsFor:'testing-literals-integer'!
+
+testHexIntegerLiteral1
+	self 
+		parse: '0xC0B0L'
+		rule: #hexIntegerLiteral
+!
+
+testIntegerLiteral1
+	self 
+		parse: '0'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral10
+	self 
+		parse: '1996'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral11
+	self 
+		parse: '0x00FF00FF'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral2
+	self 
+		parse: '0l'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral3
+	self 
+		parse: '0777L'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral4
+	self 
+		parse: '0x100000000L'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral5
+	self 
+		parse: '2147483648L'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral6
+	self 
+		parse: '0xC0B0L'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral7
+	self 
+		parse: '2'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral8
+	self 
+		parse: '0372'
+		rule: #integerLiteral
+!
+
+testIntegerLiteral9
+	self 
+		parse: '0xDadaCafe'
+		rule: #integerLiteral
+!
+
+testOctalIntegerLiteral1
+	self 
+		parse: '0777L'
+		rule: #octalIntegerLiteral
+! !
+
+!JavaParserITests methodsFor:'testing-unicode'!
+
+testUnicodeEscape1
+
+	self
+		parse: '\u0000'
+		rule: #unicodeEscape
+!
+
+testUnicodeEscape2
+
+	self
+		fail: '\u000'
+		rule: #unicodeEscape
+!
+
+testUnicodeEscape3
+
+	self
+		fail: '\u00000'
+		rule: #unicodeEscape
+!
+
+testUnicodeInputCharacter1
+
+	self
+		parse: '\u0000'
+		rule: #unicodeInputCharacter
+!
+
+testUnicodeInputCharacter2
+
+	self
+		parse: '\'
+		rule: #unicodeInputCharacter
+!
+
+testUnicodeInputCharacter3
+
+	self
+		parse: 'µ'
+		rule: #unicodeInputCharacter
+!
+
+testUnicodeInputCharacter4
+
+	self
+		fail: '\\'
+		rule: #unicodeInputCharacter
+! !
+
+!JavaParserITests class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaParserTestCase.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,85 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+TestCase subclass:#JavaParserTestCase
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Tests-Parser'
+!
+
+!JavaParserTestCase class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaParserTestCase class methodsFor:'testing'!
+
+isAbstract
+
+    ^self == JavaParserTestCase
+
+    "Created: / 16-03-2011 / 16:27:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 07-04-2011 / 22:16:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParserTestCase methodsFor:'utilities'!
+
+assertParse: string
+        self assert: (JavaPetitParser new matches: string).
+
+    "Modified: / 08-03-2012 / 21:21:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parse: string
+        ^ JavaParser parse: string
+
+    "Created: / 29-12-2010 / 21:02:23 / Jan Kurs <kurs.jan@post.cz>"
+    "Modified: / 07-04-2011 / 22:07:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParserTestCase class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaParserTests.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,6053 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaParserTestCase subclass:#JavaParserTests
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Tests-Parser'
+!
+
+!JavaParserTests class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaParserTests methodsFor:'arguments'!
+
+testMethodWithArgs
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod(Object o)
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithArgs2
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod(Object o, Object o2)
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithArgs3
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod(int i)
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithArgs4
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod(int i, Object o)
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithArgs5
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod(final int i, Object o)
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithArgs6
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod(final int i, final Object o)
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithArgs7
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod(java.lang.Object o)
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithArgs8
+	^ self assertParse: '
+		public class Foo {
+			public void fooMethod(int ... numbers)
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithArgs9
+	^ self assertParse: '
+		public class Foo {
+			public void fooMethod(Object<T> ... numbers)
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithArrayArgs
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod(Object[] o)
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithArrayArgs2
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod(int[] o)
+			{
+				int i = 0;
+			}
+		}
+	'
+! !
+
+!JavaParserTests methodsFor:'classOrInterface'!
+
+testClassWithComment
+        ^ self assertParse: '
+// this is one line comment
+public class Object {
+}
+        '
+!
+
+testClassWithComment2
+        ^ self assertParse: '
+// this is one line comment
+public class Object {
+        // this is one line comment
+}
+'
+
+    "Modified: / 29-12-2010 / 20:28:27 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+testClassWithComment3
+        ^ self assertParse: '
+public class Object {
+        // this is one line comment
+}
+'
+
+    "Modified: / 29-12-2010 / 20:28:40 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+testClassWithJavadoc
+	^ self assertParse: '
+		/** this is class javadoc */
+		public class Foo {
+			public void foo() {}
+		}
+	'
+!
+
+testClassWithJavadoc2
+	^ self assertParse: '
+/*
+ * Possible end/of javadoc?
+ */
+public class Object {
+}
+	'
+!
+
+testClassWithStaticInitializer
+	^ self assertParse: '
+		public class Foo {
+			int i = 0;
+			
+			static { 
+				//cokoli
+				int i = 0;
+			}
+			
+			public void fooMethod()
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testClassWithStaticInitializer2
+	^ self assertParse: '
+		public class Foo {
+			static { 
+				//cokoli
+				int i = 0;
+			}
+		}
+	'
+!
+
+testClassWithStaticInitializer3
+	^ self assertParse: '
+		public class Foo {
+			public void fooMethod()
+			{
+				int i = 0;
+			}
+			static { 
+				//cokoli
+				int i = 0;
+			}
+		}
+	'
+!
+
+testEmptyAbstractClass
+	^ self assertParse: '
+		public abstract class Foo {}
+	'
+!
+
+testEmptyClass
+	^ self assertParse: '
+		public class Foo {}
+	'
+!
+
+testEmptyStatement
+	^ self
+		assertParse:
+			'
+		public class Foo {
+			;;;
+		}
+	'
+!
+
+testFinalClass
+	^ self assertParse: '
+		public final class Foo {
+			public Foo fooMethod()
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testFoo
+	self assert: true.
+!
+
+testGenericClass
+	^ self assertParse: '
+		public class Foo<T> {
+			public T fooMethod()
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testGenericClass2
+	^ self assertParse: '
+		public class Foo<T extends Foo> {
+			public T fooMethod()
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testHeader
+	^ self assertParse: '
+		package a.b.c;
+		
+		import a.b.*;
+		import c.d.*;
+		
+		public class Foo {
+			public void foo() {}
+		}
+	'
+!
+
+testHeader2
+	^ self assertParse: '
+		package a.b.c;
+		
+		public class Foo {
+			public void foo() {}
+		}
+	'
+!
+
+testHeader3
+	^ self assertParse: '
+		import a.b.c;
+		
+		public class Foo {
+			public void foo() {}
+		}
+	'
+!
+
+testHeader4
+	^ self assertParse: '
+		/* some doc */
+		package a.b;
+
+		import a.b.c;
+
+		public class Foo {
+			public void foo() {}
+		}
+	'
+!
+
+testHeader5
+	^ self assertParse: '
+		/* some doc */
+		package a.b;
+		/* another doc */
+		import a.b.c;
+		/* ane another doc */
+		/** class javadoc */
+		public class Foo {
+			public void foo() {}
+		}
+	'
+!
+
+testHeader6
+	^ self assertParse: '
+/*
+ * simple doc
+ */
+public class Object {
+}
+	'
+!
+
+testHeader7
+	^ self assertParse: '
+/*
+ * Copyright (c) 2006, Oracle and/or its affiliates.
+ */
+public class Object {
+}
+	'
+!
+
+testInnerClass
+	^ self assertParse: '
+		public class Foo {
+			private class A
+			{
+				public void foo() {}
+			}
+		
+		}
+	'
+!
+
+testInnerClass2
+	^ self assertParse: '
+		public class Foo {
+			private class A
+			{
+				public void foo() {}
+			}
+		}
+	'
+!
+
+testInnerClass3
+	^ self
+		assertParse:
+			'
+		public class Foo {
+			private class A
+			{
+				public void foo() {}
+			}
+			
+			private int foo2() {int i = 9;}
+		}
+	'
+!
+
+testInnerClass4
+	^ self assertParse: '
+		public class Foo {
+			public void foo() {}
+			
+			/** class javadoc */
+			private class A
+			{
+				/* comment */
+				public void foo() {}
+			}
+		
+			/**
+			 * javadoc */
+			private int foo2() {int i = 9;}
+			/**
+			 * javadoc */
+			private int foo2() {int i = 9;}
+		}
+	'
+!
+
+testInnerClass5
+	^ self assertParse: '
+		public class Foo {
+			private class A
+			{
+				public void foo() {}
+			}
+			int i;
+		}
+	'
+!
+
+testInterface1
+	^ self assertParse: '
+public interface MyVisitor
+{
+}
+	'
+!
+
+testInterface2
+	^ self assertParse: '
+public interface Visitor
+{
+	public void process(Circle c);
+	public void process(Square s);
+}
+	'
+!
+
+testInterface3
+	^ self assertParse: '
+public interface MyVisitor extends Visitor
+{
+	public void foo();
+}
+	'
+!
+
+testInterface4
+	^ self assertParse: '
+public interface MyVisitor extends Visitor
+{
+	public void foo() {};
+}
+	'
+!
+
+testInterface5
+	^ self assertParse: '
+public class MyVisitor implements Visitor
+{
+	public void foo() {};
+}
+	'
+!
+
+testInterface6
+	^ self assertParse: '
+public class MyVisitor implements Visitor, Iterator<Foo>
+{
+	public void foo() {};
+}
+	'
+!
+
+testSubclass
+	^ self assertParse: '
+public class MyVisitor extends Visitor
+{
+	public void foo() {};
+}
+	'
+!
+
+testSubclass2
+	^ self assertParse: '
+public class MyVisitor extends ArrayList<Foo>
+{
+	public void foo() {};
+}
+	'
+! !
+
+!JavaParserTests methodsFor:'fields'!
+
+testClassWithFields
+	^ self assertParse: '
+		public class Foo {
+			int i = 0;
+			
+			public void fooMethod()
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testClassWithFields2
+	^ self assertParse: '
+		public class Foo {
+			int i = 0;
+			private Object[] o = new Array[3];
+			
+			public void fooMethod()
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testClassWithFields3
+	^ self assertParse: '
+		public class Foo {
+			public static int i = 0;
+			
+			public void fooMethod()
+			{
+				int i = 0;
+			}
+			private Object[] o = new Array[3];
+
+			public void fooMethod2()
+			{
+				int i = 0;
+			}
+
+		}
+	'
+!
+
+testClassWithFields4
+	^ self assertParse: '
+		public class Foo {
+			private List<Foo> l = new ArrayList<Foo>();
+		}
+	'
+! !
+
+!JavaParserTests methodsFor:'methods'!
+
+testAbstractMethod
+	^ self assertParse: '
+		public class Foo {
+		
+			public abstract void fooMethod();
+		}
+	'
+!
+
+testAbstractMethod2
+	^ self assertParse: '
+		public class Foo {
+		
+			public abstract void fooMethod();
+			public abstract void fooMethod2();
+		}
+	'
+!
+
+testAbstractMethod3
+	^ self assertParse: '
+		public class Foo {
+			int i = 0;
+			/** javadoc */
+			public abstract void fooMethod();
+			/* another javadoc */
+			public abstract void fooMethod2();
+			
+			public void method() {int b = 3;}
+		}
+	'
+!
+
+testAnnotation
+	^ self assertParse: '
+		public class Foo {
+		     @Override
+			public void fooMethod() {};
+		}
+	'
+!
+
+testAnnotation2
+	^ self assertParse: '
+		public class Foo {
+
+			public @Interface void fooMethod() {};
+		}
+	'
+!
+
+testAnnotation3
+	^ self assertParse: '
+		public class Foo {
+			@Test
+			public @Interface void fooMethod() {};
+		}
+	'
+!
+
+testClassWithMethod
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod()
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testClassWithMethod10
+	^ self assertParse: '
+		public class Foo {
+		
+			public java.lang.Object fooMethod()
+			{
+				int i = 0;
+				return new Object();
+			};
+		}
+	'
+!
+
+testClassWithMethod11
+	^ self assertParse: '
+		public class Foo {
+		
+			public java.util.Map<Foo, String> fooMethod()
+			{
+				int i = 0;
+				return new Object();
+			};
+		}
+	'
+!
+
+testClassWithMethod12
+	^ self assertParse: '
+		public class Foo {
+		
+    			public Constructor<?> getConstructors()
+			{
+				int i = 0;
+				return new Object();
+			};
+		}
+	'
+!
+
+testClassWithMethod13
+	^ self assertParse: '
+		public class Foo {
+		
+    			public Constructor<?>[] getConstructors()
+			{
+				int i = 0;
+				return new Object();
+			};
+		}
+	'
+!
+
+testClassWithMethod14
+	^ self assertParse: '
+		public class Foo {
+		
+    			public Constructor[] getConstructors()
+			{
+				int i = 0;
+				return new Object();
+			}
+		}
+	'
+!
+
+testClassWithMethod15
+	^ self assertParse: '
+		public class Foo {
+		
+    			public Constructor<Foo>[] getConstructors()
+			{
+				int i = 0;
+				return new Object();
+			};
+		}
+	'
+!
+
+testClassWithMethod16
+	^ self assertParse: '
+		public class Foo {
+    public <U> Class<? extends U> asSubclass(Class<U> clazz) {
+        if (clazz.isAssignableFrom(this))
+            return (Class<? extends U>) this;
+        else
+            throw new ClassCastException(this.toString());
+    }
+		}
+	'
+!
+
+testClassWithMethod2
+	^ self assertParse: '
+		public class Foo {
+		
+			public Object fooMethod()
+			{
+				int i = 0;
+				return new Object();
+			}
+		}
+	'
+!
+
+testClassWithMethod3
+	^ self assertParse: '
+		public class Foo {
+		
+			public int fooMethod()
+			{
+				int i = 0;
+				return new Object();
+			}
+		}
+	'
+!
+
+testClassWithMethod4
+	^ self assertParse: '
+		public class Foo {
+		
+			public byte fooMethod()
+			{
+				int i = 0;
+				return new Object();
+			}
+		}
+	'
+!
+
+testClassWithMethod5
+	^ self assertParse: '
+		public class Foo {
+		
+			public boolean fooMethod()
+			{
+				int i = 0;
+				return new Object();
+			}
+		}
+	'
+!
+
+testClassWithMethod6
+	^ self assertParse: '
+		public class Foo {
+		
+			public float fooMethod()
+			{
+				int i = 0;
+				return new Object();
+			}
+		}
+	'
+!
+
+testClassWithMethod7
+	^ self assertParse: '
+		public class Foo {
+		
+			public double fooMethod()
+			{
+				int i = 0;
+				return new Object();
+			}
+		}
+	'
+!
+
+testClassWithMethod8
+	^ self assertParse: '
+		public class Foo {
+		
+			public double fooMethod()
+			{
+				int i = 0;
+				return new Object();
+			};
+		}
+	'
+!
+
+testClassWithMethod9
+	^ self assertParse: '
+		public class Foo {
+		
+			public List<Foo> fooMethod()
+			{
+				int i = 0;
+				return new Object();
+			};
+		}
+	'
+!
+
+testConstructor
+	^ self assertParse: '
+public class MyVisitor
+{
+	public Myvisitor() {
+		super();
+	}
+}
+	'
+!
+
+testConstructor2
+	^ self assertParse: '
+public class MyVisitor
+{
+	/** this is constructor */
+	protected Myvisitor() {
+		super();
+	}
+}
+	'
+!
+
+testConstructor3
+	^ self assertParse: '
+public class MyVisitor
+{
+	/** this is constructor */
+	Myvisitor() {
+		super();
+	}
+}
+	'
+!
+
+testConstructor4
+	^ self assertParse: '
+public class MyVisitor
+{
+	/** this is constructor */
+	private Myvisitor() {
+		super();
+	}
+}
+	'
+!
+
+testFinalMethod
+	^ self assertParse: '
+		public class Foo {
+		
+			public final void fooMethod() {};
+		}
+	'
+!
+
+testFinalMethod2
+	^ self assertParse: '
+		public class Foo {
+		
+			static final void fooMethod() {};
+		}
+	'
+!
+
+testMethodWithArrayRetval
+	^ self assertParse: '
+		public class Foo {
+		
+			public Object[] fooMethod(Object[] o)
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithArrayRetval2
+	^ self assertParse: '
+		public class Foo {
+		
+			public int[] fooMethod(Object[] o)
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithComment
+        ^ self assertParse: '
+                public class Foo {
+                        // Some comment
+                        public void fooMethod()
+                        {
+                                int i = 0;
+                        }
+                }
+    '
+
+    "Modified: / 29-12-2010 / 20:29:01 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+testMethodWithJavadoc
+	^ self assertParse: '
+		public class Foo {
+			/**
+			 * This is a javadoc, isnt it?
+			 */		
+			public void fooMethod()
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithJavadoc2
+	^ self assertParse: '
+		public class Foo {
+			/*
+			 * This is not a javadoc, but it is before method, is it?
+			 */		
+			public void fooMethod()
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithJavadoc3
+	^ self assertParse: '
+		public class Foo {
+			/** constant with javadoc */
+			private static String MY_CONSTANT = "This is a constant";
+		
+			/*
+			 * This is not a javadoc, but it is before method, is it?
+			 */		
+			public void fooMethod()
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithJavadoc4
+	^ self assertParse: '
+		public class Foo {
+			/** constant with javadoc */
+			private static String MY_CONSTANT = "This is a constant";
+		
+			/* random comment */
+		
+			/**
+			 * This is not a javadoc, but it is before method, is it?
+			 */		
+			public void fooMethod()
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithJavadoc5
+	^ self assertParse: '
+		public class Foo {
+			/** constant with javadoc */
+			private static String MY_CONSTANT = "This is a constant";
+		
+			/* random comment */
+			int i = 0;
+			/* another random comment */
+			
+			/**
+			 * This is not a javadoc, but it is before method, is it?
+			 */		
+			public void fooMethod()
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMethodWithJavadoc6
+	^ self assertParse: '
+		public class Foo {
+			/**
+			 * Multiple Javadoc per methods :)
+			 */	
+			/**
+			 * This is not a javadoc, but it is before method, is it?
+			 */		
+			public void fooMethod()
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMultipleMethods
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod(int i, Object o)
+			{
+				int i = 0;
+			}
+
+			public void fooMethod2(Object o)
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMultipleMethods2
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod(int i, Object o)
+			{
+				int i = 0;
+			};
+
+			public void fooMethod2(Object o)
+			{
+				int i = 0;
+			}
+		}
+	'
+!
+
+testMultipleMethods3
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod(int i, Object o)
+			{
+				int i = 0;
+			};
+
+			public void fooMethod2(Object o)
+			{
+				int i = 0;
+			};
+		}
+	'
+!
+
+testMultipleMethods4
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod(int i, Object o)
+			{
+				int i = 0;
+			};
+
+			int i = 9;
+
+			public void fooMethod2(Object o)
+			{
+				int i = 0;
+			};
+		}
+	'
+!
+
+testNativeMethod
+	^ self assertParse: '
+		public class Foo {
+		
+			public native void wait();
+		}
+	'
+!
+
+testNativeMethod2
+	^ self assertParse: '
+		public class Foo {
+		
+			public native void wait(long millis);
+		}
+	'
+!
+
+testNativeMethod3
+	^ self assertParse: '
+		public class Foo {
+		
+			private static native Object wait(long millis);
+		}
+	'
+!
+
+testSynchronizedMethod
+	^ self assertParse: '
+		public class Foo {
+		
+			public final synchronized void fooMethod() {};
+		}
+	'
+!
+
+testThrow
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod() throws MyException;
+		}
+	'
+!
+
+testThrow2
+	^ self assertParse: '
+		public class Foo {
+		
+			public void fooMethod() throws MyException, YourException;
+		}
+	'
+! !
+
+!JavaParserTests methodsFor:'realClasses'!
+
+testJavaLangClass6
+    | res time |
+    time := Time millisecondsToRun: [
+    res := self assertParse: '
+/*
+ * %W% %E%
+ *
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+
+package java.lang;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.Member;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.GenericDeclaration;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.ref.SoftReference;
+import java.io.InputStream;
+import java.io.ObjectStreamField;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.Map;
+import java.util.HashMap;
+import sun.misc.Unsafe;
+import sun.reflect.ConstantPool;
+import sun.reflect.Reflection;
+import sun.reflect.ReflectionFactory;
+import sun.reflect.SignatureIterator;
+import sun.reflect.generics.factory.CoreReflectionFactory;
+import sun.reflect.generics.factory.GenericsFactory;
+import sun.reflect.generics.repository.ClassRepository;
+import sun.reflect.generics.repository.MethodRepository;
+import sun.reflect.generics.repository.ConstructorRepository;
+import sun.reflect.generics.scope.ClassScope;
+import sun.security.util.SecurityConstants;
+import java.lang.annotation.Annotation;
+import sun.reflect.annotation.*;
+
+/**
+ * Instances of the class <code>Class</code> represent classes and
+ * interfaces in a running Java application.  An enum is a kind of
+ * class and an annotation is a kind of interface.  Every array also
+ * belongs to a class that is reflected as a <code>Class</code> object
+ * that is shared by all arrays with the same element type and number
+ * of dimensions.  The primitive Java types (<code>boolean</code>,
+ * <code>byte</code>, <code>char</code>, <code>short</code>,
+ * <code>int</code>, <code>long</code>, <code>float</code>, and
+ * <code>double</code>), and the keyword <code>void</code> are also
+ * represented as <code>Class</code> objects.
+ *
+ * <p> <code>Class</code> has no public constructor. Instead <code>Class</code>
+ * objects are constructed automatically by the Java Virtual Machine as classes
+ * are loaded and by calls to the <code>defineClass</code> method in the class
+ * loader.
+ *
+ * <p> The following example uses a <code>Class</code> object to print the
+ * class name of an object:
+ *
+ * <p> <blockquote><pre>
+ *     void printClassName(Object obj) {
+ *         System.out.println("The class of " + obj +
+ *                            " is " + obj.getClass().getName());
+ *     }
+ * </pre></blockquote>
+ * 
+ * <p> It is also possible to get the <code>Class</code> object for a named
+ * type (or for void) using a class literal 
+ * (JLS Section <A HREF="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#251530">15.8.2</A>). 
+ * For example:
+ *
+ * <p> <blockquote><pre>
+ *     System.out.println("The name of class Foo is: "+Foo.class.getName());
+ * </pre></blockquote>
+ *
+ * @param <T> the type of the class modeled by this {@code Class}
+ * object.  For example, the type of {@code String.class} is {@code
+ * Class<String>}.  Use {@code Class<?>} if the class being modeled is
+ * unknown.
+ *
+ * @author  unascribed
+ * @version %I%, %G%
+ * @see     java.lang.ClassLoader#defineClass(byte[], int, int)
+ * @since   JDK1.0
+ */
+public final
+    class Class<T> implements java.io.Serializable, 
+                              java.lang.reflect.GenericDeclaration, 
+                              java.lang.reflect.Type,
+                              java.lang.reflect.AnnotatedElement {
+    private static final int ANNOTATION= 0x00002000;
+    private static final int ENUM      = 0x00004000;
+    private static final int SYNTHETIC = 0x00001000;
+
+    private static native void registerNatives();
+    static {
+        registerNatives();
+    }
+
+    /*
+     * Constructor. Only the Java Virtual Machine creates Class
+     * objects.
+     */
+    private Class() {}
+
+
+    /**
+     * Converts the object to a string. The string representation is the
+     * string "class" or "interface", followed by a space, and then by the
+     * fully qualified name of the class in the format returned by
+     * <code>getName</code>.  If this <code>Class</code> object represents a
+     * primitive type, this method returns the name of the primitive type.  If
+     * this <code>Class</code> object represents void this method returns
+     * "void".
+     *
+     * @return a string representation of this class object.
+     */
+    public String toString() {
+        return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
+            + getName();
+    }
+
+
+    /**
+     * Returns the <code>Class</code> object associated with the class or
+     * interface with the given string name.  Invoking this method is
+     * equivalent to:
+     *
+     * <blockquote><pre>
+     *  Class.forName(className, true, currentLoader)
+     * </pre></blockquote>
+     *
+     * where <code>currentLoader</code> denotes the defining class loader of
+     * the current class.
+     *
+     * <p> For example, the following code fragment returns the
+     * runtime <code>Class</code> descriptor for the class named
+     * <code>java.lang.Thread</code>:
+     *
+     * <blockquote><pre>
+     *   Class&nbsp;t&nbsp;= Class.forName("java.lang.Thread")
+     * </pre></blockquote>
+     * <p>
+     * A call to <tt>forName("X")</tt> causes the class named 
+     * <tt>X</tt> to be initialized.
+     *
+     * @param      className   the fully qualified name of the desired class.
+     * @return     the <code>Class</code> object for the class with the
+     *             specified name.
+     * @exception LinkageError if the linkage fails
+     * @exception ExceptionInInitializerError if the initialization provoked
+     *            by this method fails
+     * @exception ClassNotFoundException if the class cannot be located
+     */
+    public static Class<?> forName(String className) 
+                throws ClassNotFoundException {
+        return forName0(className, true, ClassLoader.getCallerClassLoader());
+    }
+
+
+    /**
+     * Returns the <code>Class</code> object associated with the class or
+     * interface with the given string name, using the given class loader.
+     * Given the fully qualified name for a class or interface (in the same
+     * format returned by <code>getName</code>) this method attempts to
+     * locate, load, and link the class or interface.  The specified class
+     * loader is used to load the class or interface.  If the parameter
+     * <code>loader</code> is null, the class is loaded through the bootstrap
+     * class loader.  The class is initialized only if the
+     * <code>initialize</code> parameter is <code>true</code> and if it has
+     * not been initialized earlier.
+     *
+     * <p> If <code>name</code> denotes a primitive type or void, an attempt
+     * will be made to locate a user-defined class in the unnamed package whose
+     * name is <code>name</code>. Therefore, this method cannot be used to
+     * obtain any of the <code>Class</code> objects representing primitive
+     * types or void.
+     *
+     * <p> If <code>name</code> denotes an array class, the component type of
+     * the array class is loaded but not initialized.
+     *
+     * <p> For example, in an instance method the expression:
+     *
+     * <blockquote><pre>
+     *  Class.forName("Foo")
+     * </pre></blockquote>
+     *
+     * is equivalent to:
+     *
+     * <blockquote><pre>
+     *  Class.forName("Foo", true, this.getClass().getClassLoader())
+     * </pre></blockquote>
+     *
+     * Note that this method throws errors related to loading, linking or
+     * initializing as specified in Sections 12.2, 12.3 and 12.4 of <em>The
+     * Java Language Specification</em>.
+     * Note that this method does not check whether the requested class 
+     * is accessible to its caller.
+     *
+     * <p> If the <code>loader</code> is <code>null</code>, and a security
+     * manager is present, and the caller''s class loader is not null, then this
+     * method calls the security manager''s <code>checkPermission</code> method
+     * with a <code>RuntimePermission("getClassLoader")</code> permission to
+     * ensure it''s ok to access the bootstrap class loader.
+     *
+     * @param name       fully qualified name of the desired class
+     * @param initialize whether the class must be initialized
+     * @param loader     class loader from which the class must be loaded
+     * @return           class object representing the desired class
+     * 
+     * @exception LinkageError if the linkage fails
+     * @exception ExceptionInInitializerError if the initialization provoked
+     *            by this method fails
+     * @exception ClassNotFoundException if the class cannot be located by
+     *            the specified class loader
+     *
+     * @see       java.lang.Class#forName(String) 
+     * @see       java.lang.ClassLoader
+     * @since     1.2
+     */
+    public static Class<?> forName(String name, boolean initialize,
+                                   ClassLoader loader)
+        throws ClassNotFoundException
+    {
+        if (loader == null) {
+            SecurityManager sm = System.getSecurityManager();
+            if (sm !!= null) {
+                ClassLoader ccl = ClassLoader.getCallerClassLoader();
+                if (ccl !!= null) {
+                    sm.checkPermission(
+                        SecurityConstants.GET_CLASSLOADER_PERMISSION);
+                }
+            }
+        }
+        return forName0(name, initialize, loader);
+    }
+
+    /** Called after security checks have been made. */
+    private static native Class forName0(String name, boolean initialize,
+                                            ClassLoader loader)
+        throws ClassNotFoundException;
+
+    /**
+     * Creates a new instance of the class represented by this <tt>Class</tt>
+     * object.  The class is instantiated as if by a <code>new</code>
+     * expression with an empty argument list.  The class is initialized if it
+     * has not already been initialized.
+     *
+     * <p>Note that this method propagates any exception thrown by the
+     * nullary constructor, including a checked exception.  Use of
+     * this method effectively bypasses the compile-time exception
+     * checking that would otherwise be performed by the compiler.
+     * The {@link
+     * java.lang.reflect.Constructor#newInstance(java.lang.Object...)
+     * Constructor.newInstance} method avoids this problem by wrapping
+     * any exception thrown by the constructor in a (checked) {@link
+     * java.lang.reflect.InvocationTargetException}.
+     *
+     * @return     a newly allocated instance of the class represented by this
+     *             object.
+     * @exception  IllegalAccessException  if the class or its nullary 
+     *               constructor is not accessible.
+     * @exception  InstantiationException 
+     *               if this <code>Class</code> represents an abstract class,
+     *               an interface, an array class, a primitive type, or void;
+     *               or if the class has no nullary constructor;
+     *               or if the instantiation fails for some other reason.
+     * @exception  ExceptionInInitializerError if the initialization
+     *               provoked by this method fails.
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.PUBLIC)}</tt> denies
+     *             creation of new instances of this class
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package
+     *             of this class
+     *
+     *             </ul>
+     *
+     */
+    public T newInstance() 
+        throws InstantiationException, IllegalAccessException
+    {
+        if (System.getSecurityManager() !!= null) {
+            checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+        }
+        return newInstance0();
+    }
+
+    private T newInstance0()
+        throws InstantiationException, IllegalAccessException
+    {
+        // NOTE: the following code may not be strictly correct under
+        // the current Java memory model.
+
+        // Constructor lookup
+        if (cachedConstructor == null) {
+            if (this == Class.class) {
+                throw new IllegalAccessException(
+                    "Can not call newInstance() on the Class for java.lang.Class"
+                );
+            }
+            try {
+                Class[] empty = {};
+                final Constructor<T> c = getConstructor0(empty, Member.DECLARED);
+                // Disable accessibility checks on the constructor
+                // since we have to do the security check here anyway
+                // (the stack depth is wrong for the Constructor''s
+                // security check to work)
+                java.security.AccessController.doPrivileged
+                    (new java.security.PrivilegedAction() {
+                            public Object run() {
+                                c.setAccessible(true);
+                                return null;
+                            }
+                        });
+                cachedConstructor = c;
+            } catch (NoSuchMethodException e) {
+                throw new InstantiationException(getName());
+            }
+        }
+        Constructor<T> tmpConstructor = cachedConstructor;
+        // Security check (same as in java.lang.reflect.Constructor)
+        int modifiers = tmpConstructor.getModifiers();
+        if (!!Reflection.quickCheckMemberAccess(this, modifiers)) {
+            Class caller = Reflection.getCallerClass(3);
+            if (newInstanceCallerCache !!= caller) {
+                Reflection.ensureMemberAccess(caller, this, null, modifiers);
+                newInstanceCallerCache = caller;
+            }
+        }
+        // Run constructor
+        try {
+            return tmpConstructor.newInstance((Object[])null);
+        } catch (InvocationTargetException e) {
+            Unsafe.getUnsafe().throwException(e.getTargetException());
+            // Not reached
+            return null;
+        }
+    }
+    private volatile transient Constructor<T> cachedConstructor;
+    private volatile transient Class       newInstanceCallerCache;
+
+
+    /**
+     * Determines if the specified <code>Object</code> is assignment-compatible
+     * with the object represented by this <code>Class</code>.  This method is
+     * the dynamic equivalent of the Java language <code>instanceof</code>
+     * operator. The method returns <code>true</code> if the specified
+     * <code>Object</code> argument is non-null and can be cast to the
+     * reference type represented by this <code>Class</code> object without
+     * raising a <code>ClassCastException.</code> It returns <code>false</code>
+     * otherwise.
+     *
+     * <p> Specifically, if this <code>Class</code> object represents a
+     * declared class, this method returns <code>true</code> if the specified
+     * <code>Object</code> argument is an instance of the represented class (or
+     * of any of its subclasses); it returns <code>false</code> otherwise. If
+     * this <code>Class</code> object represents an array class, this method
+     * returns <code>true</code> if the specified <code>Object</code> argument
+     * can be converted to an object of the array class by an identity
+     * conversion or by a widening reference conversion; it returns
+     * <code>false</code> otherwise. If this <code>Class</code> object
+     * represents an interface, this method returns <code>true</code> if the
+     * class or any superclass of the specified <code>Object</code> argument
+     * implements this interface; it returns <code>false</code> otherwise. If
+     * this <code>Class</code> object represents a primitive type, this method
+     * returns <code>false</code>.
+     *
+     * @param   obj the object to check
+     * @return  true if <code>obj</code> is an instance of this class
+     *
+     * @since JDK1.1
+     */
+    public native boolean isInstance(Object obj);
+
+
+    /**
+     * Determines if the class or interface represented by this
+     * <code>Class</code> object is either the same as, or is a superclass or
+     * superinterface of, the class or interface represented by the specified
+     * <code>Class</code> parameter. It returns <code>true</code> if so;
+     * otherwise it returns <code>false</code>. If this <code>Class</code>
+     * object represents a primitive type, this method returns
+     * <code>true</code> if the specified <code>Class</code> parameter is
+     * exactly this <code>Class</code> object; otherwise it returns
+     * <code>false</code>.
+     *
+     * <p> Specifically, this method tests whether the type represented by the
+     * specified <code>Class</code> parameter can be converted to the type
+     * represented by this <code>Class</code> object via an identity conversion
+     * or via a widening reference conversion. See <em>The Java Language
+     * Specification</em>, sections 5.1.1 and 5.1.4 , for details.
+     * 
+     * @param cls the <code>Class</code> object to be checked
+     * @return the <code>boolean</code> value indicating whether objects of the
+     * type <code>cls</code> can be assigned to objects of this class
+     * @exception NullPointerException if the specified Class parameter is
+     *            null.
+     * @since JDK1.1
+     */
+    public native boolean isAssignableFrom(Class<?> cls);
+
+
+    /**
+     * Determines if the specified <code>Class</code> object represents an
+     * interface type.
+     *
+     * @return  <code>true</code> if this object represents an interface;
+     *          <code>false</code> otherwise.
+     */
+    public native boolean isInterface();
+
+
+    /**
+     * Determines if this <code>Class</code> object represents an array class.
+     *
+     * @return  <code>true</code> if this object represents an array class;
+     *          <code>false</code> otherwise.
+     * @since   JDK1.1
+     */
+    public native boolean isArray();
+
+
+    /**
+     * Determines if the specified <code>Class</code> object represents a
+     * primitive type.
+     *
+     * <p> There are nine predefined <code>Class</code> objects to represent
+     * the eight primitive types and void.  These are created by the Java
+     * Virtual Machine, and have the same names as the primitive types that
+     * they represent, namely <code>boolean</code>, <code>byte</code>,
+     * <code>char</code>, <code>short</code>, <code>int</code>,
+     * <code>long</code>, <code>float</code>, and <code>double</code>.
+     *
+     * <p> These objects may only be accessed via the following public static
+     * final variables, and are the only <code>Class</code> objects for which
+     * this method returns <code>true</code>.
+     *
+     * @return true if and only if this class represents a primitive type
+     *
+     * @see     java.lang.Boolean#TYPE
+     * @see     java.lang.Character#TYPE
+     * @see     java.lang.Byte#TYPE
+     * @see     java.lang.Short#TYPE
+     * @see     java.lang.Integer#TYPE
+     * @see     java.lang.Long#TYPE
+     * @see     java.lang.Float#TYPE
+     * @see     java.lang.Double#TYPE
+     * @see     java.lang.Void#TYPE
+     * @since JDK1.1
+     */
+    public native boolean isPrimitive();
+
+    /**
+     * Returns true if this <tt>Class</tt> object represents an annotation
+     * type.  Note that if this method returns true, {@link #isInterface()}
+     * would also return true, as all annotation types are also interfaces.
+     *
+     * @return <tt>true</tt> if this class object represents an annotation
+     *      type; <tt>false</tt> otherwise
+     * @since 1.5
+     */
+    public boolean isAnnotation() {
+        return (getModifiers() & ANNOTATION) !!= 0;
+    }
+
+    /**
+     * Returns <tt>true</tt> if this class is a synthetic class;
+     * returns <tt>false</tt> otherwise.
+     * @return <tt>true</tt> if and only if this class is a synthetic class as
+     *         defined by the Java Language Specification.
+     * @since 1.5
+     */
+    public boolean isSynthetic() {
+        return (getModifiers() & SYNTHETIC) !!= 0;
+    }
+
+    /**
+     * Returns the  name of the entity (class, interface, array class,
+     * primitive type, or void) represented by this <tt>Class</tt> object,
+     * as a <tt>String</tt>.
+     * 
+     * <p> If this class object represents a reference type that is not an
+     * array type then the binary name of the class is returned, as specified
+     * by the Java Language Specification, Second Edition.
+     *
+     * <p> If this class object represents a primitive type or void, then the
+     * name returned is a <tt>String</tt> equal to the Java language
+     * keyword corresponding to the primitive type or void.
+     * 
+     * <p> If this class object represents a class of arrays, then the internal
+     * form of the name consists of the name of the element type preceded by
+     * one or more ''<tt>[</tt>'' characters representing the depth of the array
+     * nesting.  The encoding of element type names is as follows:
+     *
+     * <blockquote><table summary="Element types and encodings">
+     * <tr><th> Element Type <th> &nbsp;&nbsp;&nbsp; <th> Encoding
+     * <tr><td> boolean      <td> &nbsp;&nbsp;&nbsp; <td align=center> Z
+     * <tr><td> byte         <td> &nbsp;&nbsp;&nbsp; <td align=center> B
+     * <tr><td> char         <td> &nbsp;&nbsp;&nbsp; <td align=center> C
+     * <tr><td> class or interface  
+     *                       <td> &nbsp;&nbsp;&nbsp; <td align=center> L<i>classname</i>;
+     * <tr><td> double       <td> &nbsp;&nbsp;&nbsp; <td align=center> D
+     * <tr><td> float        <td> &nbsp;&nbsp;&nbsp; <td align=center> F
+     * <tr><td> int          <td> &nbsp;&nbsp;&nbsp; <td align=center> I
+     * <tr><td> long         <td> &nbsp;&nbsp;&nbsp; <td align=center> J
+     * <tr><td> short        <td> &nbsp;&nbsp;&nbsp; <td align=center> S
+     * </table></blockquote>
+     *
+     * <p> The class or interface name <i>classname</i> is the binary name of
+     * the class specified above.
+     *
+     * <p> Examples:
+     * <blockquote><pre>
+     * String.class.getName()
+     *     returns "java.lang.String"
+     * byte.class.getName()
+     *     returns "byte"
+     * (new Object[3]).getClass().getName()
+     *     returns "[Ljava.lang.Object;"
+     * (new int[3][4][5][6][7][8][9]).getClass().getName()
+     *     returns "[[[[[[[I"
+     * </pre></blockquote>
+     *
+     * @return  the name of the class or interface
+     *          represented by this object.
+     */
+    public String getName() {
+        if (name == null)
+            name = getName0();
+        return name;
+    }
+
+    // cache the name to reduce the number of calls into the VM
+    private transient String name;
+    private native String getName0();
+
+    /**
+     * Returns the class loader for the class.  Some implementations may use
+     * null to represent the bootstrap class loader. This method will return
+     * null in such implementations if this class was loaded by the bootstrap
+     * class loader.
+     *
+     * <p> If a security manager is present, and the caller''s class loader is
+     * not null and the caller''s class loader is not the same as or an ancestor of
+     * the class loader for the class whose class loader is requested, then
+     * this method calls the security manager''s <code>checkPermission</code> 
+     * method with a <code>RuntimePermission("getClassLoader")</code> 
+     * permission to ensure it''s ok to access the class loader for the class.
+     * 
+     * <p>If this object
+     * represents a primitive type or void, null is returned.
+     *
+     * @return  the class loader that loaded the class or interface
+     *          represented by this object.
+     * @throws SecurityException
+     *    if a security manager exists and its 
+     *    <code>checkPermission</code> method denies
+     *    access to the class loader for the class.
+     * @see java.lang.ClassLoader
+     * @see SecurityManager#checkPermission
+     * @see java.lang.RuntimePermission
+     */
+    public ClassLoader getClassLoader() {
+        ClassLoader cl = getClassLoader0();
+        if (cl == null)
+            return null;
+        SecurityManager sm = System.getSecurityManager();
+        if (sm !!= null) {
+            ClassLoader ccl = ClassLoader.getCallerClassLoader();
+            if (ccl !!= null && ccl !!= cl && !!cl.isAncestor(ccl)) {
+                sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);
+            }
+        }
+        return cl;
+    }
+
+    // Package-private to allow ClassLoader access
+    native ClassLoader getClassLoader0();
+
+
+    /**
+     * Returns an array of <tt>TypeVariable</tt> objects that represent the
+     * type variables declared by the generic declaration represented by this
+     * <tt>GenericDeclaration</tt> object, in declaration order.  Returns an
+     * array of length 0 if the underlying generic declaration declares no type
+     * variables.
+     *
+     * @return an array of <tt>TypeVariable</tt> objects that represent
+     *     the type variables declared by this generic declaration
+     * @throws GenericSignatureFormatError if the generic
+     *     signature of this generic declaration does not conform to
+     *     the format specified in the Java Virtual Machine Specification,
+     *     3rd edition
+     * @since 1.5
+     */
+    public TypeVariable<Class<T>>[] getTypeParameters() {
+        if (getGenericSignature() !!= null) 
+            return (TypeVariable<Class<T>>[])getGenericInfo().getTypeParameters();
+        else
+            return (TypeVariable<Class<T>>[])new TypeVariable[0];
+    }
+
+
+    /**
+     * Returns the <code>Class</code> representing the superclass of the entity
+     * (class, interface, primitive type or void) represented by this
+     * <code>Class</code>.  If this <code>Class</code> represents either the
+     * <code>Object</code> class, an interface, a primitive type, or void, then
+     * null is returned.  If this object represents an array class then the
+     * <code>Class</code> object representing the <code>Object</code> class is
+     * returned.
+     *
+     * @return the superclass of the class represented by this object.
+     */
+    public native Class<? super T> getSuperclass();
+
+
+    /**
+     * Returns the <tt>Type</tt> representing the direct superclass of
+     * the entity (class, interface, primitive type or void) represented by
+     * this <tt>Class</tt>.
+     * 
+     * <p>If the superclass is a parameterized type, the <tt>Type</tt>
+     * object returned must accurately reflect the actual type
+     * parameters used in the source code. The parameterized type
+     * representing the superclass is created if it had not been
+     * created before. See the declaration of {@link
+     * java.lang.reflect.ParameterizedType ParameterizedType} for the
+     * semantics of the creation process for parameterized types.  If
+     * this <tt>Class</tt> represents either the <tt>Object</tt>
+     * class, an interface, a primitive type, or void, then null is
+     * returned.  If this object represents an array class then the
+     * <tt>Class</tt> object representing the <tt>Object</tt> class is
+     * returned.
+     *
+     * @throws GenericSignatureFormatError if the generic
+     *     class signature does not conform to the format specified in the
+     *     Java Virtual Machine Specification, 3rd edition
+     * @throws TypeNotPresentException if the generic superclass
+     *     refers to a non-existent type declaration
+     * @throws MalformedParameterizedTypeException if the 
+     *     generic superclass refers to a parameterized type that cannot be
+     *     instantiated  for any reason
+     * @return the superclass of the class represented by this object
+     * @since 1.5
+     */
+    public Type getGenericSuperclass() {
+        if (getGenericSignature() !!= null) {
+            // Historical irregularity:
+            // Generic signature marks interfaces with superclass = Object
+            // but this API returns null for interfaces
+            if (isInterface())
+                return null;
+            return getGenericInfo().getSuperclass();
+        } else
+            return getSuperclass();
+    }
+
+    /**
+     * Gets the package for this class.  The class loader of this class is used
+     * to find the package.  If the class was loaded by the bootstrap class
+     * loader the set of packages loaded from CLASSPATH is searched to find the
+     * package of the class. Null is returned if no package object was created
+     * by the class loader of this class.
+     *
+     * <p> Packages have attributes for versions and specifications only if the
+     * information was defined in the manifests that accompany the classes, and
+     * if the class loader created the package instance with the attributes
+     * from the manifest.
+     *
+     * @return the package of the class, or null if no package
+     *         information is available from the archive or codebase.
+     */
+    public Package getPackage() {
+        return Package.getPackage(this);
+    }
+
+
+    /**
+     * Determines the interfaces implemented by the class or interface
+     * represented by this object.
+     *
+     * <p> If this object represents a class, the return value is an array
+     * containing objects representing all interfaces implemented by the
+     * class. The order of the interface objects in the array corresponds to
+     * the order of the interface names in the <code>implements</code> clause
+     * of the declaration of the class represented by this object. For 
+     * example, given the declaration:
+     * <blockquote><pre>
+     * class Shimmer implements FloorWax, DessertTopping { ... }
+     * </pre></blockquote>
+     * suppose the value of <code>s</code> is an instance of 
+     * <code>Shimmer</code>; the value of the expression:
+     * <blockquote><pre>
+     * s.getClass().getInterfaces()[0]
+     * </pre></blockquote>
+     * is the <code>Class</code> object that represents interface 
+     * <code>FloorWax</code>; and the value of:
+     * <blockquote><pre>
+     * s.getClass().getInterfaces()[1]
+     * </pre></blockquote>
+     * is the <code>Class</code> object that represents interface 
+     * <code>DessertTopping</code>.
+     *
+     * <p> If this object represents an interface, the array contains objects
+     * representing all interfaces extended by the interface. The order of the
+     * interface objects in the array corresponds to the order of the interface
+     * names in the <code>extends</code> clause of the declaration of the
+     * interface represented by this object.
+     *
+     * <p> If this object represents a class or interface that implements no
+     * interfaces, the method returns an array of length 0.
+     *
+     * <p> If this object represents a primitive type or void, the method
+     * returns an array of length 0.
+     *
+     * @return an array of interfaces implemented by this class.
+     */
+    public native Class<?>[] getInterfaces();
+
+    /**
+     * Returns the <tt>Type</tt>s representing the interfaces 
+     * directly implemented by the class or interface represented by
+     * this object.
+     *
+     * <p>If a superinterface is a parameterized type, the
+     * <tt>Type</tt> object returned for it must accurately reflect
+     * the actual type parameters used in the source code. The
+     * parameterized type representing each superinterface is created
+     * if it had not been created before. See the declaration of
+     * {@link java.lang.reflect.ParameterizedType ParameterizedType}
+     * for the semantics of the creation process for parameterized
+     * types.
+     *
+     * <p> If this object represents a class, the return value is an
+     * array containing objects representing all interfaces
+     * implemented by the class. The order of the interface objects in
+     * the array corresponds to the order of the interface names in
+     * the <tt>implements</tt> clause of the declaration of the class
+     * represented by this object.  In the case of an array class, the
+     * interfaces <tt>Cloneable</tt> and <tt>Serializable</tt> are
+     * returned in that order.
+     *
+     * <p>If this object represents an interface, the array contains
+     * objects representing all interfaces directly extended by the
+     * interface.  The order of the interface objects in the array
+     * corresponds to the order of the interface names in the
+     * <tt>extends</tt> clause of the declaration of the interface
+     * represented by this object.
+     *
+     * <p>If this object represents a class or interface that
+     * implements no interfaces, the method returns an array of length
+     * 0.
+     *
+     * <p>If this object represents a primitive type or void, the
+     * method returns an array of length 0.
+     *
+     * @throws GenericSignatureFormatError
+     *     if the generic class signature does not conform to the format
+     *     specified in the Java Virtual Machine Specification, 3rd edition
+     * @throws TypeNotPresentException if any of the generic
+     *     superinterfaces refers to a non-existent type declaration
+     * @throws MalformedParameterizedTypeException if any of the 
+     *     generic superinterfaces refer to a parameterized type that cannot
+     *     be instantiated  for any reason
+     * @return an array of interfaces implemented by this class
+     * @since 1.5
+     */
+    public Type[] getGenericInterfaces() {
+        if (getGenericSignature() !!= null)
+            return getGenericInfo().getSuperInterfaces();
+        else
+            return getInterfaces();
+    }
+
+
+    /**
+     * Returns the <code>Class</code> representing the component type of an
+     * array.  If this class does not represent an array class this method
+     * returns null.
+     *
+     * @return the <code>Class</code> representing the component type of this
+     * class if this class is an array
+     * @see     java.lang.reflect.Array
+     * @since JDK1.1
+     */
+    public native Class<?> getComponentType();
+
+
+    /**
+     * Returns the Java language modifiers for this class or interface, encoded
+     * in an integer. The modifiers consist of the Java Virtual Machine''s
+     * constants for <code>public</code>, <code>protected</code>,
+     * <code>private</code>, <code>final</code>, <code>static</code>,
+     * <code>abstract</code> and <code>interface</code>; they should be decoded
+     * using the methods of class <code>Modifier</code>.
+     *
+     * <p> If the underlying class is an array class, then its
+     * <code>public</code>, <code>private</code> and <code>protected</code>
+     * modifiers are the same as those of its component type.  If this
+     * <code>Class</code> represents a primitive type or void, its
+     * <code>public</code> modifier is always <code>true</code>, and its
+     * <code>protected</code> and <code>private</code> modifiers are always
+     * <code>false</code>. If this object represents an array class, a
+     * primitive type or void, then its <code>final</code> modifier is always
+     * <code>true</code> and its interface modifier is always
+     * <code>false</code>. The values of its other modifiers are not determined
+     * by this specification.
+     *
+     * <p> The modifier encodings are defined in <em>The Java Virtual Machine
+     * Specification</em>, table 4.1.
+     *
+     * @return the <code>int</code> representing the modifiers for this class
+     * @see     java.lang.reflect.Modifier
+     * @since JDK1.1
+     */
+    public native int getModifiers();
+
+
+    /**
+     * Gets the signers of this class.
+     *
+     * @return  the signers of this class, or null if there are no signers.  In
+     *          particular, this method returns null if this object represents
+     *          a primitive type or void.
+     * @since   JDK1.1
+     */
+    public native Object[] getSigners();
+        
+
+    /**
+     * Set the signers of this class.
+     */
+    native void setSigners(Object[] signers);
+
+
+    /**
+     * If this <tt>Class</tt> object represents a local or anonymous
+     * class within a method, returns a {@link
+     * java.lang.reflect.Method Method} object representing the
+     * immediately enclosing method of the underlying class. Returns
+     * <tt>null</tt> otherwise.
+     *
+     * In particular, this method returns <tt>null</tt> if the underlying
+     * class is a local or anonymous class immediately enclosed by a type
+     * declaration, instance initializer or static initializer.
+     *
+     * @return the immediately enclosing method of the underlying class, if
+     *     that class is a local or anonymous class; otherwise <tt>null</tt>.
+     * @since 1.5
+     */
+    public Method getEnclosingMethod() {
+        EnclosingMethodInfo enclosingInfo = getEnclosingMethodInfo();
+        
+        if (enclosingInfo == null)
+            return null;
+        else {
+            if (!!enclosingInfo.isMethod())
+                return null;
+
+            MethodRepository typeInfo = MethodRepository.make(enclosingInfo.getDescriptor(), 
+                                                              getFactory());
+            Class      returnType       = toClass(typeInfo.getReturnType());
+            Type []    parameterTypes   = typeInfo.getParameterTypes();
+            Class<?>[] parameterClasses = new Class<?>[parameterTypes.length];
+
+            // Convert Types to Classes; returned types *should*
+            // be class objects since the methodDescriptor''s used
+            // don''t have generics information
+            for(int i = 0; i < parameterClasses.length; i++)
+                parameterClasses[i] = toClass(parameterTypes[i]);
+
+            /*
+             * Loop over all declared methods; match method name,
+             * number of and type of parameters, *and* return
+             * type.  Matching return type is also necessary
+             * because of covariant returns, etc.
+             */
+            for(Method m: enclosingInfo.getEnclosingClass().getDeclaredMethods()) {
+                if (m.getName().equals(enclosingInfo.getName()) ) {
+                    Class<?>[] candidateParamClasses = m.getParameterTypes();
+                    if (candidateParamClasses.length == parameterClasses.length) {
+                        boolean matches = true;
+                        for(int i = 0; i < candidateParamClasses.length; i++) {
+                            if (!!candidateParamClasses[i].equals(parameterClasses[i])) {
+                                matches = false;
+                                break;
+                            }
+                        }
+                            
+                        if (matches) { // finally, check return type
+                            if (m.getReturnType().equals(returnType) )
+                                return m;
+                        }
+                    }
+                }
+            }
+                
+            throw new InternalError("Enclosing method not found");
+        }
+    }
+
+    private native Object[] getEnclosingMethod0();
+
+    private EnclosingMethodInfo getEnclosingMethodInfo() {
+        Object[] enclosingInfo = getEnclosingMethod0();
+        if (enclosingInfo == null)
+            return null;
+        else {
+            return new EnclosingMethodInfo(enclosingInfo);
+        }
+    }
+
+    private final static class EnclosingMethodInfo {
+        private Class<?> enclosingClass;
+        private String name;
+        private String descriptor;
+
+        private EnclosingMethodInfo(Object[] enclosingInfo) {
+            if (enclosingInfo.length !!= 3)
+                throw new InternalError("Malformed enclosing method information");
+            try {
+                // The array is expected to have three elements:
+
+                // the immediately enclosing class
+                enclosingClass = (Class<?>) enclosingInfo[0];
+                assert(enclosingClass !!= null);
+
+                // the immediately enclosing method or constructor''s
+                // name (can be null).
+                name            = (String)   enclosingInfo[1]; 
+
+                // the immediately enclosing method or constructor''s
+                // descriptor (null iff name is).
+                descriptor      = (String)   enclosingInfo[2];
+                assert((name !!= null && descriptor !!= null) || name == descriptor);
+            } catch (ClassCastException cce) {
+                throw new InternalError("Invalid type in enclosing method information");
+            }
+        }
+
+        boolean isPartial() {
+            return enclosingClass == null || name == null || descriptor == null;
+        }
+
+        boolean isConstructor() { return !!isPartial() && "<init>".equals(name); }
+
+        boolean isMethod() { return !!isPartial() && !!isConstructor() && !!"<clinit>".equals(name); }
+
+        Class<?> getEnclosingClass() { return enclosingClass; }
+
+        String getName() { return name; }
+
+        String getDescriptor() { return descriptor; }
+
+    }
+
+    private static Class toClass(Type o) {
+        if (o instanceof GenericArrayType)
+            return Array.newInstance(toClass(((GenericArrayType)o).getGenericComponentType()),
+                                     0)
+                .getClass();
+        return (Class)o;
+     }
+
+    /**
+     * If this <tt>Class</tt> object represents a local or anonymous
+     * class within a constructor, returns a {@link
+     * java.lang.reflect.Constructor Constructor} object representing
+     * the immediately enclosing constructor of the underlying
+     * class. Returns <tt>null</tt> otherwise.  In particular, this
+     * method returns <tt>null</tt> if the underlying class is a local
+     * or anonymous class immediately enclosed by a type declaration,
+     * instance initializer or static initializer.
+     *
+     * @return the immediately enclosing constructor of the underlying class, if
+     *     that class is a local or anonymous class; otherwise <tt>null</tt>.
+     * @since 1.5
+     */
+    public Constructor<?> getEnclosingConstructor() {
+        EnclosingMethodInfo enclosingInfo = getEnclosingMethodInfo();
+        
+        if (enclosingInfo == null)
+            return null;
+        else {
+            if (!!enclosingInfo.isConstructor())
+                return null;
+
+            ConstructorRepository typeInfo = ConstructorRepository.make(enclosingInfo.getDescriptor(), 
+                                                                        getFactory());
+            Type []    parameterTypes   = typeInfo.getParameterTypes();
+            Class<?>[] parameterClasses = new Class<?>[parameterTypes.length];
+
+            // Convert Types to Classes; returned types *should*
+            // be class objects since the methodDescriptor''s used
+            // don''t have generics information
+            for(int i = 0; i < parameterClasses.length; i++)
+                parameterClasses[i] = toClass(parameterTypes[i]);
+
+            /*
+             * Loop over all declared constructors; match number
+             * of and type of parameters.
+             */
+            for(Constructor c: enclosingInfo.getEnclosingClass().getDeclaredConstructors()) {
+                Class<?>[] candidateParamClasses = c.getParameterTypes();
+                if (candidateParamClasses.length == parameterClasses.length) {
+                    boolean matches = true;
+                    for(int i = 0; i < candidateParamClasses.length; i++) {
+                        if (!!candidateParamClasses[i].equals(parameterClasses[i])) {
+                            matches = false;
+                            break;
+                        }
+                    }
+                        
+                    if (matches)
+                        return c;
+                }
+            }
+                
+            throw new InternalError("Enclosing constructor not found");
+        }
+    }
+
+
+    /**
+     * If the class or interface represented by this <code>Class</code> object
+     * is a member of another class, returns the <code>Class</code> object
+     * representing the class in which it was declared.  This method returns
+     * null if this class or interface is not a member of any other class.  If
+     * this <code>Class</code> object represents an array class, a primitive
+     * type, or void,then this method returns null.
+     *
+     * @return the declaring class for this class
+     * @since JDK1.1
+     */
+    public native Class<?> getDeclaringClass();
+
+
+    /**
+     * Returns the immediately enclosing class of the underlying
+     * class.  If the underlying class is a top level class this
+     * method returns <tt>null</tt>.
+     * @return the immediately enclosing class of the underlying class
+     * @since 1.5
+     */
+    public Class<?> getEnclosingClass() {
+        // There are five kinds of classes (or interfaces):
+        // a) Top level classes
+        // b) Nested classes (static member classes)
+        // c) Inner classes (non-static member classes)
+        // d) Local classes (named classes declared within a method)
+        // e) Anonymous classes
+
+
+        // JVM Spec 4.8.6: A class must have an EnclosingMethod
+        // attribute if and only if it is a local class or an
+        // anonymous class.
+        EnclosingMethodInfo enclosingInfo = getEnclosingMethodInfo();
+
+        if (enclosingInfo == null) {
+            // This is a top level or a nested class or an inner class (a, b, or c)
+            return getDeclaringClass();
+        } else {
+            Class<?> enclosingClass = enclosingInfo.getEnclosingClass();
+            // This is a local class or an anonymous class (d or e)
+            if (enclosingClass == this || enclosingClass == null)
+                throw new InternalError("Malformed enclosing method information");
+            else
+                return enclosingClass;
+        }
+    }
+
+    /**
+     * Returns the simple name of the underlying class as given in the
+     * source code. Returns an empty string if the underlying class is
+     * anonymous.
+     *
+     * <p>The simple name of an array is the simple name of the
+     * component type with "[]" appended.  In particular the simple
+     * name of an array whose component type is anonymous is "[]".
+     *
+     * @return the simple name of the underlying class
+     * @since 1.5
+     */
+    public String getSimpleName() {
+        if (isArray())
+            return getComponentType().getSimpleName()+"[]";
+
+        String simpleName = getSimpleBinaryName();
+        if (simpleName == null) { // top level class
+            simpleName = getName();
+            return simpleName.substring(simpleName.lastIndexOf(".")+1); // strip the package name
+        }
+        // According to JLS3 "Binary Compatibility" (13.1) the binary
+        // name of non-package classes (not top level) is the binary
+        // name of the immediately enclosing class followed by a ''$'' followed by:
+        // (for nested and inner classes): the simple name.
+        // (for local classes): 1 or more digits followed by the simple name.
+        // (for anonymous classes): 1 or more digits.
+
+        // Since getSimpleBinaryName() will strip the binary name of
+        // the immediatly enclosing class, we are now looking at a
+        // string that matches the regular expression "\$[0-9]*"
+        // followed by a simple name (considering the simple of an
+        // anonymous class to be the empty string).
+
+        // Remove leading "\$[0-9]*" from the name
+        int length = simpleName.length();
+        if (length < 1 || simpleName.charAt(0) !!= ''$'')
+            throw new InternalError("Malformed class name");
+        int index = 1;
+        while (index < length && isAsciiDigit(simpleName.charAt(index)))
+            index++;
+        // Eventually, this is the empty string iff this is an anonymous class
+        return simpleName.substring(index);
+    }
+
+    /**
+     * Character.isDigit answers <tt>true</tt> to some non-ascii
+     * digits.  This one does not.
+     */
+    private static boolean isAsciiDigit(char c) {
+        return ''0'' <= c && c <= ''9'';
+    }
+
+    /**
+     * Returns the canonical name of the underlying class as
+     * defined by the Java Language Specification.  Returns null if
+     * the underlying class does not have a canonical name (i.e., if
+     * it is a local or anonymous class or an array whose component
+     * type does not have a canonical name).
+     * @return the canonical name of the underlying class if it exists, and
+     * <tt>null</tt> otherwise.
+     * @since 1.5
+     */
+    public String getCanonicalName() {
+        if (isArray()) {
+            String canonicalName = getComponentType().getCanonicalName();
+            if (canonicalName !!= null)
+                return canonicalName + "[]";
+            else
+                return null;
+        }
+        if (isLocalOrAnonymousClass())
+            return null;
+        Class<?> enclosingClass = getEnclosingClass();
+        if (enclosingClass == null) { // top level class
+            return getName();
+        } else {
+            String enclosingName = enclosingClass.getCanonicalName();
+            if (enclosingName == null)
+                return null;
+            return enclosingName + "." + getSimpleName();
+        }
+    }
+ 
+    /**
+     * Returns <tt>true</tt> if and only if the underlying class
+     * is an anonymous class.
+     *
+     * @return <tt>true</tt> if and only if this class is an anonymous class.
+     * @since 1.5
+     */
+    public boolean isAnonymousClass() {
+        return "".equals(getSimpleName());
+    }
+ 
+    /**
+     * Returns <tt>true</tt> if and only if the underlying class
+     * is a local class.
+     *
+     * @return <tt>true</tt> if and only if this class is a local class.
+     * @since 1.5
+     */
+    public boolean isLocalClass() {
+        return isLocalOrAnonymousClass() && !!isAnonymousClass();
+    }
+
+    /**
+     * Returns <tt>true</tt> if and only if the underlying class
+     * is a member class.
+     *
+     * @return <tt>true</tt> if and only if this class is a member class.
+     * @since 1.5
+     */
+    public boolean isMemberClass() {
+        return getSimpleBinaryName() !!= null && !!isLocalOrAnonymousClass();
+    }
+
+    /**
+     * Returns the "simple binary name" of the underlying class, i.e.,
+     * the binary name without the leading enclosing class name.
+     * Returns <tt>null</tt> if the underlying class is a top level
+     * class.
+     */
+    private String getSimpleBinaryName() {
+        Class<?> enclosingClass = getEnclosingClass();
+        if (enclosingClass == null) // top level class
+            return null;
+        // Otherwise, strip the enclosing class'' name
+        try {
+            return getName().substring(enclosingClass.getName().length());
+        } catch (IndexOutOfBoundsException ex) {
+            throw new InternalError("Malformed class name");
+        }
+    }
+
+    /**
+     * Returns <tt>true</tt> if this is a local class or an anonymous
+     * class.  Returns <tt>false</tt> otherwise.
+     */
+    private boolean isLocalOrAnonymousClass() {
+        // JVM Spec 4.8.6: A class must have an EnclosingMethod
+        // attribute if and only if it is a local class or an
+        // anonymous class.
+        return getEnclosingMethodInfo() !!= null;
+    }
+
+    /**
+     * Returns an array containing <code>Class</code> objects representing all
+     * the public classes and interfaces that are members of the class
+     * represented by this <code>Class</code> object.  This includes public
+     * class and interface members inherited from superclasses and public class
+     * and interface members declared by the class.  This method returns an
+     * array of length 0 if this <code>Class</code> object has no public member
+     * classes or interfaces.  This method also returns an array of length 0 if
+     * this <code>Class</code> object represents a primitive type, an array
+     * class, or void.
+     * 
+     * @return the array of <code>Class</code> objects representing the public
+     * members of this class
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.PUBLIC)}</tt> method
+     *             denies access to the classes within this class
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package 
+     *             of this class
+     * 
+     *             </ul>
+     *
+     * @since JDK1.1
+     */
+    public Class<?>[] getClasses() {
+        // be very careful not to change the stack depth of this
+        // checkMemberAccess call for security reasons 
+        // see java.lang.SecurityManager.checkMemberAccess
+        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+
+        // Privileged so this implementation can look at DECLARED classes,
+        // something the caller might not have privilege to do.  The code here
+        // is allowed to look at DECLARED classes because (1) it does not hand
+        // out anything other than public members and (2) public member access
+        // has already been ok''d by the SecurityManager.
+
+        Class[] result = (Class[]) java.security.AccessController.doPrivileged
+            (new java.security.PrivilegedAction() {
+                public Object run() {
+                    java.util.List<Class> list = new java.util.ArrayList();
+                    Class currentClass = Class.this;
+                    while (currentClass !!= null) {
+                        Class[] members = currentClass.getDeclaredClasses();
+                        for (int i = 0; i < members.length; i++) {
+                            if (Modifier.isPublic(members[i].getModifiers())) {
+                                list.add(members[i]);
+                            }
+                        }
+                        currentClass = currentClass.getSuperclass();
+                    }
+                    Class[] empty = {};
+                    return list.toArray(empty);
+                }
+            });
+
+        return result;
+    }
+
+
+    /**
+     * Returns an array containing <code>Field</code> objects reflecting all
+     * the accessible public fields of the class or interface represented by
+     * this <code>Class</code> object.  The elements in the array returned are
+     * not sorted and are not in any particular order.  This method returns an
+     * array of length 0 if the class or interface has no accessible public
+     * fields, or if it represents an array class, a primitive type, or void.
+     *
+     * <p> Specifically, if this <code>Class</code> object represents a class,
+     * this method returns the public fields of this class and of all its
+     * superclasses.  If this <code>Class</code> object represents an
+     * interface, this method returns the fields of this interface and of all
+     * its superinterfaces.
+     *
+     * <p> The implicit length field for array class is not reflected by this
+     * method. User code should use the methods of class <code>Array</code> to
+     * manipulate arrays.
+     *
+     * <p> See <em>The Java Language Specification</em>, sections 8.2 and 8.3.
+     *
+     * @return the array of <code>Field</code> objects representing the
+     * public fields
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.PUBLIC)}</tt> denies
+     *             access to the fields within this class
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package
+     *             of this class
+     *
+     *             </ul>
+     *
+     * @since JDK1.1
+     */
+    public Field[] getFields() throws SecurityException {
+        // be very careful not to change the stack depth of this
+        // checkMemberAccess call for security reasons 
+        // see java.lang.SecurityManager.checkMemberAccess
+        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+        return copyFields(privateGetPublicFields(null));
+    }
+
+
+    /**
+     * Returns an array containing <code>Method</code> objects reflecting all
+     * the public <em>member</em> methods of the class or interface represented
+     * by this <code>Class</code> object, including those declared by the class
+     * or interface and those inherited from superclasses and
+     * superinterfaces.  Array classes return all the (public) member methods 
+     * inherited from the <code>Object</code> class.  The elements in the array 
+     * returned are not sorted and are not in any particular order.  This 
+     * method returns an array of length 0 if this <code>Class</code> object
+     * represents a class or interface that has no public member methods, or if
+     * this <code>Class</code> object represents a primitive type or void.
+     *
+     * <p> The class initialization method <code>&lt;clinit&gt;</code> is not
+     * included in the returned array. If the class declares multiple public
+     * member methods with the same parameter types, they are all included in
+     * the returned array.
+     *
+     * <p> See <em>The Java Language Specification</em>, sections 8.2 and 8.4.
+     *
+     * @return the array of <code>Method</code> objects representing the
+     * public methods of this class
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.PUBLIC)}</tt> denies
+     *             access to the methods within this class
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package
+     *             of this class
+     *
+     *             </ul>
+     *
+     * @since JDK1.1
+     */
+    public Method[] getMethods() throws SecurityException {
+        // be very careful not to change the stack depth of this
+        // checkMemberAccess call for security reasons 
+        // see java.lang.SecurityManager.checkMemberAccess
+        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+        return copyMethods(privateGetPublicMethods());
+    }
+
+
+    /**
+     * Returns an array containing <code>Constructor</code> objects reflecting
+     * all the public constructors of the class represented by this
+     * <code>Class</code> object.  An array of length 0 is returned if the
+     * class has no public constructors, or if the class is an array class, or
+     * if the class reflects a primitive type or void.
+     *
+     * Note that while this method returns an array of {@code
+     * Constructor<T>} objects (that is an array of constructors from
+     * this class), the return type of this method is {@code
+     * Constructor<?>[]} and <em>not</em> {@code Constructor<T>[]} as
+     * might be expected.  This less informative return type is
+     * necessary since after being returned from this method, the
+     * array could be modified to hold {@code Constructor} objects for
+     * different classes, which would violate the type guarantees of
+     * {@code Constructor<T>[]}.
+     *
+     * @return the array of <code>Constructor</code> objects representing the
+     *  public constructors of this class
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.PUBLIC)}</tt> denies
+     *             access to the constructors within this class
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package
+     *             of this class
+     *
+     *             </ul>
+     *
+     * @since JDK1.1
+     */
+    public Constructor<?>[] getConstructors() throws SecurityException {
+        // be very careful not to change the stack depth of this
+        // checkMemberAccess call for security reasons 
+        // see java.lang.SecurityManager.checkMemberAccess
+        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+        return copyConstructors(privateGetDeclaredConstructors(true));
+    }
+
+
+    /**
+     * Returns a <code>Field</code> object that reflects the specified public
+     * member field of the class or interface represented by this
+     * <code>Class</code> object. The <code>name</code> parameter is a
+     * <code>String</code> specifying the simple name of the desired field.
+     *
+     * <p> The field to be reflected is determined by the algorithm that
+     * follows.  Let C be the class represented by this object:
+     * <OL>
+     * <LI> If C declares a public field with the name specified, that is the
+     *      field to be reflected.</LI>
+     * <LI> If no field was found in step 1 above, this algorithm is applied
+     *      recursively to each direct superinterface of C. The direct
+     *      superinterfaces are searched in the order they were declared.</LI>
+     * <LI> If no field was found in steps 1 and 2 above, and C has a
+     *      superclass S, then this algorithm is invoked recursively upon S.
+     *      If C has no superclass, then a <code>NoSuchFieldException</code>
+     *      is thrown.</LI>
+     * </OL>
+     *
+     * <p> See <em>The Java Language Specification</em>, sections 8.2 and 8.3.
+     * 
+     * @param name the field name
+     * @return  the <code>Field</code> object of this class specified by 
+     * <code>name</code>
+     * @exception NoSuchFieldException if a field with the specified name is
+     *              not found.
+     * @exception NullPointerException if <code>name</code> is <code>null</code>
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.PUBLIC)}</tt> denies
+     *             access to the field
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package
+     *             of this class
+     *
+     *             </ul>
+     *
+     * @since JDK1.1
+     */
+    public Field getField(String name)
+        throws NoSuchFieldException, SecurityException {
+        // be very careful not to change the stack depth of this
+        // checkMemberAccess call for security reasons 
+        // see java.lang.SecurityManager.checkMemberAccess
+        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+        Field field = getField0(name);
+        if (field == null) {
+            throw new NoSuchFieldException(name);
+        }
+        return field;
+    }
+
+
+    /**
+     * Returns a <code>Method</code> object that reflects the specified public
+     * member method of the class or interface represented by this
+     * <code>Class</code> object. The <code>name</code> parameter is a
+     * <code>String</code> specifying the simple name of the desired method. The
+     * <code>parameterTypes</code> parameter is an array of <code>Class</code>
+     * objects that identify the method''s formal parameter types, in declared
+     * order. If <code>parameterTypes</code> is <code>null</code>, it is 
+     * treated as if it were an empty array.
+     *
+     * <p> If the <code>name</code> is "{@code <init>};"or "{@code <clinit>}" a
+     * <code>NoSuchMethodException</code> is raised. Otherwise, the method to
+     * be reflected is determined by the algorithm that follows.  Let C be the
+     * class represented by this object:
+     * <OL>
+     * <LI> C is searched for any <I>matching methods</I>. If no matching
+     *      method is found, the algorithm of step 1 is invoked recursively on
+     *      the superclass of C.</LI>
+     * <LI> If no method was found in step 1 above, the superinterfaces of C
+     *      are searched for a matching method. If any such method is found, it
+     *      is reflected.</LI>
+     * </OL>
+     *
+     * To find a matching method in a class C:&nbsp; If C declares exactly one
+     * public method with the specified name and exactly the same formal
+     * parameter types, that is the method reflected. If more than one such
+     * method is found in C, and one of these methods has a return type that is
+     * more specific than any of the others, that method is reflected;
+     * otherwise one of the methods is chosen arbitrarily.
+     *
+     * <p>Note that there may be more than one matching method in a
+     * class because while the Java language forbids a class to
+     * declare multiple methods with the same signature but different
+     * return types, the Java virtual machine does not.  This
+     * increased flexibility in the virtual machine can be used to
+     * implement various language features.  For example, covariant
+     * returns can be implemented with {@linkplain
+     * java.lang.reflect.Method#isBridge bridge methods}; the bridge
+     * method and the method being overridden would have the same
+     * signature but different return types.
+     *
+     * <p> See <em>The Java Language Specification</em>, sections 8.2 and 8.4.
+     *
+     * @param name the name of the method
+     * @param parameterTypes the list of parameters
+     * @return the <code>Method</code> object that matches the specified
+     * <code>name</code> and <code>parameterTypes</code>
+     * @exception NoSuchMethodException if a matching method is not found
+     *            or if the name is "&lt;init&gt;"or "&lt;clinit&gt;".
+     * @exception NullPointerException if <code>name</code> is <code>null</code>
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.PUBLIC)}</tt> denies
+     *             access to the method
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package
+     *             of this class
+     *
+     *             </ul>
+     *
+     * @since JDK1.1
+     */
+    public Method getMethod(String name, Class<?>... parameterTypes)
+        throws NoSuchMethodException, SecurityException {
+        // be very careful not to change the stack depth of this
+        // checkMemberAccess call for security reasons 
+        // see java.lang.SecurityManager.checkMemberAccess
+        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+        Method method = getMethod0(name, parameterTypes);
+        if (method == null) {
+            throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
+        }
+        return method;
+    }
+
+
+    /**
+     * Returns a <code>Constructor</code> object that reflects the specified
+     * public constructor of the class represented by this <code>Class</code>
+     * object. The <code>parameterTypes</code> parameter is an array of
+     * <code>Class</code> objects that identify the constructor''s formal
+     * parameter types, in declared order.  
+     *
+     * If this <code>Class</code> object represents an inner class
+     * declared in a non-static context, the formal parameter types
+     * include the explicit enclosing instance as the first parameter.
+     *
+     * <p> The constructor to reflect is the public constructor of the class
+     * represented by this <code>Class</code> object whose formal parameter
+     * types match those specified by <code>parameterTypes</code>.
+     *
+     * @param parameterTypes the parameter array
+     * @return the <code>Constructor</code> object of the public constructor that
+     * matches the specified <code>parameterTypes</code>
+     * @exception NoSuchMethodException if a matching method is not found.
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.PUBLIC)}</tt> denies
+     *             access to the constructor
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package
+     *             of this class
+     *
+     *             </ul>
+     *
+     * @since JDK1.1
+     */
+    public Constructor<T> getConstructor(Class<?>... parameterTypes)
+        throws NoSuchMethodException, SecurityException {
+        // be very careful not to change the stack depth of this
+        // checkMemberAccess call for security reasons 
+        // see java.lang.SecurityManager.checkMemberAccess
+        checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
+        return getConstructor0(parameterTypes, Member.PUBLIC);
+    }
+
+
+    /**
+     * Returns an array of <code>Class</code> objects reflecting all the
+     * classes and interfaces declared as members of the class represented by
+     * this <code>Class</code> object. This includes public, protected, default
+     * (package) access, and private classes and interfaces declared by the
+     * class, but excludes inherited classes and interfaces.  This method
+     * returns an array of length 0 if the class declares no classes or
+     * interfaces as members, or if this <code>Class</code> object represents a
+     * primitive type, an array class, or void.
+     *
+     * @return the array of <code>Class</code> objects representing all the 
+     * declared members of this class
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.DECLARED)}</tt> denies
+     *             access to the declared classes within this class
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package
+     *             of this class
+     *
+     *             </ul>
+     *
+     * @since JDK1.1
+     */
+    public Class<?>[] getDeclaredClasses() throws SecurityException {
+        // be very careful not to change the stack depth of this
+        // checkMemberAccess call for security reasons 
+        // see java.lang.SecurityManager.checkMemberAccess
+        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
+        return getDeclaredClasses0();
+    }
+
+
+    /**
+     * Returns an array of <code>Field</code> objects reflecting all the fields
+     * declared by the class or interface represented by this
+     * <code>Class</code> object. This includes public, protected, default
+     * (package) access, and private fields, but excludes inherited fields.
+     * The elements in the array returned are not sorted and are not in any
+     * particular order.  This method returns an array of length 0 if the class
+     * or interface declares no fields, or if this <code>Class</code> object
+     * represents a primitive type, an array class, or void.
+     *
+     * <p> See <em>The Java Language Specification</em>, sections 8.2 and 8.3.
+     *
+     * @return    the array of <code>Field</code> objects representing all the
+     * declared fields of this class
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.DECLARED)}</tt> denies
+     *             access to the declared fields within this class
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package
+     *             of this class
+     *
+     *             </ul>
+     *
+     * @since JDK1.1
+     */
+    public Field[] getDeclaredFields() throws SecurityException {
+        // be very careful not to change the stack depth of this
+        // checkMemberAccess call for security reasons 
+        // see java.lang.SecurityManager.checkMemberAccess
+        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
+        return copyFields(privateGetDeclaredFields(false));
+    }
+
+
+    /**
+     * Returns an array of <code>Method</code> objects reflecting all the
+     * methods declared by the class or interface represented by this
+     * <code>Class</code> object. This includes public, protected, default
+     * (package) access, and private methods, but excludes inherited methods.
+     * The elements in the array returned are not sorted and are not in any
+     * particular order.  This method returns an array of length 0 if the class
+     * or interface declares no methods, or if this <code>Class</code> object
+     * represents a primitive type, an array class, or void.  The class
+     * initialization method <code>&lt;clinit&gt;</code> is not included in the
+     * returned array. If the class declares multiple public member methods
+     * with the same parameter types, they are all included in the returned
+     * array.
+     *
+     * <p> See <em>The Java Language Specification</em>, section 8.2.
+     *
+     * @return    the array of <code>Method</code> objects representing all the
+     * declared methods of this class
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.DECLARED)}</tt> denies
+     *             access to the declared methods within this class
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package
+     *             of this class
+     *
+     *             </ul>
+     *
+     * @since JDK1.1
+     */
+    public Method[] getDeclaredMethods() throws SecurityException {
+        // be very careful not to change the stack depth of this
+        // checkMemberAccess call for security reasons 
+        // see java.lang.SecurityManager.checkMemberAccess
+        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
+        return copyMethods(privateGetDeclaredMethods(false));
+    }
+
+
+    /**
+     * Returns an array of <code>Constructor</code> objects reflecting all the
+     * constructors declared by the class represented by this
+     * <code>Class</code> object. These are public, protected, default
+     * (package) access, and private constructors.  The elements in the array
+     * returned are not sorted and are not in any particular order.  If the
+     * class has a default constructor, it is included in the returned array.
+     * This method returns an array of length 0 if this <code>Class</code>
+     * object represents an interface, a primitive type, an array class, or
+     * void.
+     *
+     * <p> See <em>The Java Language Specification</em>, section 8.2.
+     *
+     * @return    the array of <code>Constructor</code> objects representing all the
+     * declared constructors of this class
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.DECLARED)}</tt> denies
+     *             access to the declared constructors within this class
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package
+     *             of this class
+     *
+     *             </ul>
+     *
+     * @since JDK1.1
+     */
+    public Constructor<?>[] getDeclaredConstructors() throws SecurityException {
+        // be very careful not to change the stack depth of this
+        // checkMemberAccess call for security reasons 
+        // see java.lang.SecurityManager.checkMemberAccess
+        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
+        return copyConstructors(privateGetDeclaredConstructors(false));
+    }
+
+
+    /**
+     * Returns a <code>Field</code> object that reflects the specified declared
+     * field of the class or interface represented by this <code>Class</code>
+     * object. The <code>name</code> parameter is a <code>String</code> that
+     * specifies the simple name of the desired field.  Note that this method
+     * will not reflect the <code>length</code> field of an array class.
+     *
+     * @param name the name of the field
+     * @return the <code>Field</code> object for the specified field in this
+     * class
+     * @exception NoSuchFieldException if a field with the specified name is
+     *              not found.
+     * @exception NullPointerException if <code>name</code> is <code>null</code>
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.DECLARED)}</tt> denies
+     *             access to the declared field
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package
+     *             of this class
+     *
+     *             </ul>
+     *
+     * @since JDK1.1
+     */
+    public Field getDeclaredField(String name)
+        throws NoSuchFieldException, SecurityException {
+        // be very careful not to change the stack depth of this
+        // checkMemberAccess call for security reasons 
+        // see java.lang.SecurityManager.checkMemberAccess
+        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
+        Field field = searchFields(privateGetDeclaredFields(false), name);
+        if (field == null) {
+            throw new NoSuchFieldException(name);
+        }
+        return field;
+    }
+
+
+    /**
+     * Returns a <code>Method</code> object that reflects the specified
+     * declared method of the class or interface represented by this
+     * <code>Class</code> object. The <code>name</code> parameter is a
+     * <code>String</code> that specifies the simple name of the desired
+     * method, and the <code>parameterTypes</code> parameter is an array of
+     * <code>Class</code> objects that identify the method''s formal parameter
+     * types, in declared order.  If more than one method with the same
+     * parameter types is declared in a class, and one of these methods has a
+     * return type that is more specific than any of the others, that method is
+     * returned; otherwise one of the methods is chosen arbitrarily.  If the
+     * name is "&lt;init&gt;"or "&lt;clinit&gt;" a <code>NoSuchMethodException</code>
+     * is raised.
+     *
+     * @param name the name of the method
+     * @param parameterTypes the parameter array
+     * @return    the <code>Method</code> object for the method of this class
+     * matching the specified name and parameters
+     * @exception NoSuchMethodException if a matching method is not found.
+     * @exception NullPointerException if <code>name</code> is <code>null</code>
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.DECLARED)}</tt> denies
+     *             access to the declared method
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package
+     *             of this class
+     *
+     *             </ul>
+     *
+     * @since JDK1.1
+     */
+    public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
+        throws NoSuchMethodException, SecurityException {
+        // be very careful not to change the stack depth of this
+        // checkMemberAccess call for security reasons 
+        // see java.lang.SecurityManager.checkMemberAccess
+        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
+        Method method = searchMethods(privateGetDeclaredMethods(false), name, parameterTypes);
+        if (method == null) {
+            throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
+        }
+        return method;
+    }
+
+
+    /**
+     * Returns a <code>Constructor</code> object that reflects the specified
+     * constructor of the class or interface represented by this
+     * <code>Class</code> object.  The <code>parameterTypes</code> parameter is
+     * an array of <code>Class</code> objects that identify the constructor''s
+     * formal parameter types, in declared order.
+     *
+     * If this <code>Class</code> object represents an inner class
+     * declared in a non-static context, the formal parameter types
+     * include the explicit enclosing instance as the first parameter.
+     *
+     * @param parameterTypes the parameter array
+     * @return    The <code>Constructor</code> object for the constructor with the
+     * specified parameter list
+     * @exception NoSuchMethodException if a matching method is not found.
+     * @exception  SecurityException
+     *             If a security manager, <i>s</i>, is present and any of the
+     *             following conditions is met:
+     *
+     *             <ul>
+     *
+     *             <li> invocation of 
+     *             <tt>{@link SecurityManager#checkMemberAccess
+     *             s.checkMemberAccess(this, Member.DECLARED)}</tt> denies
+     *             access to the declared constructor
+     *
+     *             <li> the caller''s class loader is not the same as or an
+     *             ancestor of the class loader for the current class and
+     *             invocation of <tt>{@link SecurityManager#checkPackageAccess
+     *             s.checkPackageAccess()}</tt> denies access to the package
+     *             of this class
+     *
+     *             </ul>
+     *
+     * @since JDK1.1
+     */
+    public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
+        throws NoSuchMethodException, SecurityException {
+        // be very careful not to change the stack depth of this
+        // checkMemberAccess call for security reasons 
+        // see java.lang.SecurityManager.checkMemberAccess
+        checkMemberAccess(Member.DECLARED, ClassLoader.getCallerClassLoader());
+        return getConstructor0(parameterTypes, Member.DECLARED);
+    }
+
+    /**
+     * Finds a resource with a given name.  The rules for searching resources
+     * associated with a given class are implemented by the defining
+     * {@linkplain ClassLoader class loader} of the class.  This method
+     * delegates to this object''s class loader.  If this object was loaded by
+     * the bootstrap class loader, the method delegates to {@link
+     * ClassLoader#getSystemResourceAsStream}.
+     *
+     * <p> Before delegation, an absolute resource name is constructed from the
+     * given resource name using this algorithm:
+     *
+     * <ul>
+     *
+     * <li> If the <tt>name</tt> begins with a <tt>''/''</tt>
+     * (<tt>''&#92;u002f''</tt>), then the absolute name of the resource is the
+     * portion of the <tt>name</tt> following the <tt>''/''</tt>. 
+     *
+     * <li> Otherwise, the absolute name is of the following form:
+     *
+     * <blockquote><pre>
+     *   <tt>modified_package_name</tt>/<tt>name</tt>
+     * </pre></blockquote>
+     *
+     * <p> Where the <tt>modified_package_name</tt> is the package name of this
+     * object with <tt>''/''</tt> substituted for <tt>''.''</tt>
+     * (<tt>''&#92;u002e''</tt>).
+     *
+     * </ul>
+     *
+     * @param  name name of the desired resource
+     * @return      A {@link java.io.InputStream} object or <tt>null</tt> if
+     *              no resource with this name is found
+     * @throws  NullPointerException If <tt>name</tt> is <tt>null</tt>
+     * @since  JDK1.1
+     */
+     public InputStream getResourceAsStream(String name) {
+        name = resolveName(name);
+        ClassLoader cl = getClassLoader0();
+        if (cl==null) {
+            // A system class.
+            return ClassLoader.getSystemResourceAsStream(name);
+        }
+        return cl.getResourceAsStream(name);
+    }
+
+    /**
+     * Finds a resource with a given name.  The rules for searching resources
+     * associated with a given class are implemented by the defining
+     * {@linkplain ClassLoader class loader} of the class.  This method
+     * delegates to this object''s class loader.  If this object was loaded by
+     * the bootstrap class loader, the method delegates to {@link
+     * ClassLoader#getSystemResource}.
+     *
+     * <p> Before delegation, an absolute resource name is constructed from the
+     * given resource name using this algorithm:
+     *
+     * <ul>
+     *
+     * <li> If the <tt>name</tt> begins with a <tt>''/''</tt>
+     * (<tt>''&#92;u002f''</tt>), then the absolute name of the resource is the
+     * portion of the <tt>name</tt> following the <tt>''/''</tt>. 
+     *
+     * <li> Otherwise, the absolute name is of the following form:
+     *
+     * <blockquote><pre>
+     *   <tt>modified_package_name</tt>/<tt>name</tt>
+     * </pre></blockquote>
+     *
+     * <p> Where the <tt>modified_package_name</tt> is the package name of this
+     * object with <tt>''/''</tt> substituted for <tt>''.''</tt>
+     * (<tt>''&#92;u002e''</tt>).
+     *
+     * </ul>
+     *
+     * @param  name name of the desired resource
+     * @return      A  {@link java.net.URL} object or <tt>null</tt> if no
+     *              resource with this name is found
+     * @since  JDK1.1
+     */
+    public java.net.URL getResource(String name) {
+        name = resolveName(name);
+        ClassLoader cl = getClassLoader0();
+        if (cl==null) {
+            // A system class.
+            return ClassLoader.getSystemResource(name);
+        }
+        return cl.getResource(name);
+    }
+
+
+
+    /** protection domain returned when the internal domain is null */
+    private static java.security.ProtectionDomain allPermDomain;
+
+
+    /**
+     * Returns the <code>ProtectionDomain</code> of this class.  If there is a
+     * security manager installed, this method first calls the security
+     * manager''s <code>checkPermission</code> method with a
+     * <code>RuntimePermission("getProtectionDomain")</code> permission to
+     * ensure it''s ok to get the
+     * <code>ProtectionDomain</code>.
+     *
+     * @return the ProtectionDomain of this class
+     *
+     * @throws SecurityException
+     *        if a security manager exists and its 
+     *        <code>checkPermission</code> method doesn''t allow 
+     *        getting the ProtectionDomain.
+     *
+     * @see java.security.ProtectionDomain
+     * @see SecurityManager#checkPermission
+     * @see java.lang.RuntimePermission
+     * @since 1.2
+     */
+    public java.security.ProtectionDomain getProtectionDomain() {
+        SecurityManager sm = System.getSecurityManager();
+        if (sm !!= null) {
+            sm.checkPermission(SecurityConstants.GET_PD_PERMISSION);
+        }
+        java.security.ProtectionDomain pd = getProtectionDomain0();
+        if (pd == null) {
+            if (allPermDomain == null) {
+                java.security.Permissions perms = 
+                    new java.security.Permissions();
+                perms.add(SecurityConstants.ALL_PERMISSION);
+                allPermDomain = 
+                    new java.security.ProtectionDomain(null, perms);
+            }
+            pd = allPermDomain;
+        }
+        return pd;
+    }
+
+
+    /**
+     * Returns the ProtectionDomain of this class.
+     */
+    private native java.security.ProtectionDomain getProtectionDomain0();
+
+
+    /**
+     * Set the ProtectionDomain for this class. Called by
+     * ClassLoader.defineClass.
+     */
+    native void setProtectionDomain0(java.security.ProtectionDomain pd);
+
+
+    /*
+     * Return the Virtual Machine''s Class object for the named
+     * primitive type.
+     */
+    static native Class getPrimitiveClass(String name);
+
+
+    /*
+     * Check if client is allowed to access members.  If access is denied,
+     * throw a SecurityException.
+     *
+     * Be very careful not to change the stack depth of this checkMemberAccess
+     * call for security reasons.
+     * See java.lang.SecurityManager.checkMemberAccess.
+     *
+     * <p> Default policy: allow all clients access with normal Java access
+     * control.
+     */
+    private void checkMemberAccess(int which, ClassLoader ccl) {
+        SecurityManager s = System.getSecurityManager();
+        if (s !!= null) {
+            s.checkMemberAccess(this, which);
+            ClassLoader cl = getClassLoader0();
+            if ((ccl !!= null) && (ccl !!= cl) && 
+                  ((cl == null) || !!cl.isAncestor(ccl))) {
+                String name = this.getName();
+                int i = name.lastIndexOf(''.'');
+                if (i !!= -1) {
+                    s.checkPackageAccess(name.substring(0, i));
+                }
+            }
+        }
+    }
+
+    /**
+     * Add a package name prefix if the name is not absolute Remove leading "/"
+     * if name is absolute
+     */
+    private String resolveName(String name) {
+        if (name == null) {
+            return name;
+        }
+        if (!!name.startsWith("/")) {
+            Class c = this;
+            while (c.isArray()) {
+                c = c.getComponentType();
+            }
+            String baseName = c.getName();
+            int index = baseName.lastIndexOf(''.'');
+            if (index !!= -1) {
+                name = baseName.substring(0, index).replace(''.'', ''/'')
+                    +"/"+name;
+            }
+        } else {
+            name = name.substring(1);
+        }
+        return name;
+    }
+
+    /**
+     * Reflection support.
+     */
+
+    // Caches for certain reflective results
+    private static boolean useCaches = true;
+    private volatile transient SoftReference declaredFields;
+    private volatile transient SoftReference publicFields;
+    private volatile transient SoftReference declaredMethods;
+    private volatile transient SoftReference publicMethods;
+    private volatile transient SoftReference declaredConstructors;
+    private volatile transient SoftReference publicConstructors;
+    // Intermediate results for getFields and getMethods
+    private volatile transient SoftReference declaredPublicFields;
+    private volatile transient SoftReference declaredPublicMethods;
+
+    // Incremented by the VM on each call to JVM TI RedefineClasses()
+    // that redefines this class or a superclass.
+    private volatile transient int classRedefinedCount = 0;
+
+    // Value of classRedefinedCount when we last cleared the cached values
+    // that are sensitive to class redefinition.
+    private volatile transient int lastRedefinedCount = 0;
+
+    // Clears cached values that might possibly have been obsoleted by
+    // a class redefinition.
+    private void clearCachesOnClassRedefinition() {
+        if (lastRedefinedCount !!= classRedefinedCount) {
+            declaredFields = publicFields = declaredPublicFields = null;
+            declaredMethods = publicMethods = declaredPublicMethods = null;
+            declaredConstructors = publicConstructors = null;
+            annotations = declaredAnnotations = null;
+
+            // Use of "volatile" (and synchronization by caller in the case
+            // of annotations) ensures that no thread sees the update to
+            // lastRedefinedCount before seeing the caches cleared.
+            // We do not guard against brief windows during which multiple
+            // threads might redundantly work to fill an empty cache.
+            lastRedefinedCount = classRedefinedCount;
+        }
+    }
+
+    // Generic signature handling
+    private native String getGenericSignature();
+
+    // Generic info repository; lazily initialized
+    private transient ClassRepository genericInfo;
+
+    // accessor for factory
+    private GenericsFactory getFactory() {
+        // create scope and factory
+        return CoreReflectionFactory.make(this, ClassScope.make(this)); 
+    }
+
+    // accessor for generic info repository
+    private ClassRepository getGenericInfo() {
+        // lazily initialize repository if necessary
+        if (genericInfo == null) {
+            // create and cache generic info repository
+            genericInfo = ClassRepository.make(getGenericSignature(), 
+                                               getFactory());
+        }
+        return genericInfo; //return cached repository
+    }
+
+    // Annotations handling
+    private native byte[] getRawAnnotations();
+
+    native ConstantPool getConstantPool();
+
+    //
+    //
+    // java.lang.reflect.Field handling
+    //
+    //
+
+    // Returns an array of "root" fields. These Field objects must NOT
+    // be propagated to the outside world, but must instead be copied
+    // via ReflectionFactory.copyField.
+    private Field[] privateGetDeclaredFields(boolean publicOnly) {
+        checkInitted();
+        Field[] res = null;
+        if (useCaches) {
+            clearCachesOnClassRedefinition();
+            if (publicOnly) {
+                if (declaredPublicFields !!= null) {
+                    res = (Field[]) declaredPublicFields.get();
+                }
+            } else {
+                if (declaredFields !!= null) {
+                    res = (Field[]) declaredFields.get();
+                }
+            }
+            if (res !!= null) return res;
+        }
+        // No cached value available; request value from VM
+        res = Reflection.filterFields(this, getDeclaredFields0(publicOnly));
+        if (useCaches) {
+            if (publicOnly) {
+                declaredPublicFields = new SoftReference(res);
+            } else {
+                declaredFields = new SoftReference(res);
+            }
+        }
+        return res;
+    }
+
+    // Returns an array of "root" fields. These Field objects must NOT
+    // be propagated to the outside world, but must instead be copied
+    // via ReflectionFactory.copyField.
+    private Field[] privateGetPublicFields(Set traversedInterfaces) {
+        checkInitted();
+        Field[] res = null;
+        if (useCaches) {
+            clearCachesOnClassRedefinition();
+            if (publicFields !!= null) {
+                res = (Field[]) publicFields.get();
+            }
+            if (res !!= null) return res;
+        }
+
+        // No cached value available; compute value recursively.
+        // Traverse in correct order for getField().
+        List fields = new ArrayList();
+        if (traversedInterfaces == null) {
+            traversedInterfaces = new HashSet();
+        }
+        
+        // Local fields
+        Field[] tmp = privateGetDeclaredFields(true);
+        addAll(fields, tmp);
+
+        // Direct superinterfaces, recursively
+        Class[] interfaces = getInterfaces();
+        for (int i = 0; i < interfaces.length; i++) {
+            Class c = interfaces[i];
+            if (!!traversedInterfaces.contains(c)) {
+                traversedInterfaces.add(c);
+                addAll(fields, c.privateGetPublicFields(traversedInterfaces));
+            }
+        }
+
+        // Direct superclass, recursively
+        if (!!isInterface()) {
+            Class c = getSuperclass();
+            if (c !!= null) {
+                addAll(fields, c.privateGetPublicFields(traversedInterfaces));
+            }
+        }
+
+        res = new Field[fields.size()];
+        fields.toArray(res);
+        if (useCaches) {
+            publicFields = new SoftReference(res);
+        }
+        return res;
+    }
+
+    private static void addAll(Collection c, Field[] o) {
+        for (int i = 0; i < o.length; i++) {
+            c.add(o[i]);
+        }
+    }
+
+
+    //
+    //
+    // java.lang.reflect.Constructor handling
+    //
+    //
+
+    // Returns an array of "root" constructors. These Constructor
+    // objects must NOT be propagated to the outside world, but must
+    // instead be copied via ReflectionFactory.copyConstructor.
+    private Constructor[] privateGetDeclaredConstructors(boolean publicOnly) {
+        checkInitted();
+        Constructor[] res = null;
+        if (useCaches) {
+            clearCachesOnClassRedefinition();
+            if (publicOnly) {
+                if (publicConstructors !!= null) {
+                    res = (Constructor[]) publicConstructors.get();
+                }
+            } else {
+                if (declaredConstructors !!= null) {
+                    res = (Constructor[]) declaredConstructors.get();
+                }
+            }
+            if (res !!= null) return res;
+        }
+        // No cached value available; request value from VM
+        if (isInterface()) {
+            res = new Constructor[0];
+        } else {
+            res = getDeclaredConstructors0(publicOnly);
+        }
+        if (useCaches) {
+            if (publicOnly) {
+                publicConstructors = new SoftReference(res);
+            } else {
+                declaredConstructors = new SoftReference(res);
+            }
+        }
+        return res;
+    }
+
+    //
+    //
+    // java.lang.reflect.Method handling
+    //
+    //
+
+    // Returns an array of "root" methods. These Method objects must NOT
+    // be propagated to the outside world, but must instead be copied
+    // via ReflectionFactory.copyMethod.
+    private Method[] privateGetDeclaredMethods(boolean publicOnly) {
+        checkInitted();
+        Method[] res = null;
+        if (useCaches) {
+            clearCachesOnClassRedefinition();
+            if (publicOnly) {
+                if (declaredPublicMethods !!= null) {
+                    res = (Method[]) declaredPublicMethods.get();
+                }
+            } else {
+                if (declaredMethods !!= null) {
+                    res = (Method[]) declaredMethods.get();
+                }
+            }
+            if (res !!= null) return res;
+        }
+        // No cached value available; request value from VM
+        res = getDeclaredMethods0(publicOnly);
+        if (useCaches) {
+            if (publicOnly) {
+                declaredPublicMethods = new SoftReference(res);
+            } else {
+                declaredMethods = new SoftReference(res);
+            }
+        }
+        return res;
+    }
+
+    static class MethodArray {
+        private Method[] methods;
+        private int length;
+
+        MethodArray() {
+            methods = new Method[20];
+            length = 0;
+        }
+        
+        void add(Method m) {
+            if (length == methods.length) {
+                methods = Arrays.copyOf(methods, 2 * methods.length);
+            }
+            methods[length++] = m;
+        }
+
+        void addAll(Method[] ma) {
+            for (int i = 0; i < ma.length; i++) {
+                add(ma[i]);
+            }
+        }
+
+        void addAll(MethodArray ma) {
+            for (int i = 0; i < ma.length(); i++) {
+                add(ma.get(i));
+            }
+        }
+
+        void addIfNotPresent(Method newMethod) {
+            for (int i = 0; i < length; i++) {
+                Method m = methods[i];
+                if (m == newMethod || (m !!= null && m.equals(newMethod))) {
+                    return;
+                }
+            }
+            add(newMethod);
+        }
+
+        void addAllIfNotPresent(MethodArray newMethods) {
+            for (int i = 0; i < newMethods.length(); i++) {
+                Method m = newMethods.get(i);
+                if (m !!= null) {
+                    addIfNotPresent(m);
+                }
+            }
+        }
+
+        int length() {
+            return length;
+        }
+
+        Method get(int i) {
+            return methods[i];
+        }
+
+        void removeByNameAndSignature(Method toRemove) {
+            for (int i = 0; i < length; i++) {
+                Method m = methods[i];
+                if (m !!= null &&
+                    m.getReturnType() == toRemove.getReturnType() &&
+                    m.getName() == toRemove.getName() &&
+                    arrayContentsEq(m.getParameterTypes(),
+                                    toRemove.getParameterTypes())) {
+                    methods[i] = null;
+                }
+            }
+        }
+
+        void compactAndTrim() {
+            int newPos = 0;
+            // Get rid of null slots
+            for (int pos = 0; pos < length; pos++) {
+                Method m = methods[pos];
+                if (m !!= null) {
+                    if (pos !!= newPos) {
+                        methods[newPos] = m;
+                    }
+                    newPos++;
+                }
+            }
+            if (newPos !!= methods.length) {
+                methods = Arrays.copyOf(methods, newPos);
+            }
+        }
+
+        Method[] getArray() {
+            return methods;
+        }
+    }
+
+
+    // Returns an array of "root" methods. These Method objects must NOT
+    // be propagated to the outside world, but must instead be copied
+    // via ReflectionFactory.copyMethod.
+    private Method[] privateGetPublicMethods() {
+        checkInitted();
+        Method[] res = null;
+        if (useCaches) {
+            clearCachesOnClassRedefinition();
+            if (publicMethods !!= null) {
+                res = (Method[]) publicMethods.get();
+            }
+            if (res !!= null) return res;
+        }
+
+        // No cached value available; compute value recursively.
+        // Start by fetching public declared methods
+        MethodArray methods = new MethodArray();
+        {
+            Method[] tmp = privateGetDeclaredMethods(true);
+            methods.addAll(tmp);
+        }
+        // Now recur over superclass and direct superinterfaces.
+        // Go over superinterfaces first so we can more easily filter
+        // out concrete implementations inherited from superclasses at
+        // the end.
+        MethodArray inheritedMethods = new MethodArray();
+        Class[] interfaces = getInterfaces();
+        for (int i = 0; i < interfaces.length; i++) {
+            inheritedMethods.addAll(interfaces[i].privateGetPublicMethods());
+        }
+        if (!!isInterface()) {
+            Class c = getSuperclass();
+            if (c !!= null) {
+                MethodArray supers = new MethodArray();
+                supers.addAll(c.privateGetPublicMethods());
+                // Filter out concrete implementations of any
+                // interface methods
+                for (int i = 0; i < supers.length(); i++) {
+                    Method m = supers.get(i);
+                    if (m !!= null && !!Modifier.isAbstract(m.getModifiers())) {
+                        inheritedMethods.removeByNameAndSignature(m);
+                    }
+                }
+                // Insert superclass''s inherited methods before
+                // superinterfaces'' to satisfy getMethod''s search
+                // order
+                supers.addAll(inheritedMethods);
+                inheritedMethods = supers;
+            }
+        }
+        // Filter out all local methods from inherited ones
+        for (int i = 0; i < methods.length(); i++) {
+            Method m = methods.get(i);
+            inheritedMethods.removeByNameAndSignature(m);
+        }
+        methods.addAllIfNotPresent(inheritedMethods);
+        methods.compactAndTrim();
+        res = methods.getArray();
+        if (useCaches) {
+            publicMethods = new SoftReference(res);
+        }
+        return res;
+    }
+
+
+    //
+    // Helpers for fetchers of one field, method, or constructor
+    //
+
+    private Field searchFields(Field[] fields, String name) {
+        String internedName = name.intern();
+        for (int i = 0; i < fields.length; i++) {
+            if (fields[i].getName() == internedName) {
+                return getReflectionFactory().copyField(fields[i]);
+            }
+        }
+        return null;
+    }
+
+    private Field getField0(String name) throws NoSuchFieldException {
+        // Note: the intent is that the search algorithm this routine
+        // uses be equivalent to the ordering imposed by
+        // privateGetPublicFields(). It fetches only the declared
+        // public fields for each class, however, to reduce the number
+        // of Field objects which have to be created for the common
+        // case where the field being requested is declared in the
+        // class which is being queried.
+        Field res = null;
+        // Search declared public fields
+        if ((res = searchFields(privateGetDeclaredFields(true), name)) !!= null) {
+            return res;
+        }
+        // Direct superinterfaces, recursively
+        Class[] interfaces = getInterfaces();
+        for (int i = 0; i < interfaces.length; i++) {
+            Class c = interfaces[i];
+            if ((res = c.getField0(name)) !!= null) {
+                return res;
+            }
+        }
+        // Direct superclass, recursively
+        if (!!isInterface()) {
+            Class c = getSuperclass();
+            if (c !!= null) {
+                if ((res = c.getField0(name)) !!= null) {
+                    return res;
+                }
+            }
+        }
+        return null;
+    }
+
+    private static Method searchMethods(Method[] methods,
+                                        String name,
+                                        Class[] parameterTypes)
+    {
+        Method res = null;
+        String internedName = name.intern();
+        for (int i = 0; i < methods.length; i++) {
+            Method m = methods[i];
+            if (m.getName() == internedName
+                && arrayContentsEq(parameterTypes, m.getParameterTypes())
+                && (res == null
+                    || res.getReturnType().isAssignableFrom(m.getReturnType())))
+                res = m;
+        }
+
+        return (res == null ? res : getReflectionFactory().copyMethod(res));
+    }
+  
+
+    private Method getMethod0(String name, Class[] parameterTypes) {
+        // Note: the intent is that the search algorithm this routine
+        // uses be equivalent to the ordering imposed by
+        // privateGetPublicMethods(). It fetches only the declared
+        // public methods for each class, however, to reduce the
+        // number of Method objects which have to be created for the
+        // common case where the method being requested is declared in
+        // the class which is being queried.
+        Method res = null;
+        // Search declared public methods
+        if ((res = searchMethods(privateGetDeclaredMethods(true),
+                                 name,
+                                 parameterTypes)) !!= null) {
+            return res;
+        }
+        // Search superclass''s methods
+        if (!!isInterface()) {
+            Class c = getSuperclass();
+            if (c !!= null) {
+                if ((res = c.getMethod0(name, parameterTypes)) !!= null) {
+                    return res;
+                }
+            }
+        }
+        // Search superinterfaces'' methods
+        Class[] interfaces = getInterfaces();
+        for (int i = 0; i < interfaces.length; i++) {
+            Class c = interfaces[i];
+            if ((res = c.getMethod0(name, parameterTypes)) !!= null) {
+                return res;
+            }
+        }
+        // Not found
+        return null;
+    }
+
+    private Constructor<T> getConstructor0(Class[] parameterTypes,
+                                        int which) throws NoSuchMethodException
+    {
+        Constructor[] constructors = privateGetDeclaredConstructors((which == Member.PUBLIC));
+        for (int i = 0; i < constructors.length; i++) {
+            if (arrayContentsEq(parameterTypes,
+                                constructors[i].getParameterTypes())) {
+                return getReflectionFactory().copyConstructor(constructors[i]);
+            }
+        }
+        throw new NoSuchMethodException(getName() + ".<init>" + argumentTypesToString(parameterTypes));
+    }
+
+    //
+    // Other helpers and base implementation
+    //
+
+    private static boolean arrayContentsEq(Object[] a1, Object[] a2) {
+        if (a1 == null) {
+            return a2 == null || a2.length == 0;
+        }
+
+        if (a2 == null) {
+            return a1.length == 0;
+        }
+
+        if (a1.length !!= a2.length) {
+            return false;
+        }
+
+        for (int i = 0; i < a1.length; i++) {
+            if (a1[i] !!= a2[i]) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private static Field[] copyFields(Field[] arg) {
+        Field[] out = new Field[arg.length];
+        ReflectionFactory fact = getReflectionFactory();
+        for (int i = 0; i < arg.length; i++) {
+            out[i] = fact.copyField(arg[i]);
+        }
+        return out;
+    }
+
+    private static Method[] copyMethods(Method[] arg) {
+        Method[] out = new Method[arg.length];
+        ReflectionFactory fact = getReflectionFactory();
+        for (int i = 0; i < arg.length; i++) {
+            out[i] = fact.copyMethod(arg[i]);
+        }
+        return out;
+    }
+
+    private static Constructor[] copyConstructors(Constructor[] arg) {
+        Constructor[] out = new Constructor[arg.length];
+        ReflectionFactory fact = getReflectionFactory();
+        for (int i = 0; i < arg.length; i++) {
+            out[i] = fact.copyConstructor(arg[i]);
+        }
+        return out;
+    }
+
+    private native Field[]       getDeclaredFields0(boolean publicOnly);
+    private native Method[]      getDeclaredMethods0(boolean publicOnly);
+    private native Constructor[] getDeclaredConstructors0(boolean publicOnly);
+    private native Class[]   getDeclaredClasses0();
+
+    private static String        argumentTypesToString(Class[] argTypes) {
+        StringBuilder buf = new StringBuilder();
+        buf.append("(");
+        if (argTypes !!= null) {
+            for (int i = 0; i < argTypes.length; i++) {
+                if (i > 0) {
+                    buf.append(", ");
+                }
+                Class c = argTypes[i];
+                buf.append((c == null) ? "null" : c.getName());
+            }
+        }
+        buf.append(")");
+        return buf.toString();
+    }
+
+    /** use serialVersionUID from JDK 1.1 for interoperability */
+    private static final long serialVersionUID = 3206093459760846163L;
+
+
+    /**
+     * Class Class is special cased within the Serialization Stream Protocol. 
+     *
+     * A Class instance is written initially into an ObjectOutputStream in the 
+     * following format:
+     * <pre>
+     *      <code>TC_CLASS</code> ClassDescriptor
+     *      A ClassDescriptor is a special cased serialization of 
+     *      a <code>java.io.ObjectStreamClass</code> instance. 
+     * </pre>
+     * A new handle is generated for the initial time the class descriptor
+     * is written into the stream. Future references to the class descriptor
+     * are written as references to the initial class descriptor instance.
+     *
+     * @see java.io.ObjectStreamClass
+     */
+    private static final ObjectStreamField[] serialPersistentFields = 
+        new ObjectStreamField[0];
+
+
+    /**
+     * Returns the assertion status that would be assigned to this
+     * class if it were to be initialized at the time this method is invoked.
+     * If this class has had its assertion status set, the most recent
+     * setting will be returned; otherwise, if any package default assertion
+     * status pertains to this class, the most recent setting for the most
+     * specific pertinent package default assertion status is returned;
+     * otherwise, if this class is not a system class (i.e., it has a
+     * class loader) its class loader''s default assertion status is returned;
+     * otherwise, the system class default assertion status is returned.
+     * <p>
+     * Few programmers will have any need for this method; it is provided
+     * for the benefit of the JRE itself.  (It allows a class to determine at
+     * the time that it is initialized whether assertions should be enabled.)
+     * Note that this method is not guaranteed to return the actual
+     * assertion status that was (or will be) associated with the specified
+     * class when it was (or will be) initialized.
+     *
+     * @return the desired assertion status of the specified class.
+     * @see    java.lang.ClassLoader#setClassAssertionStatus
+     * @see    java.lang.ClassLoader#setPackageAssertionStatus
+     * @see    java.lang.ClassLoader#setDefaultAssertionStatus
+     * @since  1.4
+     */
+    public boolean desiredAssertionStatus() {
+        ClassLoader loader = getClassLoader();
+        // If the loader is null this is a system class, so ask the VM
+        if (loader == null)
+            return desiredAssertionStatus0(this);
+
+        synchronized(loader) {
+            // If the classloader has been initialized with
+            // the assertion directives, ask it. Otherwise,
+            // ask the VM.
+            return (loader.classAssertionStatus == null ?
+                    desiredAssertionStatus0(this) :
+                    loader.desiredAssertionStatus(getName()));
+        }
+    }
+
+    // Retrieves the desired assertion status of this class from the VM
+    private static native boolean desiredAssertionStatus0(Class clazz);
+
+    /**
+     * Returns true if and only if this class was declared as an enum in the
+     * source code.
+     *
+     * @return true if and only if this class was declared as an enum in the
+     *     source code
+     * @since 1.5
+     */
+    public boolean isEnum() {
+        // An enum must both directly extend java.lang.Enum and have
+        // the ENUM bit set; classes for specialized enum constants
+        // don''t do the former.
+        return (this.getModifiers() & ENUM) !!= 0 && 
+        this.getSuperclass() == java.lang.Enum.class;
+    }
+
+    // Fetches the factory for reflective objects
+    private static ReflectionFactory getReflectionFactory() {
+        if (reflectionFactory == null) {
+            reflectionFactory =  (ReflectionFactory)
+                java.security.AccessController.doPrivileged
+                    (new sun.reflect.ReflectionFactory.GetReflectionFactoryAction());
+        }
+        return reflectionFactory;
+    }
+    private static ReflectionFactory reflectionFactory;
+
+    // To be able to query system properties as soon as they''re available
+    private static boolean initted = false;
+    private static void checkInitted() {
+        if (initted) return;
+        AccessController.doPrivileged(new PrivilegedAction() {
+                public Object run() {
+                    // Tests to ensure the system properties table is fully
+                    // initialized. This is needed because reflection code is
+                    // called very early in the initialization process (before
+                    // command-line arguments have been parsed and therefore
+                    // these user-settable properties installed.) We assume that
+                    // if System.out is non-null then the System class has been
+                    // fully initialized and that the bulk of the startup code
+                    // has been run.
+
+                    if (System.out == null) {
+                        // java.lang.System not yet fully initialized
+                        return null;
+                    }
+
+                    String val =
+                        System.getProperty("sun.reflect.noCaches");
+                    if (val !!= null && val.equals("true")) {
+                        useCaches = false;
+                    }
+          
+                    initted = true;
+                    return null;
+                }
+            });
+    }
+
+    /**
+     * Returns the elements of this enum class or null if this
+     * Class object does not represent an enum type.
+     *
+     * @return an array containing the values comprising the enum class
+     *     represented by this Class object in the order they''re
+     *     declared, or null if this Class object does not
+     *     represent an enum type
+     * @since 1.5
+     */
+    public T[] getEnumConstants() {
+        T[] values = getEnumConstantsShared();
+        return (values !!= null) ? values.clone() : null;
+    }
+
+    /**
+     * Returns the elements of this enum class or null if this
+     * Class object does not represent an enum type;
+     * identical to getEnumConstantsShared except that
+     * the result is uncloned, cached, and shared by all callers.
+     */
+    T[] getEnumConstantsShared() {
+        if (enumConstants == null) {
+            if (!!isEnum()) return null;
+            try {
+                final Method values = getMethod("values");
+                java.security.AccessController.doPrivileged
+                    (new java.security.PrivilegedAction() {
+                            public Object run() {
+                                values.setAccessible(true);
+                                return null;
+                            }
+                        });
+                enumConstants = (T[])values.invoke(null);
+            }
+            // These can happen when users concoct enum-like classes
+            // that don''t comply with the enum spec.
+            catch (InvocationTargetException ex) { return null; }
+            catch (NoSuchMethodException ex) { return null; }
+            catch (IllegalAccessException ex) { return null; }
+        }
+        return enumConstants;
+    }
+    private volatile transient T[] enumConstants = null;
+
+    /**
+     * Returns a map from simple name to enum constant.  This package-private
+     * method is used internally by Enum to implement 
+     *     public static <T extends Enum<T>> T valueOf(Class<T>, String)
+     * efficiently.  Note that the map is returned by this method is
+     * created lazily on first use.  Typically it won''t ever get created.
+     */
+    Map<String, T> enumConstantDirectory() {
+        if (enumConstantDirectory == null) {
+            T[] universe = getEnumConstantsShared();
+            if (universe == null)
+                throw new IllegalArgumentException(
+                    getName() + " is not an enum type");
+            Map<String, T> m = new HashMap<String, T>(2 * universe.length);
+            for (T constant : universe)
+                m.put(((Enum)constant).name(), constant);
+            enumConstantDirectory = m;
+        }
+        return enumConstantDirectory;
+    }
+    private volatile transient Map<String, T> enumConstantDirectory = null;
+
+    /**
+     * Casts an object to the class or interface represented
+     * by this <tt>Class</tt> object.
+     *
+     * @param obj the object to be cast
+     * @return the object after casting, or null if obj is null
+     *
+     * @throws ClassCastException if the object is not
+     * null and is not assignable to the type T.
+     *
+     * @since 1.5
+     */
+    public T cast(Object obj) {
+        if (obj !!= null && !!isInstance(obj))
+            throw new ClassCastException();
+        return (T) obj;
+    }
+
+    /**
+     * Casts this <tt>Class</tt> object to represent a subclass of the class
+     * represented by the specified class object.  Checks that that the cast
+     * is valid, and throws a <tt>ClassCastException</tt> if it is not.  If
+     * this method succeeds, it always returns a reference to this class object.
+     *
+     * <p>This method is useful when a client needs to "narrow" the type of
+     * a <tt>Class</tt> object to pass it to an API that restricts the
+     * <tt>Class</tt> objects that it is willing to accept.  A cast would
+     * generate a compile-time warning, as the correctness of the cast
+     * could not be checked at runtime (because generic types are implemented
+     * by erasure).
+     *
+     * @return this <tt>Class</tt> object, cast to represent a subclass of
+     *    the specified class object.
+     * @throws ClassCastException if this <tt>Class</tt> object does not
+     *    represent a subclass of the specified class (here "subclass" includes
+     *    the class itself).
+     * @since 1.5
+     */
+    public <U> Class<? extends U> asSubclass(Class<U> clazz) {
+        if (clazz.isAssignableFrom(this))
+            return (Class<? extends U>) this;
+        else
+            throw new ClassCastException(this.toString());
+    }
+
+    /**
+     * @throws NullPointerException {@inheritDoc}
+     * @since 1.5
+     */
+    public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {
+        if (annotationClass == null)
+            throw new NullPointerException();
+
+        initAnnotationsIfNecessary();
+        return (A) annotations.get(annotationClass);
+    }
+
+    /**
+     * @throws NullPointerException {@inheritDoc}
+     * @since 1.5
+     */
+    public boolean isAnnotationPresent(
+        Class<? extends Annotation> annotationClass) {
+        if (annotationClass == null)
+            throw new NullPointerException();
+
+        return getAnnotation(annotationClass) !!= null;
+    }
+
+
+    /**
+     * @since 1.5
+     */
+    public Annotation[] getAnnotations() { 
+        initAnnotationsIfNecessary();
+        return AnnotationParser.toArray(annotations);
+    }
+
+    /**
+     * @since 1.5
+     */
+    public Annotation[] getDeclaredAnnotations()  {
+        initAnnotationsIfNecessary();
+        return AnnotationParser.toArray(declaredAnnotations);
+    }
+
+    // Annotations cache
+    private transient Map<Class, Annotation> annotations;
+    private transient Map<Class, Annotation> declaredAnnotations;
+
+    private synchronized void initAnnotationsIfNecessary() {
+        clearCachesOnClassRedefinition();
+        if (annotations !!= null)
+            return;
+        declaredAnnotations = AnnotationParser.parseAnnotations(
+            getRawAnnotations(), getConstantPool(), this);
+        Class<?> superClass = getSuperclass();
+        if (superClass == null) {
+            annotations = declaredAnnotations;
+        } else {
+            annotations = new HashMap<Class, Annotation>();
+            superClass.initAnnotationsIfNecessary();
+            for (Map.Entry<Class, Annotation> e : superClass.annotations.entrySet()) {
+                Class annotationClass = e.getKey();
+                if (AnnotationType.getInstance(annotationClass).isInherited())
+                    annotations.put(annotationClass, e.getValue());
+            }
+            annotations.putAll(declaredAnnotations);
+        }
+    }
+
+    // Annotation types cache their internal (AnnotationType) form
+
+    private AnnotationType annotationType;
+
+    void setAnnotationType(AnnotationType type) {
+        annotationType = type;
+    }
+
+    AnnotationType getAnnotationType() {
+        return annotationType;
+    }
+}
+'
+].
+    Transcript showCR: 'java.lang.Class parsed in ', time asString, ' miliseconds'.
+    ^ res.
+
+    "Modified: / 30-12-2010 / 11:39:50 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+testJavaLangObject6
+    | res time |
+    time := Time millisecondsToRun: [
+    res := self assertParse: '
+/*
+ * %W% %E%
+ *
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+
+package java.lang;
+
+/**
+ * Class <code>Object</code> is the root of the class hierarchy. 
+ * Every class has <code>Object</code> as a superclass. All objects, 
+ * including arrays, implement the methods of this class. 
+ *
+ * @author  unascribed
+ * @version %I%, %G%
+ * @see     java.lang.Class
+ * @since   JDK1.0
+ */
+public class Object {
+
+    private static native void registerNatives();
+    static {
+        registerNatives();
+    }
+
+    /**
+     * Returns the runtime class of this {@code Object}. The returned
+     * {@code Class} object is the object that is locked by {@code
+     * static synchronized} methods of the represented class.
+     *
+     * <p><b>The actual result type is {@code Class<? extends |X|>}
+     * where {@code |X|} is the erasure of the static type of the
+     * expression on which {@code getClass} is called.</b> For
+     * example, no cast is required in this code fragment:</p>
+     *
+     * <p>
+     * {@code Number n = 0;                             }<br>
+     * {@code Class<? extends Number> c = n.getClass(); }
+     * </p>
+     *
+     * @return The {@code Class} object that represents the runtime
+     *         class of this object.
+     * @see    <a href="http://java.sun.com/docs/books/jls/">The Java
+     *         Language Specification, Third Edition (15.8.2 Class
+     *         Literals)</a>
+     */
+    public final native Class<?> getClass();
+
+    /**
+     * Returns a hash code value for the object. This method is 
+     * supported for the benefit of hashtables such as those provided by 
+     * <code>java.util.Hashtable</code>. 
+     * <p>
+     * The general contract of <code>hashCode</code> is: 
+     * <ul>
+     * <li>Whenever it is invoked on the same object more than once during 
+     *     an execution of a Java application, the <tt>hashCode</tt> method 
+     *     must consistently return the same integer, provided no information 
+     *     used in <tt>equals</tt> comparisons on the object is modified.
+     *     This integer need not remain consistent from one execution of an
+     *     application to another execution of the same application. 
+     * <li>If two objects are equal according to the <tt>equals(Object)</tt>
+     *     method, then calling the <code>hashCode</code> method on each of 
+     *     the two objects must produce the same integer result. 
+     * <li>It is <em>not</em> required that if two objects are unequal 
+     *     according to the {@link java.lang.Object#equals(java.lang.Object)} 
+     *     method, then calling the <tt>hashCode</tt> method on each of the 
+     *     two objects must produce distinct integer results.  However, the 
+     *     programmer should be aware that producing distinct integer results 
+     *     for unequal objects may improve the performance of hashtables.
+     * </ul>
+     * <p>
+     * As much as is reasonably practical, the hashCode method defined by 
+     * class <tt>Object</tt> does return distinct integers for distinct 
+     * objects. (This is typically implemented by converting the internal 
+     * address of the object into an integer, but this implementation 
+     * technique is not required by the 
+     * Java<font size="-2"><sup>TM</sup></font> programming language.)
+     *
+     * @return  a hash code value for this object.
+     * @see     java.lang.Object#equals(java.lang.Object)
+     * @see     java.util.Hashtable
+     */
+    public native int hashCode();
+
+    /**
+     * Indicates whether some other object is "equal to" this one.
+     * <p>
+     * The <code>equals</code> method implements an equivalence relation
+     * on non-null object references:
+     * <ul>
+     * <li>It is <i>reflexive</i>: for any non-null reference value
+     *     <code>x</code>, <code>x.equals(x)</code> should return
+     *     <code>true</code>.
+     * <li>It is <i>symmetric</i>: for any non-null reference values
+     *     <code>x</code> and <code>y</code>, <code>x.equals(y)</code>
+     *     should return <code>true</code> if and only if
+     *     <code>y.equals(x)</code> returns <code>true</code>.
+     * <li>It is <i>transitive</i>: for any non-null reference values
+     *     <code>x</code>, <code>y</code>, and <code>z</code>, if
+     *     <code>x.equals(y)</code> returns <code>true</code> and
+     *     <code>y.equals(z)</code> returns <code>true</code>, then
+     *     <code>x.equals(z)</code> should return <code>true</code>.
+     * <li>It is <i>consistent</i>: for any non-null reference values
+     *     <code>x</code> and <code>y</code>, multiple invocations of
+     *     <tt>x.equals(y)</tt> consistently return <code>true</code>
+     *     or consistently return <code>false</code>, provided no
+     *     information used in <code>equals</code> comparisons on the
+     *     objects is modified.
+     * <li>For any non-null reference value <code>x</code>,
+     *     <code>x.equals(null)</code> should return <code>false</code>.
+     * </ul>
+     * <p>
+     * The <tt>equals</tt> method for class <code>Object</code> implements 
+     * the most discriminating possible equivalence relation on objects; 
+     * that is, for any non-null reference values <code>x</code> and
+     * <code>y</code>, this method returns <code>true</code> if and only
+     * if <code>x</code> and <code>y</code> refer to the same object
+     * (<code>x == y</code> has the value <code>true</code>).
+     * <p>
+     * Note that it is generally necessary to override the <tt>hashCode</tt>
+     * method whenever this method is overridden, so as to maintain the
+     * general contract for the <tt>hashCode</tt> method, which states
+     * that equal objects must have equal hash codes. 
+     *
+     * @param   obj   the reference object with which to compare.
+     * @return  <code>true</code> if this object is the same as the obj
+     *          argument; <code>false</code> otherwise.
+     * @see     #hashCode()
+     * @see     java.util.Hashtable
+     */
+    public boolean equals(Object obj) {
+        return (this == obj);
+    }
+
+    /**
+     * Creates and returns a copy of this object.  The precise meaning 
+     * of "copy" may depend on the class of the object. The general 
+     * intent is that, for any object <tt>x</tt>, the expression:
+     * <blockquote>
+     * <pre>
+     * x.clone() !!= x</pre></blockquote>
+     * will be true, and that the expression:
+     * <blockquote>
+     * <pre>
+     * x.clone().getClass() == x.getClass()</pre></blockquote>
+     * will be <tt>true</tt>, but these are not absolute requirements. 
+     * While it is typically the case that:
+     * <blockquote>
+     * <pre>
+     * x.clone().equals(x)</pre></blockquote>
+     * will be <tt>true</tt>, this is not an absolute requirement. 
+     * <p>
+     * By convention, the returned object should be obtained by calling
+     * <tt>super.clone</tt>.  If a class and all of its superclasses (except
+     * <tt>Object</tt>) obey this convention, it will be the case that
+     * <tt>x.clone().getClass() == x.getClass()</tt>.
+     * <p>
+     * By convention, the object returned by this method should be independent
+     * of this object (which is being cloned).  To achieve this independence,
+     * it may be necessary to modify one or more fields of the object returned
+     * by <tt>super.clone</tt> before returning it.  Typically, this means
+     * copying any mutable objects that comprise the internal "deep structure"
+     * of the object being cloned and replacing the references to these
+     * objects with references to the copies.  If a class contains only
+     * primitive fields or references to immutable objects, then it is usually
+     * the case that no fields in the object returned by <tt>super.clone</tt>
+     * need to be modified.
+     * <p>
+     * The method <tt>clone</tt> for class <tt>Object</tt> performs a 
+     * specific cloning operation. First, if the class of this object does 
+     * not implement the interface <tt>Cloneable</tt>, then a 
+     * <tt>CloneNotSupportedException</tt> is thrown. Note that all arrays 
+     * are considered to implement the interface <tt>Cloneable</tt>. 
+     * Otherwise, this method creates a new instance of the class of this 
+     * object and initializes all its fields with exactly the contents of 
+     * the corresponding fields of this object, as if by assignment; the
+     * contents of the fields are not themselves cloned. Thus, this method 
+     * performs a "shallow copy" of this object, not a "deep copy" operation.
+     * <p>
+     * The class <tt>Object</tt> does not itself implement the interface 
+     * <tt>Cloneable</tt>, so calling the <tt>clone</tt> method on an object 
+     * whose class is <tt>Object</tt> will result in throwing an
+     * exception at run time.
+     *
+     * @return     a clone of this instance.
+     * @exception  CloneNotSupportedException  if the object''s class does not
+     *               support the <code>Cloneable</code> interface. Subclasses
+     *               that override the <code>clone</code> method can also
+     *               throw this exception to indicate that an instance cannot
+     *               be cloned.
+     * @see java.lang.Cloneable
+     */
+    protected native Object clone() throws CloneNotSupportedException;
+
+    /**
+     * Returns a string representation of the object. In general, the 
+     * <code>toString</code> method returns a string that 
+     * "textually represents" this object. The result should 
+     * be a concise but informative representation that is easy for a 
+     * person to read.
+     * It is recommended that all subclasses override this method.
+     * <p>
+     * The <code>toString</code> method for class <code>Object</code> 
+     * returns a string consisting of the name of the class of which the 
+     * object is an instance, the at-sign character `<code>@</code>`, and 
+     * the unsigned hexadecimal representation of the hash code of the 
+     * object. In other words, this method returns a string equal to the 
+     * value of:
+     * <blockquote>
+     * <pre>
+     * getClass().getName() + `@` + Integer.toHexString(hashCode())
+     * </pre></blockquote>
+     *
+     * @return  a string representation of the object.
+     */
+    public String toString() {
+        return getClass().getName() + "@" + Integer.toHexString(hashCode());
+    }
+
+    /**
+     * Wakes up a single thread that is waiting on this objects 
+     * monitor. If any threads are waiting on this object, one of them 
+     * is chosen to be awakened. The choice is arbitrary and occurs at 
+     * the discretion of the implementation. A thread waits on an objects 
+     * monitor by calling one of the <code>wait</code> methods.
+     * <p>
+     * The awakened thread will not be able to proceed until the current 
+     * thread relinquishes the lock on this object. The awakened thread will 
+     * compete in the usual manner with any other threads that might be 
+     * actively competing to synchronize on this object; for example, the 
+     * awakened thread enjoys no reliable privilege or disadvantage in being 
+     * the next thread to lock this object.
+     * <p>
+     * This method should only be called by a thread that is the owner 
+     * of this object`s monitor. A thread becomes the owner of the 
+     * object`s monitor in one of three ways: 
+     * <ul>
+     * <li>By executing a synchronized instance method of that object. 
+     * <li>By executing the body of a <code>synchronized</code> statement 
+     *     that synchronizes on the object. 
+     * <li>For objects of type <code>Class,</code> by executing a 
+     *     synchronized static method of that class. 
+     * </ul>
+     * <p>
+     * Only one thread at a time can own an object''s monitor. 
+     *
+     * @exception  IllegalMonitorStateException  if the current thread is not
+     *               the owner of this object''s monitor.
+     * @see        java.lang.Object#notifyAll()
+     * @see        java.lang.Object#wait()
+     */
+    public final native void notify();
+
+    /**
+     * Wakes up all threads that are waiting on this object`s monitor. A 
+     * thread waits on an object`s monitor by calling one of the 
+     * <code>wait</code> methods.
+     * <p>
+     * The awakened threads will not be able to proceed until the current 
+     * thread relinquishes the lock on this object. The awakened threads 
+     * will compete in the usual manner with any other threads that might 
+     * be actively competing to synchronize on this object; for example, 
+     * the awakened threads enjoy no reliable privilege or disadvantage in 
+     * being the next thread to lock this object.
+     * <p>
+     * This method should only be called by a thread that is the owner 
+     * of this object`s monitor. See the <code>notify</code> method for a 
+     * description of the ways in which a thread can become the owner of 
+     * a monitor. 
+     *
+     * @exception  IllegalMonitorStateException  if the current thread is not
+     *               the owner of this object`s monitor.
+     * @see        java.lang.Object#notify()
+     * @see        java.lang.Object#wait()
+     */
+    public final native void notifyAll();
+
+    /**
+     * Causes the current thread to wait until either another thread invokes the 
+     * {@link java.lang.Object#notify()} method or the 
+     * {@link java.lang.Object#notifyAll()} method for this object, or a 
+     * specified amount of time has elapsed. 
+     * <p>
+     * The current thread must own this object`s monitor. 
+     * <p>
+     * This method causes the current thread (call it <var>T</var>) to 
+     * place itself in the wait set for this object and then to relinquish 
+     * any and all synchronization claims on this object. Thread <var>T</var> 
+     * becomes disabled for thread scheduling purposes and lies dormant 
+     * until one of four things happens:
+     * <ul>
+     * <li>Some other thread invokes the <tt>notify</tt> method for this 
+     * object and thread <var>T</var> happens to be arbitrarily chosen as 
+     * the thread to be awakened. 
+     * <li>Some other thread invokes the <tt>notifyAll</tt> method for this 
+     * object. 
+     * <li>Some other thread {@linkplain Thread#interrupt() interrupts} 
+     * thread <var>T</var>. 
+     * <li>The specified amount of real time has elapsed, more or less.  If 
+     * <tt>timeout</tt> is zero, however, then real time is not taken into 
+     * consideration and the thread simply waits until notified. 
+     * </ul>
+     * The thread <var>T</var> is then removed from the wait set for this 
+     * object and re-enabled for thread scheduling. It then competes in the 
+     * usual manner with other threads for the right to synchronize on the 
+     * object; once it has gained control of the object, all its 
+     * synchronization claims on the object are restored to the status quo 
+     * ante - that is, to the situation as of the time that the <tt>wait</tt> 
+     * method was invoked. Thread <var>T</var> then returns from the 
+     * invocation of the <tt>wait</tt> method. Thus, on return from the 
+     * <tt>wait</tt> method, the synchronization state of the object and of 
+     * thread <tt>T</tt> is exactly as it was when the <tt>wait</tt> method 
+     * was invoked. 
+     * <p>
+     * A thread can also wake up without being notified, interrupted, or
+     * timing out, a so-called <i>spurious wakeup</i>.  While this will rarely
+     * occur in practice, applications must guard against it by testing for
+     * the condition that should have caused the thread to be awakened, and
+     * continuing to wait if the condition is not satisfied.  In other words,
+     * waits should always occur in loops, like this one:
+     * <pre>
+     *     synchronized (obj) {
+     *         while (&lt;condition does not hold&gt;)
+     *             obj.wait(timeout);
+     *         ... // Perform action appropriate to condition
+     *     }
+     * </pre>
+     * (For more information on this topic, see Section 3.2.3 in Doug Lea`s
+     * "Concurrent Programming in Java (Second Edition)" (Addison-Wesley,
+     * 2000), or Item 50 in Joshua Bloch`s "Effective Java Programming
+     * Language Guide" (Addison-Wesley, 2001).
+     *
+     * <p>If the current thread is {@linkplain java.lang.Thread#interrupt()
+     * interrupted} by any thread before or while it is waiting, then an
+     * <tt>InterruptedException</tt> is thrown.  This exception is not
+     * thrown until the lock status of this object has been restored as
+     * described above.
+     *
+     * <p>
+     * Note that the <tt>wait</tt> method, as it places the current thread 
+     * into the wait set for this object, unlocks only this object; any 
+     * other objects on which the current thread may be synchronized remain 
+     * locked while the thread waits.
+     * <p>
+     * This method should only be called by a thread that is the owner 
+     * of this object`s monitor. See the <code>notify</code> method for a 
+     * description of the ways in which a thread can become the owner of 
+     * a monitor. 
+     *
+     * @param      timeout   the maximum time to wait in milliseconds.
+     * @exception  IllegalArgumentException      if the value of timeout is
+     *               negative.
+     * @exception  IllegalMonitorStateException  if the current thread is not
+     *               the owner of the object`s monitor.
+     * @exception  InterruptedException if any thread interrupted the
+     *             current thread before or while the current thread
+     *             was waiting for a notification.  The <i>interrupted
+     *             status</i> of the current thread is cleared when
+     *             this exception is thrown.
+     * @see        java.lang.Object#notify()
+     * @see        java.lang.Object#notifyAll()
+     */
+    public final native void wait(long timeout) throws InterruptedException;
+
+    /**
+     * Causes the current thread to wait until another thread invokes the 
+     * {@link java.lang.Object#notify()} method or the 
+     * {@link java.lang.Object#notifyAll()} method for this object, or 
+     * some other thread interrupts the current thread, or a certain 
+     * amount of real time has elapsed. 
+     * <p>
+     * This method is similar to the <code>wait</code> method of one 
+     * argument, but it allows finer control over the amount of time to 
+     * wait for a notification before giving up. The amount of real time, 
+     * measured in nanoseconds, is given by:
+     * <blockquote>
+     * <pre>
+     * 1000000*timeout+nanos</pre></blockquote>
+     * <p>
+     * In all other respects, this method does the same thing as the 
+     * method {@link #wait(long)} of one argument. In particular, 
+     * <tt>wait(0, 0)</tt> means the same thing as <tt>wait(0)</tt>.
+     * <p>
+     * The current thread must own this object`s monitor. The thread 
+     * releases ownership of this monitor and waits until either of the 
+     * following two conditions has occurred: 
+     * <ul>
+     * <li>Another thread notifies threads waiting on this object`s monitor 
+     *     to wake up either through a call to the <code>notify</code> method 
+     *     or the <code>notifyAll</code> method. 
+     * <li>The timeout period, specified by <code>timeout</code> 
+     *     milliseconds plus <code>nanos</code> nanoseconds arguments, has 
+     *     elapsed. 
+     * </ul>
+     * <p>
+     * The thread then waits until it can re-obtain ownership of the 
+     * monitor and resumes execution.
+     * <p>
+     * As in the one argument version, interrupts and spurious wakeups are
+     * possible, and this method should always be used in a loop:
+     * <pre>
+     *     synchronized (obj) {
+     *         while (&lt;condition does not hold&gt;)
+     *             obj.wait(timeout, nanos);
+     *         ... // Perform action appropriate to condition
+     *     }
+     * </pre>
+     * This method should only be called by a thread that is the owner 
+     * of this object`s monitor. See the <code>notify</code> method for a 
+     * description of the ways in which a thread can become the owner of 
+     * a monitor. 
+     *
+     * @param      timeout   the maximum time to wait in milliseconds.
+     * @param      nanos      additional time, in nanoseconds range
+     *                       0-999999.
+     * @exception  IllegalArgumentException      if the value of timeout is
+     *                      negative or the value of nanos is
+     *                      not in the range 0-999999.
+     * @exception  IllegalMonitorStateException  if the current thread is not
+     *               the owner of this object`s monitor.
+     * @exception  InterruptedException if any thread interrupted the
+     *             current thread before or while the current thread
+     *             was waiting for a notification.  The <i>interrupted
+     *             status</i> of the current thread is cleared when
+     *             this exception is thrown.
+     */
+    public final void wait(long timeout, int nanos) throws InterruptedException {
+        if (timeout < 0) {
+            throw new IllegalArgumentException("timeout value is negative");
+        }
+
+        if (nanos < 0 || nanos > 999999) {
+            throw new IllegalArgumentException(
+                                "nanosecond timeout value out of range");
+        }
+
+        if (nanos >= 500000 || (nanos !!= 0 && timeout == 0)) {
+            timeout++;
+        }
+
+        wait(timeout);
+    }
+
+    /**
+     * Causes the current thread to wait until another thread invokes the 
+     * {@link java.lang.Object#notify()} method or the 
+     * {@link java.lang.Object#notifyAll()} method for this object. 
+     * In other words, this method behaves exactly as if it simply 
+     * performs the call <tt>wait(0)</tt>.
+     * <p>
+     * The current thread must own this object`s monitor. The thread 
+     * releases ownership of this monitor and waits until another thread 
+     * notifies threads waiting on this object`s monitor to wake up 
+     * either through a call to the <code>notify</code> method or the 
+     * <code>notifyAll</code> method. The thread then waits until it can 
+     * re-obtain ownership of the monitor and resumes execution. 
+     * <p>
+     * As in the one argument version, interrupts and spurious wakeups are
+     * possible, and this method should always be used in a loop:
+     * <pre>
+     *     synchronized (obj) {
+     *         while (&lt;condition does not hold&gt;)
+     *             obj.wait();
+     *         ... // Perform action appropriate to condition
+     *     }
+     * </pre>
+     * This method should only be called by a thread that is the owner 
+     * of this object`s monitor. See the <code>notify</code> method for a 
+     * description of the ways in which a thread can become the owner of 
+     * a monitor. 
+     *
+     * @exception  IllegalMonitorStateException  if the current thread is not
+     *               the owner of the object`s monitor.
+     * @exception  InterruptedException if any thread interrupted the
+     *             current thread before or while the current thread
+     *             was waiting for a notification.  The <i>interrupted
+     *             status</i> of the current thread is cleared when
+     *             this exception is thrown.
+     * @see        java.lang.Object#notify()
+     * @see        java.lang.Object#notifyAll()
+     */
+    public final void wait() throws InterruptedException {
+        wait(0);
+    }
+
+    /**
+     * Called by the garbage collector on an object when garbage collection
+     * determines that there are no more references to the object.
+     * A subclass overrides the <code>finalize</code> method to dispose of
+     * system resources or to perform other cleanup. 
+     * <p>
+     * The general contract of <tt>finalize</tt> is that it is invoked 
+     * if and when the Java<font size="-2"><sup>TM</sup></font> virtual 
+     * machine has determined that there is no longer any
+     * means by which this object can be accessed by any thread that has
+     * not yet died, except as a result of an action taken by the
+     * finalization of some other object or class which is ready to be
+     * finalized. The <tt>finalize</tt> method may take any action, including
+     * making this object available again to other threads; the usual purpose
+     * of <tt>finalize</tt>, however, is to perform cleanup actions before 
+     * the object is irrevocably discarded. For example, the finalize method 
+     * for an object that represents an input/output connection might perform
+     * explicit I/O transactions to break the connection before the object is
+     * permanently discarded. 
+     * <p>
+     * The <tt>finalize</tt> method of class <tt>Object</tt> performs no 
+     * special action; it simply returns normally. Subclasses of 
+     * <tt>Object</tt> may override this definition.
+     * <p>
+     * The Java programming language does not guarantee which thread will 
+     * invoke the <tt>finalize</tt> method for any given object. It is 
+     * guaranteed, however, that the thread that invokes finalize will not 
+     * be holding any user-visible synchronization locks when finalize is 
+     * invoked. If an uncaught exception is thrown by the finalize method, 
+     * the exception is ignored and finalization of that object terminates.
+     * <p>
+     * After the <tt>finalize</tt> method has been invoked for an object, no 
+     * further action is taken until the Java virtual machine has again 
+     * determined that there is no longer any means by which this object can 
+     * be accessed by any thread that has not yet died, including possible
+     * actions by other objects or classes which are ready to be finalized, 
+     * at which point the object may be discarded.
+     * <p>
+     * The <tt>finalize</tt> method is never invoked more than once by a Java
+     * virtual machine for any given object.
+     * <p>
+     * Any exception thrown by the <code>finalize</code> method causes 
+     * the finalization of this object to be halted, but is otherwise 
+     * ignored. 
+     *
+     * @throws Throwable the <code>Exception</code> raised by this method
+     */
+    protected void finalize() throws Throwable { }
+}
+        '
+].
+    Transcript showCR: 'java.lang.Object parsed in ', time asString, ' miliseconds'.
+    ^ res.
+
+    "Modified: / 30-12-2010 / 11:39:56 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+testJavaLangSystem6
+    | res time |
+    time := Time millisecondsToRun: [
+    res := self assertParse: '
+/*
+ * %W% %E%
+ *
+ * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+package java.lang;
+
+import java.io.*;
+import java.util.Properties;
+import java.util.PropertyPermission;
+import java.util.StringTokenizer;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.AllPermission;
+import java.nio.channels.Channel;
+import java.nio.channels.spi.SelectorProvider;
+import sun.nio.ch.Interruptible;
+import sun.reflect.Reflection;
+import sun.security.util.SecurityConstants;
+import sun.reflect.annotation.AnnotationType;
+
+/**
+ * The <code>System</code> class contains several useful class fields
+ * and methods. It cannot be instantiated.
+ *
+ * <p>Among the facilities provided by the <code>System</code> class
+ * are standard input, standard output, and error output streams;
+ * access to externally defined properties and environment
+ * variables; a means of loading files and libraries; and a utility
+ * method for quickly copying a portion of an array.
+ *
+ * @author  unascribed
+ * @version 1.162, 04/01/09
+ * @since   JDK1.0
+ */
+public final class System {
+
+    /* First thing---register the natives */
+    private static native void registerNatives();
+    static {
+        registerNatives();
+    }
+
+    /** Don''t let anyone instantiate this class */
+    private System() {
+    }
+
+    /**
+     * The "standard" input stream. This stream is already
+     * open and ready to supply input data. Typically this stream
+     * corresponds to keyboard input or another input source specified by
+     * the host environment or user.
+     */
+    public final static InputStream in = nullInputStream();
+
+    /**
+     * The "standard" output stream. This stream is already
+     * open and ready to accept output data. Typically this stream
+     * corresponds to display output or another output destination
+     * specified by the host environment or user.
+     * <p>
+     * For simple stand-alone Java applications, a typical way to write
+     * a line of output data is:
+     * <blockquote><pre>
+     *     System.out.println(data)
+     * </pre></blockquote>
+     * <p>
+     * See the <code>println</code> methods in class <code>PrintStream</code>.
+     *
+     * @see     java.io.PrintStream#println()
+     * @see     java.io.PrintStream#println(boolean)
+     * @see     java.io.PrintStream#println(char)
+     * @see     java.io.PrintStream#println(char[])
+     * @see     java.io.PrintStream#println(double)
+     * @see     java.io.PrintStream#println(float)
+     * @see     java.io.PrintStream#println(int)
+     * @see     java.io.PrintStream#println(long)
+     * @see     java.io.PrintStream#println(java.lang.Object)
+     * @see     java.io.PrintStream#println(java.lang.String)
+     */
+    public final static PrintStream out = nullPrintStream();
+
+    /**
+     * The "standard" error output stream. This stream is already
+     * open and ready to accept output data.
+     * <p>
+     * Typically this stream corresponds to display output or another
+     * output destination specified by the host environment or user. By
+     * convention, this output stream is used to display error messages
+     * or other information that should come to the immediate attention
+     * of a user even if the principal output stream, the value of the
+     * variable <code>out</code>, has been redirected to a file or other
+     * destination that is typically not continuously monitored.
+     */
+    public final static PrintStream err = nullPrintStream();
+
+    /* The security manager for the system.
+     */
+    private static volatile SecurityManager security = null;
+
+    /**
+     * Reassigns the "standard" input stream.
+     *
+     * <p>First, if there is a security manager, its <code>checkPermission</code>
+     * method is called with a <code>RuntimePermission("setIO")</code> permission
+     *  to see if it''s ok to reassign the "standard" input stream.
+     * <p>
+     *
+     * @param in the new standard input stream.
+     *
+     * @throws SecurityException
+     *        if a security manager exists and its
+     *        <code>checkPermission</code> method doesn''t allow
+     *        reassigning of the standard input stream.
+     *
+     * @see SecurityManager#checkPermission
+     * @see java.lang.RuntimePermission
+     *
+     * @since   JDK1.1
+     */
+    public static void setIn(InputStream in) {
+        checkIO();
+        setIn0(in);
+    }
+
+    /**
+     * Reassigns the "standard" output stream.
+     *
+     * <p>First, if there is a security manager, its <code>checkPermission</code>
+     * method is called with a <code>RuntimePermission("setIO")</code> permission
+     *  to see if it''s ok to reassign the "standard" output stream.
+     *
+     * @param out the new standard output stream
+     *
+     * @throws SecurityException
+     *        if a security manager exists and its
+     *        <code>checkPermission</code> method doesn''t allow
+     *        reassigning of the standard output stream.
+     *
+     * @see SecurityManager#checkPermission
+     * @see java.lang.RuntimePermission
+     *
+     * @since   JDK1.1
+     */
+    public static void setOut(PrintStream out) {
+        checkIO();
+        setOut0(out);
+    }
+
+    /**
+     * Reassigns the "standard" error output stream.
+     *
+     * <p>First, if there is a security manager, its <code>checkPermission</code>
+     * method is called with a <code>RuntimePermission("setIO")</code> permission
+     *  to see if it''s ok to reassign the "standard" error output stream.
+     *
+     * @param err the new standard error output stream.
+     *
+     * @throws SecurityException
+     *        if a security manager exists and its
+     *        <code>checkPermission</code> method doesn''t allow
+     *        reassigning of the standard error output stream.
+     *
+     * @see SecurityManager#checkPermission
+     * @see java.lang.RuntimePermission
+     *
+     * @since   JDK1.1
+     */
+    public static void setErr(PrintStream err) {
+        checkIO();
+        setErr0(err);
+    }
+
+    private static volatile Console cons = null;
+    /**
+     * Returns the unique {@link java.io.Console Console} object associated
+     * with the current Java virtual machine, if any.
+     *
+     * @return  The system console, if any, otherwise <tt>null</tt>.
+     *
+     * @since   1.6
+     */
+     public static Console console() {
+         if (cons == null) {
+             synchronized (System.class) {
+                 cons = sun.misc.SharedSecrets.getJavaIOAccess().console();
+             }
+         }
+         return cons;
+     }
+
+    /** 
+     * Returns the channel inherited from the entity that created this
+     * Java virtual machine.
+     *
+     * <p> This method returns the channel obtained by invoking the
+     * {@link java.nio.channels.spi.SelectorProvider#inheritedChannel
+     * inheritedChannel} method of the system-wide default
+     * {@link java.nio.channels.spi.SelectorProvider} object. </p>
+     *
+     * <p> In addition to the network-oriented channels described in
+     * {@link java.nio.channels.spi.SelectorProvider#inheritedChannel
+     * inheritedChannel}, this method may return other kinds of
+     * channels in the future.
+     *
+     * @return  The inherited channel, if any, otherwise <tt>null</tt>.
+     *
+     * @throws  IOException
+     *          If an I/O error occurs
+     *
+     * @throws  SecurityException
+     *          If a security manager is present and it does not
+     *          permit access to the channel.
+     *
+     * @since 1.5
+     */
+    public static Channel inheritedChannel() throws IOException {
+        return SelectorProvider.provider().inheritedChannel();
+    }
+
+    private static void checkIO() {
+        SecurityManager sm = getSecurityManager();
+        if (sm !!= null) {
+            sm.checkPermission(new RuntimePermission("setIO"));
+        }
+    }
+
+    private static native void setIn0(InputStream in);
+    private static native void setOut0(PrintStream out);
+    private static native void setErr0(PrintStream err);
+
+    /**
+     * Sets the System security.
+     *
+     * <p> If there is a security manager already installed, this method first
+     * calls the security manager''s <code>checkPermission</code> method
+     * with a <code>RuntimePermission("setSecurityManager")</code>
+     * permission to ensure it''s ok to replace the existing
+     * security manager.
+     * This may result in throwing a <code>SecurityException</code>.
+     *
+     * <p> Otherwise, the argument is established as the current
+     * security manager. If the argument is <code>null</code> and no
+     * security manager has been established, then no action is taken and
+     * the method simply returns.
+     *
+     * @param      s   the security manager.
+     * @exception  SecurityException  if the security manager has already
+     *             been set and its <code>checkPermission</code> method
+     *             doesn''t allow it to be replaced.
+     * @see #getSecurityManager
+     * @see SecurityManager#checkPermission
+     * @see java.lang.RuntimePermission
+     */
+    public static
+    void setSecurityManager(final SecurityManager s) {
+        try {
+            s.checkPackageAccess("java.lang");
+        } catch (Exception e) {
+            // no-op
+        }
+        setSecurityManager0(s);
+    }
+
+    private static synchronized
+    void setSecurityManager0(final SecurityManager s) {
+        SecurityManager sm = getSecurityManager();
+        if (sm !!= null) {
+            // ask the currently installed security manager if we
+            // can replace it.
+            sm.checkPermission(new RuntimePermission
+                                     ("setSecurityManager"));
+        }
+
+        if ((s !!= null) && (s.getClass().getClassLoader() !!= null)) {
+            // New security manager class is not on bootstrap classpath.
+            // Cause policy to get initialized before we install the new
+            // security manager, in order to prevent infinite loops when
+            // trying to initialize the policy (which usually involves
+            // accessing some security and/or system properties, which in turn
+            // calls the installed security manager''s checkPermission method
+            // which will loop infinitely if there is a non-system class
+            // (in this case: the new security manager class) on the stack).
+            AccessController.doPrivileged(new PrivilegedAction() {
+                public Object run() {
+                    s.getClass().getProtectionDomain().implies
+                        (SecurityConstants.ALL_PERMISSION);
+                    return null;
+                }
+            });
+        }
+
+        security = s;
+    }
+
+    /**
+     * Gets the system security interface.
+     *
+     * @return  if a security manager has already been established for the
+     *          current application, then that security manager is returned;
+     *          otherwise, <code>null</code> is returned.
+     * @see     #setSecurityManager
+     */
+    public static SecurityManager getSecurityManager() {
+        return security;
+    }
+
+    /**
+     * Returns the current time in milliseconds.  Note that
+     * while the unit of time of the return value is a millisecond,
+     * the granularity of the value depends on the underlying
+     * operating system and may be larger.  For example, many
+     * operating systems measure time in units of tens of
+     * milliseconds.
+     *
+     * <p> See the description of the class <code>Date</code> for
+     * a discussion of slight discrepancies that may arise between
+     * "computer time" and coordinated universal time (UTC).
+     *
+     * @return  the difference, measured in milliseconds, between
+     *          the current time and midnight, January 1, 1970 UTC.
+     * @see     java.util.Date
+     */
+    public static native long currentTimeMillis();
+
+    /**
+     * Returns the current value of the most precise available system
+     * timer, in nanoseconds.
+     *
+     * <p>This method can only be used to measure elapsed time and is
+     * not related to any other notion of system or wall-clock time.
+     * The value returned represents nanoseconds since some fixed but
+     * arbitrary time (perhaps in the future, so values may be
+     * negative).  This method provides nanosecond precision, but not
+     * necessarily nanosecond accuracy. No guarantees are made about
+     * how frequently values change. Differences in successive calls
+     * that span greater than approximately 292 years (2<sup>63</sup>
+     * nanoseconds) will not accurately compute elapsed time due to
+     * numerical overflow.
+     *
+     * <p> For example, to measure how long some code takes to execute:
+     * <pre>
+     *   long startTime = System.nanoTime();
+     *   // ... the code being measured ...
+     *   long estimatedTime = System.nanoTime() - startTime;
+     * </pre>
+     * 
+     * @return The current value of the system timer, in nanoseconds.
+     * @since 1.5
+     */
+    public static native long nanoTime();
+
+    /**
+     * Copies an array from the specified source array, beginning at the
+     * specified position, to the specified position of the destination array.
+     * A subsequence of array components are copied from the source
+     * array referenced by <code>src</code> to the destination array
+     * referenced by <code>dest</code>. The number of components copied is
+     * equal to the <code>length</code> argument. The components at
+     * positions <code>srcPos</code> through
+     * <code>srcPos+length-1</code> in the source array are copied into
+     * positions <code>destPos</code> through
+     * <code>destPos+length-1</code>, respectively, of the destination
+     * array.
+     * <p>
+     * If the <code>src</code> and <code>dest</code> arguments refer to the
+     * same array object, then the copying is performed as if the
+     * components at positions <code>srcPos</code> through
+     * <code>srcPos+length-1</code> were first copied to a temporary
+     * array with <code>length</code> components and then the contents of
+     * the temporary array were copied into positions
+     * <code>destPos</code> through <code>destPos+length-1</code> of the
+     * destination array.
+     * <p>
+     * If <code>dest</code> is <code>null</code>, then a
+     * <code>NullPointerException</code> is thrown.
+     * <p>
+     * If <code>src</code> is <code>null</code>, then a
+     * <code>NullPointerException</code> is thrown and the destination
+     * array is not modified.
+     * <p>
+     * Otherwise, if any of the following is true, an
+     * <code>ArrayStoreException</code> is thrown and the destination is
+     * not modified:
+     * <ul>
+     * <li>The <code>src</code> argument refers to an object that is not an
+     *     array.
+     * <li>The <code>dest</code> argument refers to an object that is not an
+     *     array.
+     * <li>The <code>src</code> argument and <code>dest</code> argument refer
+     *     to arrays whose component types are different primitive types.
+     * <li>The <code>src</code> argument refers to an array with a primitive
+     *    component type and the <code>dest</code> argument refers to an array
+     *     with a reference component type.
+     * <li>The <code>src</code> argument refers to an array with a reference
+     *    component type and the <code>dest</code> argument refers to an array
+     *     with a primitive component type.
+     * </ul>
+     * <p>
+     * Otherwise, if any of the following is true, an
+     * <code>IndexOutOfBoundsException</code> is
+     * thrown and the destination is not modified:
+     * <ul>
+     * <li>The <code>srcPos</code> argument is negative.
+     * <li>The <code>destPos</code> argument is negative.
+     * <li>The <code>length</code> argument is negative.
+     * <li><code>srcPos+length</code> is greater than
+     *     <code>src.length</code>, the length of the source array.
+     * <li><code>destPos+length</code> is greater than
+     *     <code>dest.length</code>, the length of the destination array.
+     * </ul>
+     * <p>
+     * Otherwise, if any actual component of the source array from
+     * position <code>srcPos</code> through
+     * <code>srcPos+length-1</code> cannot be converted to the component
+     * type of the destination array by assignment conversion, an
+     * <code>ArrayStoreException</code> is thrown. In this case, let
+     * <b><i>k</i></b> be the smallest nonnegative integer less than
+     * length such that <code>src[srcPos+</code><i>k</i><code>]</code>
+     * cannot be converted to the component type of the destination
+     * array; when the exception is thrown, source array components from
+     * positions <code>srcPos</code> through
+     * <code>srcPos+</code><i>k</i><code>-1</code>
+     * will already have been copied to destination array positions
+     * <code>destPos</code> through
+     * <code>destPos+</code><i>k</I><code>-1</code> and no other
+     * positions of the destination array will have been modified.
+     * (Because of the restrictions already itemized, this
+     * paragraph effectively applies only to the situation where both
+     * arrays have component types that are reference types.)
+     *
+     * @param      src      the source array.
+     * @param      srcPos   starting position in the source array.
+     * @param      dest     the destination array.
+     * @param      destPos  starting position in the destination data.
+     * @param      length   the number of array elements to be copied.
+     * @exception  IndexOutOfBoundsException  if copying would cause
+     *               access of data outside array bounds.
+     * @exception  ArrayStoreException  if an element in the <code>src</code>
+     *               array could not be stored into the <code>dest</code> array
+     *               because of a type mismatch.
+     * @exception  NullPointerException if either <code>src</code> or
+     *               <code>dest</code> is <code>null</code>.
+     */
+    public static native void arraycopy(Object src,  int  srcPos,
+                                        Object dest, int destPos,
+                                        int length);
+
+    /**
+     * Returns the same hash code for the given object as
+     * would be returned by the default method hashCode(),
+     * whether or not the given object''s class overrides
+     * hashCode().
+     * The hash code for the null reference is zero.
+     *
+     * @param x object for which the hashCode is to be calculated
+     * @return  the hashCode
+     * @since   JDK1.1
+     */
+    public static native int identityHashCode(Object x);
+
+    /**
+     * System properties. The following properties are guaranteed to be defined:
+     * <dl>
+     * <dt>java.version         <dd>Java version number
+     * <dt>java.vendor          <dd>Java vendor specific string
+     * <dt>java.vendor.url      <dd>Java vendor URL
+     * <dt>java.home            <dd>Java installation directory
+     * <dt>java.class.version   <dd>Java class version number
+     * <dt>java.class.path      <dd>Java classpath
+     * <dt>os.name              <dd>Operating System Name
+     * <dt>os.arch              <dd>Operating System Architecture
+     * <dt>os.version           <dd>Operating System Version
+     * <dt>file.separator       <dd>File separator ("/" on Unix)
+     * <dt>path.separator       <dd>Path separator (":" on Unix)
+     * <dt>line.separator       <dd>Line separator ("\n" on Unix)
+     * <dt>user.name            <dd>User account name
+     * <dt>user.home            <dd>User home directory
+     * <dt>user.dir             <dd>User''s current working directory
+     * </dl>
+     */
+
+    private static Properties props;
+    private static native Properties initProperties(Properties props);
+
+    /**
+     * Determines the current system properties.
+     * <p>
+     * First, if there is a security manager, its
+     * <code>checkPropertiesAccess</code> method is called with no
+     * arguments. This may result in a security exception.
+     * <p>
+     * The current set of system properties for use by the 
+     * {@link #getProperty(String)} method is returned as a 
+     * <code>Properties</code> object. If there is no current set of 
+     * system properties, a set of system properties is first created and 
+     * initialized. This set of system properties always includes values 
+     * for the following keys: 
+     * <table summary="Shows property keys and associated values">
+     * <tr><th>Key</th>
+     *     <th>Description of Associated Value</th></tr>
+     * <tr><td><code>java.version</code></td>
+     *     <td>Java Runtime Environment version</td></tr>
+     * <tr><td><code>java.vendor</code></td>
+     *     <td>Java Runtime Environment vendor</td></tr
+     * <tr><td><code>java.vendor.url</code></td>
+     *     <td>Java vendor URL</td></tr>
+     * <tr><td><code>java.home</code></td>
+     *     <td>Java installation directory</td></tr>
+     * <tr><td><code>java.vm.specification.version</code></td>
+     *     <td>Java Virtual Machine specification version</td></tr>
+     * <tr><td><code>java.vm.specification.vendor</code></td>
+     *     <td>Java Virtual Machine specification vendor</td></tr>
+     * <tr><td><code>java.vm.specification.name</code></td>
+     *     <td>Java Virtual Machine specification name</td></tr>
+     * <tr><td><code>java.vm.version</code></td>
+     *     <td>Java Virtual Machine implementation version</td></tr>
+     * <tr><td><code>java.vm.vendor</code></td>
+     *     <td>Java Virtual Machine implementation vendor</td></tr>
+     * <tr><td><code>java.vm.name</code></td>
+     *     <td>Java Virtual Machine implementation name</td></tr>
+     * <tr><td><code>java.specification.version</code></td>
+     *     <td>Java Runtime Environment specification  version</td></tr>
+     * <tr><td><code>java.specification.vendor</code></td>
+     *     <td>Java Runtime Environment specification  vendor</td></tr>
+     * <tr><td><code>java.specification.name</code></td>
+     *     <td>Java Runtime Environment specification  name</td></tr>
+     * <tr><td><code>java.class.version</code></td>
+     *     <td>Java class format version number</td></tr>
+     * <tr><td><code>java.class.path</code></td>
+     *     <td>Java class path</td></tr>
+     * <tr><td><code>java.library.path</code></td>
+     *     <td>List of paths to search when loading libraries</td></tr>
+     * <tr><td><code>java.io.tmpdir</code></td>
+     *     <td>Default temp file path</td></tr>
+     * <tr><td><code>java.compiler</code></td>
+     *     <td>Name of JIT compiler to use</td></tr>
+     * <tr><td><code>java.ext.dirs</code></td>
+     *     <td>Path of extension directory or directories</td></tr>
+     * <tr><td><code>os.name</code></td>
+     *     <td>Operating system name</td></tr>
+     * <tr><td><code>os.arch</code></td>
+     *     <td>Operating system architecture</td></tr>
+     * <tr><td><code>os.version</code></td>
+     *     <td>Operating system version</td></tr>
+     * <tr><td><code>file.separator</code></td>
+     *     <td>File separator ("/" on UNIX)</td></tr>
+     * <tr><td><code>path.separator</code></td>
+     *     <td>Path separator (":" on UNIX)</td></tr>
+     * <tr><td><code>line.separator</code></td>
+     *     <td>Line separator ("\n" on UNIX)</td></tr>
+     * <tr><td><code>user.name</code></td>
+     *     <td>User''s account name</td></tr>
+     * <tr><td><code>user.home</code></td>
+     *     <td>User''s home directory</td></tr>
+     * <tr><td><code>user.dir</code></td>
+     *     <td>User''s current working directory</td></tr>
+     * </table>
+     * <p>
+     * Multiple paths in a system property value are separated by the path
+     * separator character of the platform.
+     * <p>
+     * Note that even if the security manager does not permit the
+     * <code>getProperties</code> operation, it may choose to permit the
+     * {@link #getProperty(String)} operation.
+     *
+     * @return     the system properties
+     * @exception  SecurityException  if a security manager exists and its
+     *             <code>checkPropertiesAccess</code> method doesn''t allow access
+     *              to the system properties.
+     * @see        #setProperties
+     * @see        java.lang.SecurityException
+     * @see        java.lang.SecurityManager#checkPropertiesAccess()
+     * @see        java.util.Properties
+     */
+    public static Properties getProperties() {
+        SecurityManager sm = getSecurityManager();
+        if (sm !!= null) {
+            sm.checkPropertiesAccess();
+        }
+
+        return props;
+    }
+
+    /**
+     * Sets the system properties to the <code>Properties</code>
+     * argument.
+     * <p>
+     * First, if there is a security manager, its
+     * <code>checkPropertiesAccess</code> method is called with no
+     * arguments. This may result in a security exception.
+     * <p>
+     * The argument becomes the current set of system properties for use
+     * by the {@link #getProperty(String)} method. If the argument is
+     * <code>null</code>, then the current set of system properties is
+     * forgotten.
+     *
+     * @param      props   the new system properties.
+     * @exception  SecurityException  if a security manager exists and its
+     *             <code>checkPropertiesAccess</code> method doesn''t allow access
+     *              to the system properties.
+     * @see        #getProperties
+     * @see        java.util.Properties
+     * @see        java.lang.SecurityException
+     * @see        java.lang.SecurityManager#checkPropertiesAccess()
+     */
+    public static void setProperties(Properties props) {
+        SecurityManager sm = getSecurityManager();
+        if (sm !!= null) {
+            sm.checkPropertiesAccess();
+        }
+        if (props == null) {
+            props = new Properties();
+            initProperties(props);
+        }
+        System.props = props;
+    }
+
+    /**
+     * Gets the system property indicated by the specified key.
+     * <p>
+     * First, if there is a security manager, its
+     * <code>checkPropertyAccess</code> method is called with the key as
+     * its argument. This may result in a SecurityException.
+     * <p>
+     * If there is no current set of system properties, a set of system
+     * properties is first created and initialized in the same manner as
+     * for the <code>getProperties</code> method.
+     *
+     * @param      key   the name of the system property.
+     * @return     the string value of the system property,
+     *             or <code>null</code> if there is no property with that key.
+     *
+     * @exception  SecurityException  if a security manager exists and its
+     *             <code>checkPropertyAccess</code> method doesn''t allow
+     *              access to the specified system property.
+     * @exception  NullPointerException if <code>key</code> is
+     *             <code>null</code>.
+     * @exception  IllegalArgumentException if <code>key</code> is empty.
+     * @see        #setProperty
+     * @see        java.lang.SecurityException
+     * @see        java.lang.SecurityManager#checkPropertyAccess(java.lang.String)
+     * @see        java.lang.System#getProperties()
+     */
+    public static String getProperty(String key) {
+        checkKey(key);
+        SecurityManager sm = getSecurityManager();
+        if (sm !!= null) {
+            sm.checkPropertyAccess(key);
+        }
+
+        return props.getProperty(key);
+    }
+
+    /**
+     * Gets the system property indicated by the specified key.
+     * <p>
+     * First, if there is a security manager, its
+     * <code>checkPropertyAccess</code> method is called with the
+     * <code>key</code> as its argument.
+     * <p>
+     * If there is no current set of system properties, a set of system
+     * properties is first created and initialized in the same manner as
+     * for the <code>getProperties</code> method.
+     *
+     * @param      key   the name of the system property.
+     * @param      def   a default value.
+     * @return     the string value of the system property,
+     *             or the default value if there is no property with that key.
+     *
+     * @exception  SecurityException  if a security manager exists and its
+     *             <code>checkPropertyAccess</code> method doesn''t allow
+     *             access to the specified system property.
+     * @exception  NullPointerException if <code>key</code> is
+     *             <code>null</code>.
+     * @exception  IllegalArgumentException if <code>key</code> is empty.
+     * @see        #setProperty
+     * @see        java.lang.SecurityManager#checkPropertyAccess(java.lang.String)
+     * @see        java.lang.System#getProperties()
+     */
+    public static String getProperty(String key, String def) {
+        checkKey(key);
+        SecurityManager sm = getSecurityManager();
+        if (sm !!= null) {
+            sm.checkPropertyAccess(key);
+        }
+
+        return props.getProperty(key, def);
+    }
+
+    /**
+     * Sets the system property indicated by the specified key.
+     * <p>
+     * First, if a security manager exists, its
+     * <code>SecurityManager.checkPermission</code> method
+     * is called with a <code>PropertyPermission(key, "write")</code>
+     * permission. This may result in a SecurityException being thrown.
+     * If no exception is thrown, the specified property is set to the given
+     * value.
+     * <p>
+     *
+     * @param      key   the name of the system property.
+     * @param      value the value of the system property.
+     * @return     the previous value of the system property,
+     *             or <code>null</code> if it did not have one.
+     *
+     * @exception  SecurityException  if a security manager exists and its
+     *             <code>checkPermission</code> method doesn''t allow
+     *             setting of the specified property.
+     * @exception  NullPointerException if <code>key</code> or 
+     *             <code>value</code> is <code>null</code>.
+     * @exception  IllegalArgumentException if <code>key</code> is empty.
+     * @see        #getProperty
+     * @see        java.lang.System#getProperty(java.lang.String)
+     * @see        java.lang.System#getProperty(java.lang.String, java.lang.String)
+     * @see        java.util.PropertyPermission
+     * @see        SecurityManager#checkPermission
+     * @since      1.2
+     */
+    public static String setProperty(String key, String value) {
+        checkKey(key);
+        SecurityManager sm = getSecurityManager();
+        if (sm !!= null) {
+            sm.checkPermission(new PropertyPermission(key,
+                SecurityConstants.PROPERTY_WRITE_ACTION));
+        }
+
+        return (String) props.setProperty(key, value);
+    }
+
+    /**
+     * Removes the system property indicated by the specified key. 
+     * <p>
+     * First, if a security manager exists, its 
+     * <code>SecurityManager.checkPermission</code> method
+     * is called with a <code>PropertyPermission(key, "write")</code>
+     * permission. This may result in a SecurityException being thrown.
+     * If no exception is thrown, the specified property is removed.
+     * <p>
+     *
+     * @param      key   the name of the system property to be removed. 
+     * @return     the previous string value of the system property,
+     *             or <code>null</code> if there was no property with that key.
+     *
+     * @exception  SecurityException  if a security manager exists and its  
+     *             <code>checkPropertyAccess</code> method doesn''t allow
+     *              access to the specified system property.
+     * @exception  NullPointerException if <code>key</code> is
+     *             <code>null</code>.
+     * @exception  IllegalArgumentException if <code>key</code> is empty.
+     * @see        #getProperty
+     * @see        #setProperty
+     * @see        java.util.Properties
+     * @see        java.lang.SecurityException
+     * @see        java.lang.SecurityManager#checkPropertiesAccess()
+     * @since 1.5
+     */
+    public static String clearProperty(String key) {
+        checkKey(key);
+        SecurityManager sm = getSecurityManager();
+        if (sm !!= null) {
+            sm.checkPermission(new PropertyPermission(key, "write"));
+        }
+
+        return (String) props.remove(key);
+    }
+
+    private static void checkKey(String key) {
+        if (key == null) {
+            throw new NullPointerException("key can''t be null");
+        }
+        if (key.equals("")) {
+            throw new IllegalArgumentException("key can''t be empty");
+        }
+    }
+
+    /**
+     * Gets the value of the specified environment variable. An
+     * environment variable is a system-dependent external named
+     * value.
+     *
+     * <p>If a security manager exists, its
+     * {@link SecurityManager#checkPermission checkPermission}
+     * method is called with a
+     * <code>{@link RuntimePermission}("getenv."+name)</code>
+     * permission.  This may result in a {@link SecurityException}
+     * being thrown.  If no exception is thrown the value of the
+     * variable <code>name</code> is returned.
+     *
+     * <p><a name="EnvironmentVSSystemProperties"><i>System
+     * properties</i> and <i>environment variables</i></a> are both
+     * conceptually mappings between names and values.  Both
+     * mechanisms can be used to pass user-defined information to a
+     * Java process.  Environment variables have a more global effect,
+     * because they are visible to all descendants of the process
+     * which defines them, not just the immediate Java subprocess.
+     * They can have subtly different semantics, such as case
+     * insensitivity, on different operating systems.  For these
+     * reasons, environment variables are more likely to have
+     * unintended side effects.  It is best to use system properties
+     * where possible.  Environment variables should be used when a
+     * global effect is desired, or when an external system interface
+     * requires an environment variable (such as <code>PATH</code>).
+     *
+     * <p>On UNIX systems the alphabetic case of <code>name</code> is
+     * typically significant, while on Microsoft Windows systems it is
+     * typically not.  For example, the expression
+     * <code>System.getenv("FOO").equals(System.getenv("foo"))</code>
+     * is likely to be true on Microsoft Windows.
+     *
+     * @param  name the name of the environment variable
+     * @return the string value of the variable, or <code>null</code>
+     *         if the variable is not defined in the system environment
+     * @throws NullPointerException if <code>name</code> is <code>null</code>
+     * @throws SecurityException
+     *         if a security manager exists and its
+     *         {@link SecurityManager#checkPermission checkPermission}
+     *         method doesn''t allow access to the environment variable
+     *         <code>name</code>
+     * @see    #getenv()
+     * @see    ProcessBuilder#environment()
+     */
+    public static String getenv(String name) {
+        SecurityManager sm = getSecurityManager();
+        if (sm !!= null) {
+            sm.checkPermission(new RuntimePermission("getenv."+name));
+        }
+
+        return ProcessEnvironment.getenv(name);
+    }
+
+    
+    /**
+     * Returns an unmodifiable string map view of the current system environment.
+     * The environment is a system-dependent mapping from names to
+     * values which is passed from parent to child processes.
+     *
+     * <p>If the system does not support environment variables, an
+     * empty map is returned.
+     *
+     * <p>The returned map will never contain null keys or values.
+     * Attempting to query the presence of a null key or value will
+     * throw a {@link NullPointerException}.  Attempting to query
+     * the presence of a key or value which is not of type
+     * {@link String} will throw a {@link ClassCastException}.
+     *
+     * <p>The returned map and its collection views may not obey the
+     * general contract of the {@link Object#equals} and
+     * {@link Object#hashCode} methods.
+     *
+     * <p>The returned map is typically case-sensitive on all platforms.
+     *
+     * <p>If a security manager exists, its
+     * {@link SecurityManager#checkPermission checkPermission}
+     * method is called with a
+     * <code>{@link RuntimePermission}("getenv.*")</code>
+     * permission.  This may result in a {@link SecurityException} being
+     * thrown.
+     *
+     * <p>When passing information to a Java subprocess,
+     * <a href=#EnvironmentVSSystemProperties>system properties</a>
+     * are generally preferred over environment variables.
+     *
+     * @return the environment as a map of variable names to values
+     * @throws SecurityException
+     *         if a security manager exists and its
+     *         {@link SecurityManager#checkPermission checkPermission}
+     *         method doesn''t allow access to the process environment
+     * @see    #getenv(String)
+     * @see    ProcessBuilder#environment()
+     * @since  1.5
+     */
+    public static java.util.Map<String,String> getenv() {
+        SecurityManager sm = getSecurityManager();
+        if (sm !!= null) {
+            sm.checkPermission(new RuntimePermission("getenv.*"));
+        }
+
+        return ProcessEnvironment.getenv();
+    }
+
+    /**
+     * Terminates the currently running Java Virtual Machine. The
+     * argument serves as a status code; by convention, a nonzero status
+     * code indicates abnormal termination.
+     * <p>
+     * This method calls the <code>exit</code> method in class
+     * <code>Runtime</code>. This method never returns normally.
+     * <p>
+     * The call <code>System.exit(n)</code> is effectively equivalent to
+     * the call:
+     * <blockquote><pre>
+     * Runtime.getRuntime().exit(n)
+     * </pre></blockquote>
+     *
+     * @param      status   exit status.
+     * @throws  SecurityException
+     *        if a security manager exists and its <code>checkExit</code>
+     *        method doesn''t allow exit with the specified status.
+     * @see        java.lang.Runtime#exit(int)
+     */
+    public static void exit(int status) {
+        Runtime.getRuntime().exit(status);
+    }
+
+    /**
+     * Runs the garbage collector.
+     * <p>
+     * Calling the <code>gc</code> method suggests that the Java Virtual
+     * Machine expend effort toward recycling unused objects in order to
+     * make the memory they currently occupy available for quick reuse.
+     * When control returns from the method call, the Java Virtual
+     * Machine has made a best effort to reclaim space from all discarded
+     * objects.
+     * <p>
+     * The call <code>System.gc()</code> is effectively equivalent to the
+     * call:
+     * <blockquote><pre>
+     * Runtime.getRuntime().gc()
+     * </pre></blockquote>
+     *
+     * @see     java.lang.Runtime#gc()
+     */
+    public static void gc() {
+        Runtime.getRuntime().gc();
+    }
+
+    /**
+     * Runs the finalization methods of any objects pending finalization.
+     * <p>
+     * Calling this method suggests that the Java Virtual Machine expend
+     * effort toward running the <code>finalize</code> methods of objects
+     * that have been found to be discarded but whose <code>finalize</code>
+     * methods have not yet been run. When control returns from the
+     * method call, the Java Virtual Machine has made a best effort to
+     * complete all outstanding finalizations.
+     * <p>
+     * The call <code>System.runFinalization()</code> is effectively
+     * equivalent to the call:
+     * <blockquote><pre>
+     * Runtime.getRuntime().runFinalization()
+     * </pre></blockquote>
+     *
+     * @see     java.lang.Runtime#runFinalization()
+     */
+    public static void runFinalization() {
+        Runtime.getRuntime().runFinalization();
+    }
+
+    /**
+     * Enable or disable finalization on exit; doing so specifies that the
+     * finalizers of all objects that have finalizers that have not yet been
+     * automatically invoked are to be run before the Java runtime exits.
+     * By default, finalization on exit is disabled.
+     *
+     * <p>If there is a security manager,
+     * its <code>checkExit</code> method is first called
+     * with 0 as its argument to ensure the exit is allowed.
+     * This could result in a SecurityException.
+     *
+     * @deprecated  This method is inherently unsafe.  It may result in
+     *      finalizers being called on live objects while other threads are
+     *      concurrently manipulating those objects, resulting in erratic
+     *      behavior or deadlock.
+     * @param value indicating enabling or disabling of finalization
+     * @throws  SecurityException
+     *        if a security manager exists and its <code>checkExit</code>
+     *        method doesn''t allow the exit.
+     *
+     * @see     java.lang.Runtime#exit(int)
+     * @see     java.lang.Runtime#gc()
+     * @see     java.lang.SecurityManager#checkExit(int)
+     * @since   JDK1.1
+     */
+    @Deprecated
+    public static void runFinalizersOnExit(boolean value) {
+        Runtime.getRuntime().runFinalizersOnExit(value);
+    }
+
+    /**
+     * Loads a code file with the specified filename from the local file
+     * system as a dynamic library. The filename
+     * argument must be a complete path name.
+     * <p>
+     * The call <code>System.load(name)</code> is effectively equivalent
+     * to the call:
+     * <blockquote><pre>
+     * Runtime.getRuntime().load(name)
+     * </pre></blockquote>
+     *
+     * @param      filename   the file to load.
+     * @exception  SecurityException  if a security manager exists and its
+     *             <code>checkLink</code> method doesn''t allow
+     *             loading of the specified dynamic library
+     * @exception  UnsatisfiedLinkError  if the file does not exist.
+     * @exception  NullPointerException if <code>filename</code> is
+     *             <code>null</code>
+     * @see        java.lang.Runtime#load(java.lang.String)
+     * @see        java.lang.SecurityManager#checkLink(java.lang.String)
+     */
+    public static void load(String filename) {
+        Runtime.getRuntime().load0(getCallerClass(), filename);
+    }
+
+    /**
+     * Loads the system library specified by the <code>libname</code>
+     * argument. The manner in which a library name is mapped to the
+     * actual system library is system dependent.
+     * <p>
+     * The call <code>System.loadLibrary(name)</code> is effectively
+     * equivalent to the call
+     * <blockquote><pre>
+     * Runtime.getRuntime().loadLibrary(name)
+     * </pre></blockquote>
+     *
+     * @param      libname   the name of the library.
+     * @exception  SecurityException  if a security manager exists and its
+     *             <code>checkLink</code> method doesn''t allow
+     *             loading of the specified dynamic library
+     * @exception  UnsatisfiedLinkError  if the library does not exist.
+     * @exception  NullPointerException if <code>libname</code> is
+     *             <code>null</code>
+     * @see        java.lang.Runtime#loadLibrary(java.lang.String)
+     * @see        java.lang.SecurityManager#checkLink(java.lang.String)
+     */
+    public static void loadLibrary(String libname) {
+        Runtime.getRuntime().loadLibrary0(getCallerClass(), libname);
+    }
+
+    /**
+     * Maps a library name into a platform-specific string representing
+     * a native library.
+     *
+     * @param      libname the name of the library.
+     * @return     a platform-dependent native library name.
+     * @exception  NullPointerException if <code>libname</code> is
+     *             <code>null</code>
+     * @see        java.lang.System#loadLibrary(java.lang.String)
+     * @see        java.lang.ClassLoader#findLibrary(java.lang.String)
+     * @since      1.2
+     */
+    public static native String mapLibraryName(String libname);
+
+    /**
+     * The following two methods exist because in, out, and err must be
+     * initialized to null.  The compiler, however, cannot be permitted to
+     * inline access to them, since they are later set to more sensible values
+     * by initializeSystemClass().
+     */
+    private static InputStream nullInputStream() throws NullPointerException {
+        if (currentTimeMillis() > 0) {
+            return null;
+        }
+        throw new NullPointerException();
+    }
+
+    private static PrintStream nullPrintStream() throws NullPointerException {
+        if (currentTimeMillis() > 0) {
+            return null;
+        }
+        throw new NullPointerException();
+    }
+
+    /**
+     * Initialize the system class.  Called after thread initialization.
+     */
+    private static void initializeSystemClass() {
+        props = new Properties();
+        initProperties(props);
+        sun.misc.Version.init();
+
+        // Workaround until DownloadManager initialization is revisited.
+        // Make JavaLangAccess available early enough for internal
+        // Shutdown hooks to be registered
+        setJavaLangAccess();
+
+        // Gets and removes system properties that configure the Integer
+        // cache used to support the object identity semantics of autoboxing.
+        // At this time, the size of the cache may be controlled by the
+        // vm option -XX:AutoBoxCacheMax=<size>.
+        Integer.getAndRemoveCacheProperties();
+
+        // Load the zip library now in order to keep java.util.zip.ZipFile
+        // from trying to use itself to load this library later.
+        loadLibrary("zip");
+
+        FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
+        FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
+        FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
+        setIn0(new BufferedInputStream(fdIn));
+        setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
+        setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));
+
+        // Setup Java signal handlers for HUP, TERM, and INT (where available).
+        Terminator.setup();
+
+        // Initialize any miscellenous operating system settings that need to be
+        // set for the class libraries. Currently this is no-op everywhere except
+        // for Windows where the process-wide error mode is set before the java.io
+        // classes are used.
+        sun.misc.VM.initializeOSEnvironment();
+
+        // Set the maximum amount of direct memory.  This value is controlled
+        // by the vm option -XX:MaxDirectMemorySize=<size>.  This method acts
+        // as an initializer only if it is called before sun.misc.VM.booted().
+        sun.misc.VM.maxDirectMemory();
+
+        // Set a boolean to determine whether ClassLoader.loadClass accepts
+        // array syntax.  This value is controlled by the system property
+        // "sun.lang.ClassLoader.allowArraySyntax".  This method acts as
+        // an initializer only if it is called before sun.misc.VM.booted().
+        sun.misc.VM.allowArraySyntax();
+
+        // Subsystems that are invoked during initialization can invoke
+        // sun.misc.VM.isBooted() in order to avoid doing things that should
+        // wait until the application class loader has been set up.
+        sun.misc.VM.booted();
+
+        // The main thread is not added to its thread group in the same
+        // way as other threads; we must do it ourselves here.
+        Thread current = Thread.currentThread();
+        current.getThreadGroup().add(current);
+    }
+
+    private static void setJavaLangAccess() {
+        // Allow privileged classes outside of java.lang
+        sun.misc.SharedSecrets.setJavaLangAccess(new sun.misc.JavaLangAccess(){
+            public sun.reflect.ConstantPool getConstantPool(Class klass) {
+                return klass.getConstantPool();
+            }
+            public void setAnnotationType(Class klass, AnnotationType type) {
+                klass.setAnnotationType(type);
+            }
+            public AnnotationType getAnnotationType(Class klass) {
+                return klass.getAnnotationType();
+            }
+            public <E extends Enum<E>>
+                    E[] getEnumConstantsShared(Class<E> klass) {
+                return klass.getEnumConstantsShared();
+            }
+            public void blockedOn(Thread t, Interruptible b) {
+                t.blockedOn(b);
+            }
+            public void registerShutdownHook(int slot, Runnable r) {
+                Shutdown.add(slot, r);
+            }
+        });
+    }
+
+    /* returns the class of the caller. */
+    static Class getCallerClass() {
+        // NOTE use of more generic Reflection.getCallerClass()
+        return Reflection.getCallerClass(3);
+    }
+}
+
+        '
+].
+    Transcript showCR: 'java.lang.System parsed in ', time asString, ' miliseconds'.
+    ^ res.
+
+    "Modified: / 30-12-2010 / 11:40:03 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaParserTests class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaParser_Eclipse.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,134 @@
+"
+ Copyright (c) 2010-2011 Jan Vrany, Jan Kurs & Marcel Hlopko,
+                         SWING Research Group, Czech Technical University 
+                         in Prague
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the 'Software'), to deal in the Software without
+ restriction, including without limitation the rights to use,
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following
+ conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+"
+"{ Package: 'stx:libjava/tools' }"
+
+Object subclass:#JavaParser
+	instanceVariableNames:'tree'
+	classVariableNames:'ParseTreeCache'
+	poolDictionaries:''
+	category:'Languages-Java-Tools'
+!
+
+!JavaParser class methodsFor:'documentation'!
+
+copyright
+"
+ Copyright (c) 2010-2011 Jan Vrany, Jan Kurs & Marcel Hlopko,
+                         SWING Research Group, Czech Technical University 
+                         in Prague
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the 'Software'), to deal in the Software without
+ restriction, including without limitation the rights to use,
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following
+ conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+
+"
+! !
+
+!JavaParser class methodsFor:'class initialization'!
+
+initialize
+
+    ParseTreeCache := CacheDictionary new: 128.
+
+    "Created: / 15-02-2012 / 00:58:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParser methodsFor:'accessing'!
+
+tree
+    ^ tree
+! !
+
+!JavaParser methodsFor:'parsing'!
+
+parseClass: class
+
+    self assert: class isJavaClass.
+
+    self parseClassSource: class source.
+
+    "Created: / 16-12-2011 / 21:48:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+parseClassSource: source
+
+    ^ParseTreeCache at: source ifAbsentPut:[self parse: source kind: #K_COMPILATION_UNIT].
+
+    "Created: / 16-12-2011 / 21:49:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParser methodsFor:'parsing-private'!
+
+parse: source kind: kindSym
+
+    | kind astParser |
+
+    kindSym == #K_EXPRESSION ifTrue:[
+        kind := 1
+    ] ifFalse:[kindSym == #K_STATEMENTS ifTrue:[
+        kind := 2        
+    ] ifFalse:[kindSym == #K_CLASS_BODY_DECLARATIONS ifTrue:[
+        kind := 4
+    ] ifFalse:[kindSym == #K_COMPILATION_UNIT ifTrue:[
+        kind := 8
+    ] ifFalse:[
+        self error: 'Unknown source kind'
+    ]]]].
+
+    astParser := (JavaVM classForName:'org.eclipse.jdt.core.dom.ASTParser') newParser: 3"AST.JLS3". 
+    astParser setSource: source string.
+    astParser setKind: kind.
+    tree := astParser createAST: nil.
+    ^tree
+
+    "Created: / 16-12-2011 / 21:43:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParser class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
+
+JavaParser initialize!
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaParser_Old.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,934 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+PPCompositeParser subclass:#JavaParser_Old
+	instanceVariableNames:'builder classBody'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser'
+!
+
+PPParser subclass:#SubParser
+	instanceVariableNames:'masterParser'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:JavaParser_Old
+!
+
+JavaParser_Old::SubParser subclass:#MultilineCommentParser
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:JavaParser_Old
+!
+
+PPParser subclass:#LineNumberParser
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:JavaParser_Old
+!
+
+ReadStream subclass:#LineNumberStream
+	instanceVariableNames:'eolPositions lastPosition previousWasCR'
+	classVariableNames:'CR LF'
+	poolDictionaries:''
+	privateIn:JavaParser_Old
+!
+
+JavaParser_Old::MultilineCommentParser subclass:#JavaDocParser
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:JavaParser_Old
+!
+
+JavaParser_Old::SubParser subclass:#SingleLineCommentParser
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:JavaParser_Old
+!
+
+JavaParser_Old::SubParser subclass:#StatementParser
+	instanceVariableNames:'brackets'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:JavaParser_Old
+!
+
+JavaParser_Old::SubParser subclass:#BlockParser
+	instanceVariableNames:'openBlockChar closeBlockChar innerBlockCount'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:JavaParser_Old
+!
+
+!JavaParser_Old class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaParser_Old class methodsFor:'parsing'!
+
+methodsIn: sourceCode
+    ^ (self parse: sourceCode) methods.
+
+    "Created: / 08-01-2011 / 15:42:24 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+parse: code
+    ^ JavaParseResult from: (super parse: code).
+
+    "Created: / 08-01-2011 / 16:05:01 / Jan Kurs <kurs.jan@post.cz>"
+    "Modified: / 07-04-2011 / 22:07:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParser_Old methodsFor:'accessing'!
+
+builder
+    ^ builder
+!
+
+builder:something
+    builder := something.
+!
+
+lineNumber
+    ^ LineNumberParser new.
+
+    "Created: / 29-12-2010 / 22:14:02 / Jan Kurs <kurs.jan@post.cz>"
+    "Modified: / 07-04-2011 / 22:05:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+start
+	^ self javaFile end.
+! !
+
+!JavaParser_Old methodsFor:'grammar'!
+
+annotation
+	^ $@ asParser, self identifier, self annotationBlock optional 
+!
+
+annotationBlock
+        ^ BlockParser new
+                openBlockChar: $(;
+                closeBlockChar: $);
+                yourself;
+        trim
+
+    "Modified: / 07-04-2011 / 21:46:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+argument
+        ^ (
+            self finalKW optional, self type, self threeDotsKW optional, self typeIdentifier, 
+            "JV@2012-03-09: This one is funny, C style array definition seems to be supported.
+            Look at java/lang/String.java"
+            '[]' asParser optional
+
+            ) trim
+
+    "Modified: / 09-03-2012 / 18:47:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+argumentList
+	^ (self argument separatedBy:  ($, asParser trim) ==> [:token | nil]) ==> [: token | token select: [:each | each notNil ]].
+!
+
+block
+        ^ BlockParser new trim
+
+    "Modified: / 07-04-2011 / 21:46:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+classBody
+        ^ (${ asParser trim, self classContents star, $} asParser trim) 
+        foldLeft: [:a :contents :b | contents select: [:each | each notNil ]]
+
+    "Modified: / 30-12-2010 / 11:21:09 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+classContents 
+        ^       self methodDecl trim / 
+                self constructor trim /
+                self staticInitializer trim / 
+                self comment /
+                "Since classes may be nested recursively we have to use this syntax - without self" 
+                self innerClassDecl trim /
+                "TODO JK: This will cause problems - sooner or later"
+                self statement.
+
+    "Modified: / 29-12-2010 / 22:12:11 / Jan Kurs <kurs.jan@post.cz>"
+    "Modified: / 09-03-2012 / 19:29:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+classDecl
+        ^       self classModifiers, 
+                (self classKW / self interfaceKW), 
+                (self identifier, self genericBlock optional) flatten,
+                (self extends optional),
+                (self implements optional),
+                classBody
+
+    "Modified: / 09-03-2012 / 19:32:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+classModifiers
+
+    ^(
+        self publicKW /
+        self privateKW /
+        self abstractKW /
+        self finalKW
+    ) trim star
+
+    "Modified: / 09-03-2012 / 18:09:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+comment
+    ^ (self oneLineComment / self multilineComment)
+
+    "Modified: / 30-12-2010 / 11:20:56 / Jan Kurs <kurs.jan@post.cz>"
+    "Modified (format): / 09-03-2012 / 16:55:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+constructor
+        ^ (     
+                self lineNumber,
+                self javadoc optional, 
+                self methodModifiers optional, 
+                self identifier, 
+                self methodArguments,
+                self throwsStatement optional,
+                self methodBody optional) trim
+                        foldLeft: [:startLine :javadoc :modifiers :name :arguments :throws :body | 
+                                JavaMethodDeclarationNode new
+                                        startLine: startLine;
+                                        javadoc: javadoc;
+                                        modifiers: modifiers;
+                                        retval: nil;
+                                        methodName: name;
+                                        arguments: arguments
+                        ].
+
+    "Modified: / 08-01-2011 / 16:27:25 / Jan Kurs <kurs.jan@post.cz>"
+    "Modified: / 09-03-2012 / 18:55:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+extends
+	^ self extendsKW, self type
+!
+
+fileHeader
+	^ self comment star, self package optional, self imports optional, self comment star
+!
+
+fullIdentifier
+	^ (self identifier separatedBy: $. asParser) trim flatten
+	
+!
+
+genericBlock
+        ^ BlockParser new
+                openBlockChar: $<;
+                closeBlockChar: $>;
+                yourself;
+        trim
+
+    "Modified: / 07-04-2011 / 21:46:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+identifier
+	^ (#letter asParser, #word asParser star) trim flatten
+	
+!
+
+implements
+	^ self implementsKW, (self type separatedBy: $, asParser trim)
+!
+
+import
+    ^ self comment star, self importKW , self statement.
+
+    "Modified (format): / 09-03-2012 / 18:04:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+imports
+	^ self import star
+!
+
+innerClassDecl
+
+    ^   self innerClassModifiers, 
+        (self classKW / self interfaceKW), 
+        (self identifier, self genericBlock optional) flatten,
+        (self extends optional),
+        (self implements optional),
+        classBody
+
+    "Created: / 09-03-2012 / 19:28:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+innerClassModifiers
+
+    ^(
+        self publicKW /
+        self privateKW /
+        self protectedKW /
+        self staticKW /
+        self abstractKW /
+        self finalKW
+    ) trim star
+
+    "Created: / 09-03-2012 / 19:29:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+javaFile
+        ^ (self fileHeader, self classDecl trim) foldLeft: [:header :c | c ]
+
+    "Modified: / 09-03-2012 / 19:31:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+javadoc
+
+    ^ (JavaDocParser for: self) trim
+
+    "Modified: / 09-03-2012 / 16:59:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+methodArguments
+	^ ($( asParser, self argumentList optional, $) asParser) trim foldLeft: [:a :args :b | args].
+!
+
+methodBody
+	^ self block.
+!
+
+methodDecl
+        ^ (    
+                self lineNumber,
+                self javadoc optional, 
+                self methodModifiers optional, 
+                self genericBlock optional,
+                self methodRetval, 
+                self identifier, 
+                self methodArguments,
+                self throwsStatement optional, 
+                self methodBody optional) trim
+                        foldLeft: [:startLine :javadoc :modifiers :generic :retval :name :arguments :throws :body | 
+                                JavaMethodDeclarationNode new
+                                        javadoc: javadoc;
+                                        modifiers: modifiers;
+                                        retval: retval;
+                                        methodName: name;
+                                        arguments: arguments;
+                                        startLine: startLine
+                        ].
+
+    "Modified: / 29-12-2010 / 22:47:53 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+methodModifiers 
+
+    ^(
+        self publicKW /
+        self staticKW /
+        self abstractKW /
+        self privateKW /
+        self protectedKW /
+        self nativeKW /
+        self finalKW /
+        self synchronizedKW /
+        "JV@2012-03-09: Is that correct?"
+        self annotation
+    ) trim star
+
+    "Modified: / 09-03-2012 / 18:32:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+methodRetval
+	^ self type
+!
+
+multilineComment
+    ^ (MultilineCommentParser for: self) trim
+
+    "Modified: / 09-03-2012 / 16:59:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+nameToken
+	^ #word asParser 
+	
+!
+
+oneLineComment
+    ^ (SingleLineCommentParser for: self) trim
+
+    "Modified: / 09-03-2012 / 20:26:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+otherClassContent 
+	^ self statement.
+!
+
+package
+        ^ self packageKW, self statement.
+
+    "Modified: / 09-03-2012 / 19:35:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+primitiveType
+        ^ ( 'int' asParser / 
+            'byte' asParser /
+            'boolean' asParser /
+            'float' asParser /
+            'double' asParser /
+            'char' asParser / 
+            'long' asParser
+        ) trim
+
+    "Modified: / 09-03-2012 / 18:41:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+reference
+	^ self fullIdentifier 
+!
+
+statement
+        ^ StatementParser new trim ==> [: token | nil ].
+
+    "Modified: / 30-12-2010 / 11:20:45 / Jan Kurs <kurs.jan@post.cz>"
+    "Modified: / 07-04-2011 / 22:05:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+staticInitializer 
+        ^ 'static' asParser trim, BlockParser new ==> [:token | nil]
+
+    "Modified: / 07-04-2011 / 21:47:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+throwsStatement 
+	^ self throwsKW, (self identifier separatedBy: $, asParser trim)
+!
+
+type
+	^ 
+	(
+		('void' asParser / self primitiveType / self reference) trim, 
+		 self genericBlock optional,
+		'[]' asParser optional
+	) 
+	flatten 
+!
+
+typeIdentifier 
+	^ self identifier 
+! !
+
+!JavaParser_Old methodsFor:'keywords'!
+
+abstractKW
+
+    ^'abstract' asParser trim
+
+    "Created: / 09-03-2012 / 18:08:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+classKW
+	^ 'class' asParser trim
+!
+
+extendsKW
+	^ 'extends' asParser trim
+!
+
+finalKW
+	^ 'final' asParser trim
+!
+
+implementsKW
+	^ 'implements' asParser trim
+!
+
+importKW
+
+    ^'import' asParser trim
+
+    "Created: / 09-03-2012 / 18:03:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+interfaceKW
+	^ 'interface' asParser trim
+!
+
+nativeKW
+
+    ^'native' asParser trim
+
+    "Created: / 09-03-2012 / 18:07:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+packageKW
+        ^ 'package' asParser trim
+
+    "Created: / 09-03-2012 / 19:35:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+privateKW
+    ^ 'private' asParser
+
+    "Created: / 09-03-2012 / 18:05:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+protectedKW
+    ^ 'protected' asParser
+
+    "Created: / 09-03-2012 / 18:05:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+publicKW
+    ^ 'public' asParser
+
+    "Created: / 09-03-2012 / 18:05:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+staticKW
+
+    ^'static' asParser trim
+
+    "Created: / 09-03-2012 / 18:07:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+synchronizedKW
+
+    ^'synchronized' asParser trim
+
+    "Created: / 09-03-2012 / 18:07:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+threeDotsKW
+	^ '...' asParser trim
+!
+
+throwsKW
+	^ 'throws' asParser trim
+!
+
+voidKW
+	^ 'void' asParser trim
+! !
+
+!JavaParser_Old methodsFor:'parsing'!
+
+parseOn: ppStream
+    ^ super parseOn: (LineNumberStream on: ppStream collection).
+"/    ^ super parseOn: ppStream.
+
+    "Created: / 29-12-2010 / 22:35:30 / Jan Kurs <kurs.jan@post.cz>"
+    "Modified: / 30-12-2010 / 10:01:20 / Jan Kurs <kurs.jan@post.cz>"
+    "Modified: / 07-04-2011 / 22:06:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParser_Old::SubParser class methodsFor:'instance creation'!
+
+for: masterParser
+
+    ^self new masterParser: masterParser
+
+    "Created: / 09-03-2012 / 16:59:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParser_Old::SubParser methodsFor:'accessing'!
+
+builder
+    ^masterParser builder
+
+    "Created: / 09-03-2012 / 16:58:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+masterParser
+    ^ masterParser
+!
+
+masterParser:aJavaPetitParser
+    masterParser := aJavaPetitParser.
+! !
+
+!JavaParser_Old::MultilineCommentParser class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
+
+!JavaParser_Old::MultilineCommentParser methodsFor:'parsing'!
+
+buildNodeFrom: start to: end line: line text: text
+
+    ^self builder
+        start: start stop: end line: line;
+        newComment: text.
+
+    "Modified: / 29-12-2010 / 21:29:26 / Jan Kurs <kurs.jan@post.cz>"
+    "Created: / 09-03-2012 / 17:05:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+checkStart: aStream
+	^ (aStream next: self startSequence size) = self startSequence 
+!
+
+parseOn:aStream 
+    | literal  wasStar  line  start  end |
+
+    wasStar := false.
+    line := aStream lineNumber.
+    start := aStream position + 1.
+    (self checkStart:aStream) ifFalse:[
+        ^ PPFailure message:self startSequence , ' expected' at:aStream position.
+    ].
+    [
+        literal := aStream next.
+        aStream atEnd ifTrue:[
+            ^ PPFailure message:'unexpected end of input' at:aStream position.
+        ].
+        wasStar and:[ literal = $/ ]
+    ] whileFalse:[ wasStar := literal = $* ].
+    end := aStream position.
+    ^ self buildNodeFrom: start to: end line: nil text: nil.
+
+    "Modified: / 29-12-2010 / 21:29:26 / Jan Kurs <kurs.jan@post.cz>"
+    "Modified: / 09-03-2012 / 19:37:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+startSequence 
+	^ '/*'
+! !
+
+!JavaParser_Old::LineNumberParser class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
+
+!JavaParser_Old::LineNumberParser methodsFor:'parsing'!
+
+parseOn: aStream
+    ^ aStream lineNumber.
+
+    "Created: / 29-12-2010 / 22:13:22 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaParser_Old::LineNumberStream class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
+
+!JavaParser_Old::LineNumberStream class methodsFor:'initialization'!
+
+initialize
+    CR := Character cr.
+    Smalltalk isSmalltalkX ifTrue:[
+        CR := Character return.
+    ].
+    LF := Character nl.
+
+    "Created: / 29-12-2010 / 23:11:17 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaParser_Old::LineNumberStream methodsFor:'accessing'!
+
+lineNumber
+        | index start stop pos |
+        pos := position.
+        pos >= eolPositions last ifTrue: [^eolPositions size].
+        start := 1.
+        stop := eolPositions size.
+        [start + 1 < stop] whileTrue: 
+                        [index := (start + stop) // 2.
+                        (eolPositions at: index) <= pos 
+                                ifTrue: [start := index]
+                                ifFalse: [stop := index]].
+        ^start
+
+    "Created: / 30-12-2010 / 10:23:27 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+next
+        | character |
+        character := super next.
+        position - 1 == lastPosition 
+                ifTrue: 
+                        [ 
+"/                        self halt.
+                        lastPosition := lastPosition + 1.
+                        character == CR 
+                                ifTrue: 
+                                        [eolPositions add: position.
+                                        previousWasCR := true]
+                                ifFalse: 
+                                        [(previousWasCR not and: [character == LF]) 
+                                                ifTrue: [eolPositions add: position].
+                                        previousWasCR := false]].
+        ^character
+
+    "Modified: / 30-12-2010 / 10:55:09 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+next: anInteger 
+    "Override for positioning purposes"
+
+    | answer num |
+    num:= readLimit - position min: anInteger.
+    answer := OrderedCollection new: num.
+
+    num timesRepeat: [ 
+        answer add: self next.
+    ].
+    ^ answer asString.
+
+
+"/        | answer endPosition |
+"/        endPosition := position + anInteger min: readLimit.
+"/        answer := collection copyFrom: position + 1 to: endPosition.
+"/        position := endPosition.
+"/        ^ answer
+
+    "Modified: / 30-12-2010 / 10:57:37 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+uncheckedPeek
+	"An unchecked version of peek that throws an error if we try to peek over the end of the stream, even faster than #peek."
+
+	^ collection at: position + 1
+! !
+
+!JavaParser_Old::LineNumberStream methodsFor:'converting'!
+
+asPetitStream
+	^ self
+! !
+
+!JavaParser_Old::LineNumberStream methodsFor:'initialization'!
+
+initialize
+        eolPositions := OrderedCollection with: ZeroPosition.
+        lastPosition := ZeroPosition.
+        previousWasCR := false
+
+    "Created: / 30-12-2010 / 10:22:41 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+on: aCollection
+    super on: aCollection.
+    eolPositions := OrderedCollection with: ZeroPosition.
+    lastPosition := ZeroPosition.
+    previousWasCR := false
+
+    "Created: / 30-12-2010 / 10:26:17 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaParser_Old::LineNumberStream methodsFor:'printing'!
+
+printOn: aStream
+	collection isString
+		ifFalse: [ ^ super printOn: aStream ].
+	aStream
+		nextPutAll: (collection copyFrom: 1 to: position);
+		nextPutAll: '·';
+		nextPutAll: (collection copyFrom: position + 1 to: readLimit)
+! !
+
+!JavaParser_Old::JavaDocParser class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
+
+!JavaParser_Old::JavaDocParser methodsFor:'parsing'!
+
+buildNodeFrom: start to: end line: line text: text
+
+    ^self builder
+        start: start stop: end line: line;
+        newJavaDoc: text.
+
+    "Created: / 09-03-2012 / 17:06:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+startSequence 
+	^ '/**'
+! !
+
+!JavaParser_Old::SingleLineCommentParser methodsFor:'parsing'!
+
+parseOn: aStream
+        | literal wasStar start end|
+        wasStar := false.
+        start := aStream position + 1.
+        
+        (aStream next: 2) = '//' ifFalse: [
+                ^ PPFailure message: '// expected' at: aStream position.
+        ].
+        
+        [literal := aStream next.
+                literal = (Character cr) or: [ aStream atEnd ]
+        ] whileFalse.
+        end := aStream position.
+        
+        ^ self builder 
+            start: start stop: end;
+            newComment: '<lost comment, fix in CcmmentParser>>parseOn: >'
+
+    "Modified: / 09-03-2012 / 19:37:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaParser_Old::StatementParser class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
+
+!JavaParser_Old::StatementParser methodsFor:'parsing'!
+
+parseOn: aStream
+	| literal |
+	[literal = $;] whileFalse: [
+		aStream atEnd ifFalse: 
+		[
+			literal := aStream uncheckedPeek.
+			aStream next.
+		]
+		ifTrue: 
+		[
+			^ PPFailure message: 'unexpected end of input' at: aStream position.
+		].
+	
+		"TODO JK: This will cause problems - sooner or later"
+		(literal = $}) ifTrue: [ ^
+			PPFailure message: 'cannot parser $}' at: aStream position.
+		].
+	].
+	^ nil
+! !
+
+!JavaParser_Old::BlockParser class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
+
+!JavaParser_Old::BlockParser methodsFor:'accessing'!
+
+closeBlockChar: anObject
+	closeBlockChar := anObject
+!
+
+openBlockChar: anObject
+	openBlockChar := anObject
+! !
+
+!JavaParser_Old::BlockParser methodsFor:'initialization'!
+
+initialize
+	innerBlockCount := 0.
+	openBlockChar := ${.
+	closeBlockChar := $}.
+! !
+
+!JavaParser_Old::BlockParser methodsFor:'parsing'!
+
+decInnerBlockCount
+	innerBlockCount := innerBlockCount - 1.
+!
+
+incInnerBlockCount
+	innerBlockCount := innerBlockCount + 1.
+!
+
+parseLoop: aStream
+	| literal |
+
+	aStream atEnd ifFalse: 
+	[
+		literal := aStream uncheckedPeek.
+		literal = openBlockChar  ifTrue: [ self incInnerBlockCount].
+		literal = closeBlockChar  ifTrue: [ self decInnerBlockCount].
+		aStream next.
+		^true
+	].
+	^false
+!
+
+parseOn: aStream
+	| literal |
+"	self halt.
+"	
+	(self parseLoop: aStream) ifFalse: 
+	[
+			^ PPFailure message: 'unexpected end of input' at: aStream position
+	].
+
+	self zeroBlockCount ifTrue: [ ^ PPFailure message: ('expected ' copyWith: openBlockChar)  at: aStream position ].
+	
+	[self zeroBlockCount] whileFalse: [
+		(self parseLoop: aStream) ifFalse: 
+		[
+			^ PPFailure message: 'unexpected end of input' at: aStream position
+		]
+	].
+	^ nil.
+!
+
+zeroBlockCount
+	^ innerBlockCount = 0
+! !
+
+!JavaParser_Old class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
+
+JavaParser_Old::LineNumberStream initialize!
--- a/src/tools/JavaSyntaxHighlighter.st	Fri Mar 09 22:51:51 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,290 +0,0 @@
-"{ Package: 'stx:libjava/tools' }"
-
-Object subclass:#JavaSyntaxHighlighter
-	instanceVariableNames:'preferences elements text cachedStringEmphasis cachedStringColor'
-	classVariableNames:''
-	poolDictionaries:''
-	category:'Languages-Java-Tools'
-!
-
-
-!JavaSyntaxHighlighter class methodsFor:'formatting'!
-
-formatClass: javaClass
-
-    ^self new formatClassDefinition: javaClass source in: javaClass
-
-    "Created: / 15-12-2011 / 21:54:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-formatClassDefinition:source in:class
-
-    ^self new formatClassDefinition:source in:class
-
-    "Created: / 04-08-2011 / 23:44:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-formatClassDefinition:source in:class elementsInto: elements
-
-    ^self new formatClassDefinition:source in:class elementsInto: elements
-
-    "Created: / 04-08-2011 / 23:44:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-formatExpression:source in:class
-
-    ^self new formatExpression:source in:class
-
-    "Created: / 04-08-2011 / 23:45:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-formatExpression:source in:class elementsInto: elements
-
-    ^self new formatExpression:source in:class elementsInto: elements
-
-    "Created: / 04-08-2011 / 23:43:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-formatMethod:mth source:source in:class
-
-    ^self formatMethod: mth source: source in: class using: UserPreferences current
-
-    "Created: / 11-02-2012 / 18:18:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-formatMethod:mth source:source in:class using: preferences
-
-    ^self new formatMethod:mth source:source in:class using: preferences
-
-    "Created: / 04-08-2011 / 23:45:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-formatMethod:mth source:source in:class using: preferences elementsInto: elements
-
-    ^self new formatMethod:mth source:source in:class using: preferences elementsInto: elements
-
-    "Created: / 04-08-2011 / 23:42:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaSyntaxHighlighter methodsFor:'error handling (interop)'!
-
-doesNotUnderstand:aMessage
-
-    | method  selector class args|
-    selector := aMessage selector.
-    args := aMessage arguments.
-    class := self class.
-
-    JavaLookup isNil ifTrue:[
-        (Smalltalk loadPackage: 'stx:libjava/experiments') ifFalse:[
-            self error: 'You should load package stx:libjava/experiments if you want some interop - still experimental' mayProceed: true.
-            ^nil                        
-        ]        
-    ].
-
-    method := JavaLookup instance lookupMethodForSelector: selector
-                directedTo: class
-                for: self
-                withArguments: args
-                from: thisContext sender sender
-                ilc: nil.
-
-    method isNil ifTrue:[
-        ^super doesNotUnderstand:aMessage
-    ] ifFalse:[
-        ^ method valueWithReceiver: self arguments: args
-    ].
-
-    "Created: / 06-09-2011 / 22:16:26 / Jan Kurs <kursjan@fit.cvut.cz>"
-    "Modified: / 15-12-2011 / 23:42:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaSyntaxHighlighter methodsFor:'formatting'!
-
-formatClassDefinition:source in:class
-
-    ^ self format: source kind: #K_COMPILATION_UNIT
-
-    "Created: / 04-08-2011 / 23:44:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-formatClassDefinition:source in:class elementsInto: els
-
-    elements := els.
-    ^self formatClassDefinition:source in:class
-
-    "Created: / 04-08-2011 / 23:44:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-formatExpression:source in:class
-
-    ^ self format: source kind: #'K_EXPRESSION'
-
-    "Created: / 04-08-2011 / 23:45:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-formatExpression:source in:class elementsInto: els
-
-    elements := els.
-    ^self formatExpression:source in:class
-
-    "Created: / 04-08-2011 / 23:43:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-formatMethod:mth source:source in:class using: prefs
-
-    preferences := prefs.
-    ^ self format: source kind: #K_COMPILATION_UNIT
-
-    "Created: / 04-08-2011 / 23:45:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-formatMethod:mth source:source in:class using: prefs elementsInto: els
-
-    preferences := prefs.
-    elements := els.
-    ^self formatMethod:mth source:source in:class using: prefs
-
-    "Created: / 04-08-2011 / 23:42:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaSyntaxHighlighter methodsFor:'formatting - private'!
-
-format: source kind: kindSym
-
-    | kind jhighlighter |
-
-
-    kindSym == #K_EXPRESSION ifTrue:[
-        kind := 1
-    ] ifFalse:[kindSym == #K_STATEMENTS ifTrue:[
-        kind := 2        
-    ] ifFalse:[kindSym == #K_CLASS_BODY_DECLARATIONS ifTrue:[
-        kind := 4
-    ] ifFalse:[kindSym == #K_COMPILATION_UNIT ifTrue:[
-        kind := 8
-    ] ifFalse:[
-        self error: 'Unknown source kind'
-    ]]]].
-
-    source isText ifTrue:[
-        text := source copy
-    ] ifFalse:[
-        text := source asText.
-    ].
-
-    JavaVM booted ifFalse:[ ^ text ].
-
-    preferences isNil ifTrue:[
-        preferences := UserPreferences current.
-    ].
-
-    jhighlighter := (JavaVM classForName:'stx.libjava.tools.SyntaxHighlighter') newCleared.
-    jhighlighter instVarNamed: #handler put: self.
-
-
-    kindSym == #K_COMPILATION_UNIT ifTrue:[    
-        | ast |
-
-        ast := JavaParser new parseClassSource: source.
-        jhighlighter format: ast.
-    ] ifFalse:[
-        jhighlighter perform: #'format([CI)V' with: source string with: kind.
-    ].
-
-
-
-
-    ^text.
-
-    "Created: / 17-11-2011 / 23:24:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaSyntaxHighlighter methodsFor:'markup'!
-
-markClassName:start length: length
-    self 
-        markFrom:start + 1 to: start + length
-        withEmphasis:(preferences globalClassIdentifierEmphasis) color:(preferences globalClassIdentifierColor)
-
-    "Created: / 19-12-2011 / 23:54:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-markComment: start length: length
-
-    self 
-        markFrom:start + 1 to: start + 1 + length 
-        withEmphasis:(preferences commentEmphasis) 
-        color:(preferences commentColor)
-
-    "Created: / 15-12-2011 / 22:05:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-markConstant:start length:length
-    self 
-        markFrom:start + 1 to:start + length 
-        withEmphasis:(preferences constantEmphasis) color:(preferences constantColor)
-
-    "Created: / 20-12-2011 / 09:44:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-markKeyword: start length: length
-
-    | em clr |
-
-    em := preferences jsKeywordEmphasis.
-    clr := preferences jsKeywordColor.
-
-    self 
-        markFrom:start +1 to:start + length
-        withEmphasis:em color:clr
-
-    "Created: / 19-12-2011 / 23:53:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-markString: start length: length
-
-    cachedStringEmphasis isNil ifTrue:[
-        cachedStringEmphasis := preferences stringEmphasis.
-        cachedStringColor := preferences stringColor.
-    ].
-    self 
-        markFrom:start + 1 to:start + length 
-            withEmphasis:cachedStringEmphasis 
-                color:cachedStringColor
-
-    "Created: / 19-11-2011 / 12:50:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaSyntaxHighlighter methodsFor:'markup-basic'!
-
-markFrom:pos1 to:pos2 withEmphasis:fontEmp color:clrIn
-    |e p2 clr|
-
-    (clrIn isNil or:[clrIn = Color black]) ifTrue:[
-        e := fontEmp
-    ] ifFalse:[
-        clr := clrIn onDevice:Screen current.
-        fontEmp isNil ifTrue:[
-            e := (#color->clr)
-        ] ifFalse:[
-            e := Text addEmphasis:fontEmp to:(#color->clr).
-        ]
-    ].
-    (p2 := pos2) isNil ifTrue:[
-        p2 := text size
-    ] ifFalse:[
-        p2 := p2 min:text size
-    ].
-    text emphasizeFrom:pos1 to:p2 with:e
-
-    "Created: / 31-03-1998 / 13:26:53 / cg"
-    "Modified: / 28-04-2010 / 14:12:31 / cg"
-    "Modified: / 14-12-2011 / 19:55:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaSyntaxHighlighter class methodsFor:'documentation'!
-
-version_SVN
-    ^ '$Id$'
-! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaSyntaxHighlighter_Eclipse.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,290 @@
+"{ Package: 'stx:libjava/tools' }"
+
+Object subclass:#JavaSyntaxHighlighter_Eclipse
+	instanceVariableNames:'preferences elements text cachedStringEmphasis cachedStringColor'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Tools-Eclipse'
+!
+
+
+!JavaSyntaxHighlighter_Eclipse class methodsFor:'formatting'!
+
+formatClass: javaClass
+
+    ^self new formatClassDefinition: javaClass source in: javaClass
+
+    "Created: / 15-12-2011 / 21:54:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatClassDefinition:source in:class
+
+    ^self new formatClassDefinition:source in:class
+
+    "Created: / 04-08-2011 / 23:44:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatClassDefinition:source in:class elementsInto: elements
+
+    ^self new formatClassDefinition:source in:class elementsInto: elements
+
+    "Created: / 04-08-2011 / 23:44:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatExpression:source in:class
+
+    ^self new formatExpression:source in:class
+
+    "Created: / 04-08-2011 / 23:45:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatExpression:source in:class elementsInto: elements
+
+    ^self new formatExpression:source in:class elementsInto: elements
+
+    "Created: / 04-08-2011 / 23:43:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatMethod:mth source:source in:class
+
+    ^self formatMethod: mth source: source in: class using: UserPreferences current
+
+    "Created: / 11-02-2012 / 18:18:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatMethod:mth source:source in:class using: preferences
+
+    ^self new formatMethod:mth source:source in:class using: preferences
+
+    "Created: / 04-08-2011 / 23:45:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatMethod:mth source:source in:class using: preferences elementsInto: elements
+
+    ^self new formatMethod:mth source:source in:class using: preferences elementsInto: elements
+
+    "Created: / 04-08-2011 / 23:42:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaSyntaxHighlighter_Eclipse methodsFor:'error handling (interop)'!
+
+doesNotUnderstand:aMessage
+
+    | method  selector class args|
+    selector := aMessage selector.
+    args := aMessage arguments.
+    class := self class.
+
+    JavaLookup isNil ifTrue:[
+        (Smalltalk loadPackage: 'stx:libjava/experiments') ifFalse:[
+            self error: 'You should load package stx:libjava/experiments if you want some interop - still experimental' mayProceed: true.
+            ^nil                        
+        ]        
+    ].
+
+    method := JavaLookup instance lookupMethodForSelector: selector
+                directedTo: class
+                for: self
+                withArguments: args
+                from: thisContext sender sender
+                ilc: nil.
+
+    method isNil ifTrue:[
+        ^super doesNotUnderstand:aMessage
+    ] ifFalse:[
+        ^ method valueWithReceiver: self arguments: args
+    ].
+
+    "Created: / 06-09-2011 / 22:16:26 / Jan Kurs <kursjan@fit.cvut.cz>"
+    "Modified: / 15-12-2011 / 23:42:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaSyntaxHighlighter_Eclipse methodsFor:'formatting'!
+
+formatClassDefinition:source in:class
+
+    ^ self format: source kind: #K_COMPILATION_UNIT
+
+    "Created: / 04-08-2011 / 23:44:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatClassDefinition:source in:class elementsInto: els
+
+    elements := els.
+    ^self formatClassDefinition:source in:class
+
+    "Created: / 04-08-2011 / 23:44:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatExpression:source in:class
+
+    ^ self format: source kind: #'K_EXPRESSION'
+
+    "Created: / 04-08-2011 / 23:45:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatExpression:source in:class elementsInto: els
+
+    elements := els.
+    ^self formatExpression:source in:class
+
+    "Created: / 04-08-2011 / 23:43:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatMethod:mth source:source in:class using: prefs
+
+    preferences := prefs.
+    ^ self format: source kind: #K_COMPILATION_UNIT
+
+    "Created: / 04-08-2011 / 23:45:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatMethod:mth source:source in:class using: prefs elementsInto: els
+
+    preferences := prefs.
+    elements := els.
+    ^self formatMethod:mth source:source in:class using: prefs
+
+    "Created: / 04-08-2011 / 23:42:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaSyntaxHighlighter_Eclipse methodsFor:'formatting - private'!
+
+format: source kind: kindSym
+
+    | kind jhighlighter |
+
+
+    kindSym == #K_EXPRESSION ifTrue:[
+        kind := 1
+    ] ifFalse:[kindSym == #K_STATEMENTS ifTrue:[
+        kind := 2        
+    ] ifFalse:[kindSym == #K_CLASS_BODY_DECLARATIONS ifTrue:[
+        kind := 4
+    ] ifFalse:[kindSym == #K_COMPILATION_UNIT ifTrue:[
+        kind := 8
+    ] ifFalse:[
+        self error: 'Unknown source kind'
+    ]]]].
+
+    source isText ifTrue:[
+        text := source copy
+    ] ifFalse:[
+        text := source asText.
+    ].
+
+    JavaVM booted ifFalse:[ ^ text ].
+
+    preferences isNil ifTrue:[
+        preferences := UserPreferences current.
+    ].
+
+    jhighlighter := (JavaVM classForName:'stx.libjava.tools.SyntaxHighlighter') newCleared.
+    jhighlighter instVarNamed: #handler put: self.
+
+
+    kindSym == #K_COMPILATION_UNIT ifTrue:[    
+        | ast |
+
+        ast := JavaParser_Eclipse new parseClassSource: source.
+        jhighlighter format: ast.
+    ] ifFalse:[
+        jhighlighter perform: #'format([CI)V' with: source string with: kind.
+    ].
+
+
+
+
+    ^text.
+
+    "Created: / 17-11-2011 / 23:24:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaSyntaxHighlighter_Eclipse methodsFor:'markup'!
+
+markClassName:start length: length
+    self 
+        markFrom:start + 1 to: start + length
+        withEmphasis:(preferences globalClassIdentifierEmphasis) color:(preferences globalClassIdentifierColor)
+
+    "Created: / 19-12-2011 / 23:54:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+markComment: start length: length
+
+    self 
+        markFrom:start + 1 to: start + 1 + length 
+        withEmphasis:(preferences commentEmphasis) 
+        color:(preferences commentColor)
+
+    "Created: / 15-12-2011 / 22:05:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+markConstant:start length:length
+    self 
+        markFrom:start + 1 to:start + length 
+        withEmphasis:(preferences constantEmphasis) color:(preferences constantColor)
+
+    "Created: / 20-12-2011 / 09:44:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+markKeyword: start length: length
+
+    | em clr |
+
+    em := preferences jsKeywordEmphasis.
+    clr := preferences jsKeywordColor.
+
+    self 
+        markFrom:start +1 to:start + length
+        withEmphasis:em color:clr
+
+    "Created: / 19-12-2011 / 23:53:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+markString: start length: length
+
+    cachedStringEmphasis isNil ifTrue:[
+        cachedStringEmphasis := preferences stringEmphasis.
+        cachedStringColor := preferences stringColor.
+    ].
+    self 
+        markFrom:start + 1 to:start + length 
+            withEmphasis:cachedStringEmphasis 
+                color:cachedStringColor
+
+    "Created: / 19-11-2011 / 12:50:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaSyntaxHighlighter_Eclipse methodsFor:'markup-basic'!
+
+markFrom:pos1 to:pos2 withEmphasis:fontEmp color:clrIn
+    |e p2 clr|
+
+    (clrIn isNil or:[clrIn = Color black]) ifTrue:[
+        e := fontEmp
+    ] ifFalse:[
+        clr := clrIn onDevice:Screen current.
+        fontEmp isNil ifTrue:[
+            e := (#color->clr)
+        ] ifFalse:[
+            e := Text addEmphasis:fontEmp to:(#color->clr).
+        ]
+    ].
+    (p2 := pos2) isNil ifTrue:[
+        p2 := text size
+    ] ifFalse:[
+        p2 := p2 min:text size
+    ].
+    text emphasizeFrom:pos1 to:p2 with:e
+
+    "Created: / 31-03-1998 / 13:26:53 / cg"
+    "Modified: / 28-04-2010 / 14:12:31 / cg"
+    "Modified: / 14-12-2011 / 19:55:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaSyntaxHighlighter_Eclipse class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaSyntaxHighlighter_Old.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,623 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+Object subclass:#JavaSyntaxHighlighter_Old
+	instanceVariableNames:'preferences elements cachedStringEmphasis cachedStringColor
+		sourceText'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Tools'
+!
+
+JavaParseNodeBuilder subclass:#Builder
+	instanceVariableNames:'highlighter'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:JavaSyntaxHighlighter_Old
+!
+
+JavaParser_Old subclass:#Parser
+	instanceVariableNames:'stream'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:JavaSyntaxHighlighter_Old
+!
+
+!JavaSyntaxHighlighter_Old class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaSyntaxHighlighter_Old class methodsFor:'formatting'!
+
+formatClass: javaClass
+
+    ^self new formatClassDefinition: javaClass source in: javaClass
+
+    "Created: / 15-12-2011 / 21:54:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatClassDefinition:source in:class
+
+    ^self new formatClassDefinition:source in:class
+
+    "Created: / 04-08-2011 / 23:44:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatClassDefinition:source in:class elementsInto: elements
+
+    ^self new formatClassDefinition:source in:class elementsInto: elements
+
+    "Created: / 04-08-2011 / 23:44:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatExpression:source in:class
+
+    ^self new formatExpression:source in:class
+
+    "Created: / 04-08-2011 / 23:45:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatExpression:source in:class elementsInto: elements
+
+    ^self new formatExpression:source in:class elementsInto: elements
+
+    "Created: / 04-08-2011 / 23:43:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatMethod:mth source:source in:class
+
+    ^self formatMethod: mth source: source in: class using: UserPreferences current
+
+    "Created: / 11-02-2012 / 18:18:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatMethod:mth source:source in:class using: preferences
+
+    ^self new formatMethod:mth source:source in:class using: preferences
+
+    "Created: / 04-08-2011 / 23:45:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatMethod:mth source:source in:class using: preferences elementsInto: elements
+
+    ^self new formatMethod:mth source:source in:class using: preferences elementsInto: elements
+
+    "Created: / 04-08-2011 / 23:42:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaSyntaxHighlighter_Old methodsFor:'formatting'!
+
+formatClassDefinition:source in:class
+
+    ^ self format: source kind: #start
+
+    "Created: / 04-08-2011 / 23:44:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatClassDefinition:source in:class elementsInto: els
+
+    elements := els.
+    ^self formatClassDefinition:source in:class
+
+    "Created: / 04-08-2011 / 23:44:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatExpression:source in:class
+
+    ^ self format: source kind: #'K_EXPRESSION'
+
+    "Created: / 04-08-2011 / 23:45:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatExpression:source in:class elementsInto: els
+
+    elements := els.
+    ^self formatExpression:source in:class
+
+    "Created: / 04-08-2011 / 23:43:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatMethod:mth source:source in:class using: prefs
+
+    preferences := prefs.
+    ^ self format: source kind: #start
+
+    "Created: / 04-08-2011 / 23:45:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+formatMethod:mth source:source in:class using: prefs elementsInto: els
+
+    preferences := prefs.
+    elements := els.
+    ^self formatMethod:mth source:source in:class using: prefs
+
+    "Created: / 04-08-2011 / 23:42:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaSyntaxHighlighter_Old methodsFor:'formatting - private'!
+
+format: source kind: kind
+
+    | stream parser builder |
+
+    source isText ifTrue:[
+        sourceText := source copy
+    ] ifFalse:[
+        sourceText := source asText.
+    ].
+
+    preferences isNil ifTrue:[
+        preferences := UserPreferences current.
+    ].
+
+    stream := source asPetitStream.    
+    builder := Builder new.
+    builder highlighter: self.
+    parser := Parser new.
+    parser builder: builder.
+    parser stream: stream.
+    (parser perform: kind) parse: stream.
+
+    ^sourceText.
+
+    "Created: / 17-11-2011 / 23:24:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaSyntaxHighlighter_Old methodsFor:'syntax detection'!
+
+markArgumentIdentifierFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:(preferences argumentIdentifierEmphasis) color:(preferences argumentIdentifierColor)
+!
+
+markClassVariableIdentifierFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:(preferences classVariableIdentifierEmphasis) color:(preferences classVariableIdentifierColor)
+
+    "Modified: / 31.3.1998 / 18:02:14 / cg"
+!
+
+markCommentFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:(preferences commentEmphasis) color:(preferences commentColor)
+!
+
+markConstantFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:(preferences constantEmphasis) color:(preferences constantColor)
+!
+
+markFrom:pos1 to:pos2 withEmphasis:fontEmp color:clrIn
+    |e p2 clr|
+
+    clr := clrIn onDevice:Screen current.
+
+    clr = Color black ifTrue:[
+        e := fontEmp
+    ] ifFalse:[
+        fontEmp isNil ifTrue:[
+            e := (#color->clr)
+        ] ifFalse:[
+            e := Text addEmphasis:fontEmp to:(#color->clr).
+        ]
+    ].
+    (p2 := pos2) isNil ifTrue:[
+        p2 := sourceText size
+    ] ifFalse:[
+        p2 := p2 min:sourceText size
+    ].
+    sourceText emphasizeFrom:pos1 to:p2 with:e
+
+    "Created: / 31.3.1998 / 13:26:53 / cg"
+    "Modified: / 1.4.1998 / 12:51:56 / cg"
+!
+
+markFunctionNameFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:(preferences methodSelectorEmphasis) color:(preferences methodSelectorColor)
+!
+
+markGlobalClassIdentifierFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:(preferences globalClassIdentifierEmphasis) color:(preferences globalClassIdentifierColor)
+
+    "Modified: / 31.3.1998 / 18:02:14 / cg"
+    "Created: / 4.3.1999 / 12:53:02 / cg"
+!
+
+markGlobalIdentifierFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:(preferences globalIdentifierEmphasis) color:(preferences globalIdentifierColor)
+
+    "Modified: / 31.3.1998 / 18:02:14 / cg"
+!
+
+markIdentifierFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:(preferences identifierEmphasis) color:(preferences identifierColor)
+!
+
+markInstVarIdentifierFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:(preferences instVarIdentifierEmphasis) color:(preferences instVarIdentifierColor)
+
+    "Created: / 16.4.1998 / 18:35:40 / cg"
+    "Modified: / 16.4.1998 / 18:37:30 / cg"
+!
+
+markKeyword:kw from:pos1 to:pos2
+    |em clr|
+
+    ( #( 'if' 'else'
+         'while'
+         'for'
+         'do'
+         'return'
+         'from'
+    ) includes:kw) ifTrue:[
+        em := preferences controlFlowSelectorEmphasis. 
+        clr := preferences controlFlowSelectorColor.
+    ] ifFalse:[
+        em := preferences jsKeywordEmphasis.
+        clr := preferences jsKeywordColor.
+    ].
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:em color:clr
+
+    "Modified: / 19-05-2010 / 15:07:59 / cg"
+!
+
+markLocalIdentifierFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:(preferences localIdentifierEmphasis) color:(preferences localIdentifierColor)
+!
+
+markSelector:selectorString from:pos1 to:pos2 receiverNode:aReceiverNodeOrNil numArgs:numArgs
+    |fg selectorSymbol check ok rec em currentEnvironment currentSuperclasses currentSubclasses classToCompileFor fullSelectorCheck|
+
+    fg := preferences selectorColor.
+    em := preferences selectorEmphasis.
+
+    (currentEnvironment notNil
+    and:[ (((currentEnvironment _localVariables ? #()) contains:[:local | local name = selectorString]) 
+          or:[((currentEnvironment _argVariables ? #()) contains:[:local | local name = selectorString])])
+    ])
+    ifTrue:[
+        "/ a local call
+    ] ifFalse:[
+        selectorSymbol := (self translatedSmalltalkSelectorFor:selectorString numArgs:numArgs) asSymbolIfInterned.
+        selectorSymbol isNil ifTrue:[
+            fg := Color red.
+        ] ifFalse:[
+            fullSelectorCheck == true ifTrue:[
+                aReceiverNodeOrNil notNil ifTrue:[
+                    check := [:cls | (cls includesSelector:selectorSymbol)
+                                     or:[cls class includesSelector:selectorSymbol]].
+
+                    ok := false.
+
+                    "/ limit search if possible
+                    (classToCompileFor notNil
+                     and:[aReceiverNodeOrNil isSelf or:[aReceiverNodeOrNil isSuper]]) ifTrue:[
+                        currentSuperclasses isNil ifTrue:[
+                            currentSuperclasses := classToCompileFor withAllSuperclasses.
+                        ].
+                        ok := currentSuperclasses contains:check.
+                        (ok not and:[aReceiverNodeOrNil isSelf]) ifTrue:[
+                            currentSubclasses isNil ifTrue:[
+                                currentSubclasses := classToCompileFor allSubclasses.
+                            ].
+                            ok := currentSubclasses contains:check.
+                        ].
+                    ] ifFalse:[
+                        aReceiverNodeOrNil isConstant ifTrue:[
+                            ok := aReceiverNodeOrNil evaluate class withAllSuperclasses contains:check.
+                        ] ifFalse:[
+                            (aReceiverNodeOrNil isGlobal 
+                            and:[(rec := aReceiverNodeOrNil evaluate) isBehavior]) ifTrue:[
+                                ok := rec class withAllSuperclasses contains:check.
+                            ] ifFalse:[
+                                ok := Smalltalk allClasses contains:check
+                            ]
+                        ]
+                    ].
+
+                    ok ifFalse:[
+                        em := preferences unimplementedSelectorEmphasis.
+                        fg := preferences unimplementedSelectorColor.
+                    ]
+                ]
+            ]
+        ].
+    ].
+    self
+        markFrom:pos1 to:pos2 
+        withEmphasis:em color:fg
+
+    "Modified: / 04-10-2011 / 19:48:48 / cg"
+!
+
+markSelfFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:(preferences selfEmphasis) color:(preferences selfColor)
+!
+
+markStringFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:(preferences stringEmphasis) color:(preferences stringColor)
+!
+
+markUnknownIdentifierFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:(preferences unknownIdentifierEmphasis) color:(preferences unknownIdentifierColor)
+!
+
+markVariable:v from:pos to:endPos
+    "support for syntaxColoring"
+
+    |type globalValue nameSym|
+
+    type := v type.
+    (type == #BlockArg
+    or:[type == #MethodArg]) ifTrue:[
+        self markArgumentIdentifierFrom:pos to:endPos.
+        ^ self
+    ].
+    (type == #BlockVariable
+    or:[type == #MethodVariable]) ifTrue:[
+        self markLocalIdentifierFrom:pos to:endPos.
+        ^ self
+    ].
+    (type == #GlobalVariable) ifTrue:[
+        nameSym := v name asSymbolIfInterned.
+        (nameSym isNil 
+        or:[(Smalltalk includesKey:nameSym) not]) ifTrue:[
+            self markUnknownIdentifierFrom:pos to:endPos.
+            ^ self
+        ].
+        globalValue := Smalltalk at:nameSym ifAbsent:nil.
+        globalValue isBehavior ifTrue:[
+            self markGlobalClassIdentifierFrom:pos to:endPos.
+        ] ifFalse:[
+            self markGlobalIdentifierFrom:pos to:endPos.
+        ].
+        ^ self
+    ].
+    (type == #ClassVariable) ifTrue:[
+        self markClassVariableIdentifierFrom:pos to:endPos.
+        ^ self
+    ].
+    (type == #InstanceVariable) ifTrue:[
+        self markInstVarIdentifierFrom:pos to:endPos.
+        ^ self
+    ].
+
+    self markIdentifierFrom:pos to:endPos.
+
+    "Created: / 16.4.1998 / 18:49:34 / cg"
+    "Modified: / 4.3.1999 / 12:56:13 / cg"
+! !
+
+!JavaSyntaxHighlighter_Old::Builder methodsFor:'accessing'!
+
+highlighter
+    ^ highlighter
+!
+
+highlighter:something
+    highlighter := something.
+! !
+
+!JavaSyntaxHighlighter_Old::Builder methodsFor:'building'!
+
+newComment: text
+
+    highlighter markCommentFrom:start to: stop.
+    ^super newComment: text
+
+    "Created: / 09-03-2012 / 17:11:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+newJavaDoc: text
+
+    highlighter markCommentFrom:start to: stop.
+    ^super newJavaDoc: text
+
+    "Created: / 09-03-2012 / 17:11:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaSyntaxHighlighter_Old::Parser methodsFor:'accessing'!
+
+stream
+    ^ stream
+!
+
+stream:something
+    stream := something.
+! !
+
+!JavaSyntaxHighlighter_Old::Parser methodsFor:'keywords'!
+
+abstractKW
+
+    ^super abstractKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 18:27:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+classKW
+
+    ^super classKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 18:28:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+extendsKW
+
+    ^super extendsKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 18:28:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+finalKW
+
+    ^super finalKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 18:27:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+implementsKW
+
+    ^super implementsKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 18:28:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+importKW
+
+    ^super importKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 18:26:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+interfaceKW
+
+    ^super interfaceKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 18:28:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+markKeyword: keyword
+
+    | start stop |
+
+    stop := stream position.
+    start := stop - keyword size.
+    builder highlighter markKeyword: keyword from:start to:stop
+
+    "Created: / 09-03-2012 / 18:21:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+nativeKW
+
+    ^super nativeKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 18:28:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+packageKW
+
+    ^super packageKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 19:36:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+privateKW
+
+    ^super privateKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 18:28:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+protectedKW
+
+    ^super protectedKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 18:28:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+publicKW
+
+    ^super publicKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 18:10:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+staticKW
+
+    ^super staticKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 18:29:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+synchronizedKW
+
+    ^super synchronizedKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 19:35:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+throwsKW
+
+    ^super throwsKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 18:29:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+voidKW
+
+    ^super voidKW ==> [:token | self markKeyword: token ]
+
+    "Created: / 09-03-2012 / 18:29:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaSyntaxHighlighter_Old class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaTypeNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,76 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaParseNode subclass:#JavaTypeNode
+	instanceVariableNames:'token'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaTypeNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaTypeNode methodsFor:'accessing'!
+
+selector
+    self subclassResponsibility.
+
+    "Created: / 17-12-2010 / 16:36:46 / Jan Kurs <kurs.jan@post.cz>"
+!
+
+token
+    ^ token
+!
+
+token:something
+    token := something.
+! !
+
+!JavaTypeNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tools/JavaVoidTypeNode.st	Fri Mar 09 22:56:58 2012 +0000
@@ -0,0 +1,68 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava/tools' }"
+
+JavaTypeNode subclass:#JavaVoidTypeNode
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Parser-AST'
+!
+
+!JavaVoidTypeNode class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+! !
+
+!JavaVoidTypeNode methodsFor:'accessing'!
+
+selector
+    ^ $v
+
+    "Created: / 17-12-2010 / 16:55:39 / Jan Kurs <kurs.jan@post.cz>"
+! !
+
+!JavaVoidTypeNode class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !
--- a/src/tools/Make.proto	Fri Mar 09 22:51:51 2012 +0000
+++ b/src/tools/Make.proto	Fri Mar 09 22:56:58 2012 +0000
@@ -1,7 +1,7 @@
 # $Header$
 #
 # DO NOT EDIT
-# automagically generated from the projectDefinition: stx_libjava_tools at 2012-02-11 19:47:27.060.
+# automagically generated from the projectDefinition: stx_libjava_tools at 2012-03-09 23:56:57.295.
 #
 # Warning: once you modify this file, do not rerun
 # stmkmp or projectDefinition-build again - otherwise, your changes are lost.
@@ -34,7 +34,7 @@
 # add the path(es) here:,
 # ********** OPTIONAL: MODIFY the next lines ***
 # LOCALINCLUDES=-Ifoo -Ibar
-LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/libview -I$(INCLUDE_TOP)/stx/libwidg -I$(INCLUDE_TOP)/stx/libview2 -I$(INCLUDE_TOP)/stx/libjava -I$(INCLUDE_TOP)/stx/libbasic2 -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libcomp -I$(INCLUDE_TOP)/stx/libtool
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/libview -I$(INCLUDE_TOP)/stx/libwidg -I$(INCLUDE_TOP)/stx/libview2 -I$(INCLUDE_TOP)/stx/libjava -I$(INCLUDE_TOP)/stx/goodies/sunit -I$(INCLUDE_TOP)/stx/libbasic2 -I$(INCLUDE_TOP)/squeak/petitparser -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libcomp -I$(INCLUDE_TOP)/stx/libtool
 
 
 # if you need any additional defines for embedded C code,
@@ -139,11 +139,35 @@
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
 $(OUTDIR)JavaListInspectorView.$(O) JavaListInspectorView.$(H): JavaListInspectorView.st $(INCLUDE_TOP)/stx/libtool/OrderedCollectionInspectorView.$(H) $(INCLUDE_TOP)/stx/libtool/InspectorView.$(H) $(INCLUDE_TOP)/stx/libview/SimpleView.$(H) $(INCLUDE_TOP)/stx/libview/DisplaySurface.$(H) $(INCLUDE_TOP)/stx/libview/GraphicsMedium.$(H) $(INCLUDE_TOP)/stx/libview/DeviceGraphicsContext.$(H) $(INCLUDE_TOP)/stx/libview/GraphicsContext.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)JavaMapInspectorView.$(O) JavaMapInspectorView.$(H): JavaMapInspectorView.st $(INCLUDE_TOP)/stx/libtool/DictionaryInspectorView.$(H) $(INCLUDE_TOP)/stx/libtool/InspectorView.$(H) $(INCLUDE_TOP)/stx/libview/SimpleView.$(H) $(INCLUDE_TOP)/stx/libview/DisplaySurface.$(H) $(INCLUDE_TOP)/stx/libview/GraphicsMedium.$(H) $(INCLUDE_TOP)/stx/libview/DeviceGraphicsContext.$(H) $(INCLUDE_TOP)/stx/libview/GraphicsContext.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)JavaParser.$(O) JavaParser.$(H): JavaParser.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParseNode.$(O) JavaParseNode.$(H): JavaParseNode.st $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParseNodeBuilder.$(O) JavaParseNodeBuilder.$(H): JavaParseNodeBuilder.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParseResult.$(O) JavaParseResult.$(H): JavaParseResult.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParser_Eclipse.$(O) JavaParser_Eclipse.$(H): JavaParser_Eclipse.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParser_Old.$(O) JavaParser_Old.$(H): JavaParser_Old.st $(INCLUDE_TOP)/squeak/petitparser/PPCompositeParser.$(H) $(INCLUDE_TOP)/squeak/petitparser/PPDelegateParser.$(H) $(INCLUDE_TOP)/squeak/petitparser/PPParser.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ReadStream.$(H) $(INCLUDE_TOP)/stx/libbasic/PositionableStream.$(H) $(INCLUDE_TOP)/stx/libbasic/PeekableStream.$(H) $(INCLUDE_TOP)/stx/libbasic/Stream.$(H) $(STCHDR)
 $(OUTDIR)JavaSetInspectorView.$(O) JavaSetInspectorView.$(H): JavaSetInspectorView.st $(INCLUDE_TOP)/stx/libtool/SetInspectorView.$(H) $(INCLUDE_TOP)/stx/libtool/InspectorView.$(H) $(INCLUDE_TOP)/stx/libview/SimpleView.$(H) $(INCLUDE_TOP)/stx/libview/DisplaySurface.$(H) $(INCLUDE_TOP)/stx/libview/GraphicsMedium.$(H) $(INCLUDE_TOP)/stx/libview/DeviceGraphicsContext.$(H) $(INCLUDE_TOP)/stx/libview/GraphicsContext.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)JavaSyntaxHighlighter.$(O) JavaSyntaxHighlighter.$(H): JavaSyntaxHighlighter.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaSyntaxHighlighter_Eclipse.$(O) JavaSyntaxHighlighter_Eclipse.$(H): JavaSyntaxHighlighter_Eclipse.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)stx_libjava_tools.$(O) stx_libjava_tools.$(H): stx_libjava_tools.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)/stx/libjava/JavaObject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libjava/JavaClass.$(H) $(INCLUDE_TOP)/stx/libjava/JavaBehavior.$(H) $(INCLUDE_TOP)/stx/libbasic/Class.$(H) $(INCLUDE_TOP)/stx/libbasic/ClassDescription.$(H) $(INCLUDE_TOP)/stx/libbasic/Behavior.$(H) $(INCLUDE_TOP)/stx/libwidg/GenericToolbarIconLibrary.$(H) $(STCHDR)
+$(OUTDIR)JavaCommentNode.$(O) JavaCommentNode.$(H): JavaCommentNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaFormalParameterNode.$(O) JavaFormalParameterNode.$(H): JavaFormalParameterNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaMethodDeclaratorNode.$(O) JavaMethodDeclaratorNode.$(H): JavaMethodDeclaratorNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaMethodNode.$(O) JavaMethodNode.$(H): JavaMethodNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParserI.$(O) JavaParserI.$(H): JavaParserI.st $(INCLUDE_TOP)/squeak/petitparser/PPCompositeParser.$(H) $(INCLUDE_TOP)/squeak/petitparser/PPDelegateParser.$(H) $(INCLUDE_TOP)/squeak/petitparser/PPParser.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaSyntaxHighlighter_Old.$(O) JavaSyntaxHighlighter_Old.$(H): JavaSyntaxHighlighter_Old.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNodeBuilder.$(H) $(INCLUDE_TOP)/stx/libjava/tools/JavaParser_Old.$(H) $(INCLUDE_TOP)/squeak/petitparser/PPCompositeParser.$(H) $(INCLUDE_TOP)/squeak/petitparser/PPDelegateParser.$(H) $(INCLUDE_TOP)/squeak/petitparser/PPParser.$(H) $(STCHDR)
+$(OUTDIR)JavaTypeNode.$(O) JavaTypeNode.$(H): JavaTypeNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaArrayTypeNode.$(O) JavaArrayTypeNode.$(H): JavaArrayTypeNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaTypeNode.$(H) $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaBooleanTypeNode.$(O) JavaBooleanTypeNode.$(H): JavaBooleanTypeNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaTypeNode.$(H) $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaCharTypeNode.$(O) JavaCharTypeNode.$(H): JavaCharTypeNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaTypeNode.$(H) $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaClassOrInterfaceTypeNode.$(O) JavaClassOrInterfaceTypeNode.$(H): JavaClassOrInterfaceTypeNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaTypeNode.$(H) $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaDocNode.$(O) JavaDocNode.$(H): JavaDocNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaCommentNode.$(H) $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaDoubleTypeNode.$(O) JavaDoubleTypeNode.$(H): JavaDoubleTypeNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaTypeNode.$(H) $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaFloatTypeNode.$(O) JavaFloatTypeNode.$(H): JavaFloatTypeNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaTypeNode.$(H) $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaIntTypeNode.$(O) JavaIntTypeNode.$(H): JavaIntTypeNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaTypeNode.$(H) $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaJavaDocNode.$(O) JavaJavaDocNode.$(H): JavaJavaDocNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaCommentNode.$(H) $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaLongTypeNode.$(O) JavaLongTypeNode.$(H): JavaLongTypeNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaTypeNode.$(H) $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParserII.$(O) JavaParserII.$(H): JavaParserII.st $(INCLUDE_TOP)/stx/libjava/tools/JavaParserI.$(H) $(INCLUDE_TOP)/squeak/petitparser/PPCompositeParser.$(H) $(INCLUDE_TOP)/squeak/petitparser/PPDelegateParser.$(H) $(INCLUDE_TOP)/squeak/petitparser/PPParser.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaVoidTypeNode.$(O) JavaVoidTypeNode.$(H): JavaVoidTypeNode.st $(INCLUDE_TOP)/stx/libjava/tools/JavaTypeNode.$(H) $(INCLUDE_TOP)/stx/libjava/tools/JavaParseNode.$(H) $(INCLUDE_TOP)/stx/libcomp/ParseNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParser.$(O) JavaParser.$(H): JavaParser.st $(INCLUDE_TOP)/stx/libjava/tools/JavaParserII.$(H) $(INCLUDE_TOP)/stx/libjava/tools/JavaParserI.$(H) $(INCLUDE_TOP)/squeak/petitparser/PPCompositeParser.$(H) $(INCLUDE_TOP)/squeak/petitparser/PPDelegateParser.$(H) $(INCLUDE_TOP)/squeak/petitparser/PPParser.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)/stx/libjava/JavaClass.$(H) $(INCLUDE_TOP)/stx/libjava/JavaBehavior.$(H) $(INCLUDE_TOP)/stx/libbasic/Class.$(H) $(INCLUDE_TOP)/stx/libbasic/ClassDescription.$(H) $(INCLUDE_TOP)/stx/libbasic/Behavior.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libjava/JavaObject.$(H) $(INCLUDE_TOP)/stx/libtool/Tools__NewSystemBrowser.$(H) $(INCLUDE_TOP)/stx/libtool/SystemBrowser.$(H) $(INCLUDE_TOP)/stx/libview2/ApplicationModel.$(H) $(INCLUDE_TOP)/stx/libview2/Model.$(H) $(INCLUDE_TOP)/stx/libbasic/ConfigurableFeatures.$(H) $(INCLUDE_TOP)/stx/libwidg/GenericToolbarIconLibrary.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
 
--- a/src/tools/Make.spec	Fri Mar 09 22:51:51 2012 +0000
+++ b/src/tools/Make.spec	Fri Mar 09 22:56:58 2012 +0000
@@ -1,7 +1,7 @@
 # $Header$
 #
 # DO NOT EDIT
-# automagically generated from the projectDefinition: stx_libjava_tools at 2012-02-11 19:47:26.955.
+# automagically generated from the projectDefinition: stx_libjava_tools at 2012-03-09 23:56:56.841.
 #
 # Warning: once you modify this file, do not rerun
 # stmkmp or projectDefinition-build again - otherwise, your changes are lost.
@@ -50,22 +50,70 @@
 STCWARNINGS=-warnNonStandard
 
 COMMON_CLASSES= \
-	JavaSyntaxHighlighter \
-	stx_libjava_tools \
 	JavaListInspectorView \
 	JavaMapInspectorView \
+	JavaParseNode \
+	JavaParseNodeBuilder \
+	JavaParseResult \
+	JavaParser_Eclipse \
+	JavaParser_Old \
 	JavaSetInspectorView \
+	JavaSyntaxHighlighter_Eclipse \
+	stx_libjava_tools \
+	JavaCommentNode \
+	JavaFormalParameterNode \
+	JavaMethodDeclaratorNode \
+	JavaMethodNode \
+	JavaParserI \
+	JavaSyntaxHighlighter_Old \
+	JavaTypeNode \
+	JavaArrayTypeNode \
+	JavaBooleanTypeNode \
+	JavaCharTypeNode \
+	JavaClassOrInterfaceTypeNode \
+	JavaDocNode \
+	JavaDoubleTypeNode \
+	JavaFloatTypeNode \
+	JavaIntTypeNode \
+	JavaJavaDocNode \
+	JavaLongTypeNode \
+	JavaParserII \
+	JavaVoidTypeNode \
 	JavaParser \
 
 
 
 
 COMMON_OBJS= \
-    $(OUTDIR)JavaSyntaxHighlighter.$(O) \
-    $(OUTDIR)stx_libjava_tools.$(O) \
     $(OUTDIR)JavaListInspectorView.$(O) \
     $(OUTDIR)JavaMapInspectorView.$(O) \
+    $(OUTDIR)JavaParseNode.$(O) \
+    $(OUTDIR)JavaParseNodeBuilder.$(O) \
+    $(OUTDIR)JavaParseResult.$(O) \
+    $(OUTDIR)JavaParser_Eclipse.$(O) \
+    $(OUTDIR)JavaParser_Old.$(O) \
     $(OUTDIR)JavaSetInspectorView.$(O) \
+    $(OUTDIR)JavaSyntaxHighlighter_Eclipse.$(O) \
+    $(OUTDIR)stx_libjava_tools.$(O) \
+    $(OUTDIR)JavaCommentNode.$(O) \
+    $(OUTDIR)JavaFormalParameterNode.$(O) \
+    $(OUTDIR)JavaMethodDeclaratorNode.$(O) \
+    $(OUTDIR)JavaMethodNode.$(O) \
+    $(OUTDIR)JavaParserI.$(O) \
+    $(OUTDIR)JavaSyntaxHighlighter_Old.$(O) \
+    $(OUTDIR)JavaTypeNode.$(O) \
+    $(OUTDIR)JavaArrayTypeNode.$(O) \
+    $(OUTDIR)JavaBooleanTypeNode.$(O) \
+    $(OUTDIR)JavaCharTypeNode.$(O) \
+    $(OUTDIR)JavaClassOrInterfaceTypeNode.$(O) \
+    $(OUTDIR)JavaDocNode.$(O) \
+    $(OUTDIR)JavaDoubleTypeNode.$(O) \
+    $(OUTDIR)JavaFloatTypeNode.$(O) \
+    $(OUTDIR)JavaIntTypeNode.$(O) \
+    $(OUTDIR)JavaJavaDocNode.$(O) \
+    $(OUTDIR)JavaLongTypeNode.$(O) \
+    $(OUTDIR)JavaParserII.$(O) \
+    $(OUTDIR)JavaVoidTypeNode.$(O) \
     $(OUTDIR)JavaParser.$(O) \
     $(OUTDIR)extensions.$(O) \
 
--- a/src/tools/abbrev.stc	Fri Mar 09 22:51:51 2012 +0000
+++ b/src/tools/abbrev.stc	Fri Mar 09 22:56:58 2012 +0000
@@ -1,9 +1,37 @@
 # automagically generated by the project definition
 # this file is needed for stc to be able to compile modules independently.
 # it provides information about a classes filename, category and especially namespace.
-JavaSyntaxHighlighter JavaSyntaxHighlighter stx:libjava/tools 'Languages-Java-Tools' 0
-stx_libjava_tools stx_libjava_tools stx:libjava/tools '* Projects & Packages *' 3
 JavaListInspectorView JavaListInspectorView stx:libjava/tools 'Languages-Java-Tools-Inspectors' 2
 JavaMapInspectorView JavaMapInspectorView stx:libjava/tools 'Languages-Java-Tools-Inspectors' 2
+JavaParseNode JavaParseNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaParseNodeBuilder JavaParseNodeBuilder stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaParseResult JavaParseResult stx:libjava/tools 'Languages-Java-Parser' 0
+JavaParserIITests JavaParserIITests stx:libjava/tools 'Languages-Java-Tests-Parser' 1
+JavaParserITests JavaParserITests stx:libjava/tools 'Languages-Java-Tests-Parser' 1
+JavaParserTestCase JavaParserTestCase stx:libjava/tools 'Languages-Java-Tests-Parser' 1
+JavaParser_Eclipse JavaParser_Eclipse stx:libjava/tools 'Languages-Java-Tools-Eclipse' 0
+JavaParser_Old JavaParser_Old stx:libjava/tools 'Languages-Java-Parser' 0
 JavaSetInspectorView JavaSetInspectorView stx:libjava/tools 'Languages-Java-Tools-Inspectors' 2
-JavaParser JavaParser stx:libjava/tools 'Languages-Java-Tools' 0
+JavaSyntaxHighlighter_Eclipse JavaSyntaxHighlighter_Eclipse stx:libjava/tools 'Languages-Java-Tools-Eclipse' 0
+stx_libjava_tools stx_libjava_tools stx:libjava/tools '* Projects & Packages *' 3
+JavaCommentNode JavaCommentNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaFormalParameterNode JavaFormalParameterNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaMethodDeclaratorNode JavaMethodDeclaratorNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaMethodNode JavaMethodNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaParserI JavaParserI stx:libjava/tools 'Languages-Java-Parser' 0
+JavaParserTests JavaParserTests stx:libjava/tools 'Languages-Java-Tests-Parser' 1
+JavaSyntaxHighlighter_Old JavaSyntaxHighlighter_Old stx:libjava/tools 'Languages-Java-Tools' 0
+JavaTypeNode JavaTypeNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaArrayTypeNode JavaArrayTypeNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaBooleanTypeNode JavaBooleanTypeNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaCharTypeNode JavaCharTypeNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaClassOrInterfaceTypeNode JavaClassOrInterfaceTypeNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaDocNode JavaDocNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaDoubleTypeNode JavaDoubleTypeNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaFloatTypeNode JavaFloatTypeNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaIntTypeNode JavaIntTypeNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaJavaDocNode JavaJavaDocNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaLongTypeNode JavaLongTypeNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaParserII JavaParserII stx:libjava/tools 'Languages-Java-Parser' 0
+JavaVoidTypeNode JavaVoidTypeNode stx:libjava/tools 'Languages-Java-Parser-AST' 0
+JavaParser JavaParser stx:libjava/tools 'Languages-Java-Parser' 0
--- a/src/tools/bc.mak	Fri Mar 09 22:51:51 2012 +0000
+++ b/src/tools/bc.mak	Fri Mar 09 22:56:58 2012 +0000
@@ -1,7 +1,7 @@
 # $Header$
 #
 # DO NOT EDIT
-# automagically generated from the projectDefinition: stx_libjava_tools at 2012-02-11 19:47:27.099.
+# automagically generated from the projectDefinition: stx_libjava_tools at 2012-03-09 23:56:57.491.
 #
 # Warning: once you modify this file, do not rerun
 # stmkmp or projectDefinition-build again - otherwise, your changes are lost.
@@ -34,7 +34,7 @@
 
 
 
-LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\libview -I$(INCLUDE_TOP)\stx\libwidg -I$(INCLUDE_TOP)\stx\libview2 -I$(INCLUDE_TOP)\stx\libjava -I$(INCLUDE_TOP)\stx\libbasic2 -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libcomp -I$(INCLUDE_TOP)\stx\libtool
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\libview -I$(INCLUDE_TOP)\stx\libwidg -I$(INCLUDE_TOP)\stx\libview2 -I$(INCLUDE_TOP)\stx\libjava -I$(INCLUDE_TOP)\stx\goodies\sunit -I$(INCLUDE_TOP)\stx\libbasic2 -I$(INCLUDE_TOP)\squeak\petitparser -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libcomp -I$(INCLUDE_TOP)\stx\libtool
 LOCALDEFINES=
 
 STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
@@ -78,10 +78,34 @@
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
 $(OUTDIR)JavaListInspectorView.$(O) JavaListInspectorView.$(H): JavaListInspectorView.st $(INCLUDE_TOP)\stx\libtool\OrderedCollectionInspectorView.$(H) $(INCLUDE_TOP)\stx\libtool\InspectorView.$(H) $(INCLUDE_TOP)\stx\libview\SimpleView.$(H) $(INCLUDE_TOP)\stx\libview\DisplaySurface.$(H) $(INCLUDE_TOP)\stx\libview\GraphicsMedium.$(H) $(INCLUDE_TOP)\stx\libview\DeviceGraphicsContext.$(H) $(INCLUDE_TOP)\stx\libview\GraphicsContext.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)JavaMapInspectorView.$(O) JavaMapInspectorView.$(H): JavaMapInspectorView.st $(INCLUDE_TOP)\stx\libtool\DictionaryInspectorView.$(H) $(INCLUDE_TOP)\stx\libtool\InspectorView.$(H) $(INCLUDE_TOP)\stx\libview\SimpleView.$(H) $(INCLUDE_TOP)\stx\libview\DisplaySurface.$(H) $(INCLUDE_TOP)\stx\libview\GraphicsMedium.$(H) $(INCLUDE_TOP)\stx\libview\DeviceGraphicsContext.$(H) $(INCLUDE_TOP)\stx\libview\GraphicsContext.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)JavaParser.$(O) JavaParser.$(H): JavaParser.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParseNode.$(O) JavaParseNode.$(H): JavaParseNode.st $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParseNodeBuilder.$(O) JavaParseNodeBuilder.$(H): JavaParseNodeBuilder.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParseResult.$(O) JavaParseResult.$(H): JavaParseResult.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParser_Eclipse.$(O) JavaParser_Eclipse.$(H): JavaParser_Eclipse.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParser_Old.$(O) JavaParser_Old.$(H): JavaParser_Old.st $(INCLUDE_TOP)\squeak\petitparser\PPCompositeParser.$(H) $(INCLUDE_TOP)\squeak\petitparser\PPDelegateParser.$(H) $(INCLUDE_TOP)\squeak\petitparser\PPParser.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ReadStream.$(H) $(INCLUDE_TOP)\stx\libbasic\PositionableStream.$(H) $(INCLUDE_TOP)\stx\libbasic\PeekableStream.$(H) $(INCLUDE_TOP)\stx\libbasic\Stream.$(H) $(STCHDR)
 $(OUTDIR)JavaSetInspectorView.$(O) JavaSetInspectorView.$(H): JavaSetInspectorView.st $(INCLUDE_TOP)\stx\libtool\SetInspectorView.$(H) $(INCLUDE_TOP)\stx\libtool\InspectorView.$(H) $(INCLUDE_TOP)\stx\libview\SimpleView.$(H) $(INCLUDE_TOP)\stx\libview\DisplaySurface.$(H) $(INCLUDE_TOP)\stx\libview\GraphicsMedium.$(H) $(INCLUDE_TOP)\stx\libview\DeviceGraphicsContext.$(H) $(INCLUDE_TOP)\stx\libview\GraphicsContext.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)JavaSyntaxHighlighter.$(O) JavaSyntaxHighlighter.$(H): JavaSyntaxHighlighter.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaSyntaxHighlighter_Eclipse.$(O) JavaSyntaxHighlighter_Eclipse.$(H): JavaSyntaxHighlighter_Eclipse.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)stx_libjava_tools.$(O) stx_libjava_tools.$(H): stx_libjava_tools.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)\stx\libjava\JavaObject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libjava\JavaClass.$(H) $(INCLUDE_TOP)\stx\libjava\JavaBehavior.$(H) $(INCLUDE_TOP)\stx\libbasic\Class.$(H) $(INCLUDE_TOP)\stx\libbasic\ClassDescription.$(H) $(INCLUDE_TOP)\stx\libbasic\Behavior.$(H) $(INCLUDE_TOP)\stx\libwidg\GenericToolbarIconLibrary.$(H) $(STCHDR)
+$(OUTDIR)JavaCommentNode.$(O) JavaCommentNode.$(H): JavaCommentNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaFormalParameterNode.$(O) JavaFormalParameterNode.$(H): JavaFormalParameterNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaMethodDeclaratorNode.$(O) JavaMethodDeclaratorNode.$(H): JavaMethodDeclaratorNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaMethodNode.$(O) JavaMethodNode.$(H): JavaMethodNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParserI.$(O) JavaParserI.$(H): JavaParserI.st $(INCLUDE_TOP)\squeak\petitparser\PPCompositeParser.$(H) $(INCLUDE_TOP)\squeak\petitparser\PPDelegateParser.$(H) $(INCLUDE_TOP)\squeak\petitparser\PPParser.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaSyntaxHighlighter_Old.$(O) JavaSyntaxHighlighter_Old.$(H): JavaSyntaxHighlighter_Old.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNodeBuilder.$(H) $(INCLUDE_TOP)\stx\libjava\tools\JavaParser_Old.$(H) $(INCLUDE_TOP)\squeak\petitparser\PPCompositeParser.$(H) $(INCLUDE_TOP)\squeak\petitparser\PPDelegateParser.$(H) $(INCLUDE_TOP)\squeak\petitparser\PPParser.$(H) $(STCHDR)
+$(OUTDIR)JavaTypeNode.$(O) JavaTypeNode.$(H): JavaTypeNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaArrayTypeNode.$(O) JavaArrayTypeNode.$(H): JavaArrayTypeNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaTypeNode.$(H) $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaBooleanTypeNode.$(O) JavaBooleanTypeNode.$(H): JavaBooleanTypeNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaTypeNode.$(H) $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaCharTypeNode.$(O) JavaCharTypeNode.$(H): JavaCharTypeNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaTypeNode.$(H) $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaClassOrInterfaceTypeNode.$(O) JavaClassOrInterfaceTypeNode.$(H): JavaClassOrInterfaceTypeNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaTypeNode.$(H) $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaDocNode.$(O) JavaDocNode.$(H): JavaDocNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaCommentNode.$(H) $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaDoubleTypeNode.$(O) JavaDoubleTypeNode.$(H): JavaDoubleTypeNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaTypeNode.$(H) $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaFloatTypeNode.$(O) JavaFloatTypeNode.$(H): JavaFloatTypeNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaTypeNode.$(H) $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaIntTypeNode.$(O) JavaIntTypeNode.$(H): JavaIntTypeNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaTypeNode.$(H) $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaJavaDocNode.$(O) JavaJavaDocNode.$(H): JavaJavaDocNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaCommentNode.$(H) $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaLongTypeNode.$(O) JavaLongTypeNode.$(H): JavaLongTypeNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaTypeNode.$(H) $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParserII.$(O) JavaParserII.$(H): JavaParserII.st $(INCLUDE_TOP)\stx\libjava\tools\JavaParserI.$(H) $(INCLUDE_TOP)\squeak\petitparser\PPCompositeParser.$(H) $(INCLUDE_TOP)\squeak\petitparser\PPDelegateParser.$(H) $(INCLUDE_TOP)\squeak\petitparser\PPParser.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaVoidTypeNode.$(O) JavaVoidTypeNode.$(H): JavaVoidTypeNode.st $(INCLUDE_TOP)\stx\libjava\tools\JavaTypeNode.$(H) $(INCLUDE_TOP)\stx\libjava\tools\JavaParseNode.$(H) $(INCLUDE_TOP)\stx\libcomp\ParseNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaParser.$(O) JavaParser.$(H): JavaParser.st $(INCLUDE_TOP)\stx\libjava\tools\JavaParserII.$(H) $(INCLUDE_TOP)\stx\libjava\tools\JavaParserI.$(H) $(INCLUDE_TOP)\squeak\petitparser\PPCompositeParser.$(H) $(INCLUDE_TOP)\squeak\petitparser\PPDelegateParser.$(H) $(INCLUDE_TOP)\squeak\petitparser\PPParser.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)\stx\libjava\JavaClass.$(H) $(INCLUDE_TOP)\stx\libjava\JavaBehavior.$(H) $(INCLUDE_TOP)\stx\libbasic\Class.$(H) $(INCLUDE_TOP)\stx\libbasic\ClassDescription.$(H) $(INCLUDE_TOP)\stx\libbasic\Behavior.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libjava\JavaObject.$(H) $(INCLUDE_TOP)\stx\libtool\Tools__NewSystemBrowser.$(H) $(INCLUDE_TOP)\stx\libtool\SystemBrowser.$(H) $(INCLUDE_TOP)\stx\libview2\ApplicationModel.$(H) $(INCLUDE_TOP)\stx\libview2\Model.$(H) $(INCLUDE_TOP)\stx\libbasic\ConfigurableFeatures.$(H) $(INCLUDE_TOP)\stx\libwidg\GenericToolbarIconLibrary.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
--- a/src/tools/libInit.cc	Fri Mar 09 22:51:51 2012 +0000
+++ b/src/tools/libInit.cc	Fri Mar 09 22:56:58 2012 +0000
@@ -29,10 +29,34 @@
 __BEGIN_PACKAGE2__("libstx_libjava_tools", _libstx_libjava_tools_Init, "stx:libjava/tools");
 _JavaListInspectorView_Init(pass,__pRT__,snd);
 _JavaMapInspectorView_Init(pass,__pRT__,snd);
-_JavaParser_Init(pass,__pRT__,snd);
+_JavaParseNode_Init(pass,__pRT__,snd);
+_JavaParseNodeBuilder_Init(pass,__pRT__,snd);
+_JavaParseResult_Init(pass,__pRT__,snd);
+_JavaParser_137Eclipse_Init(pass,__pRT__,snd);
+_JavaParser_137Old_Init(pass,__pRT__,snd);
 _JavaSetInspectorView_Init(pass,__pRT__,snd);
-_JavaSyntaxHighlighter_Init(pass,__pRT__,snd);
+_JavaSyntaxHighlighter_137Eclipse_Init(pass,__pRT__,snd);
 _stx_137libjava_137tools_Init(pass,__pRT__,snd);
+_JavaCommentNode_Init(pass,__pRT__,snd);
+_JavaFormalParameterNode_Init(pass,__pRT__,snd);
+_JavaMethodDeclaratorNode_Init(pass,__pRT__,snd);
+_JavaMethodNode_Init(pass,__pRT__,snd);
+_JavaParserI_Init(pass,__pRT__,snd);
+_JavaSyntaxHighlighter_137Old_Init(pass,__pRT__,snd);
+_JavaTypeNode_Init(pass,__pRT__,snd);
+_JavaArrayTypeNode_Init(pass,__pRT__,snd);
+_JavaBooleanTypeNode_Init(pass,__pRT__,snd);
+_JavaCharTypeNode_Init(pass,__pRT__,snd);
+_JavaClassOrInterfaceTypeNode_Init(pass,__pRT__,snd);
+_JavaDocNode_Init(pass,__pRT__,snd);
+_JavaDoubleTypeNode_Init(pass,__pRT__,snd);
+_JavaFloatTypeNode_Init(pass,__pRT__,snd);
+_JavaIntTypeNode_Init(pass,__pRT__,snd);
+_JavaJavaDocNode_Init(pass,__pRT__,snd);
+_JavaLongTypeNode_Init(pass,__pRT__,snd);
+_JavaParserII_Init(pass,__pRT__,snd);
+_JavaVoidTypeNode_Init(pass,__pRT__,snd);
+_JavaParser_Init(pass,__pRT__,snd);
 
 _stx_137libjava_137tools_extensions_Init(pass,__pRT__,snd);
 __END_PACKAGE__();
--- a/src/tools/stx_libjava_tools.st	Fri Mar 09 22:51:51 2012 +0000
+++ b/src/tools/stx_libjava_tools.st	Fri Mar 09 22:56:58 2012 +0000
@@ -27,13 +27,15 @@
      exclude individual packages in the #excludedFromPrerequisites method."
 
     ^ #(
-        #'stx:libbasic'    "Object - superclass of JavaMapInspectorView "
-        #'stx:libbasic2'    "Text - referenced by JavaSyntaxHighlighter>>markFrom:to:withEmphasis:color: "
-        #'stx:libcomp'
+        #'squeak:petitparser'    "PPCompositeParserTest - superclass of JavaParserIITests "
+        #'stx:goodies/sunit'    "TestCase - superclass of JavaParserIITests "
+        #'stx:libbasic'    "PositionableStream - superclass of JavaParser_Old::LineNumberStream "
+        #'stx:libbasic2'    "Text - referenced by JavaSyntaxHighlighter_Old>>markFrom:to:withEmphasis:color: "
+        #'stx:libcomp'    "ParseNode - superclass of JavaLongTypeNode "
         #'stx:libjava'    "JavaBehavior - superclass of extended JavaClass "
-        #'stx:libtool'    "SetInspectorView - superclass of JavaSetInspectorView "
-        #'stx:libview'    "GraphicsContext - superclass of JavaMapInspectorView "
-        #'stx:libview2'    "Icon - referenced by GenericToolbarIconLibrary class>>javaPublicInterfaceBrowserIcon "
+        #'stx:libtool'    "OrderedCollectionInspectorView - superclass of JavaListInspectorView "
+        #'stx:libview'    "SimpleView - superclass of JavaListInspectorView "
+        #'stx:libview2'    "Model - superclass of extended SystemBrowser "
         #'stx:libwidg'    "GenericToolbarIconLibrary - extended "
     )
 ! !
@@ -48,11 +50,39 @@
 
     ^ #(
         "<className> or (<className> attributes...) in load order"
-        JavaSyntaxHighlighter
-        #'stx_libjava_tools'
         JavaListInspectorView
         JavaMapInspectorView
+        JavaParseNode
+        JavaParseNodeBuilder
+        JavaParseResult
+        (JavaParserIITests autoload)
+        (JavaParserITests autoload)
+        (JavaParserTestCase autoload)
+        #'JavaParser_Eclipse'
+        #'JavaParser_Old'
         JavaSetInspectorView
+        #'JavaSyntaxHighlighter_Eclipse'
+        #'stx_libjava_tools'
+        JavaCommentNode
+        JavaFormalParameterNode
+        JavaMethodDeclaratorNode
+        JavaMethodNode
+        JavaParserI
+        (JavaParserTests autoload)
+        #'JavaSyntaxHighlighter_Old'
+        JavaTypeNode
+        JavaArrayTypeNode
+        JavaBooleanTypeNode
+        JavaCharTypeNode
+        JavaClassOrInterfaceTypeNode
+        JavaDocNode
+        JavaDoubleTypeNode
+        JavaFloatTypeNode
+        JavaIntTypeNode
+        JavaJavaDocNode
+        JavaLongTypeNode
+        JavaParserII
+        JavaVoidTypeNode
         JavaParser
     )
 !
@@ -62,8 +92,11 @@
      Entries are 2-element array literals, consisting of class-name and selector."
 
     ^ #(
+        JavaClass iconInBrowserSymbol
         JavaObject inspectorClass
-        JavaClass iconInBrowserSymbol
+        #'Tools::NewSystemBrowser' classMenuNewGroovyClass
+        'ConfigurableFeatures class' hasGroovySupport
+        'ConfigurableFeatures class' hasJavaToolingSupport
         'GenericToolbarIconLibrary class' javaClassBrowserIcon
         'GenericToolbarIconLibrary class' javaExceptionBrowserIcon
         'GenericToolbarIconLibrary class' javaPrivateClassBrowserIcon
@@ -152,7 +185,7 @@
     "Return a SVN revision number of myself.
      This number is updated after a commit"
 
-    ^ "$SVN-Revision:"'1685'"$"
+    ^ "$SVN-Revision:"1730"$"
 ! !
 
 !stx_libjava_tools class methodsFor:'documentation'!
--- a/src/tools/tools.rc	Fri Mar 09 22:51:51 2012 +0000
+++ b/src/tools/tools.rc	Fri Mar 09 22:56:58 2012 +0000
@@ -3,7 +3,7 @@
 // automagically generated from the projectDefinition: stx_libjava_tools.
 //
 VS_VERSION_INFO VERSIONINFO
-  FILEVERSION     6,2,1685,1685
+  FILEVERSION     6,2,1713,1713
   PRODUCTVERSION  6,2,1,1
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
@@ -20,12 +20,12 @@
     BEGIN
       VALUE "CompanyName", "eXept Software AG\0"
       VALUE "FileDescription", "Smalltalk/X Class library (LIB)\0"
-      VALUE "FileVersion", "6.2.1685.1685\0"
+      VALUE "FileVersion", "6.2.1713.1713\0"
       VALUE "InternalName", "stx:libjava/tools\0"
       VALUE "LegalCopyright", "Copyright Claus Gittinger 1988-2011\nCopyright eXept Software AG 1998-2011\0"
       VALUE "ProductName", "Smalltalk/X\0"
       VALUE "ProductVersion", "6.2.1.1\0"
-      VALUE "ProductDate", "Sat, 11 Feb 2012 19:47:27 GMT\0"
+      VALUE "ProductDate", "Fri, 09 Mar 2012 22:56:57 GMT\0"
     END
 
   END