Skip to content

Commit 8e4b61b

Browse files
committed
Handle class <<expr; end eigenclass opening.
1 parent 9e28ed5 commit 8e4b61b

File tree

3 files changed

+16
-4
lines changed

3 files changed

+16
-4
lines changed

compile_class.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ def compile_class(scope, name,superclass, *exps)
8787
superc = name == :Class ? nil : @classes[superclass]
8888
cscope = scope.find_constant(name)
8989

90+
if name.is_a?(Array)
91+
return compile_eigenclass(scope, name[-1], *exps)
92+
end
93+
9094
@e.comment("=== class #{cscope.name} ===")
9195

9296

parser.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ def parse_defexp
272272

273273
def parse_opt_defexp
274274
exps = E[position]
275-
while ret = parse_defexp
275+
while ret = parse_exp
276276
exps << ret
277277
end
278278
exps
@@ -364,6 +364,10 @@ def parse_class
364364
type = keyword(:class) or return
365365
ws
366366
name = expect(Atom) || literal("\<\<") or expected("class name")
367+
if name == "<<"
368+
ob = parse_exp
369+
name = [:eigen, ob]
370+
end
367371
ws
368372
# FIXME: Workaround for initialization error
369373
superclass = nil

transform.rb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -565,11 +565,15 @@ def build_class_scopes(exps, scope)
565565
elsif e[0] == :class
566566
superclass = e[2]
567567
superc = @classes[superclass.to_sym]
568-
cscope = @classes[e[1].to_sym]
569-
cscope = ClassScope.new(scope, e[1], @vtableoffsets, superc) if !cscope
568+
name = e[1]
569+
if name.is_a?(Array) && name[0] == :eigen
570+
name = clean_method_name(name.to_s)
571+
end
572+
cscope = @classes[name.to_sym]
573+
cscope = ClassScope.new(scope, name, @vtableoffsets, superc) if !cscope
570574
@classes[cscope.name.to_sym] = cscope
571575
@global_scope.add_constant(cscope.name.to_sym,cscope)
572-
scope.add_constant(e[1].to_sym,cscope)
576+
scope.add_constant(name.to_sym,cscope)
573577
build_class_scopes(e[3], cscope)
574578
elsif e[0] == :module
575579
cscope = @classes[e[1].to_sym]

0 commit comments

Comments
 (0)