[フレーム]

Class: Opal::Nodes::TopNode

Inherits:
ScopeNode show all
Defined in:
opal/lib/opal/nodes/top.rb

Overview

Generates code for an entire file, i.e. the base sexp

Instance Attribute Summary

Attributes inherited from ScopeNode

#await_encountered , #block_name , #catch_return , #defs , #gvars , #has_break , #has_retry , #identity , #ivars , #locals , #methods , #mid , #name , #parent , #rescue_else_sexp , #scope_name

Attributes inherited from Base

#compiler , #sexp , #type

Attributes included from Closure::NodeSupport

#closure

Instance Method Summary collapse

Methods inherited from ScopeNode

#accepts_using? , #add_arg , #add_proto_ivar , #add_scope_gvar , #add_scope_ivar , #add_scope_local , #add_scope_temp , #class? , #class_scope? , #collect_refinements_temps , #current_rescue , #def? , #def_in_class? , #defines_lambda , #find_parent_def , #gen_retry_id , #has_local? , #has_rescue_else? , #has_temp? , #identify! , #in_ensure , #in_ensure? , #in_resbody , #in_resbody? , #in_rescue , #in_scope , #in_while? , #initialize , #is_lambda! , #iter? , #lambda? , #lambda_definition? , #module? , #nesting , #new_refinements_temp , #new_temp , #next_temp , #pop_while , #prepare_block , #prepend_scope_temp , #push_while , #queue_temp , #refinements_temp , #relative_access , #sclass? , #scope_locals , #self , #super_chain , #to_vars , #top? , #uses_block! , #uses_block?

Methods inherited from Base

#add_gvar , #add_ivar , #add_local , #add_temp , #children , children , #class_variable_owner , #class_variable_owner_nesting_level , #comments , #compile_to_fragments , #error , #expr , #expr? , #expr_or_empty , #expr_or_nil , #fragment , handle , handlers , #has_rescue_else? , #helper , #in_ensure , #in_ensure? , #in_resbody , #in_resbody? , #in_rescue , #in_while? , #initialize , #process , #push , #recv , #recv? , #s , #scope , #source_location , #stmt , #stmt? , #top_scope , truthy_optimize? , #unshift , #while_loop , #with_temp , #wrap

Methods included from Closure::NodeSupport

#closure_is? , #compile_catcher , #generate_thrower , #generate_thrower_without_catcher , #in_closure , #pop_closure , #push_closure , #select_closure , #thrower

Methods included from Helpers

#current_indent , #empty_line , #indent , #js_truthy , #js_truthy_optimize , #line , #mid_to_jsid , #property , #valid_name?

Constructor Details

This class inherits a constructor from Opal::Nodes::ScopeNode

Instance Method Details

#absolute_constObject

Returns '$$$', but also ensures that the '$$$' variable is set

117
118
119
120
# File 'opal/lib/opal/nodes/top.rb', line 117
def absolute_const
 @define_absolute_const = true
 '$$$'
end

#add_file_source_embedObject

152
153
154
155
156
# File 'opal/lib/opal/nodes/top.rb', line 152
def add_file_source_embed
 filename = compiler.file
 source = compiler.source
 unshift "Opal.file_sources[#{filename.to_json}] = #{source.to_json};\n"
end

#add_used_helpersObject

128
129
130
# File 'opal/lib/opal/nodes/top.rb', line 128
def add_used_helpers
 compiler.helpers.to_a.reverse_each { |h| prepend_scope_temp "$#{h} = Opal.#{h}" }
end

#closingObject

94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'opal/lib/opal/nodes/top.rb', line 94
def closing
 if compiler.requirable?
 line "};\n"
 if compiler.load?
 # Opal.load normalizes the path, so that we can't
 # require absolute paths from CLI. For other cases
 # we can expect the module names to be normalized
 # already.
 line "Opal.load_normalized(#{module_name});"
 end
 elsif compiler.eval?
 line "})(Opal, self);"
 else
 line "});\n"
 end
