Mildew

 view release on metacpan or  search on metacpan

WIP/blib/lib/Mildew/AST/Block.pm  view on Meta::CPAN

class Mildew::AST::Block extends Mildew::AST::Base {
    has 'stmts' => (is=>'ro',isa=>'ArrayRef[Mildew::AST::Base]');
    has 'regs' => (is=>'ro',default=>sub {[]},isa=>'ArrayRef[Str]');
    method m0ld($ret) {
        "my $ret = mold {\n"
            . join('',map {'my $'.$_.";\n"} @{$self->regs})
            . join("",map { $_->m0ld('$void') } @{$self->stmts})
        . "};\n";
    }
    method pretty {
        return 'mold {...}' if defined $Mildew::consise_pretty;
        "mold \{\n". Mildew::AST::indent(
            join('',map {'my $'.$_.";\n"} @{$self->regs})

WIP/blib/lib/Mildew/AST/Capture.pm  view on Meta::CPAN

use v5.10;
use MooseX::Declare;
class Mildew::AST::Capture extends Mildew::AST::Base {
    has 'invocant' => (is=>'ro',isa=>'Mildew::AST::Base');
    has 'positional' => (is=>'ro',default=>sub {[]},isa=>'ArrayRef[Mildew::AST::Base]');
    has 'named' => (is=>'ro',default=>sub {[]},isa=>'ArrayRef[Mildew::AST::Base]');
}

WIP/blib/lib/Mildew/Types.pm  view on Meta::CPAN

use v5.10;
use Mildew::Emit::Yeast;
use MooseX::Declare;
class Mildew::TypeInfo {
    has type=>(is=>'rw',builder=>'infer_type',lazy=>1);
    has mold=>(is=>'rw',isa=>'Mildew::AST::Block::SSA');
    has usage=>(is=>'ro',isa=>'ArrayRef[Mildew::AST::Base]',default=>sub {[]});
    method add_usage($stmt) {
        push(@{$self->usage},$stmt);
    }
    method infer_type {
        Mildew::Type::Unknown->new();
    }
}

class Mildew::TypeInfo::FromAssignment extends Mildew::TypeInfo {
    has orgin=>(is=>'ro',isa=>'Mildew::AST::Base',required=>1);

WIP/blib/lib/Mildew/Types.pm  view on Meta::CPAN

            $self->debug("not handling method:",$id);
            Mildew::Type::Unknown->new();
        }
    }
}
class Mildew::Type::Lexical extends Mildew::Type {
    use Term::ANSIColor qw(:constants);
    use Scalar::Util qw(refaddr);
    use Carp qw(cluck);
    has content=>(is=>'rw',isa=>'Mildew::Type',lazy_build=>1);
    has binds=>(is=>'ro',isa=>'ArrayRef[Type]',default=>sub {[]});
    has stores=>(is=>'ro',isa=>'ArrayRef[Type]',default=>sub {[]});
    method _build_content {
        $self->debug("infering content of lexical");
        my $container;
        if (@{$self->binds} == 1) {
            $container = $self->binds->[0];
            $self->debug("1 BIND: ",$self->binds->[0]);
        } else {
            $self->debug("many BINDs");
            $container = Mildew::Type::Scalar->new();
        }

WIP/blib/lib/Mildew/Types.pm  view on Meta::CPAN

        }
        $self->debug(RED,"unknow usage of lexical ",$reg->pretty,": ",$usage->pretty,RESET);
    }
    method pretty {
        (ref $self) . " of " . $self->content->pretty;
    }    
}
class Mildew::Type::Scalar extends Mildew::Type {
    use Carp qw(cluck);
    use Scalar::Util qw(refaddr);
    has stores=>(is=>'ro',isa=>'ArrayRef[Type]',default=>sub {[]});
    has content=>(is=>'rw',builder=>'infer_content',lazy=>1,predicate=>'has_content');
    method add_store($content) {
        $self->debug("adding store to ",(refaddr $self));
        push(@{$self->stores},$content);
    }
    method infer_content {
        if (@{$self->stores} == 1) {
            $self->debug("just enough stores");
            $self->stores->[0];
        } else {

WIP/lib/Mildew/AST/Block.pm  view on Meta::CPAN

class Mildew::AST::Block extends Mildew::AST::Base {
    has 'stmts' => (is=>'ro',isa=>'ArrayRef[Mildew::AST::Base]');
    has 'regs' => (is=>'ro',default=>sub {[]},isa=>'ArrayRef[Str]');
    method m0ld($ret) {
        "my $ret = mold {\n"
            . join('',map {'my $'.$_.";\n"} @{$self->regs})
            . join("",map { $_->m0ld('$void') } @{$self->stmts})
        . "};\n";
    }
    method pretty {
        return 'mold {...}' if defined $Mildew::consise_pretty;
        "mold \{\n". Mildew::AST::indent(
            join('',map {'my $'.$_.";\n"} @{$self->regs})

WIP/lib/Mildew/AST/Capture.pm  view on Meta::CPAN

use v5.10;
use MooseX::Declare;
class Mildew::AST::Capture extends Mildew::AST::Base {
    has 'invocant' => (is=>'ro',isa=>'Mildew::AST::Base');
    has 'positional' => (is=>'ro',default=>sub {[]},isa=>'ArrayRef[Mildew::AST::Base]');
    has 'named' => (is=>'ro',default=>sub {[]},isa=>'ArrayRef[Mildew::AST::Base]');
}

WIP/lib/Mildew/Types.pm  view on Meta::CPAN

use v5.10;
use Mildew::Emit::Yeast;
use MooseX::Declare;
class Mildew::TypeInfo {
    has type=>(is=>'rw',builder=>'infer_type',lazy=>1);
    has mold=>(is=>'rw',isa=>'Mildew::AST::Block::SSA');
    has usage=>(is=>'ro',isa=>'ArrayRef[Mildew::AST::Base]',default=>sub {[]});
    method add_usage($stmt) {
        push(@{$self->usage},$stmt);
    }
    method infer_type {
        Mildew::Type::Unknown->new();
    }
}

class Mildew::TypeInfo::FromAssignment extends Mildew::TypeInfo {
    has orgin=>(is=>'ro',isa=>'Mildew::AST::Base',required=>1);

WIP/lib/Mildew/Types.pm  view on Meta::CPAN

            $self->debug("not handling method:",$id);
            Mildew::Type::Unknown->new();
        }
    }
}
class Mildew::Type::Lexical extends Mildew::Type {
    use Term::ANSIColor qw(:constants);
    use Scalar::Util qw(refaddr);
    use Carp qw(cluck);
    has content=>(is=>'rw',isa=>'Mildew::Type',lazy_build=>1);
    has binds=>(is=>'ro',isa=>'ArrayRef[Type]',default=>sub {[]});
    has stores=>(is=>'ro',isa=>'ArrayRef[Type]',default=>sub {[]});
    method _build_content {
        $self->debug("infering content of lexical");
        my $container;
        if (@{$self->binds} == 1) {
            $container = $self->binds->[0];
            $self->debug("1 BIND: ",$self->binds->[0]);
        } else {
            $self->debug("many BINDs");
            $container = Mildew::Type::Scalar->new();
        }

WIP/lib/Mildew/Types.pm  view on Meta::CPAN

        }
        $self->debug(RED,"unknow usage of lexical ",$reg->pretty,": ",$usage->pretty,RESET);
    }
    method pretty {
        (ref $self) . " of " . $self->content->pretty;
    }    
}
class Mildew::Type::Scalar extends Mildew::Type {
    use Carp qw(cluck);
    use Scalar::Util qw(refaddr);
    has stores=>(is=>'ro',isa=>'ArrayRef[Type]',default=>sub {[]});
    has content=>(is=>'rw',builder=>'infer_content',lazy=>1,predicate=>'has_content');
    method add_store($content) {
        $self->debug("adding store to ",(refaddr $self));
        push(@{$self->stores},$content);
    }
    method infer_content {
        if (@{$self->stores} == 1) {
            $self->debug("just enough stores");
            $self->stores->[0];
        } else {

lib/Mildew/AST/Block.pm  view on Meta::CPAN

class Mildew::AST::Block extends Mildew::AST::Base {
    has 'stmts' => (is=>'ro',isa=>'ArrayRef[Mildew::AST::Base]');
    has 'regs' => (is=>'ro',default=>sub {[]},isa=>'ArrayRef[Str]');
    method m0ld($ret) {
        "my $ret = mold {\n"
            . join('',map {'my $'.$_.";\n"} @{$self->regs})
            . join("",map { $_->m0ld('$void') } @{$self->stmts})
        . "};\n";
    }
    method pretty {
        return 'mold {...}' if defined $Mildew::consise_pretty;
        "mold \{\n". Mildew::AST::indent(
            join('',map {'my $'.$_.";\n"} @{$self->regs})

lib/Mildew/AST/Capture.pm  view on Meta::CPAN

use v5.10;
use MooseX::Declare;
class Mildew::AST::Capture extends Mildew::AST::Base {
    has 'invocant' => (is=>'ro',isa=>'Mildew::AST::Base');
    has 'positional' => (is=>'ro',default=>sub {[]},isa=>'ArrayRef[Mildew::AST::Base]');
    has 'named' => (is=>'ro',default=>sub {[]},isa=>'ArrayRef[Mildew::AST::Base]');
}

lib/Mildew/Types.pm  view on Meta::CPAN

use v5.10;
use Mildew::Emit::Yeast;
use MooseX::Declare;
class Mildew::TypeInfo {
    has type=>(is=>'rw',builder=>'infer_type',lazy=>1);
    has mold=>(is=>'rw',isa=>'Mildew::AST::Block::SSA');
    has usage=>(is=>'ro',isa=>'ArrayRef[Mildew::AST::Base]',default=>sub {[]});
    method add_usage($stmt) {
        push(@{$self->usage},$stmt);
    }
    method infer_type {
        Mildew::Type::Unknown->new();
    }
}

class Mildew::TypeInfo::FromAssignment extends Mildew::TypeInfo {
    has orgin=>(is=>'ro',isa=>'Mildew::AST::Base',required=>1);

lib/Mildew/Types.pm  view on Meta::CPAN

            $self->debug("not handling method:",$id);
            Mildew::Type::Unknown->new();
        }
    }
}
class Mildew::Type::Lexical extends Mildew::Type {
    use Term::ANSIColor qw(:constants);
    use Scalar::Util qw(refaddr);
    use Carp qw(cluck);
    has content=>(is=>'rw',isa=>'Mildew::Type',lazy_build=>1);
    has binds=>(is=>'ro',isa=>'ArrayRef[Type]',default=>sub {[]});
    has stores=>(is=>'ro',isa=>'ArrayRef[Type]',default=>sub {[]});
    method _build_content {
        $self->debug("infering content of lexical");
        my $container;
        if (@{$self->binds} == 1) {
            $container = $self->binds->[0];
            $self->debug("1 BIND: ",$self->binds->[0]);
        } else {
            $self->debug("many BINDs");
            $container = Mildew::Type::Scalar->new();
        }

lib/Mildew/Types.pm  view on Meta::CPAN

        }
        $self->debug(RED,"unknow usage of lexical ",$reg->pretty,": ",$usage->pretty,RESET);
    }
    method pretty {
        (ref $self) . " of " . $self->content->pretty;
    }    
}
class Mildew::Type::Scalar extends Mildew::Type {
    use Carp qw(cluck);
    use Scalar::Util qw(refaddr);
    has stores=>(is=>'ro',isa=>'ArrayRef[Type]',default=>sub {[]});
    has content=>(is=>'rw',builder=>'infer_content',lazy=>1,predicate=>'has_content');
    method add_store($content) {
        $self->debug("adding store to ",(refaddr $self));
        push(@{$self->stores},$content);
    }
    method infer_content {
        if (@{$self->stores} == 1) {
            $self->debug("just enough stores");
            $self->stores->[0];
        } else {



( run in 0.480 second using v1.01-cache-2.11-cpan-5f2e87ce722 )