mirror of
https://github.com/jashkenas/coffeescript.git
synced 2022-11-09 12:23:24 -05:00
33 lines
No EOL
817 B
Ruby
33 lines
No EOL
817 B
Ruby
# A class to handle lookups for lexically scoped variables.
|
|
class Scope
|
|
|
|
attr_reader :parent, :temp_variable
|
|
|
|
def initialize(parent=nil)
|
|
@parent = parent
|
|
@variables = {}
|
|
@temp_variable = @parent ? @parent.temp_variable : 'a'
|
|
end
|
|
|
|
# Look up a variable in lexical scope, or declare it if not found.
|
|
def find(name, remote=false)
|
|
found = check(name, remote)
|
|
return found if found || remote
|
|
@variables[name] = true
|
|
found
|
|
end
|
|
|
|
# Just check for the pre-definition of a variable.
|
|
def check(name, remote=false)
|
|
return true if @variables[name]
|
|
@parent && @parent.find(name, true)
|
|
end
|
|
|
|
# Find an available, short variable name.
|
|
def free_variable
|
|
@temp_variable.succ! while check(@temp_variable)
|
|
@variables[@temp_variable] = true
|
|
@temp_variable.dup
|
|
end
|
|
|
|
end |