regexp_parser 0.4.6 → 0.4.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,15 +2,101 @@
2
2
 
3
3
  # line 1 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
4
4
 
5
- # line 775 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
5
+ # line 771 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
6
6
 
7
7
 
8
8
  # THIS IS A GENERATED FILE, DO NOT EDIT DIRECTLY
9
9
  # This file was generated from lib/regexp_parser/scanner/scanner.rl
10
10
 
11
- module Regexp::Scanner
12
-
13
- # line 13 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner.rb"
11
+ class Regexp::Scanner
12
+ # General scanner error (catch all)
13
+ class ScannerError < StandardError; end
14
+
15
+ # Base for all scanner validation errors
16
+ class ValidationError < StandardError
17
+ def initialize(reason)
18
+ super reason
19
+ end
20
+ end
21
+
22
+ # Unexpected end of pattern
23
+ class PrematureEndError < ScannerError
24
+ def initialize(where = '')
25
+ super "Premature end of pattern at #{where}"
26
+ end
27
+ end
28
+
29
+ # Invalid sequence format. Used for escape sequences, mainly.
30
+ class InvalidSequenceError < ValidationError
31
+ def initialize(what = 'sequence', where = '')
32
+ super "Invalid #{what} at #{where}"
33
+ end
34
+ end
35
+
36
+ # Invalid group. Used for named groups.
37
+ class InvalidGroupError < ValidationError
38
+ def initialize(what, reason)
39
+ super "Invalid #{what}, #{reason}."
40
+ end
41
+ end
42
+
43
+ # Invalid groupOption. Used for inline options.
44
+ class InvalidGroupOption < ValidationError
45
+ def initialize(option, text)
46
+ super "Invalid group option #{option} in #{text}"
47
+ end
48
+ end
49
+
50
+ # Invalid back reference. Used for name a number refs/calls.
51
+ class InvalidBackrefError < ValidationError
52
+ def initialize(what, reason)
53
+ super "Invalid back reference #{what}, #{reason}"
54
+ end
55
+ end
56
+
57
+ # The property name was not recognized by the scanner.
58
+ class UnknownUnicodePropertyError < ValidationError
59
+ def initialize(name)
60
+ super "Unknown unicode character property name #{name}"
61
+ end
62
+ end
63
+
64
+ # Scans the given regular expression text, or Regexp object and collects the
65
+ # emitted token into an array that gets returned at the end. If a block is
66
+ # given, it gets called for each emitted token.
67
+ #
68
+ # This method may raise errors if a syntax error is encountered.
69
+ # --------------------------------------------------------------------------
70
+ def self.scan(input_object, &block)
71
+ new.scan(input_object, &block)
72
+ end
73
+
74
+ def scan(input_object, &block)
75
+ @literal, top, stack = nil, 0, []
76
+
77
+ if input_object.is_a?(Regexp)
78
+ input = input_object.source
79
+ @free_spacing = (input_object.options & Regexp::EXTENDED != 0)
80
+ else
81
+ input = input_object
82
+ @free_spacing = false
83
+ end
84
+
85
+
86
+ data = input.unpack("c*") if input.is_a?(String)
87
+ eof = data.length
88
+
89
+ @tokens = []
90
+ @block = block_given? ? block : nil
91
+
92
+ @in_group, @group_depth = false, 0
93
+ @spacing_stack = [{:free_spacing => @free_spacing, :depth => 0}]
94
+
95
+ in_set, set_depth, set_type = false, 0, :set
96
+ in_conditional, conditional_depth, conditional_stack = false, 0, []
97
+
98
+
99
+ # line 99 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner.rb"
14
100
  class << self
15
101
  attr_accessor :_re_scanner_trans_keys
16
102
  private :_re_scanner_trans_keys, :_re_scanner_trans_keys=
@@ -1586,92 +1672,9 @@ end
1586
1672
  self.re_scanner_en_main = 142;
1587
1673
 
1588
1674
 
