mirah 0.1.2-java → 0.1.3-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/History.txt +225 -0
  3. data/Rakefile +108 -315
  4. data/TODO.md +100 -0
  5. data/bin/bundler +16 -0
  6. data/bin/rake +16 -0
  7. data/dist/mirahc.jar +0 -0
  8. data/examples/appengine/Readme +0 -1
  9. data/examples/literals.mirah +17 -0
  10. data/examples/macros/string_each_char.mirah +1 -1
  11. data/lib/mirah.rb +11 -21
  12. data/lib/mirah/transform/transformer.rb +1 -2
  13. data/lib/mirah/util/class_loader.rb +1 -1
  14. data/lib/mirah/util/logging.rb +0 -63
  15. data/lib/mirah/util/process_errors.rb +1 -0
  16. data/lib/mirah/version.rb +1 -1
  17. data/{examples/simple_class.mirah~ → test/artifacts/jar_test.rb} +7 -11
  18. data/{lib/mirah/commands.rb → test/artifacts/jruby_test.rb} +8 -5
  19. data/test/core/typer_test.rb +29 -11
  20. data/test/core/util/argument_processor_test.rb +24 -23
  21. data/test/core/util/class_loader_test.rb +7 -4
  22. data/test/core/util/{compilation_state_test.rb → jvm_version_test.rb} +20 -16
  23. data/test/fixtures/org/foo/ImplicitClassRetAnno.java +4 -0
  24. data/test/fixtures/org/foo/IntAnno.java +9 -0
  25. data/test/jvm/annotations_test.rb +11 -11
  26. data/test/jvm/blocks_test.rb +16 -12
  27. data/test/jvm/constructors_test.rb +8 -8
  28. data/test/jvm/enumerable_test.rb +48 -24
  29. data/test/jvm/generics_test.rb +3 -7
  30. data/test/jvm/import_test.rb +14 -0
  31. data/test/jvm/interface_test.rb +9 -24
  32. data/test/jvm/jvm_commands_test.rb +22 -4
  33. data/test/jvm/jvm_compiler_test.rb +124 -79
  34. data/test/jvm/list_extensions_test.rb +1 -1
  35. data/test/jvm/macros_test.rb +67 -14
  36. data/test/jvm/main_method_test.rb +1 -1
  37. data/test/jvm/new_backend_test_helper.rb +100 -3
  38. data/{lib/mirah/jvm/types/bitescript_ext.rb → test/jvm/static_fields_test.rb} +22 -21
  39. data/test/mirrors/base_type_test.rb +4 -3
  40. data/test/mirrors/bytecode_mirror_test.rb +35 -15
  41. data/test/mirrors/generics_test.rb +14 -5
  42. data/test/mirrors/member_test.rb +2 -1
  43. data/test/mirrors/method_lookup_test.rb +18 -6
  44. data/test/mirrors/mirrors_test.rb +87 -20
  45. data/test/mirrors/simple_async_mirror_loader_test.rb +7 -3
  46. data/test/mirrors/simple_mirror_loader_test.rb +5 -5
  47. data/test/test_helper.rb +25 -1
  48. metadata +18 -78
  49. data/bin/mirahp +0 -27
  50. data/bin/mirahp.cmd +0 -16
  51. data/examples/Fib.class +0 -0
  52. data/javalib/mirah-bootstrap.jar +0 -0
  53. data/javalib/mirah-builtins.jar +0 -0
  54. data/javalib/mirah-compiler.jar +0 -0
  55. data/javalib/mirah-mirrors.jar +0 -0
  56. data/javalib/mirah-newast-transitional.jar +0 -0
  57. data/javalib/mirah-parser.jar +0 -0
  58. data/javalib/mirah-util.jar +0 -0
  59. data/lib/mirah/ast.rb +0 -43
  60. data/lib/mirah/ast/scope.rb +0 -262
  61. data/lib/mirah/commands/base.rb +0 -59
  62. data/lib/mirah/commands/compile.rb +0 -39
  63. data/lib/mirah/commands/parse.rb +0 -36
  64. data/lib/mirah/commands/run.rb +0 -78
  65. data/lib/mirah/generator.rb +0 -150
  66. data/lib/mirah/jvm/compiler.rb +0 -50
  67. data/lib/mirah/jvm/compiler/base.rb +0 -421
  68. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +0 -1194
  69. data/lib/mirah/jvm/method_lookup.rb +0 -307
  70. data/lib/mirah/jvm/types.rb +0 -45
  71. data/lib/mirah/jvm/types/array_type.rb +0 -60
  72. data/lib/mirah/jvm/types/ast_ext.rb +0 -31
  73. data/lib/mirah/jvm/types/basic_types.rb +0 -41
  74. data/lib/mirah/jvm/types/block_type.rb +0 -15
  75. data/lib/mirah/jvm/types/boolean.rb +0 -70
  76. data/lib/mirah/jvm/types/enumerable.rb +0 -80
  77. data/lib/mirah/jvm/types/extensions.rb +0 -110
  78. data/lib/mirah/jvm/types/factory.rb +0 -830
  79. data/lib/mirah/jvm/types/floats.rb +0 -99
  80. data/lib/mirah/jvm/types/generic_type.rb +0 -72
  81. data/lib/mirah/jvm/types/implicit_nil_type.rb +0 -29
  82. data/lib/mirah/jvm/types/integers.rb +0 -131
  83. data/lib/mirah/jvm/types/interface_definition.rb +0 -20
  84. data/lib/mirah/jvm/types/intrinsics.rb +0 -385
  85. data/lib/mirah/jvm/types/literals.rb +0 -89
  86. data/lib/mirah/jvm/types/meta_type.rb +0 -54
  87. data/lib/mirah/jvm/types/methods.rb +0 -946
  88. data/lib/mirah/jvm/types/null_type.rb +0 -39
  89. data/lib/mirah/jvm/types/number.rb +0 -184
  90. data/lib/mirah/jvm/types/primitive_type.rb +0 -76
  91. data/lib/mirah/jvm/types/source_mirror.rb +0 -274
  92. data/lib/mirah/jvm/types/type.rb +0 -311
  93. data/lib/mirah/jvm/types/type_definition.rb +0 -72
  94. data/lib/mirah/jvm/types/void_type.rb +0 -19
  95. data/lib/mirah/util/compilation_state.rb +0 -60
  96. data/test/core/commands_test.rb +0 -89
  97. data/test/core/generator_test.rb +0 -26
  98. data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
  99. data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
  100. data/test/jvm/bytecode_test_helper.rb +0 -193
  101. data/test/jvm/factory_test.rb +0 -28
  102. data/test/jvm/java_typer_test.rb +0 -283
