Skip to content

Commit 4d51d3e

Browse files
committed
better emulation of partial/complete object scope
1 parent 3ba3a75 commit 4d51d3e

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

STD.pm6

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ our $ALL;
4646
my %*LANG; # (d) braided languages: MAIN, Q, Regex, etc
4747
4848
my $*IN_DECL; # (d) a declarator is looking for a name to declare
49+
my $*HAS_SELF; # (d) in a context where 'self' exists
4950
my $*SCOPE = ""; # (d) which scope declarator we're under
5051
my $*MULTINESS; # (d) which multi declarator we're under
5152
my $*PKGDECL ::= ""; # (d) current package declarator
@@ -1072,6 +1073,7 @@ grammar P6 is STD {
10721073
:my %*LANG;
10731074
:my $*PKGDECL ::= "";
10741075
:my $*IN_DECL = '';
1076+
:my $*HAS_SELF = '';
10751077
:my $*DECLARAND;
10761078
:my $*OFTYPE;
10771079
:my $*NEWPKG;
@@ -1383,6 +1385,7 @@ grammar P6 is STD {
13831385

13841386
token statement_control:import {
13851387
:my $*IN_DECL = 'use';
1388+
:my $*HAS_SELF = '';
13861389
:my $*SCOPE = 'use';
13871390
<sym> <.ws>
13881391
<term>
@@ -1402,6 +1405,7 @@ grammar P6 is STD {
14021405
:my $longname;
14031406
:my $*IN_DECL = 'use';
14041407
:my $*SCOPE = 'use';
1408+
:my $*HAS_SELF = '';
14051409
:my %*MYSTERY;
14061410
<sym> <.ws>
14071411
[
@@ -1651,6 +1655,7 @@ grammar P6 is STD {
16511655
token scope_declarator:augment { <sym> <scoped('augment')> }
16521656
token scope_declarator:supersede { <sym> <scoped('supersede')> }
16531657
token scope_declarator:has {
1658+
:my $*HAS_SELF = 'partial';
16541659
<sym> {
16551660
given $*PKGDECL {
16561661
when 'class' {} # XXX to be replaced by MOP queries
@@ -1723,6 +1728,7 @@ grammar P6 is STD {
17231728
rule package_def {
17241729
:my $longname;
17251730
:my $*IN_DECL = 'package';
1731+
:my $*HAS_SELF = '';
17261732
:my $*DECLARAND;
17271733
:my $*NEWPKG;
17281734
:my $*NEWLEX;
@@ -1876,6 +1882,7 @@ grammar P6 is STD {
18761882
:temp $*CURLEX;
18771883
:my $*IN_DECL = $d;
18781884
:my $*DECLARAND;
1885+
:my $*HAS_SELF = $d eq 'submethod' ?? 'partial' !! 'complete';
18791886
{
18801887
given $*PKGDECL {
18811888
when 'class' {} # XXX to be replaced by MOP queries
@@ -1913,6 +1920,7 @@ grammar P6 is STD {
19131920
:my $*IN_DECL = $d;
19141921
:temp %*RX;
19151922
:my $*DECLARAND;
1923+
:my $*HAS_SELF = 'complete';
19161924
{
19171925
given $*PKGDECL {
19181926
when 'grammar' {} # XXX to be replaced by MOP queries
@@ -5863,16 +5871,15 @@ method check_variable ($variable) {
58635871
}
58645872
}
58655873
when '!' {
5866-
given $*CURLEX.<!IN_DECL>//'' {
5867-
when 'method' {} # XXX to be replaced by MOP queries
5868-
when 'submethod' {}
5869-
default { $variable.worry("Variable $name used outside of method/submethod declaration"); }
5874+
if not $*HAS_SELF { # XXX to be replaced by MOP queries
5875+
$variable.sorry("Variable $name used where no 'self' is available");
58705876
}
58715877
}
58725878
when '.' {
5873-
given $*CURLEX.<!IN_DECL>//'' {
5874-
when 'method' {} # XXX to be replaced by MOP queries
5875-
default { $variable.worry("Variable $name used outside of method declaration"); }
5879+
given $*HAS_SELF { # XXX to be replaced by MOP queries
5880+
when 'complete' {}
5881+
when 'partial' { $variable.sorry("Virtual call $name may not be used on partially constructed object"); }
5882+
default { $variable.sorry("Variable $name used where no 'self' is available"); }
58765883
}
58775884
}
58785885
when '^' {

0 commit comments

Comments
 (0)