AnyCompilationUnit.ceylon
"""A compilation unit.
There are three kinds of compilation unit:
- [[Regular compilation units|CompilationUnit]] contain toplevel type, value, or function definitions.
- [[Module descriptor compilation units|ModuleCompilationUnit]] contain a [[module descriptor|ModuleDescriptor]].
- [[Package descriptor compilation units|PackageCompilationUnit]] contain a [[package descriptor|PackageDescriptor]].
(Because it is the most commonly used, and also what most people associate with a “compilation unit”,
the first kind is simply called [[CompilationUnit]] and this abstract class is called `AnyCompilationUnit`,
rather than calling this `CompilationUnit` and using `RegularCompilationUnit` or `CodeCompilationUnit`
for regular compilation units.)
Every compilation unit starts with a (possibly empty) list of [[imports]].
Examples (separated by blank lines):
module tmp "1.0.0" {}
package tmp;
void run() {
print("Hello, World!");
}"""
shared abstract class AnyCompilationUnit()
of CompilationUnit | ModuleCompilationUnit | PackageCompilationUnit
extends Node() {
"The imports of this compilation unit."
shared formal Import[] imports;
/*
Rather than a single attribute
shared formal Declaration[]|ModuleDescriptor|PackageDescriptor content;
we have three separate attributes; this way, AST consumers _can_ (but don’t have to)
write their code in a way that will continue to work if it’s ever allowed to mix
compilation unit contents (e. g., have module descriptor + run function in the same CU).
*/
"The declarations in this compilation unit.
(This attribute is empty for non-[[regular|CompilationUnit]] compilation units.)"
shared formal Declaration[] declarations;
"The module descriptor in this compilation unit.
(This attribute is [[null]] for non-[[module descriptor|ModuleCompilationUnit]] compilation units.)"
shared formal ModuleDescriptor? moduleDescriptor;
"The package descriptor in this compilation unit.
(This attribute is [[null]] for non-[[package descriptor|PackageDescriptor]] compilation units.)"
shared formal PackageDescriptor? packageDescriptor;
shared actual formal <Import|Declaration|ModuleDescriptor|PackageDescriptor>[] children;
}