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%  | 
  |