/**
* Declare import declarations.
*
* @author Martin Bravenboer <martin@cs.uu.nl>
*/
module dryad/reclassify/declare/Imports
strategies
/**
* The scope of a type imported by a type import declaration is all the
* class and interface type declarations in the compilation unit in which
* the import declaration appears. (7.5.1, page 161)
*
* Single type imports shadow on demand imports.
* Single type imports shadow classes in this package.
*
* On demand imports do not shadow type declarations of the package of compilation unit.
*
* @todo Work on the Object here?
*/
declare-imported-types(cont) =
?cu@CompilationUnit(_, _, _);
{| ReclassifySimpleInScopeTypeName, QualifySimpleInScopeTypeName :
let declare-single-type =
TypeImportDec(declare-type-helper)
declare-on-demand =
TypeImportOnDemandDec(
where(
lookup-package
; get-toplevel-classes
; map(get-canonical-name)
; map(declare-type-helper)
)
)
declare-types-of-pkgdec =
<get-package-of-compilation-unit> cu
; get-toplevel-classes
; map(get-canonical-name)
; map(declare-type-helper)
in where(
add-java-lang-imports
; ?CompilationUnit(_, imports, _)
; <map(try(declare-on-demand))> imports
; declare-types-of-pkgdec
; <map(try(declare-single-type))> imports
; map(try(declare-single-type))
)
end
; cont
|}
/**
* Adds the java.lang imports to a CompilationUnit.
*
* @type _ -> List(ImportDec)
*/
add-java-lang-imports :
CompilationUnit(pkgdec, imports, typedecs)
->
CompilationUnit(pkgdec, [
TypeImportOnDemandDec(PackageName([Id("java"), Id("lang")]))
| imports ], typedecs)
/**
* Declare imported static fields.
*/
declare-imported-fields(cont) =
?CompilationUnit(_, imports, _);
{| ReclassifySimpleByImportInScopeField :
let declare-single = {s:
?StaticImportDec(_, Id(x))
; rules(
ReclassifySimpleByImportInScopeField :
AmbName(Id(x)) -> ExprName(Id(x))
)
}
in where(<map(try(declare-single))> imports)
end;
cont
|}
/**
* Helpers
*/
strategies
/**
* @type TypeName -> TypeName
*/
declare-type-helper =
?TypeName(qualifier, Id(x));
rules(
ReclassifySimpleInScopeTypeName :
AmbName(Id(x)) -> TypeName(qualifier, Id(x))
ReclassifySimpleInScopeTypeName :
PackageOrTypeName(Id(x)) -> TypeName(qualifier, Id(x))
QualifySimpleInScopeTypeName :
TypeName(Id(x)) -> TypeName(qualifier, Id(x))
)