1 # coding: utf-8
2 # frozen_string_literal: true
3
4
5
6 module Umu
7
8 module ConcreteSyntax
9
10 module Core
11
12 module Declaration
13
14 class Assert < Declaration::Abstract
15 attr_reader :test_expr, :else_expr
16
17
18 def initialize(loc, test_expr, else_expr)
19 ASSERT.kind_of test_expr, CSCE::Abstract
20 ASSERT.kind_of else_expr, CSCE::Abstract
21
22 super(loc)
23
24 @test_expr = test_expr
25 @else_expr = else_expr
26 end
27
28
29 def to_s
30 format("%%ASSERT %s -> %s",
31 self.test_expr.to_s,
32 self.else_expr.to_s
33 )
34 end
35
36
37 def pretty_print(q)
38 q.text '%ASSERT '
39 q.pp self.test_expr
40 PRT.group q, bb:' -> ' do
41 q.pp self.else_expr
42 end
43 end
44
45
46 def exported_vars
47 [].freeze
48 end
49
50
51 private
52
53 def __desugar__(env, event)
54 new_env = env.enter event
55
56 ASCD.make_value(
57 self.loc,
58
59 WILDCARD,
60
61 ASCE.make_if(
62 self.loc,
63
64 [
65 ASCE.make_rule(
66 self.test_expr.loc,
67 self.test_expr.desugar(new_env),
68 ASCE.make_unit(self.test_expr.loc)
69 )
70 ],
71
72 ASCE.make_raise(
73 self.else_expr.loc,
74 X::AssertionFailure,
75 self.else_expr.desugar(new_env)
76 )
77 )
78 )
79 end
80 end
81
82
83
84 module_function
85
86 def make_assert(loc, test_expr, else_expr)
87 ASSERT.kind_of loc, LOC::Entry
88 ASSERT.kind_of test_expr, CSCE::Abstract
89 ASSERT.kind_of else_expr, CSCE::Abstract
90
91 Assert.new(loc, test_expr, else_expr).freeze
92 end
93
94 end # Umu::ConcreteSyntax::Core::Declaration
95
96 end # Umu::ConcreteSyntax::Core
97
98 end # Umu::ConcreteSyntax
99
100 end # Umu