Skip to content

Commit 202e771

Browse files
author
Ary Borenszweig
committedNov 22, 2016
Enum: automatically generate a none? method for a Flags enum
1 parent eab0094 commit 202e771

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed
 

Diff for: ‎spec/compiler/codegen/enum_spec.cr

+15
Original file line numberDiff line numberDiff line change
@@ -303,4 +303,19 @@ describe "Code gen: enum" do
303303
Foo::A.value
304304
)).to_i.should eq(30)
305305
end
306+
307+
it "adds a none? method to flags enum" do
308+
run(%(
309+
@[Flags]
310+
enum Foo
311+
A
312+
B
313+
end
314+
315+
x = 0
316+
x += 1 if Foo::None.none?
317+
x += 2 if Foo::A.none?
318+
x
319+
)).to_i.should eq(1)
320+
end
306321
end

Diff for: ‎src/compiler/crystal/semantic/top_level_visitor.cr

+8
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,8 @@ class Crystal::TopLevelVisitor < Crystal::SemanticVisitor
477477
none = NumberLiteral.new(0, enum_base_type.kind)
478478
none.type = enum_type
479479
enum_type.add_constant Arg.new("None", default_value: none)
480+
481+
define_enum_none_question_method(enum_type, node)
480482
end
481483

482484
unless enum_type.types["All"]?
@@ -567,6 +569,12 @@ class Crystal::TopLevelVisitor < Crystal::SemanticVisitor
567569
enum_type.add_def a_def
568570
end
569571

572+
def define_enum_none_question_method(enum_type, node)
573+
body = Call.new(Call.new(nil, "value").at(node), "==", NumberLiteral.new(0)).at(node)
574+
a_def = Def.new("none?", body: body).at(node)
575+
enum_type.add_def a_def
576+
end
577+
570578
def visit(node : Assign)
571579
type_assign(node.target, node.value, node)
572580
false

0 commit comments

Comments
 (0)
Please sign in to comment.