Some refactoring in Java parser and highlighter - full Java parser based on PetitParser checked in
--- /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 t = 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> <th> Encoding
+ * <tr><td> boolean <td> <td align=center> Z
+ * <tr><td> byte <td> <td align=center> B
+ * <tr><td> char <td> <td align=center> C
+ * <tr><td> class or interface
+ * <td> <td align=center> L<i>classname</i>;
+ * <tr><td> double <td> <td align=center> D
+ * <tr><td> float <td> <td align=center> F
+ * <tr><td> int <td> <td align=center> I
+ * <tr><td> long <td> <td align=center> J
+ * <tr><td> short <td> <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><clinit></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: 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 "<init>"or "<clinit>".
+ * @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><clinit></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 "<init>"or "<clinit>" 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>''\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>''\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>''\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>''\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 (<condition does not hold>)
+ * 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 (<condition does not hold>)
+ * 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 (<condition does not hold>)
+ * 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