"""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;