switch scope to using lex_map to lookup locals
[scpubgit/DX.git] / lib / DX / Scope.pm
index 76bda01..214eb4f 100644 (file)
@@ -9,6 +9,8 @@ has globals => (is => 'ro', isa => DictValue, required => 1);
 
 has locals => (is => 'ro', isa => ArrayRef[DictValue], required => 1);
 
+has lex_map => (is => 'ro', isa => HashRef, required => 1);
+
 #has known_facts => (is => 'ro', required => 1);
 
 sub lookup_predicate {
@@ -17,10 +19,16 @@ sub lookup_predicate {
 }
 
 sub lookup {
-  my ($self, $name) = @_;
-  my $lookup_in = ($name =~ /^[_A-Z]/ ? $self->locals->[-1] : $self->globals);
-  return $lookup_in->get_member_at($name)
-   or die "No such name in scope: $name";
+  my ($self, $symbol) = @_;
+  if ($symbol =~ /^[_A-Z]/) {
+    my @mapped = @{$self->lex_map->{$symbol}||[]}
+      or die "No such name in scope: $symbol";
+    my $targ = $self;
+    $targ = $targ->get_member_at($_) for @mapped;
+    return $targ;
+  }
+  return $self->globals->get_member_at($symbol)
+   or die "No such name in scope: $symbol";
 }
 
 sub depth { $#{$_[0]->locals} }