@@ -46,6 +46,7 @@ our $ALL;
46
46
my %*LANG; # (d) braided languages: MAIN, Q, Regex, etc
47
47
48
48
my $*IN_DECL; # (d) a declarator is looking for a name to declare
49
+ my $*HAS_SELF; # (d) in a context where 'self' exists
49
50
my $*SCOPE = ""; # (d) which scope declarator we're under
50
51
my $*MULTINESS; # (d) which multi declarator we're under
51
52
my $*PKGDECL ::= ""; # (d) current package declarator
@@ -1072,6 +1073,7 @@ grammar P6 is STD {
1072
1073
:my % * LANG ;
1073
1074
:my $ * PKGDECL ::= "" ;
1074
1075
:my $ * IN_DECL = '' ;
1076
+ :my $ * HAS_SELF = '' ;
1075
1077
:my $ * DECLARAND ;
1076
1078
:my $ * OFTYPE ;
1077
1079
:my $ * NEWPKG ;
@@ -1383,6 +1385,7 @@ grammar P6 is STD {
1383
1385
1384
1386
token statement_control :import {
1385
1387
:my $ * IN_DECL = 'use' ;
1388
+ :my $ * HAS_SELF = '' ;
1386
1389
:my $ * SCOPE = 'use' ;
1387
1390
<sym > <.ws >
1388
1391
<term >
@@ -1402,6 +1405,7 @@ grammar P6 is STD {
1402
1405
:my $ longname ;
1403
1406
:my $ * IN_DECL = 'use' ;
1404
1407
:my $ * SCOPE = 'use' ;
1408
+ :my $ * HAS_SELF = '' ;
1405
1409
:my % * MYSTERY ;
1406
1410
<sym > <.ws >
1407
1411
[
@@ -1651,6 +1655,7 @@ grammar P6 is STD {
1651
1655
token scope_declarator :augment { <sym > <scoped (' augment' )> }
1652
1656
token scope_declarator :supersede { <sym > <scoped (' supersede' )> }
1653
1657
token scope_declarator :has {
1658
+ :my $ * HAS_SELF = 'partial' ;
1654
1659
<sym > {
1655
1660
given $ * PKGDECL {
1656
1661
when ' class' {} # XXX to be replaced by MOP queries
@@ -1723,6 +1728,7 @@ grammar P6 is STD {
1723
1728
rule package_def {
1724
1729
:my $ longname ;
1725
1730
:my $ * IN_DECL = 'package' ;
1731
+ :my $ * HAS_SELF = '' ;
1726
1732
:my $ * DECLARAND ;
1727
1733
:my $ * NEWPKG ;
1728
1734
:my $ * NEWLEX ;
@@ -1876,6 +1882,7 @@ grammar P6 is STD {
1876
1882
:temp $ * CURLEX ;
1877
1883
:my $ * IN_DECL = $ d ;
1878
1884
:my $ * DECLARAND ;
1885
+ :my $ * HAS_SELF = $ d eq 'submethod' ?? 'partial' !! 'complete' ;
1879
1886
{
1880
1887
given $ * PKGDECL {
1881
1888
when ' class' {} # XXX to be replaced by MOP queries
@@ -1913,6 +1920,7 @@ grammar P6 is STD {
1913
1920
:my $ * IN_DECL = $ d ;
1914
1921
:temp % * RX ;
1915
1922
:my $ * DECLARAND ;
1923
+ :my $ * HAS_SELF = 'complete' ;
1916
1924
{
1917
1925
given $ * PKGDECL {
1918
1926
when ' grammar' {} # XXX to be replaced by MOP queries
@@ -5863,16 +5871,15 @@ method check_variable ($variable) {
5863
5871
}
5864
5872
}
5865
5873
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" );
5870
5876
}
5871
5877
}
5872
5878
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" ); }
5876
5883
}
5877
5884
}
5878
5885
when ' ^' {
0 commit comments