1589
- # line 782 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
1590
-
1591
- # General scanner error (catch all)
1592
- class ScannerError < StandardError; end
1593
-
1594
- # Base for all scanner validation errors
1595
- class ValidationError < StandardError
1596
- def initialize(reason)
1597
- super reason
1598
- end
1599
- end
1600
-
1601
- # Unexpected end of pattern
1602
- class PrematureEndError < ScannerError
1603
- def initialize(where = '')
1604
- super "Premature end of pattern at #{where}"
1605
- end
1606
- end
1607
-
1608
- # Invalid sequence format. Used for escape sequences, mainly.
1609
- class InvalidSequenceError < ValidationError
1610
- def initialize(what = 'sequence', where = '')
1611
- super "Invalid #{what} at #{where}"
1612
- end
1613
- end
1614
-
1615
- # Invalid group. Used for named groups.
1616
- class InvalidGroupError < ValidationError
1617
- def initialize(what, reason)
1618
- super "Invalid #{what}, #{reason}."
1619
- end
1620
- end
1621
-
1622
- # Invalid groupOption. Used for inline options.
1623
- class InvalidGroupOption < ValidationError
1624
- def initialize(option, text)
1625
- super "Invalid group option #{option} in #{text}"
1626
- end
1627
- end
1628
-
1629
- # Invalid back reference. Used for name a number refs/calls.
1630
- class InvalidBackrefError < ValidationError
1631
- def initialize(what, reason)
1632
- super "Invalid back reference #{what}, #{reason}"
1633
- end
1634
- end
1635
-
1636
- # The property name was not recognized by the scanner.
1637
- class UnknownUnicodePropertyError < ValidationError
1638
- def initialize(name)
1639
- super "Unknown unicode character property name #{name}"
1640
- end
1641
- end
1642
-
1643
- # Scans the given regular expression text, or Regexp object and collects the
1644
- # emitted token into an array that gets returned at the end. If a block is
1645
- # given, it gets called for each emitted token.
1646
- #
1647
- # This method may raise errors if a syntax error is encountered.
1648
- # --------------------------------------------------------------------------
1649
- def self.scan(input_object, &block)
1650
- @literal, top, stack = nil, 0, []
1651
-
1652
- if input_object.is_a?(Regexp)
1653
- input = input_object.source
1654
- @free_spacing = (input_object.options & Regexp::EXTENDED != 0)
1655
- else
1656
- input = input_object
1657
- @free_spacing = false
1658
- end
1659
-
1660
-
1661
- data = input.unpack("c*") if input.is_a?(String)
1662
- eof = data.length
1663
-
1664
- @tokens = []
1665
- @block = block_given? ? block : nil
1666
-
1667
- @in_group, @group_depth = false, 0
1668
- @in_options, @spacing_stack = false, [[@free_spacing, 0]]
1669
-
1670
- in_set, set_depth, set_type = false, 0, :set
1671
- in_conditional, conditional_depth, conditional_stack = false, 0, []
1672
-
1675
+ # line 864 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
1673
1676
 
1674
- # line 1674 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner.rb"
1677
+ # line 1677 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner.rb"
1675
1678
  begin
1676
1679
  p ||= 0
1677
1680
  pe ||= data.length
@@ -1682,9 +1685,9 @@ begin
1682
1685
  act = 0
1683
1686
  end
1684
1687
 
1685
- # line 866 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
1688
+ # line 865 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
1686
1689
 
1687
- # line 1687 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner.rb"
1690
+ # line 1690 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner.rb"
1688
1691
  begin
1689
1692
  testEof = false
1690
1693
  _slen, _trans, _keys, _inds, _acts, _nacts = nil
@@ -1712,7 +1715,7 @@ begin
1712
1715
  begin
1713
1716
  ts = p
1714
1717
  end
1715
- # line 1715 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner.rb"
1718
+ # line 1718 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner.rb"
1716
1719
  end
1717
1720
  _keys = cs << 1
1718
1721
  _inds = _re_scanner_index_offsets[cs]
@@ -3385,7 +3388,7 @@ te = p+1
3385
3388
  begin
3386
3389
  te = p+1
3387
3390
  begin
