Java
The libraries of the "java" collection provide utilities for manipulating Java programs in both source and binary format.
*** CAVEAT: This library is still in its rather early stages. Expect significant changes to the API to occur in the future.
*** ADDITIONAL CAVEAT: The previous caveat is now many years old. The remainder of this file was ported from a doc.txt file.
parameter
(current-classpath) → (listof path)
(current-classpath path-list) → void? path-list : (listof path)
|
> (current-sourcepath [sp]) :: (parameterof (listof path)) |
|
A parameter containing a list of paths that point to directories where .java |
files reside. This is used by the standard class resolver in |
_semantics/standard-resolver.ss_. |
|
|
1 syntax/class-file
This module provides procedures for reading compiled Java .class files according |
to the Java class file format, as specified by Chapter 4 of the Java Virtual |
Machine Specification, 2nd Ed. |
|
http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html |
http://java.sun.com/docs/books/vmspec/2nd-edition/html/ClassFile.doc.html |
|
> (struct class-file (pool flags this super interfaces fields methods attributes)) |
|
This structure encapsulates all the information read in from a class file. |
|
> (extract-access-flags bits) :: exact-integer [(union 'super 'synchronized)] -> (listof access-flag) |
|
A utility for converting access flags packed in the bits of an exact integer |
into a list of their corresponding symbolic names. The possible access flags |
occurring in a bit field can be enumerated by taking the union of tables 4.1, |
4.4, 4.5, and 4.7 of the JVM specification. |
|
Unfortunately, there is a single overlap amongst these tables: both |
ACC_SUPER and ACC_SYNCHRONIZED have the value 0x0020. The second optional |
argument allows clients to specify which way to interpret the value; by default |
the procedure produces the symbol 'super/synchronized. |
|
Flag name Bit Symbolic value |
--------- --- -------------- |
ACC_PUBLIC 0x0001 'public |
ACC_PRIVATE 0x0002 'private |
ACC_PROTECTED 0x0004 'protected |
ACC_STATIC 0x0008 'static |
ACC_FINAL 0x0010 'final |
ACC_SUPER 0x0020 'super |
ACC_SYNCHRONIZED 0x0020 'synchronized |
ACC_VOLATILE 0x0040 'volatile |
ACC_TRANSIENT 0x0080 'transient |
ACC_NATIVE 0x0100 'native |
ACC_INTERFACE 0x0200 'interface |
ACC_ABSTRACT 0x0400 'abstract |
ACC_STRICT 0x0800 'strictfp |
|
> (utf8-info->string ui) :: utf8-info -> string |
|
Converts a utf8-info struct into a Unicode string. |
|
> (read-class-file [in]) :: [input-port] -> class-file |
|
Reads a class file from an input port. |
|
> access-flag/c :: contract |
|
Recognizes symbols that name access flags: all of the symbols in the table |
above, plus 'super/synchronized. |
|
The _class-file.ss_ library defines a hierarchy of structures representing the |
elements of a class file. The structures are organized according to the |
following hierarchy: |
|
info |
| |
+-- class-info |
| o name-index :: natural-number |
| |
+-- ref-info |
| o class-index :: natural-number |
| o name-and-type-index :: natural-number |
| | |
| +-- field-ref-info |
| | |
| +-- method-ref-info |
| | |
| +-- interface-method-ref-info |
| |
+-- string-info |
| o string-index :: natural-number |
| |
+-- integer-info |
| o value :: integer |
| |
+-- float-info |
| o bytes :: bytes |
| |
+-- long-info |
| o high-bytes :: bytes |
| o low-bytes :: bytes |
| |
+-- double-info |
| o high-bytes :: bytes |
| o low-bytes :: bytes |
| |
+-- name-and-type-info |
| o name-index :: natural-number |
| o descriptor-index :: natural-number |
| |
+-- utf8-info |
| o length :: natural-number |
| o bytes :: bytes |
| |
+-- inner-class-entry |
| o inner-class-info-index :: natural-number |
| o outer-class-info-index :: natural-number |
| o inner-name-index :: natural-number |
| o inner-class-access-flags :: integer |
| |
+-- element-info |
| o access-flags :: integer |
| o name-index :: natural-number |
| o descriptor-index :: natural-number |
| o attributes-count :: natural-number |
| o attributes :: (listof attribute-info) |
| | |
| +-- field-info |
| | |
| +-- method-info |
| |
+-- attribute-info |
| |
+-- unsupported-attribute-info |
| o length :: natural-number |
| o bytes :: bytes |
| |
+-- constant-value-attribute-info |
| o value-index :: natural-number |
| |
+-- code-attribute-info |
| |
+-- exceptions-attribute-info |
| o count :: natural-number |
| o exceptions :: (listof natural-number) |
| |
+-- inner-classes-attribute-info |
| |
+-- synthetic-attribute-info |
| |
+-- source-file-attribute-info |
| |
+-- line-number-table-attribute-info |
| |
+-- local-variable-table-attribute-info |
| |
+-- deprecated-attribute-info |
2 syntax/ast
|
|
The _ast.ss_ module defines a hierarchy of structures representing nodes in the |
abstract syntax tree of a Java program. The structures are organized according |
to the following hierarchy: |
|
ast |
o src :: (optional src) |
| |
+-- id |
| o name :: symbol |
| |
+-- name |
| o path :: (listof id) |
| o id :: id |
| |
+-- import |
| o name :: name |
| o star? :: boolean |
| |
+-- type-spec |
| o base-type :: type-name |
| o dimension :: natural-number |
| |
+-- modifier |
| o modifier :: symbol |
| |
+-- initializer |
| o static? :: boolean |
| o body :: block-stmt |
| |
+-- compilation-unit |
| o package :: (optional name) |
| o imports :: (listof import) |
| o classes :: (listof (optional type-decl)) |
| |
+-- decl |
| o modifiers :: (listof modifier) |
| o name :: id |
| | |
| +-- type-decl |
| | o interfaces :: (listof name) |
| | o body :: (listof class-element) |
| | | |
| | +-- class-decl |
| | | o super :: (optional name) |
| | | |
| | +-- interface-decl |
| | |
| +-- variable-decl |
| | o type :: type-spec |
| | o init :: (optional expr) |
| | |
| +-- behavior-decl |
| o formals :: (listof variable-decl) |
| o throws :: (listof name) |
| o body :: block-stmt |
| | |
| +-- constructor-decl |
| | |
| +-- method-decl |
| o return-type :: type-spec |
| |
+-- stmt |
| | |
| +-- expr-stmt |
| | o expr :: expr |
| | |
| +-- labeled-stmt |
| | o label :: id |
| | o stmt :: (optional stmt) |
| | |
| +-- block-stmt |
| | o body :: (listof block-element) |
| | |
| +-- switch-stmt |
| | o expr :: expr |
| | o clauses :: (listof (union case-stmt block-element)) |
| | |
| +-- case-stmt |
| | o test :: (optional expr) |
| | |
| +-- if-stmt |
| | o test :: expr |
| | o con :: (optional stmt) |
| | o alt :: (optional stmt) |
| | |
| +-- for-stmt |
| | o init :: (union (listof variable-decl) (listof expr)) |
| | o test :: (optional expr) |
| | o update :: (listof expr) |
| | o body :: (optional stmt) |
| | |
| +-- while-stmt |
| | o test :: expr |
| | o body :: (optional stmt) |
| | |
| +-- do-stmt |
| | o body :: stmt |
| | o test :: expr |
| | |
| +-- break-stmt |
| | o label :: (optional id) |
| | |
| +-- continue-stmt |
| | o label :: (optional id) |
| | |
| +-- return-stmt |
| | o value :: (optional expr) |
| | |
| +-- throw-stmt |
| | o expr :: expr |
| | |
| +-- synchronized-stmt |
| | o expr :: expr |
| | o body :: stmt |
| | |
| +-- try-stmt |
| | o body :: block-stmt |
| | o catches :: (listof catch-stmt) |
| | o finally :: (optional block-stmt) |
| | |
| +-- catch-stmt |
| | o exception :: variable-decl |
| | o body :: block-stmt |
| | |
| +-- assert-stmt |
| o predicate :: expr |
| o message :: expr |
| |
+-- expr |
| |
+-- conditional-expr |
| o test :: expr |
| o con :: expr |
| o alt :: expr |
| |
+-- prefix-expr |
| o op-src :: src |
| o operator :: symbol |
| o operand :: expr |
| |
+-- postfix-expr |
| o op-src :: src |
| o operator :: symbol |
| o operand :: expr |
| |
+-- unary-expr |
| o op-src :: src |
| o operator :: symbol |
| o operand :: expr |
| |
+-- binary-expr |
| o op-src :: src |
| o operator :: symbol |
| o left :: expr |
| o right :: expr |
| |
+-- instanceof-expr |
| o op-src :: src |
| o expr :: expr |
| o type :: type-spec |
| |
+-- literal |
| o value :: any |
| | |
| +-- boolean-literal |
| | |
| +-- char-literal |
| | |
| +-- integer-literal |
| | |
| +-- long-literal |
| | |
| +-- float-literal |
| | |
| +-- double-literal |
| | |
| +-- string-literal |
| | |
| +-- null-literal |
| |
+-- class-expr |
| o type :: type-spec |
| |
+-- new-object-expr |
| o container :: (optional expr) |
| o name :: name |
| o args :: (listof expr) |
| o class-body :: (optional (listof class-element)) |
| |
+-- new-array-expr |
| o type :: type-spec |
| o dim-exprs :: (listof expr) |
| o dim :: natural-number |
| o init :: (optional array-initializer) |
| |
+-- array-initializer |
| o contents :: (listof expr) |
| |
+-- call-expr |
| o object :: (optional expr) |
| o name :: name |
| o args :: (listof expr) |
| |
+-- assign-expr |
| o operator :: symbol |
| o left :: access |
| o right :: expr |
| |
+-- cast-expr |
| o type :: type-spec |
| o expr :: expr |
| |
+-- access |
| |
+-- field-access |
| o object :: expr |
| o name :: id |
| |
+-- array-access |
| o array :: expr |
| o index :: expr |
| |
+-- var-access |
o var :: name |
|
Every AST node can contain a field of type `src', which represents the source |
location information of the item. |
|
> (struct src (file line col span)) :: (optional path) * (optional natural-number) * (optional natural-number) * (optional natural-number) |
|
> (name->access name) :: name -> access |
|
Converts a name to a variable reference. |
|
> (access->name acc) :: (union field-access var-access) -> name |
|
Converts a field or local variable reference to a name. |
|
FIXME: doesn't work with field accesses in general, since those can contain |
arbitrary expressions, which can't be represented as names. (In fact, it |
appears that field-accesses always have non-name expressions; all other |
field refs get mapped to var-access nodes instead.) |
|
> (increase-type-dimension ts n) :: type-spec natural-number -> type-spec |
|
Constructs a new type-spec which is equivalent to `ts' except with type |
dimension increased by `n'. |
|
> primitive-type ::= 'void | 'boolean | 'byte | 'short | 'int | 'long | 'char | 'float | 'double |
|
> (primitive-type? v) :: any -> boolean |
|
Members of class and interface declarations are represented by the type |
`class-element', which is define by: |
|
> class-element ::= |
decl |
| (nelistof variable-decl) |
| initializer |
| #f |
|
> (class-element? v) :: any -> boolean |
|
> block-element ::= |
decl |
| (nelistof variable-decl) |
| stmt |
| #f |
|
> (block-element? v) :: any -> boolean |
|
> type-name ::= |
primitive-type |
| name |
|
> (type-name? v) :: any -> boolean |
3 syntax/lexer
|
|
The _lexer.ss_ module provides a lexer for Java. |
|
> Operators :: empty-tokens |
|
> Separators :: empty-tokens |
|
> EmptyLiterals :: empty-tokens |
|
> Keywords :: empty-tokens |
|
> BasicTokens :: tokens |
|
> (struct string-error (string error-token)) :: string position-token |
|
> (java-lexer in) :: input-port -> position-token |
|
4 syntax/parser
|
====================================================================== |
_syntax/parser.ss_: |
====================================================================== |
|
The _parser.ss_ module provides a parser for Java. |
|
> (parse in path) :: [input-port (optional (union path string))] -> ast |
|
Parses a Java compilation unit (i.e., the contents of a .java file) from an |
input port, with the given file name (used for error reporting). |
|
> (parse-string str) :: string -> ast |
|
Parses a Java compilation unit from a string. |
|
> (parse-file path) :: (union path string) -> ast |
|
Parses a Java compilation unit from a file. |
5 semantics/semantic-object
|
The _semantic-object.ss_ library defines a hierarchy of mzscheme classes and |
interfaces for the representation of the (static) semantic elements of a Java |
program, e.g., classes, interfaces, methods, fields, etc. |
|
> (struct type-name (package type [dimension])) :: (listof symbol) symbol? natural-number |
|
The `type-name' structure contains enough information to identify a type |
uniquely and can be used to look up a type with a class resolver (see |
_class-resolver.ss). The `package' field contains the name of the type's package |
(primitive types and members of the default package use the empty list). The |
`type' field contains the symbolic name of the type. The optional `dimension' |
field contains the array dimension and defaults to 0, representing a ground |
(i.e., non-array) type. |
|
> (build-type-name path) :: (listof symbol) -> type-name |
|
Given a fully qualified type name as a list of symbols, this procedure builds a |
`type-name' structure representing that name. |
|
> (dot-notation path) :: (listof symbol) -> string |
|
Given a fully qualified type name as a list of symbols, this procedure |
constructs the string representation of the fully qualified name in Java |
``dot-notation''. |
|
> (type-name->string tn) :: (optional type-name) -> string |
|
Given a `type-name' struct (or #f, representing the ``void'' type), this |
procedure constructs the string representation of the fully qualified name in |
Java ``dot-notation''. |
|
> byte, char, double, float, int, long, short, boolean :: primitive-type% |
|
Objects of class primitive-type% representing the Java primitive types of the |
same respective name. |
|
Interfaces |
---------- |
|
The mzscheme interfaces defined in this library are organized according to the |
following graph: |
|
semantic-object<%> resolvable<%> |
| | |
+---------+---------+ |
| |
type<%> |
|
++ interface semantic-object<%> |
|
> (to-string) :: -> string |
|
Returns a string representation of the semantic object. |
|
++ interface resolvable<%> |
|
> (get-related-types) :: -> (listof type-name) |
|
Returns the list of type-names that are referenced in the definition of the |
semantic object. |
|
++ interface type<%> extends semantic-object<%>, resolvable<%> |
|
> (get-type-name) :: -> type-name |
|
Returns the type-name representing the type object. |
|
Classes |
------- |
|
The mzscheme classes defined in this library are organized according to the |
following hierarchy (classes without parent classes extend the standard mzscheme |
object% class): |
|
package% (semantic-object<%>, resolvable<%>) |
|
array-type% (type<%>) |
|
ground-type% (type<%>) |
| |
+-- primitive-type% |
| |
+-- declared-type% |
| |
+-- class% |
| |
+-- interface% |
|
type-element% (semantic-object<%>, resolvable<%>) |
| |
+-- field% |
| |
+-- behavior% |
| | |
| +-- constructor% |
| | |
| +-- method% |
| |
+-- initializer% |
| |
+-- inner-type% |
|
++ class package% implements semantic-object<%> |
|
> (new package% (name _)) -> package% |
name :: (listof symbol) |
|
> (to-string) :: -> string |
|
Returns the package name in dot-notation. |
|
++ class array-type% implements type<%> |
|
> (new array-type% (base-type _)) -> array-type% |
base-type :: type-name |
|
> (get-type-name) :: -> type-name |
|
> (get-base-type) :: -> type-name |
|
> (get-dimension) :: -> natural-number |
|
> (get-related-types) :: -> (listof type-name) |
|
> (to-string) :: -> string |
|
++ class ground-type% implements semantic-object<%>, type<%> |
|
> (new ground-type% (package _) (name _)) -> ground-type% |
package :: (listof symbol) |
name :: type-name |
|
> (get-package) :: -> (listof symbol) |
|
THIS METHOD IS DEPRECATED. Use (type-name-package (send obj get-type-name)) |
instead. In the next major version release, this method will be removed. |
|
> (get-type-name) :: -> type-name |
|
> (get-related-types) :: (listof type-name) |
|
> (to-string) :: -> string |
|
++ class primitive-type% extends ground-type% |
|
> (new primitive-type% (name _)) -> primitive-type% |
name :: type-name |
|
++ class declared-type% extends ground-type% |
|
> (new declared-type% (package-name _) (name _) (modifiers _) (interfaces _) (elements _)) -> declared-type% |
package-name :: (listof symbol) |
name :: type-name |
modifiers :: (listof access-flags) |
interfaces :: (listof type-name) |
elements :: (listof type-element%) |
|
> (get-modifiers) :: -> (listof access-flag) |
|
> (get-interfaces) :: -> (listof type-name) |
|
> (get-elements) :: -> (listof type-element%) |
|
++ class class% extends declared-type% |
|
> (new class% (package _) (name _) (modifiers _) (interfaces _) (elements _) (superclass _)) -> class% |
package :: (listof symbol) |
name :: type-name |
modifiers :: (listof access-flag) |
interfaces :: (listof type-name) |
elements :: (listof type-element%) |
superclass :: (optional type-name) |
|
> (get-superclass) :: -> (optional type-name) |
|
++ class interface% extends declared-type% |
|
> (new interface% (package _) (name _) (modifiers _) (interfaces _) (elements _)) -> interface% |
package :: (listof symbol) |
name :: type-name |
modifiers :: (listof access-flag) |
interfaces :: (listof type-name) |
elements :: (listof type-element%) |
|
++ class type-element% implements semantic-object<%>, resolvable<%> |
|
> (new type-element% (name _)) -> type-element% |
name :: string |
|
> (get-name) :: -> (option string) |
|
> (get-related-types) :: (listof type-name) |
|
> (to-string) :: -> string |
|
++ class field% extends type-element% |
|
> (new field% (name _) (modifiers _) (type _)) -> field% |
name :: string |
modifiers :: (listof access-flag) |
type :: type-name |
|
> (get-modifiers) :: -> (listof access-flag) |
|
> (get-type) :: -> type-name |
|
++ class initializer% extends type-element% |
|
> (new initializer%) -> intializer% |
|
++ class behavior% extends type-element% |
|
> (new behavior% (name _) (formals _) (exceptions _) (modifiers _)) -> behavior% |
name :: string |
formals :: (listof type-name) |
exceptions :: (listof type-name) |
modifiers :: (listof access-flag) |
|
> (get-formals) :: -> (listof type-name) |
|
> (get-exceptions) :: -> (listof type-name) |
|
> (get-modifiers) :: -> (listof access-flag) |
|
++ class constructor% extends behavior% |
|
> (new constructor% (name _) (formals _) (exceptions _) (modifiers _)) -> constructor% |
name :: string |
formals :: (listof type-name) |
exceptions :: (listof type-name) |
modifiers :: (listof access-flag) |
|
++ class method% extends behavior% |
|
> (new method% (name _) (formals _) (exceptions _) (modifiers _) (return-type _)) -> method% |
name :: string |
formals :: (listof type-name) |
exceptions :: (listof type-name) |
modifiers :: (listof access-flag) |
return-type :: (optional type-name) |
|
> (get-return-type) :: -> (optional type-name) |
|
++ class inner-type% extends type-element% |
|
> (new inner-type% (name _) (type _)) -> inner-type% |
name :: string |
type :: type-name |
|
> (get-type) :: -> type-name |
|
6 semantics/class-resolver
|
|
;; TODO: this should not be starting out #f |
|
> (current-class-resolver [cr]) :: (parameterof class-resolver<%>) |
|
> (lookup-package pkg) :: (listof symbol) -> (optional package%) |
|
> (lookup-type tn) :: type-name -> (optional type<%>) |
|
> (resolve-all t) :: (union type-name semantic-object<%>) -> any |
|
Forces the resolution (via the current class resolver) of the transitive closure |
of the `get-related-types' relation on either a semantic object or the type |
associated with a type-name. |
|
++ interface class-resolver<%> |
|
> (resolve-package path) :: (listof symbol) -> (optional package%) |
|
> (resolve-type tn) :: type-name -> (optional type<%>) |
|
7 semantics/standard-resolver
|
++ class class-resolver% implements class-resolver<%> |
|
> (new method% (name _) (formals _) (exceptions _) (modifiers _) (return-type _)) -> method% |
name :: string |
formals :: (listof type-name) |
exceptions :: (listof type-name) |
modifiers :: (listof access-flag) |
return-type :: (optional type-name) |
|
> (new class-resolver% (classpath _) (sourcepath _)) -> class-resolver% |
classpath :: (listof path) |
sourcepath :: (listof path) |
|
The initialization arguments specify the paths to search during class |
resolution for binary and source resolution, respectively. Both arguments |
are optional. If they are not specified, this class uses the value of |
the current-classpath and current-sourcepath parameters, respectively, at |
the time when the class was created. Therefore, changing the value of |
either of these parameters will *not* affect previously-created instances |
of class-resolver%. |
|
> (resolve-package path) :: (listof symbol) -> (optional package%) |
|
> (resolve-type tn) :: type-name -> (option type<%>) |
8 semantics/resolve-source
|
TODO: (resolve-source ast) :: ast -> (listof declared-type%) |
|
9 semantics/resolve-binary
|
> (resolve-binary cf) :: class-file -> declared-type% |
|