@@ -1,307 +0,0 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
2
- # All contributing project authors may be found in the NOTICE file.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
-
16
- module Mirah
17
- module JVM
18
- module MethodLookup
19
- java_import 'mirah.lang.ast.ConstructorDefinition'
20
-
21
- def find_method2(mapped_type, name, mapped_params, macro_params, meta, scope=nil, &block)
22
- find_method(mapped_type, name, mapped_params, macro_params, meta, scope, &block)
23
- rescue NameError => ex
24
- raise ex unless ex.message.include?(name)
25
- if block_given?
26
- block.call(ex)
27
- end
28
- ex
29
- end
30
-
31
- def find_method(mapped_type, name, mapped_params, macro_params, meta, scope=nil, &block)
32
- if mapped_type.error?
33
- raise "WTF?!?"
34
- end
35
-
36
- if name == 'new' && meta # we're calling SomeClass.new
37
- name = "<init>"
38
- constructor = true
39
- mapped_type = mapped_type.unmeta
40
- meta = false
41
- elsif name == 'new' && !meta # we're calling some_instance.new
42
- constructor = false
43
- elsif name == '<init>' && !meta # how do we get here?
44
- constructor = true
45
- elsif name == 'initialize' && !meta && scope
46
- context = scope.context
47
- if context.kind_of?(ConstructorDefinition) || context.findAncesor(ConstructorDefinition.class)
48
- constructor = true
49
- name = '<init>'
50
- end
51
- end
52
-
53
- if block_given?
54
- if constructor
55
- mapped_type.add_method_listener('initialize') {block.call(find_method2(mapped_type.meta, 'new', mapped_params, macro_params, true))}
56
- else
57
- mapped_type.add_method_listener(name) {block.call(find_method2(mapped_type, name, mapped_params, macro_params, meta))}
58
- end
59
- block.call(find_method(mapped_type, name, mapped_params, macro_params, meta))
60
- return
61
- end
62
-
63
- begin
64
- unless mapped_params.any? {|p| p.nil? || p.isError}
65
- if constructor
66
- method = mapped_type.constructor(*mapped_params)
67
- else
68
- method = mapped_type.java_method(name, *mapped_params)
69
- end
70
- end
71
- rescue NameError => ex
72
- # TODO return nil instead of raising an exception if the method doesn't exist.
73
- raise ex unless ex.message =~ /#{Regexp.quote(mapped_type.name)}\.#{Regexp.quote(name)}|No constructor #{Regexp.quote(mapped_type.name)}/
74
- end
75
-
76
- macro = mapped_type.macro(name, macro_params)
77
- if method && macro
78
- method = nil # Need full lookup to determine precedence.
79
- elsif method.nil? && macro
80
- method = macro
81
- elsif method.nil?
82
- # exact args failed, do a deeper search
83
- log "No exact match for #{mapped_type.name}.#{name}(#{mapped_params.map(&:name).join ', '})" if mapped_params.all?
84
-
85
- method = find_jls(mapped_type, name, mapped_params, macro_params, meta, constructor, scope)
86
-
87
- unless method
88
- log "Failed to locate method #{mapped_type.name}.#{name}(#{mapped_params.map(&:name).join ', '})" if mapped_params.all?
89
- return nil
90
- end
91
- end
92
-
93
- log "Found method #{method.declaring_class.name}.#{name}(#{method.argument_types.map(&:name).join ', '}) from #{mapped_type.name}" if method
94
- return method
95
- end
96
-
97
- def find_jls(mapped_type, name, mapped_params, macro_params, meta, constructor, scope=nil)
98
- interfaces = []
99
- by_name = if constructor
100
- mapped_type.unmeta.declared_constructors
101
- elsif meta
102
- mapped_type.find_callable_static_methods(name)
103
- else
104
- mapped_type.find_callable_methods(name)
105
- end
106
- method = find_jls2(mapped_type, name, mapped_params, meta, by_name, true, scope)
107
- return method if (constructor || macro_params.nil?)
108
- macros = mapped_type.find_callable_macros(name)
109
- if macros.size != 0
110
- log "Found potential macro match for #{mapped_type.name}.#{name}(#{macro_params.map(&:full_name).join ', '})"
111
- macro = find_jls2(mapped_type, name, macro_params, meta, macros, false, scope)
112
- end
113
- if macro && method
114
- raise "Ambiguous targets invoking #{mapped_type}.#{name}:\n#{macro} and #{method}"
115
- end
116
- macro || method
117
- end
118
-
119
- def find_jls2(mapped_type, name, mapped_params, meta, by_name, include_fields=true, scope=nil)
120
- return nil if mapped_params.any? {|p| p.nil? || p.isError}
121
-
122
- # filter by arity, varargs
123
- by_name_and_arity = by_name.select {|m| m.argument_types.size == mapped_params.size }
124
-
125
- phase1_methods = phase1(mapped_params, by_name_and_arity)
126
-
127
- if phase1_methods.size > 1
128
- method_list = phase1_methods.map do |m|
129
- case m.member
130
- when BiteScript::ASM::MethodMirror
131
- m.member.inspect
132
- else
133
- "#{m.name}(#{m.parameter_types.map(&:name).join(', ')})"
134
- end
135
- end.join("\n")
136
- raise "Ambiguous targets invoking #{mapped_type}.#{name}:\n#{method_list}"
137
- end
138
-
139
- phase1_methods[0] ||
140
- phase2(mapped_params, by_name) ||
141
- phase3(mapped_params, by_name)[0] ||
142
- (include_fields &&
143
- (field_lookup(mapped_params, mapped_type, meta, name, scope) ||
144
- inner_class(mapped_params, mapped_type, meta, name)))
145
- end
146
-
147
- def phase1(mapped_params, potentials)
148
- log "Beginning JLS phase 1 search with params (#{mapped_params.map(&:name).join ', '})"
149
-
150
- # cycle through methods looking for more specific matches; gather matches of equal specificity
151
- methods = potentials.inject([]) do |currents, potential|
152
- method_params = potential.argument_types
153
- next currents unless method_params.all?
154
-
155
- # exact match always wins; duplicates not possible
156
- if each_is_exact(mapped_params, method_params)
157
- return [potential]
158
- end
159
-
160
- # otherwise, check for potential match and compare to current
161
- # TODO: missing ambiguity check; picks first method of equal specificity
162
- # Picking the first method means we prefer methods from the child class,
163
- # which is important if the parent class is not accessible (like AbstractStringBuilder).
164
- if each_is_exact_or_subtype_or_convertible(mapped_params, method_params)
165
- if !currents.empty?
166
- if is_more_specific?(currents[0].argument_types, potential.argument_types)
167
- # currents are better, try next potential
168
- #next
169
- elsif is_more_specific?(potential.argument_types, currents[0].argument_types)
170
- # potential is better, dump all currents
171
- currents = [potential]
172
- else
173
- # equal specificity, append to currents
174
- currents << potential
175
- end
176
- else
177
- # no previous matches, use potential
178
- currents = [potential]
179
- end
180
- end
181
-
182
- currents
183
- end
184
-
185
- methods
186
- end
187
-
188
- def is_more_specific?(potential, current)
189
- each_is_exact_or_subtype_or_convertible(potential, current)
190
- end
191
-
192
- def phase2(mapped_params, potentials)
193
- nil
194
- end
195
-
196
- def phase3(mapped_params, potentials)
197
- potential_varargs = potentials.select{|m| m.respond_to?(:varargs?) && m.varargs? }
198
- methods = potential_varargs.inject([]) do |currents, potential|
199
- method_params = potential.argument_types
200
- # match n-1 params of potential
201
- non_varargs_params, possible_varargs_params = mapped_params.partition.with_index{|param,i| i < method_params.size-1}
202
-
203
- vararg_types = possible_varargs_params.size.times.map{ method_params.last.component_type }
204
-
205
- if each_is_exact(non_varargs_params, method_params[0..-2]) &&
206
- each_is_exact(possible_varargs_params, vararg_types)
207
- return [potential]
208
- end
209
-
210
- if each_is_exact_or_subtype_or_convertible(non_varargs_params, method_params[0..-2]) &&
211
- each_is_exact_or_subtype_or_convertible(possible_varargs_params, vararg_types)
212
- currents << potential
213
- end
214
-
215
- currents
216
- end
217
- end
218
-
219
- def field_lookup(mapped_params, mapped_type, meta, name, scope)
220
- log("Attempting #{meta ? 'static' : 'instance'} field lookup for '#{name}' on class #{mapped_type}")
221
- # if we get to this point, the potentials do not match, so we ignore them
222
-
223
-
224
- # search for a field of the given name
225
- if name =~ /_set$/
226
- # setter
227
- setter = true
228
- name = name[0..-5]
229
- field = mapped_type.field_setter(name)
230
- else
231
- # getter
232
- setter = false
233
-
234
- # field accesses don't take arguments
235
- return if mapped_params.size > 0
236
- field = mapped_type.field_getter(name)
237
- end
238
-
239
- return nil unless field
240
-
241
- if (meta && !field.static?) ||
242
- (!meta && field.static?)
243
- return nil
244
- end
245
-
246
- # check accessibility
247
- # TODO: protected field access check appropriate to current type
248
- if setter
249
- if field.final?
250
- log "cannot set final field '#{name}' on class #{mapped_type}"
251
- return nil
252
- end
253
- end
254
- unless field.public?
255
- from = " from #{scope.selfType.resolve.name}" if scope
256
- log "cannot access field '#{name}' on class #{mapped_type}#{from}"
257
- return nil
258
- end
259
-
260
- field
261
- end
262
-
263
- def inner_class(params, type, meta, name)
264
- return unless params.empty? && meta
265
- log("Attempting inner class lookup for '#{name}' on #{type}")
266
- type.inner_class_getter(name)
267
- end
268
-
269
- def each_is_exact(incoming, target)
270
- incoming.zip(target).all? { |in_type, target_type| target_type == in_type }
271
- end
272
-
273
- def each_is_exact_or_subtype_or_convertible(incoming, target)
274
- incoming.zip(target).each do |in_type, target_type|
275
-
276
- # exact match
277
- next if target_type == in_type
278
-
279
- unless target_type.respond_to?(:primitive?) && in_type.respond_to?(:primitive?)
280
- puts "Huh?"
281
- end
282
-
283
- # primitive is safely convertible
284
- if target_type.primitive?
285
- if in_type.primitive?
286
- next if primitive_convertible? in_type, target_type
287
- end
288
- return false
289
- end
290
-
291
- # object type is assignable
292
- compatible = if target_type.respond_to?(:compatible?)
293
- target_type.compatible? in_type
294
- else
295
- target_type.assignable_from? in_type
296
- end
297
- return false unless compatible
298
- end
299
- return true
300
- end
301
-
302
- def primitive_convertible?(in_type, target_type)
303
- in_type.convertible_to?(target_type)
304
- end
305
- end
306
- end
307
- end
@@ -1,45 +0,0 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
2
- # All contributing project authors may be found in the NOTICE file.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
-
16
- require 'bitescript'
17
- require 'mirah/ast'
18
- require 'mirah/jvm/method_lookup'
19
- require 'mirah/util/logging'
20
- #require 'mirah/jvm/compiler'
21
- require 'set'
22
- module Mirah::JVM
23
- module Types
24
- end
25
- end
26
- require 'mirah/jvm/types/type'
27
- require 'mirah/jvm/types/primitive_type'
28
- require 'mirah/jvm/types/meta_type'
29
- require 'mirah/jvm/types/generic_type'
30
- require 'mirah/jvm/types/null_type'
31
- require 'mirah/jvm/types/implicit_nil_type'
32
- require 'mirah/jvm/types/void_type'
33
- require 'mirah/jvm/types/block_type'
34
- require 'mirah/jvm/types/array_type'
35
- require 'mirah/jvm/types/type_definition'
36
- require 'mirah/jvm/types/interface_definition'
37
- require 'mirah/jvm/types/intrinsics'
38
- require 'mirah/jvm/types/methods'
39
- require 'mirah/jvm/types/number'
40
- require 'mirah/jvm/types/integers'
41
- require 'mirah/jvm/types/boolean'
42
- require 'mirah/jvm/types/floats'
43
- require 'mirah/jvm/types/literals'
44
- require 'mirah/jvm/types/factory'
45
- require 'mirah/jvm/types/extensions'
@@ -1,60 +0,0 @@
1
- module Mirah
2
- module JVM
3
- module Types
4
- class ArrayType < Type
5
- attr_reader :component_type
6
-
7
- def initialize(component_type)
8
- @component_type = component_type
9
-
10
- @name = component_type.name
11
- @type_system = component_type.type_system
12
- self.intrinsics
13
- end
14
-
15
- def array?
16
- true
17
- end
18
-
19
- def iterable?
20
- true
21
- end
22
-
23
- def inner_class?
24
- basic_type.inner_class?
25
- end
26
-
27
- def basic_type
28
- component_type.basic_type
29
- end
30
-
31
- def superclass
32
- object_type = @type_system.type(nil, 'java.lang.Object')
33
- if component_type.primitive?
34
- object_type
35
- elsif component_type.array?
36
- # fix covariance here for arrays of arrays
37
- # see #55
38
- object_type
39
- else
40
- if component_type == object_type
41
- object_type
42
- else
43
- component_type.superclass.array_type
44
- end
45
- end
46
- end
47
-
48
- def interfaces(include_parent=true)
49
- []
50
- end
51
-
52
- def meta
53
- @meta ||= ArrayMetaType.new(self)
54
- end
55
- end
56
-
57
- class ArrayMetaType < MetaType; end
58
- end
59
- end
60
- end
@@ -1,31 +0,0 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
2
- # All contributing project authors may be found in the NOTICE file.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
-
16
- class Java::MirahLangAst::NodeImpl
17
- def annotated_abstract?
18
- annotations.each do |anno|
19
- if anno.type.typeref.name == 'org.mirah.jvm.types.Modifiers'
20
- anno.values.each do |entry|
21
- if entry.key.identifier == 'flags'
22
- entry.value.values.each do |value|
23
- return true if value.identifier == 'ABSTRACT'
24
- end
25
- end
26
- end
27
- end
28
- end
29
- false
30
- end
31
- end
@@ -1,41 +0,0 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
2
- # All contributing project authors may be found in the NOTICE file.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
-
16
- module Mirah::JVM::Types
17
- class TypeFactory
18
- def create_basic_types
19
- @known_types.update(
20
- 'boolean' => BooleanType.new(self, 'boolean', java.lang.Boolean),
21
- 'byte' => IntegerType.new(self, 'byte', java.lang.Byte),
22
- 'char' => CharacterType.new(self, 'char', java.lang.Character),
23
- 'short' => IntegerType.new(self, 'short', java.lang.Short),
24
- 'int' => IntegerType.new(self, 'int', java.lang.Integer),
25
- 'long' => LongType.new(self, 'long', java.lang.Long),
26
- 'float' => FloatType.new(self, 'float', java.lang.Float),
27
- 'double' => DoubleType.new(self, 'double', java.lang.Double)
28
- )
29
- @known_types['fixnum'] = @known_types['int']
30
- @known_types['Object'] = type(nil, 'java.lang.Object')
31
- @known_types['string'] = @known_types['String'] = @known_types['java.lang.String'] =
32
- StringType.new(self, get_mirror('java.lang.String'))
33
- type(nil, 'java.lang.Class')
34
- @known_types['Iterable'] = @known_types['java.lang.Iterable'] =
35
- IterableType.new(self, get_mirror('java.lang.Iterable'))
36
- @known_types['void'] = VoidType.new(self)
37
- @known_types['null'] = NullType.new(self)
38
- @known_types['implicit_nil'] = ImplicitNilType.new(self)
39
- end
40
- end
41
- end