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 :