mirah 0.0.4-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. data/History.txt +15 -0
  2. data/README.txt +51 -0
  3. data/Rakefile +86 -0
  4. data/bin/duby +10 -0
  5. data/bin/dubyc +10 -0
  6. data/bin/dubyp +10 -0
  7. data/bin/jrubyp +36 -0
  8. data/bin/mirah +9 -0
  9. data/bin/mirah.cmd +1 -0
  10. data/bin/mirahc +9 -0
  11. data/bin/mirahc.cmd +1 -0
  12. data/bin/mirahp +9 -0
  13. data/bin/mirahp.cmd +1 -0
  14. data/examples/ant/example-build.xml +7 -0
  15. data/examples/appengine/Rakefile +19 -0
  16. data/examples/appengine/Readme +29 -0
  17. data/examples/appengine/src/org/mirah/MirahApp.mirah +57 -0
  18. data/examples/appengine/src/org/mirah/list.dhtml +15 -0
  19. data/examples/appengine/war/WEB-INF/lib/dubydatastore.jar +0 -0
  20. data/examples/bintrees.mirah +66 -0
  21. data/examples/construction.mirah +8 -0
  22. data/examples/dynamic.mirah +17 -0
  23. data/examples/edb.mirah +3 -0
  24. data/examples/fib.mirah +16 -0
  25. data/examples/fields.mirah +22 -0
  26. data/examples/fractal.mirah +55 -0
  27. data/examples/java_thing.mirah +13 -0
  28. data/examples/plugins/appengine/Rakefile +55 -0
  29. data/examples/plugins/appengine/lib/com/google/appengine/ext/duby/db/datastore.rb +375 -0
  30. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +336 -0
  31. data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +113 -0
  32. data/examples/simple_class.mirah +12 -0
  33. data/examples/sort_closure.mirah +7 -0
  34. data/examples/swing.mirah +20 -0
  35. data/examples/tak.mirah +15 -0
  36. data/examples/test.edb +9 -0
  37. data/examples/wiki/Rakefile +18 -0
  38. data/examples/wiki/src/org/mirah/wiki/MirahWiki.duby +324 -0
  39. data/examples/wiki/src/org/mirah/wiki/edit.eduby.html +42 -0
  40. data/examples/wiki/src/org/mirah/wiki/error.eduby.html +2 -0
  41. data/examples/wiki/src/org/mirah/wiki/layout.eduby.html +69 -0
  42. data/examples/wiki/src/org/mirah/wiki/parser.eduby.html +7 -0
  43. data/examples/wiki/src/org/mirah/wiki/view.eduby.html +15 -0
  44. data/examples/wiki/war/WEB-INF/classes/test/HeredocContext.class +0 -0
  45. data/examples/wiki/war/WEB-INF/classes/test/MirahParser.class +0 -0
  46. data/examples/wiki/war/WEB-INF/lib/appengine-api.jar +0 -0
  47. data/examples/wiki/war/WEB-INF/lib/dubydatastore.jar +0 -0
  48. data/examples/wiki/war/WEB-INF/lib/jmeta-runtime.jar +0 -0
  49. data/examples/wiki/war/WEB-INF/lib/pegdown-stubs.jar +0 -0
  50. data/examples/wiki/war/WEB-INF/pegdown.jar +0 -0
  51. data/examples/wiki/war/app.yaml +21 -0
  52. data/examples/wiki/war/public/favicon.ico +0 -0
  53. data/examples/wiki/war/public/images/appengine_duby.png +0 -0
  54. data/examples/wiki/war/public/images/back.gif +0 -0
  55. data/examples/wiki/war/public/images/dir.gif +0 -0
  56. data/examples/wiki/war/public/images/file.gif +0 -0
  57. data/examples/wiki/war/public/javascripts/prettify.js +61 -0
  58. data/examples/wiki/war/public/robots.txt +0 -0
  59. data/examples/wiki/war/public/stylesheets/main.css +156 -0
  60. data/examples/wiki/war/public/stylesheets/prettify.css +1 -0
  61. data/examples/wiki/war/public/stylesheets/sh_style.css +66 -0
  62. data/examples/wiki/war/public/stylesheets/source.css +21 -0
  63. data/examples/wiki/war/public/wmd/images/bg-fill.png +0 -0
  64. data/examples/wiki/war/public/wmd/images/bg.png +0 -0
  65. data/examples/wiki/war/public/wmd/images/blockquote.png +0 -0
  66. data/examples/wiki/war/public/wmd/images/bold.png +0 -0
  67. data/examples/wiki/war/public/wmd/images/code.png +0 -0
  68. data/examples/wiki/war/public/wmd/images/h1.png +0 -0
  69. data/examples/wiki/war/public/wmd/images/hr.png +0 -0
  70. data/examples/wiki/war/public/wmd/images/img.png +0 -0
  71. data/examples/wiki/war/public/wmd/images/italic.png +0 -0
  72. data/examples/wiki/war/public/wmd/images/link.png +0 -0
  73. data/examples/wiki/war/public/wmd/images/ol.png +0 -0
  74. data/examples/wiki/war/public/wmd/images/redo.png +0 -0
  75. data/examples/wiki/war/public/wmd/images/separator.png +0 -0
  76. data/examples/wiki/war/public/wmd/images/ul.png +0 -0
  77. data/examples/wiki/war/public/wmd/images/undo.png +0 -0
  78. data/examples/wiki/war/public/wmd/images/wmd-on.png +0 -0
  79. data/examples/wiki/war/public/wmd/images/wmd.png +0 -0
  80. data/examples/wiki/war/public/wmd/showdown.js +421 -0
  81. data/examples/wiki/war/public/wmd/wmd-base.js +1799 -0
  82. data/examples/wiki/war/public/wmd/wmd-plus.js +311 -0
  83. data/examples/wiki/war/public/wmd/wmd.js +73 -0
  84. data/javalib/JRubyParser.jar +0 -0
  85. data/javalib/dynalang-invoke-0.1.jar +0 -0
  86. data/javalib/mirah-bootstrap.jar +0 -0
  87. data/javalib/mirah-parser.jar +0 -0
  88. data/lib/duby.rb +2 -0
  89. data/lib/mirah.rb +338 -0
  90. data/lib/mirah/appengine_tasks.rb +146 -0
  91. data/lib/mirah/ast.rb +615 -0
  92. data/lib/mirah/ast/call.rb +307 -0
  93. data/lib/mirah/ast/class.rb +311 -0
  94. data/lib/mirah/ast/flow.rb +364 -0
  95. data/lib/mirah/ast/intrinsics.rb +470 -0
  96. data/lib/mirah/ast/literal.rb +154 -0
  97. data/lib/mirah/ast/local.rb +89 -0
  98. data/lib/mirah/ast/method.rb +360 -0
  99. data/lib/mirah/ast/scope.rb +208 -0
  100. data/lib/mirah/ast/structure.rb +226 -0
  101. data/lib/mirah/ast/type.rb +130 -0
  102. data/lib/mirah/compiler.rb +341 -0
  103. data/lib/mirah/env.rb +33 -0
  104. data/lib/mirah/jvm/base.rb +258 -0
  105. data/lib/mirah/jvm/compiler.rb +885 -0
  106. data/lib/mirah/jvm/method_lookup.rb +203 -0
  107. data/lib/mirah/jvm/source_compiler.rb +737 -0
  108. data/lib/mirah/jvm/source_generator/builder.rb +444 -0
  109. data/lib/mirah/jvm/source_generator/loops.rb +110 -0
  110. data/lib/mirah/jvm/source_generator/precompile.rb +188 -0
  111. data/lib/mirah/jvm/source_generator/typer.rb +11 -0
  112. data/lib/mirah/jvm/typer.rb +151 -0
  113. data/lib/mirah/jvm/types.rb +416 -0
  114. data/lib/mirah/jvm/types/basic_types.rb +33 -0
  115. data/lib/mirah/jvm/types/boolean.rb +17 -0
  116. data/lib/mirah/jvm/types/enumerable.rb +65 -0
  117. data/lib/mirah/jvm/types/extensions.rb +86 -0
  118. data/lib/mirah/jvm/types/factory.rb +186 -0
  119. data/lib/mirah/jvm/types/floats.rb +86 -0
  120. data/lib/mirah/jvm/types/integers.rb +171 -0
  121. data/lib/mirah/jvm/types/intrinsics.rb +376 -0
  122. data/lib/mirah/jvm/types/literals.rb +74 -0
  123. data/lib/mirah/jvm/types/methods.rb +614 -0
  124. data/lib/mirah/jvm/types/number.rb +143 -0
  125. data/lib/mirah/nbcompiler.rb +29 -0
  126. data/lib/mirah/plugin/edb.rb +29 -0
  127. data/lib/mirah/plugin/gwt.rb +173 -0
  128. data/lib/mirah/plugin/java.rb +55 -0
  129. data/lib/mirah/transform.rb +266 -0
  130. data/lib/mirah/transform2.rb +728 -0
  131. data/lib/mirah/typer.rb +407 -0
  132. data/lib/mirah_task.rb +107 -0
  133. data/test/test_ast.rb +359 -0
  134. data/test/test_compilation.rb +112 -0
  135. data/test/test_env.rb +42 -0
  136. data/test/test_gwt.rb +58 -0
  137. data/test/test_java_typer.rb +183 -0
  138. data/test/test_javac_compiler.rb +63 -0
  139. data/test/test_jvm_compiler.rb +2607 -0
  140. data/test/test_typer.rb +221 -0
  141. metadata +235 -0
