PackageCompilationUnit.ceylon

"A package descriptor compilation unit, containing a package descriptor.
 
 Examples:
 
     package tmp;
     shared package ceylon.ast.core;"
shared class PackageCompilationUnit(packageDescriptor, imports = [])
        extends AnyCompilationUnit() {
    
    shared actual Import[] imports;
    shared actual PackageDescriptor packageDescriptor;
    "Package descriptor compilation units contain no declarations."
    shared actual [] declarations = [];
    "Package descriptor compilation units contain no module descriptor."
    shared actual Null moduleDescriptor = null;
    
    shared actual <Import|PackageDescriptor>[] children = concatenate(imports, [packageDescriptor]);
    
    shared actual Result transform<out Result>(Transformer<Result> transformer)
            => transformer.transformPackageCompilationUnit(this);
    
    shared actual void visit(Visitor visitor)
            => visitor.visitPackageCompilationUnit(this);

    shared actual Boolean equals(Object that) {
        if (is PackageCompilationUnit that) {
            return packageDescriptor == that.packageDescriptor && imports == that.imports;
        } else {
            return false;
        }
    }
    
    shared actual Integer hash
            => 31 * (packageDescriptor.hash + 31 * imports.hash);
    
    shared PackageCompilationUnit copy(PackageDescriptor packageDescriptor = this.packageDescriptor, Import[] imports = this.imports) {
        value ret = PackageCompilationUnit(packageDescriptor, imports);
        copyExtraInfoTo(ret);
        return ret;
    }
}