
class Perl::Compiler::PIL::Util::Pad {
    has Perl::Compiler::PIL::Util::Pad $.parent;
    has Str @.names;

    method lookup_pad($name) {
        if (grep { $_ ~~ $name }, @.names) {
            self;
        }
        else {
            $.parent ?? $.parent.lookup_pad($name) !! fail;
        }
    }
}

class Perl::Compiler::PIL::Util::Pos {
    has Int $.line;
    has Int $.column;
}

class Perl::Compiler::PIL::Util::PosRange {
    has Str $.file;
    has Perl::Compiler::PIL::Util::Pos $.begin;
    has Perl::Compiler::PIL::Util::Pos $.end;

    has $.match;
}


role Perl::Compiler::PIL::Util::Type { }

class Perl::Compiler::PIL::Util::ConcreteType
    does Perl::Compiler::PIL::Util::Type {
    has Str $.name;
}

class Perl::Compiler::PIL::Util::TypeConjunction
    does Perl::Compiler::PIL::Util::Type {
    has Perl::Compiler::PIL::Util::Type $.left;
    has Perl::Compiler::PIL::Util::Type $.right;
}

class Perl::Compiler::PIL::Util::TypeDisjunction
    does Perl::Compiler::PIL::Util::Type {
    has Perl::Compiler::PIL::Util::Type $.left;
    has Perl::Compiler::PIL::Util::Type $.right;
}


role Perl::Compiler::PIL::Util::Context { }

class Perl::Compiler::PIL::Util::VoidContext
    does Perl::Compiler::PIL::Util::Context 
{ }

class Perl::Compiler::PIL::Util::ItemContext
    does Perl::Compiler::PIL::Util::Context {
    has Perl::Compiler::PIL::Util::Type $.type;
}

class Perl::Compiler::PIL::Util::SlurpyContext
    does Perl::Compiler::PIL::Util::Context {
    has Perl::Compiler::PIL::Util::Type @.types;
    has Bit $.unbounded;   # the last type represents a *@array of 
                           # that type if true
}


class Perl::Compiler::PIL::Util::Signature {
    has Perl::Compiler::PIL::Util::Parameter @.params;
}

class Perl::Compiler::PIL::Util::Parameter {
    has Bit $.is_invocant;
    has Bit $.is_optional;
    has Bit $.is_named;
    has Bit $.is_ref;
    has Bit $.is_rw;
    has Bit $.is_delayed;
    
    has Str $.name;
    has Perl::Compiler::PIL::Util::Context $.context;
    has Perl::Compiler::PIL::PIL $.default;
}

# vim: ft=perl6 :