@@ -0,0 +1,307 @@
1
+ require 'delegate'
2
+
3
+ module Duby::AST
4
+ class NodeProxy < DelegateClass(Node)
5
+ include Java::DubyLangCompiler::Node
6
+ def __inline__(node)
7
+ node.parent = parent
8
+ __setobj__(node)
9
+ end
10
+
11
+ def dup
12
+ value = __getobj__.dup
13
+ if value.respond_to?(:proxy=)
14
+ new = super
15
+ new.__setobj__(value)
16
+ new.proxy = new
17
+ new
18
+ else
19
+ value
20
+ end
21
+ end
22
+
23
+ def _dump(depth)
24
+ Marshal.dump(__getobj__)
25
+ end
26
+
27
+ def self._load(str)
28
+ value = Marshal.load(str)
29
+ if value.respond_to?(:proxy=)
30
+ proxy = NodeProxy.new(value)
31
+ proxy.proxy = proxy
32
+ else
33
+ value
34
+ end
35
+ end
36
+ end
37
+
38
+ class FunctionalCall < Node
39
+ include Java::DubyLangCompiler.Call
40
+ include Named
41
+ include Scoped
42
+ attr_accessor :cast, :inlined, :proxy
43
+ alias cast? cast
44
+
45
+ child :parameters
46
+ child :block
47
+
48
+ def self.new(*args, &block)
49
+ real_node = super
50
+ real_node.proxy = NodeProxy.new(real_node)
51
+ end
52
+
53
+ def initialize(parent, line_number, name, &kids)
54
+ super(parent, line_number, &kids)
55
+ @name = name
56
+ @cast = false
57
+ end
58
+
59
+ def arguments
60
+ @arguments ||= begin
61
+ args = java.util.ArrayList.new(parameters.size)
62
+ parameters.each do |param|
63
+ args.add(param)
64
+ end
65
+ args
66
+ end
67
+ end
68
+
69
+ def target
70
+ nil
71
+ end
72
+
73
+ def validate_parameters
74
+ parameters.each_with_index do |child, i|
75
+ if UnquotedValue === child
76
+ child.parent = self
77
+ parameters[i] = child.node
78
+ end
79
+ end
80
+ end
81
+
82
+ def infer(typer)
83
+ unless @inferred_type
84
+ @self_type ||= scope.static_scope.self_type
85
+ receiver_type = @self_type
86
+ should_defer = false
87
+
88
+ parameter_types = parameters.map do |param|
89
+ typer.infer(param) || should_defer = true
90
+ end
91
+
92
+ parameter_types << Duby::AST.block_type if block
93
+
94
+ unless should_defer
95
+ if parameters.size == 1 && typer.known_type(scope, name)
96
+ # cast operation
97
+ resolved!
98
+ self.cast = true
99
+ @inferred_type = typer.known_type(scope, name)
100
+ elsif parameters.size == 0 && scope.static_scope.include?(name)
101
+ @inlined = Local.new(parent, position, name)
102
+ proxy.__inline__(@inlined)
103
+ return proxy.infer(typer)
104
+ else
105
+ @inferred_type = typer.method_type(receiver_type, name,
106
+ parameter_types)
107
+ if @inferred_type.kind_of? InlineCode
108
+ @inlined = @inferred_type.inline(typer.transformer, self)
109
+ proxy.__inline__(@inlined)
110
+ return proxy.infer(typer)
111
+ end
112
+ end
113
+ end
114
+
115
+ if @inferred_type
116
+ if block
117
+ method = receiver_type.get_method(name, parameter_types)
118
+ block.prepare(typer, method)
119
+ end
120
+ @inferred_type = receiver_type if @inferred_type.void?
121
+ resolved!
122
+ else
123
+ if should_defer || receiver_type.nil?
124
+ message = nil
125
+ else
126
+ parameter_names = parameter_types.map {|t| t.full_name}.join(', ')
127
+ receiver = receiver_type.full_name
128
+ desc = "#{name}(#{parameter_names})"
129
+ kind = receiver_type.meta? ? "static" : "instance"
130
+ message = "Cannot find #{kind} method #{desc} on #{receiver}"
131
+ end
132
+ typer.defer(proxy, message)
133
+ end
134
+ end
135
+
136
+ @inferred_type
137
+ end
138
+
139
+ def type_reference(typer)
140
+ typer.type_reference(scope, name)
141
+ end
142
+ end
143
+
144
+ class Call < Node
145
+ include Java::DubyLangCompiler.Call
146
+ include Named
147
+ include Scoped
148
+ attr_accessor :cast, :inlined, :proxy
149
+ alias cast? cast
150
+
151
+ child :target
152
+ child :parameters
153
+ child :block
154
+
155
+ def self.new(*args, &block)
156
+ real_node = super
157
+ real_node.proxy = NodeProxy.new(real_node)
158
+ end
159
+
160
+ def initialize(parent, line_number, name, &kids)
161
+ super(parent, line_number, &kids)
162
+ @name = name
163
+ end
164
+
165
+ def validate_parameters
166
+ parameters.each_with_index do |child, i|
167
+ if UnquotedValue === child
168
+ child.parent = self
169
+ parameters[i] = child.node
170
+ end
171
+ end
172
+ end
173
+
174
+ def arguments
175
+ @arguments ||= begin
176
+ args = java.util.ArrayList.new(parameters.size)
177
+ parameters.each do |param|
178
+ args.add(param)
179
+ end
180
+ args
181
+ end
182
+ end
183
+
184
+ def infer(typer)
185
+ unless @inferred_type
186
+ receiver_type = typer.infer(target)
187
+ should_defer = receiver_type.nil?
188
+ parameter_types = parameters.map do |param|
189
+ typer.infer(param) || should_defer = true
190
+ end
191
+
192
+ parameter_types << Duby::AST.block_type if block
193
+
194
+ unless should_defer
195
+ @inferred_type = typer.method_type(receiver_type, name,
196
+ parameter_types)
197
+ if @inferred_type.kind_of? InlineCode
198
+ @inlined = @inferred_type.inline(typer.transformer, self)
199
+ proxy.__inline__(@inlined)
200
+ return proxy.infer(typer)
201
+ end
202
+ end
203
+
204
+ if @inferred_type
205
+ if block && !receiver_type.error?
206
+ method = receiver_type.get_method(name, parameter_types)
207
+ block.prepare(typer, method)
208
+ end
209
+ @inferred_type = receiver_type if @inferred_type.void?
210
+ resolved!
211
+ else
212
+ if should_defer
213
+ message = nil
214
+ else
215
+ parameter_names = parameter_types.map {|t| t.full_name}.join(', ')
216
+ receiver = receiver_type.full_name
217
+ desc = "#{name}(#{parameter_names})"
218
+ kind = receiver_type.meta? ? "static" : "instance"
219
+ message = "Cannot find #{kind} method #{desc} on #{receiver}"
220
+ end
221
+ typer.defer(proxy, message)
222
+ end
223
+ end
224
+
225
+ @inferred_type
226
+ end
227
+
228
+ def type_reference(typer)
229
+ if name == "[]"
230
+ # array type, top should be a constant; find the rest
231
+ array = true
232
+ elements = []
233
+ else
234
+ array = false
235
+ elements = [name]
236
+ end
237
+ old_receiver = nil
238
+ receiver = self.target
239
+ while !receiver.eql?(old_receiver)
240
+ old_receiver = receiver
241
+ case receiver
242
+ when Constant, FunctionalCall, Local, Annotation
243
+ elements.unshift(receiver.name)
244
+ when Call
245
+ elements.unshift(receiver.name)
246
+ receiver = receiver.target
247
+ when String
248
+ elements.unshift(receiver.literal)
249
+ end
250
+ end
251
+
252
+ # join and load
253
+ class_name = elements.join(".")
254
+ begin
255
+ typer.type_reference(scope, class_name, array)
256
+ rescue NameError => ex
257
+ typer.known_types[class_name] = Duby::AST.error_type
258
+ raise ex
259
+ end
260
+ end
261
+ end
262
+
263
+ class Super < Node
264
+ include Named
265
+ include Scoped
266
+ attr_accessor :method, :cast
267
+ alias :cast? :cast
268
+
269
+ child :parameters
270
+
271
+ def initialize(parent, line_number)
272
+ super(parent, line_number)
273
+ @call_parent = parent
274
+ @call_parent = (@call_parent = @call_parent.parent) until MethodDefinition === @call_parent
275
+ @cast = false
276
+ end
277
+
278
+ def name
279
+ @call_parent.name
280
+ end
281
+
282
+ def infer(typer)
283
+ @self_type ||= scope.static_scope.self_type.superclass
284
+
285
+ unless @inferred_type
286
+ receiver_type = @call_parent.defining_class.superclass
287
+ should_defer = receiver_type.nil?
288
+ parameter_types = parameters.map do |param|
289
+ typer.infer(param) || should_defer = true
290
+ end
291
+
292
+ unless should_defer
293
+ @inferred_type = typer.method_type(receiver_type, name,
294
+ parameter_types)
295
+ end
296
+
297
+ @inferred_type ? resolved! : typer.defer(self)
298
+ end
299
+
300
+ @inferred_type
301
+ end
302
+ end
303
+
304
+ class BlockPass < Node
305
+ child :value
306
+ end
307
+ end
@@ -0,0 +1,311 @@
1
+ module Duby::AST
2
+ class ClassDefinition < Node
3
+ include Annotated
4
+ include Named
5
+ include Scope
6
+ attr_accessor :interfaces
7
+ attr_accessor :current_access_level
8
+ attr_accessor :abstract
9
+
10
+ child :superclass_node
11
+ child :body
12
+
13
+ attr_accessor :superclass
14
+
15
+ def initialize(parent, position, name, annotations=[], &block)
16
+ @abstract = false
17
+ @annotations = annotations
18
+ @interfaces = []
19
+ @interface_nodes = []
20
+ @name = name
21
+ self.parent = parent
22
+ if Duby::AST.type_factory.respond_to? :define_type
23
+ Duby::AST.type_factory.define_type(self)
24
+ end
25
+ # We need somewhere to collect nodes that get appended during
26
+ # the transform phase.
27
+ @extra_body = Body.new(self, position)
28
+ super(parent, position, &block)
29
+ if body
30
+ @extra_body.insert(0, body)
31
+ end
32
+ self.body = @extra_body
33
+ end
34
+
35
+ def append_node(node)
36
+ @extra_body << node
37
+ node
38
+ end
39
+
40
+ def define_inner_class(position, name, &block)
41
+ name = "#{self.name}$#{name}"
42
+ append_node ClassDefinition.new(nil, position, name, &block)
43
+ end
44
+
45
+ def define_method(position, name, type, *args)
46
+ append_node(_define_method(MethodDefinition, position, name, type, args))
47
+ end
48
+
49
+ def define_static_method(position, name, type, *args)
50
+ append_node(
51
+ _define_method(StaticMethodDefinition, position, name, type, args))
52
+ end
53
+
54
+ def define_constructor(position, *args, &block)
55
+ append_node(_define_method(
56
+ ConstructorDefinition, position, 'initialize', nil, args, &block))
57
+ end
58
+
59
+ def _define_method(klass, position, name, type, args)
60
+ klass.new(nil, position, name) do |method|
61
+ signature = {:return => type}
62
+ if Arguments === args[0]
63
+ args_node = args[0]
64
+ args_node.parent = method
65
+ else
66
+ args_node = Arguments.new(method, position) do |args_node|
67
+ arg_list = args.map do |arg_name, arg_type, arg_position|
68
+ signature[arg_name.intern] = arg_type
69
+ arg_position ||= position
70
+ RequiredArgument.new(args_node, arg_position, arg_name)
71
+ end
72
+ [arg_list, nil, nil, nil]
73
+ end
74
+ end
75
+ [
76
+ signature,
77
+ args_node,
78
+ if block_given?
79
+ yield(method)
80
+ end
81
+ ]
82
+ end
83
+ end
84
+
85
+ def declare_field(position, name, type)
86
+ field = FieldDeclaration.new(nil, position || self.position, name)
87
+ field.type = type.dup
88
+ append_node(field)
89
+ end
90
+
91
+ def infer(typer)
92
+ resolve_if(typer) do
93
+ @superclass = superclass_node.type_reference(typer) if superclass_node
94
+ @annotations.each {|a| a.infer(typer)} if @annotations
95
+ @interfaces.concat(@interface_nodes.map{|n| n.type_reference(typer)})
96
+ typer.define_type(self, name, superclass, @interfaces) do
97
+ static_scope.self_type = typer.self_type
98
+ typer.infer(body) if body
99
+ end
100
+ end
101
+ end
102
+
103
+ def implements(*types)
104
+ raise ArgumentError if types.any? {|x| x.nil?}
105
+ types.each do |type|
106
+ if Duby::AST::TypeReference === type
107
+ @interfaces << type
108
+ else
109
+ @interface_nodes << type
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ defmacro('implements') do |transformer, fcall, parent|
116
+ klass = parent
117
+ klass = klass.parent unless ClassDefinition === klass
118
+
119
+ interfaces = fcall.parameters.map do |interface|
120
+ interface.parent = klass
121
+ interface
122
+ end
123
+ klass.implements(*interfaces)
124
+ Noop.new(parent, fcall.position)
125
+ end
126
+
127
+ class InterfaceDeclaration < ClassDefinition
128
+ attr_accessor :superclass, :interfaces
129
+ child :interface_nodes
130
+ child :body
131
+
132
+ def initialize(parent, position, name, annotations)
133
+ super(parent, position, name, annotations) {|p| }
134
+ @abstract = true
135
+ @name = name
136
+ @children = [[], nil]
137
+ @children = yield(self)
138
+ end
139
+
140
+ def infer(typer)
141
+ resolve_if(typer) do
142
+ @interfaces = interface_nodes.map {|i| i.type_reference(typer)}
143
+ super
144
+ end
145
+ end
146
+
147
+ def superclass_node
148
+ nil
149
+ end
150
+ end
151
+
152
+ class ClosureDefinition < ClassDefinition
153
+ attr_accessor :enclosing_type
154
+ def initialize(parent, position, name, enclosing_type)
155
+ super(parent, position, name, []) do
156
+ [nil, nil]
157
+ end
158
+ @enclosing_type = enclosing_type
159
+ end
160
+ end
161
+
162
+ defmacro('interface') do |transformer, fcall, parent|
163
+ raise "Interface name required" unless fcall.parameters.size > 0
164
+ interfaces = fcall.parameters
165
+ interface_name = interfaces.shift
166
+ if (Call === interface_name &&
167
+ interface_name.parameters.size == 1)
168
+ interfaces.unshift(interface_name.parameters[0])
169
+ interface_name = interface_name.target
170
+ end
171
+ raise 'Interface body required' unless fcall.block
172
+ InterfaceDeclaration.new(parent, fcall.position,
173
+ interface_name.name,
174
+ transformer.annotations) do |interface|
175
+ interfaces.each {|x| x.parent = interface}
176
+ [interfaces,
177
+ if fcall.block.body
178
+ fcall.block.body.parent = interface
179
+ fcall.block.body
180
+ end
181
+ ]
182
+ end
183
+ end
184
+
185
+ class FieldDeclaration < Node
186
+ include Annotated
187
+ include Named
188
+ include ClassScoped
189
+ include Typed
190
+
191
+ child :type_node
192
+ attr_accessor :type
193
+ attr_accessor :static
194
+
195
+ def initialize(parent, position, name, annotations=[], static = false, &block)
196
+ @annotations = annotations
197
+ super(parent, position, &block)
198
+ @name = name
199
+ @static = static
200
+ end
201
+
202
+ def infer(typer)
203
+ resolve_if(typer) do
204
+ @annotations.each {|a| a.infer(typer)} if @annotations
205
+ @type = type_node.type_reference(typer)
206
+ end
207
+ end
208
+
209
+ def resolved!(typer)
210
+ if static
211
+ typer.learn_static_field_type(class_scope, name, @inferred_type)
212
+ else
213
+ typer.learn_field_type(class_scope, name, @inferred_type)
214
+ end
215
+ super
216
+ end
217
+ end
218
+
219
+ class FieldAssignment < Node
220
+ include Annotated
221
+ include Named
222
+ include Valued
223
+ include ClassScoped
224
+
225
+ child :value
226
+ attr_accessor :static
227
+
228
+ def initialize(parent, position, name, annotations=[], static = false, &block)
229
+ @annotations = annotations
230
+ super(parent, position, &block)
231
+ @name = name
232
+ @static = static
233
+ end
234
+
235
+ def infer(typer)
236
+ resolve_if(typer) do
237
+ @annotations.each {|a| a.infer(typer)} if @annotations
238
+ if static
239
+ typer.learn_static_field_type(class_scope, name, typer.infer(value))
240
+ else
241
+ typer.learn_field_type(class_scope, name, typer.infer(value))
242
+ end
243
+ end
244
+ end
245
+ end
246
+
247
+ class Field < Node
248
+ include Annotated
249
+ include Named
250
+ include ClassScoped
251
+
252
+ attr_accessor :static
253
+
254
+ def initialize(parent, position, name, annotations=[], static = false, &block)
255
+ @annotations = annotations
256
+ super(parent, position, &block)
257
+ @name = name
258
+ @static = static
259
+ end
260
+
261
+ def infer(typer)
262
+ resolve_if(typer) do
263
+ @annotations.each {|a| a.infer(typer)} if @annotations
264
+ if static
265
+ typer.static_field_type(class_scope, name)
266
+ else
267
+ typer.field_type(class_scope, name)
268
+ end
269
+ end
270
+ end
271
+ end
272
+
273
+ class AccessLevel < Node
274
+ include ClassScoped
275
+ include Named
276
+
277
+ def initialize(parent, line_number, name)
278
+ super(parent, line_number)
279
+ @name = name
280
+ class_scope.current_access_level = name.to_sym
281
+ end
282
+
283
+ def infer(typer)
284
+ typer.no_type
285
+ end
286
+ end
287
+
288
+ class Include < Node
289
+ include Scoped
290
+
291
+ def infer(typer)
292
+ children.each do |type|
293
+ typeref = type.type_reference(typer)
294
+ the_scope = scope.static_scope
295
+ the_scope.self_type = the_scope.self_type.include(typeref)
296
+ end
297
+ end
298
+
299
+ def compile(compiler, expression); end
300
+ end
301
+
302
+ defmacro("include") do |transformer, fcall, parent|
303
+ raise "Included Class name required" unless fcall.parameters.size > 0
304
+ Include.new(parent, fcall.position) do |include_node|
305
+ fcall.parameters.map do |constant|
306
+ constant.parent = include_node
307
+ constant
308
+ end
309
+ end
310
+ end
311
+ end