end

#compileObject

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
# File 'opal/lib/opal/nodes/top.rb', line 16
def compile
 compiler.top_scope = self
 compiler.dynamic_cache_result = true if sexp.meta[:dynamic_cache_result]
 push version_comment
 helper :return_val if compiler.eof_content
 if body == s(:nil)
 # A shortpath for empty (stub?) modules.
 if compiler.requirable? || compiler.esm? || compiler.eval?
 unshift 'Opal.return_val(Opal.nil); '
 definition
 else
 unshift 'Opal.nil; '
 end
 else
 in_scope do
 line '"use strict";' if compiler.use_strict?
 body_code = in_closure(Closure ::JS_FUNCTION | Closure ::TOP) do
 stmt(stmts)
 end
 body_code = [body_code] unless body_code.is_a?(Array)
 if compiler.eval?
 add_temp '$nesting = self.$$is_a_module ? [self] : [self.$$class]' if @define_nesting
 else
 add_temp 'self = Opal.top' if @define_self
 add_temp '$nesting = []' if @define_nesting
 end
 add_temp '$$ = Opal.$r($nesting)' if @define_relative_access
 add_temp 'nil = Opal.nil'
 add_temp '$$$ = Opal.$$$' if @define_absolute_const
 add_used_helpers
 line scope.to_vars
 compile_method_stubs
 compile_irb_vars
 compile_end_construct
 line body_code
 end
 opening
 definition
 closing
 end
 add_file_source_embed if compiler.enable_file_source_embed?
end

#compile_end_constructObject

Any special END content in code

141
142
143
144
145
146
# File 'opal/lib/opal/nodes/top.rb', line 141
def compile_end_construct
 if content = compiler.eof_content
 line 'var $__END__ = Opal.Object.$new();'
 line "$__END__.$read = $return_val(#{content.inspect});"
 end
end

#compile_irb_varsObject

122
123
124
125
126
# File 'opal/lib/opal/nodes/top.rb', line 122
def compile_irb_vars
 if compiler.irb?
 line 'if (!Opal.irb_vars) { Opal.irb_vars = {}; }'
 end
end

#compile_method_stubsObject

132
133
134
135
136
137
138
# File 'opal/lib/opal/nodes/top.rb', line 132
def compile_method_stubs
 if compiler.method_missing?
 calls = compiler.method_calls
 stubs = calls.to_a.map(&:to_s).join(',')
 line "Opal.add_stubs('#{stubs}');" unless stubs.empty?
 end
end

#definitionObject

74
75
76
77
78
79
80
# File 'opal/lib/opal/nodes/top.rb', line 74
def definition
 if compiler.requirable?
 unshift "Opal.modules[#{module_name}] = "
 elsif compiler.esm? && !compiler.no_export?
 unshift 'export default '
 end
end

#module_nameObject

70
71
72
# File 'opal/lib/opal/nodes/top.rb', line 70
def module_name
 Opal ::Compiler .module_name (compiler.file).inspect
end

#openingObject

82
83
84
85
86
87
88
89
90
91
92
# File 'opal/lib/opal/nodes/top.rb', line 82
def opening
 async_prefix = "async " if await_encountered
 if compiler.requirable?
 unshift "#{async_prefix}function(Opal) {"
 elsif compiler.eval?
 unshift "(#{async_prefix}function(Opal, self) {"
 else
 unshift "Opal.queue(#{async_prefix}function(Opal) {"
 end
end

#stmtsObject

112
113
114
# File 'opal/lib/opal/nodes/top.rb', line 112
def stmts
 compiler.returns(body)
end

#version_commentObject

148
149
150
# File 'opal/lib/opal/nodes/top.rb', line 148
def version_comment
 "/* Generated by Opal #{Opal ::VERSION } */"
end

AltStyle によって変換されたページ (->オリジナル) /