3388
- if in_conditional and conditional_stack.length > 0 and
3391
+ if in_conditional and conditional_stack.length > 0 and
3389
3392
  conditional_stack.last[1] == @group_depth
3390
3393
  emit(:conditional, :separator, *text(data, ts, te))
3391
3394
  else
@@ -3547,7 +3550,7 @@ te = p+1
3547
3550
  end
3548
3551
  end
3549
3552
  when 13 then
3550
- # line 642 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3553
+ # line 638 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3551
3554
  begin
3552
3555
  te = p+1
3553
3556
  begin
@@ -3619,7 +3622,7 @@ te = p+1
3619
3622
  end
3620
3623
  end
3621
3624
  when 58 then
3622
- # line 713 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3625
+ # line 709 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3623
3626
  begin
3624
3627
  te = p+1
3625
3628
  begin
@@ -3631,7 +3634,7 @@ te = p+1
3631
3634
  end
3632
3635
  end
3633
3636
  when 54 then
3634
- # line 721 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3637
+ # line 717 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3635
3638
  begin
3636
3639
  te = p+1
3637
3640
  begin
@@ -3643,7 +3646,7 @@ te = p+1
3643
3646
  end
3644
3647
  end
3645
3648
  when 56 then
3646
- # line 729 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3649
+ # line 725 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3647
3650
  begin
3648
3651
  te = p+1
3649
3652
  begin
@@ -3655,7 +3658,7 @@ te = p+1
3655
3658
  end
3656
3659
  end
3657
3660
  when 64 then
3658
- # line 737 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3661
+ # line 733 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3659
3662
  begin
3660
3663
  te = p+1
3661
3664
  begin
@@ -3663,7 +3666,7 @@ te = p+1
3663
3666
  end
3664
3667
  end
3665
3668
  when 4 then
3666
- # line 747 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3669
+ # line 743 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3667
3670
  begin
3668
3671
  te = p+1
3669
3672
  begin
@@ -3684,7 +3687,7 @@ p = p - 1; begin
3684
3687
  end
3685
3688
  end
3686
3689
  when 57 then
3687
- # line 713 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3690
+ # line 709 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3688
3691
  begin
3689
3692
  te = p
3690
3693
  p = p - 1; begin
@@ -3696,7 +3699,7 @@ p = p - 1; begin
3696
3699
  end
3697
3700
  end
3698
3701
  when 53 then
3699
- # line 721 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3702
+ # line 717 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3700
3703
  begin
3701
3704
  te = p
3702
3705
  p = p - 1; begin
@@ -3708,7 +3711,7 @@ p = p - 1; begin
3708
3711
  end
3709
3712
  end
3710
3713
  when 55 then
3711
- # line 729 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3714
+ # line 725 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3712
3715
  begin
3713
3716
  te = p
3714
3717
  p = p - 1; begin
@@ -3720,7 +3723,7 @@ p = p - 1; begin
3720
3723
  end
3721
3724
  end
3722
3725
  when 63 then
3723
- # line 737 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3726
+ # line 733 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3724
3727
  begin
3725
3728
  te = p
3726
3729
  p = p - 1; begin
@@ -3728,7 +3731,7 @@ p = p - 1; begin
3728
3731
  end
3729
3732
  end
3730
3733
  when 59 then
3731
- # line 743 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3734
+ # line 739 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3732
3735
  begin
3733
3736
  te = p
3734
3737
  p = p - 1; begin
@@ -3743,7 +3746,7 @@ p = p - 1; begin
3743
3746
  end
3744
3747
  end
3745
3748
  when 50 then
3746
- # line 755 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3749
+ # line 751 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3747
3750
  begin
3748
3751
  te = p
3749
3752
  p = p - 1; begin
@@ -3755,7 +3758,7 @@ p = p - 1; begin
3755
3758
  end
3756
3759
  end
3757
3760
  when 49 then
3758
- # line 770 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3761
+ # line 766 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3759
3762
  begin
3760
3763
  te = p
3761
3764
  p = p - 1; begin
@@ -3772,7 +3775,7 @@ p = p - 1; begin
3772
3775
  end
3773
3776
  end
3774
3777
  when 12 then
