File: static_environment.rb

package info (click to toggle)
ruby-whitequark-parser 3.3.4.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,828 kB
  • sloc: yacc: 40,699; ruby: 20,395; makefile: 12; sh: 8
file content (134 lines) | stat: -rw-r--r-- 3,214 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# frozen_string_literal: true

module Parser

  class StaticEnvironment
    FORWARD_ARGS = :FORWARD_ARGS

    ANONYMOUS_RESTARG_IN_CURRENT_SCOPE = :ANONYMOUS_RESTARG_IN_CURRENT_SCOPE
    ANONYMOUS_RESTARG_INHERITED = :ANONYMOUS_RESTARG_INHERITED

    ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE = :ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE
    ANONYMOUS_KWRESTARG_INHERITED = :ANONYMOUS_KWRESTARG_INHERITED

    ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE = :ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE
    ANONYMOUS_BLOCKARG_INHERITED = :ANONYMOUS_BLOCKARG_INHERITED

    def initialize
      reset
    end

    def reset
      @variables = Set[]
      @stack     = []
    end

    def extend_static
      @stack.push(@variables)
      @variables = Set[]

      self
    end

    def extend_dynamic
      @stack.push(@variables)
      @variables = @variables.dup
      if @variables.delete(ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE)
        @variables.add(ANONYMOUS_BLOCKARG_INHERITED)
      end
      if @variables.delete(ANONYMOUS_RESTARG_IN_CURRENT_SCOPE)
        @variables.add(ANONYMOUS_RESTARG_INHERITED)
      end
      if @variables.delete(ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE)
        @variables.add(ANONYMOUS_KWRESTARG_INHERITED)
      end

      self
    end

    def unextend
      @variables = @stack.pop

      self
    end

    def declare(name)
      @variables.add(name.to_sym)

      self
    end

    def declared?(name)
      @variables.include?(name.to_sym)
    end

    # Forward args

    def declare_forward_args
      declare(FORWARD_ARGS)
    end

    def declared_forward_args?
      declared?(FORWARD_ARGS)
    end

    # Anonymous blockarg

    def declare_anonymous_blockarg
      declare(ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE)
    end

    def declared_anonymous_blockarg?
      declared?(ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE) || declared?(ANONYMOUS_BLOCKARG_INHERITED)
    end

    def declared_anonymous_blockarg_in_current_scpe?
      declared?(ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE)
    end

    def parent_has_anonymous_blockarg?
      @stack.any? { |variables| variables.include?(ANONYMOUS_BLOCKARG_IN_CURRENT_SCOPE) }
    end

    # Anonymous restarg

    def declare_anonymous_restarg
      declare(ANONYMOUS_RESTARG_IN_CURRENT_SCOPE)
    end

    def declared_anonymous_restarg?
      declared?(ANONYMOUS_RESTARG_IN_CURRENT_SCOPE) || declared?(ANONYMOUS_RESTARG_INHERITED)
    end

    def declared_anonymous_restarg_in_current_scope?
      declared?(ANONYMOUS_RESTARG_IN_CURRENT_SCOPE)
    end

    def parent_has_anonymous_restarg?
      @stack.any? { |variables| variables.include?(ANONYMOUS_RESTARG_IN_CURRENT_SCOPE) }
    end

    # Anonymous kwresarg

    def declare_anonymous_kwrestarg
      declare(ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE)
    end

    def declared_anonymous_kwrestarg?
      declared?(ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE) || declared?(ANONYMOUS_KWRESTARG_INHERITED)
    end

    def declared_anonymous_kwrestarg_in_current_scope?
      declared?(ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE)
    end

    def parent_has_anonymous_kwrestarg?
      @stack.any? { |variables| variables.include?(ANONYMOUS_KWRESTARG_IN_CURRENT_SCOPE) }
    end

    def empty?
      @stack.empty?
    end
  end

end