Skip to content

Commit 791b30a

Browse files
committed
move Type to a separate file, re-style it as Perl6::Type
1 parent b81241b commit 791b30a

File tree

2 files changed

+59
-56
lines changed

2 files changed

+59
-56
lines changed

lib/Perl6/Type.pm

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
use v6;
2+
3+
class Perl6::Type {
4+
has Str $.name handles <Str>;
5+
has @.super;
6+
has @.roles;
7+
has $.packagetype is rw = 'class';
8+
9+
has @.mro;
10+
method mro(Perl6::Type:D:) {
11+
return @!mro if @!mro;
12+
if @.super == 1 {
13+
@!mro = @.super[0].mro;
14+
} elsif @.super > 1 {
15+
my @merge_list = @.super.map: *.mro.item;
16+
@!mro = self.c3_merge(@merge_list);
17+
}
18+
@!mro.unshift: self;
19+
}
20+
21+
method c3_merge(@merge_list) {
22+
my @result;
23+
my $accepted;
24+
my $something_accepted = 0;
25+
my $cand_count = 0;
26+
for @merge_list -> @cand_list {
27+
next unless @cand_list;
28+
my $rejected = 0;
29+
my $cand_class = @cand_list[0];
30+
$cand_count++;
31+
for @merge_list {
32+
next if $_ === @cand_list;
33+
for 1..+$_ -> $cur_pos {
34+
if $_[$cur_pos] === $cand_class {
35+
$rejected = 1;
36+
last;
37+
}
38+
}
39+
}
40+
unless $rejected {
41+
$accepted = $cand_class;
42+
$something_accepted = 1;
43+
last;
44+
}
45+
}
46+
return () unless $cand_count;
47+
unless $something_accepted {
48+
die("Could not build C3 linearization for {self}: ambiguous hierarchy");
49+
}
50+
for @merge_list.keys -> $i {
51+
@merge_list[$i] = [@merge_list[$i].grep: { $_ ne $accepted }] ;
52+
}
53+
@result = self.c3_merge(@merge_list);
54+
@result.unshift: $accepted;
55+
@result;
56+
}
57+
}

lib/Perl6/TypeGraph.pm

Lines changed: 2 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,6 @@
1+
use Perl6::Type;
12
class Perl6::TypeGraph {
23
has %.types;
3-
class Type {
4-
has Str $.name handles <Str>;
5-
has @.super;
6-
has @.roles;
7-
has $.packagetype is rw = 'class';
8-
9-
has @.mro;
10-
method mro(Type:D:) {
11-
return @!mro if @!mro;
12-
if @.super == 1 {
13-
@!mro = @.super[0].mro;
14-
} elsif @.super > 1 {
15-
my @merge_list = @.super.map: *.mro.item;
16-
@!mro = self.c3_merge(@merge_list);
17-
}
18-
@!mro.unshift: self;
19-
}
20-
21-
method c3_merge(@merge_list) {
22-
my @result;
23-
my $accepted;
24-
my $something_accepted = 0;
25-
my $cand_count = 0;
26-
for @merge_list -> @cand_list {
27-
next unless @cand_list;
28-
my $rejected = 0;
29-
my $cand_class = @cand_list[0];
30-
$cand_count++;
31-
for @merge_list {
32-
next if $_ === @cand_list;
33-
for 1..+$_ -> $cur_pos {
34-
if $_[$cur_pos] === $cand_class {
35-
$rejected = 1;
36-
last;
37-
}
38-
}
39-
}
40-
unless $rejected {
41-
$accepted = $cand_class;
42-
$something_accepted = 1;
43-
last;
44-
}
45-
}
46-
return () unless $cand_count;
47-
unless $something_accepted {
48-
die("Could not build C3 linearization for {self}: ambiguous hierarchy");
49-
}
50-
for @merge_list.keys -> $i {
51-
@merge_list[$i] = [@merge_list[$i].grep: { $_ ne $accepted }] ;
52-
}
53-
@result = self.c3_merge(@merge_list);
54-
@result.unshift: $accepted;
55-
@result;
56-
}
57-
}
584
my grammar Decl {
595
token ident { <.alpha> \w* }
606
token apostrophe { <[ ' \- ]> }
@@ -87,7 +33,7 @@ class Perl6::TypeGraph {
8733
method parse-from-file($fn) {
8834
my $f = open $fn;
8935
my $get-type = -> Str $name {
90-
%.types{$name} //= Type.new(:$name);
36+
%.types{$name} //= Perl6::Type.new(:$name);
9137
};
9238
my class Actions {
9339
method longname($/) {

0 commit comments

Comments
 (0)