3775
- # line 743 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3778
+ # line 739 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3776
3779
  begin
3777
3780
  begin p = ((te))-1; end
3778
3781
  begin
@@ -3787,7 +3790,7 @@ p = p - 1; begin
3787
3790
  end
3788
3791
  end
3789
3792
  when 3 then
3790
- # line 770 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3793
+ # line 766 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
3791
3794
  begin
3792
3795
  begin p = ((te))-1; end
3793
3796
  begin
@@ -4085,14 +4088,10 @@ te = p+1
4085
4088
  end
4086
4089
  else
4087
4090
  if @spacing_stack.length > 1 and
4088
- @spacing_stack.last[1] == (@group_depth + 1)
4091
+ @spacing_stack.last[:depth] == (@group_depth + 1)
4089
4092
  @spacing_stack.pop
4090
4093
 
4091
- @free_spacing = @spacing_stack.last[0]
4092
-
4093
- if @spacing_stack.length == 1
4094
- @in_options = false
4095
- end
4094
+ @free_spacing = @spacing_stack.last[:free_spacing]
4096
4095
  end
4097
4096
 
4098
4097
  emit(:group, :close, *text(data, ts, te))
@@ -4144,10 +4143,10 @@ act = 22; end
4144
4143
  begin
4145
4144
  te = p+1
4146
4145
  end
4147
- # line 770 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
4146
+ # line 766 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
4148
4147
  begin
4149
4148
  act = 59; end
4150
- # line 4150 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner.rb"
4149
+ # line 4149 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner.rb"
4151
4150
  end
4152
4151
  end
4153
4152
  end
@@ -4165,7 +4164,7 @@ ts = nil; end
4165
4164
  begin
4166
4165
  act = 0
4167
4166
  end
4168
- # line 4168 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner.rb"
4167
+ # line 4167 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner.rb"
4169
4168
  end
4170
4169
 
4171
4170
  if cs == 0
@@ -4199,7 +4198,7 @@ act = 0
4199
4198
  text = ts ? copy(data, ts-1..-1) : data.pack('c*')
4200
4199
  raise PrematureEndError.new( text )
4201
4200
  end
4202
- # line 4202 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner.rb"
4201
+ # line 4201 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner.rb"
4203
4202
  end
4204
4203
  end
4205
4204
 
@@ -4210,7 +4209,7 @@ act = 0
4210
4209
  end
4211
4210
  end
4212
4211
 
4213
- # line 867 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
4212
+ # line 866 "/Users/jannoschmuller/code/regexp_parser/lib/regexp_parser/scanner/scanner.rl"
4214
4213
 
4215
4214
  if cs == re_scanner_error
4216
4215
  text = ts ? copy(data, ts-1..-1) : data.pack('c*')
@@ -4228,12 +4227,25 @@ end
4228
4227
  @tokens
4229
4228
  end
4230
4229
 
4230
+ # Emits an array with the details of the scanned pattern
4231
+ def emit(type, token, text, ts, te)
4232
+ #puts "EMIT: type: #{type}, token: #{token}, text: #{text}, ts: #{ts}, te: #{te}"
4233
+
4234
+ emit_literal if @literal
4235
+
4236
+ if @block
4237
+ @block.call type, token, text, ts, te
4238
+ end
4239
+
4240
+ @tokens << [type, token, text, ts, te]
4241
+ end
4242
+
4231
4243
  private
4232
4244
 
4233
4245
  # Ragel's regex-based scan of the group options introduced a lot of
4234
4246
  # ambiguity, so we just ask it to find the beginning of what looks
4235
4247
  # like an options run and handle the rest in here.
4236
- def self.scan_options(p, data, ts, te)
4248
+ def scan_options(p, data, ts, te)
4237
4249
  text = text(data, ts, te).first
4238
4250
 
4239
4251
  options_char, options_length = true, 0
@@ -4285,26 +4297,26 @@ end
4285
4297
  end
4286
4298
 
4287
4299
  # Copy from ts to te from data as text
4288
- def self.copy(data, range)
4300
+ def copy(data, range)
4289
4301
  data[range].pack('c*')
4290
4302
  end
4291
4303
 
4292
4304
  # Copy from ts to te from data as text, returning an array with the text
4293
4305
  # and the offsets used to copy it.
4294
- def self.text(data, ts, te, soff = 0)
4306
+ def text(data, ts, te, soff = 0)
4295
4307
  [copy(data, ts-soff..te-1), ts-soff, te]
4296
4308
  end
4297
4309
 
4298
4310
  # Appends one or more characters to the literal buffer, to be emitted later
4299
4311
  # by a call to emit_literal. Contents can be a mix of ASCII and UTF-8.
4300
- def self.append_literal(data, ts, te)
4312
+ def append_literal(data, ts, te)
4301
4313
  @literal ||= []
4302
4314
  @literal << text(data, ts, te)
4303
4315
  end
4304
4316
 
4305
4317
  # Emits the literal run collected by calls to the append_literal method,
4306
4318
  # using the total start (ts) and end (te) offsets of the run.
4307
- def self.emit_literal
4319
+ def emit_literal
4308
4320
  ts, te = @literal.first[1], @literal.last[2]
4309
4321
  text = @literal.map {|t| t[0]}.join
4310
4322
 
@@ -4314,43 +4326,34 @@ end
4314
4326
  emit(:literal, :literal, text, ts, te)
4315
4327
  end
4316
4328
 
4317
- def self.emit_options(text, ts, te)
4318
- if text =~ /\(\?([mixdau]+)?-?([mix]+)?:/
4319
- positive, negative = $1, $2
4329
+ def emit_options(text, ts, te)
4330
+ if text =~ /\(\?([mixdau]*)-?([mix]*)(:)?/
4331
+ positive, negative, group_local = $1, $2, $3
4320
4332
 
4321
- if positive =~ /x/
4333
+ if positive.include?('x')
4322
4334
  @free_spacing = true
4323
4335
  end
4324
4336
 
4325
4337
  # If the x appears in both, treat it like ruby does, the second cancels
4326
4338
  # the first.
4327
- if negative =~ /x/
4339
+ if negative.include?('x')
4328
4340
  @free_spacing = false
4329
4341
  end
4330
- end
4331
4342
 
4332
- @in_options = true
4333
- @spacing_stack << [@free_spacing, @group_depth]
4334
-
4335
- emit(:group, :options, text, ts, te)
4336
- end
4337
-
4338
- # Emits an array with the details of the scanned pattern
4339
- def self.emit(type, token, text, ts, te)
4340
- #puts "EMIT: type: #{type}, token: #{token}, text: #{text}, ts: #{ts}, te: #{te}"
4341
-
4342
- emit_literal if @literal
4343
-
4344
- if @block
4345
- @block.call type, token, text, ts, te
4343
+ if group_local
4344
+ @spacing_stack << {:free_spacing => @free_spacing, :depth => @group_depth}
4345
+ else
4346
+ # switch for parent group level
4347
+ @spacing_stack.last[:free_spacing] = @free_spacing
4348
+ end
4346
4349
  end
4347
4350
 
4348
- @tokens << [type, token, text, ts, te]
4351
+ emit(:group, :options, text, ts, te)
4349
4352
  end
4350
4353
 
4351
4354
  # Centralizes and unifies the handling of validation related
4352
4355
  # errors.
4353
- def self.validation_error(type, what, reason)
4356
+ def validation_error(type, what, reason)
4354
4357
  case type
4355
4358
  when :group
4356
4359
  error = InvalidGroupError.new(what, reason)
@@ -4366,12 +4369,12 @@ end
4366
4369
  end
4367
4370
 
4368
4371
  # Used for references with an empty name or number
4369
- def self.empty_backref_error(type, what)
4372
+ def empty_backref_error(type, what)
4370
4373
  validation_error(:backref, what, 'ref ID is empty')
4371
4374
  end
4372
4375
 
4373
4376
  # Used for named expressions with an empty name
4374
- def self.empty_name_error(type, what)
4377
+ def empty_name_error(type, what)
4375
4378
  validation_error(type, what, 'name is empty')
4376
4379
  end
4377
4380