delorean_lang 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/delorean.gemspec CHANGED
@@ -21,4 +21,5 @@ Gem::Specification.new do |gem|
21
21
  gem.add_development_dependency "rspec", '~> 2.1'
22
22
  gem.add_development_dependency "sqlite3", '~> 1.3.10'
23
23
  gem.add_development_dependency "pry"
24
+ gem.add_development_dependency "rubocop"
24
25
  end
data/lib/delorean/base.rb CHANGED
@@ -9,7 +9,9 @@ module Delorean
9
9
 
10
10
  ::Delorean::Ruby.whitelist = ::Delorean::Ruby::Whitelists::Default.new
11
11
 
12
- ::Delorean::Cache.adapter = ::Delorean::Cache::Adapters::RubyCache.new(size_per_class: 1000)
12
+ ::Delorean::Cache.adapter = ::Delorean::Cache::Adapters::RubyCache.new(
13
+ size_per_class: 1000
14
+ )
13
15
 
14
16
  module BaseModule
15
17
  # _e is used by Marty promise_jobs to pass promise-related
@@ -914,21 +914,21 @@ module Delorean
914
914
  end
915
915
 
916
916
  module DotExp1
917
- def i
918
- elements[2]
919
- end
920
-
921
917
  def al
922
- elements[5]
918
+ elements[2]
923
919
  end
924
920
 
925
921
  end
926
922
 
927
923
  module DotExp2
928
- def al
924
+ def i
929
925
  elements[2]
930
926
  end
931
927
 
928
+ def al
929
+ elements[5]
930
+ end
931
+
932
932
  end
933
933
 
934
934
  module DotExp3
@@ -1002,11 +1002,11 @@ module Delorean
1002
1002
  r0 = r1
1003
1003
  else
1004
1004
  i9, s9 = index, []
1005
- if (match_len = has_terminal?('.', false, index))
1005
+ if (match_len = has_terminal?('(', false, index))
1006
1006
  r10 = true
1007
1007
  @index += match_len
1008
1008
  else
1009
- terminal_parse_failure('\'.\'')
1009
+ terminal_parse_failure('\'(\'')
1010
1010
  r10 = nil
1011
1011
  end
1012
1012
  s9 << r10
@@ -1019,59 +1019,36 @@ module Delorean
1019
1019
  end
1020
1020
  s9 << r11
1021
1021
  if r11
1022
- r13 = _nt_identifier
1022
+ r14 = _nt_kw_args
1023
+ if r14
1024
+ r13 = r14
1025
+ else
1026
+ r13 = instantiate_node(SyntaxNode,input, index...index)
1027
+ end
1023
1028
  s9 << r13
1024
1029
  if r13
1025
- if (match_len = has_terminal?('(', false, index))
1026
- r14 = true
1027
- @index += match_len
1030
+ r16 = _nt_sp
1031
+ if r16
1032
+ r15 = r16
1028
1033
  else
1029
- terminal_parse_failure('\'(\'')
1030
- r14 = nil
1034
+ r15 = instantiate_node(SyntaxNode,input, index...index)
1031
1035
  end
1032
- s9 << r14
1033
- if r14
1034
- r16 = _nt_sp
1035
- if r16
1036
- r15 = r16
1036
+ s9 << r15
1037
+ if r15
1038
+ if (match_len = has_terminal?(')', false, index))
1039
+ r17 = true
1040
+ @index += match_len
1037
1041
  else
1038
- r15 = instantiate_node(SyntaxNode,input, index...index)
1039
- end
1040
- s9 << r15
1041
- if r15
1042
- r18 = _nt_fn_args
1043
- if r18
1044
- r17 = r18
1045
- else
1046
- r17 = instantiate_node(SyntaxNode,input, index...index)
1047
- end
1048
- s9 << r17
1049
- if r17
1050
- r20 = _nt_sp
1051
- if r20
1052
- r19 = r20
1053
- else
1054
- r19 = instantiate_node(SyntaxNode,input, index...index)
1055
- end
1056
- s9 << r19
1057
- if r19
1058
- if (match_len = has_terminal?(')', false, index))
1059
- r21 = true
1060
- @index += match_len
1061
- else
1062
- terminal_parse_failure('\')\'')
1063
- r21 = nil
1064
- end
1065
- s9 << r21
1066
- end
1067
- end
1042
+ terminal_parse_failure('\')\'')
1043
+ r17 = nil
1068
1044
  end
1045
+ s9 << r17
1069
1046
  end
1070
1047
  end
1071
1048
  end
1072
1049
  end
1073
1050
  if s9.last
1074
- r9 = instantiate_node(Call,input, i9...index, s9)
1051
+ r9 = instantiate_node(NodeCall,input, i9...index, s9)
1075
1052
  r9.extend(DotExp1)
1076
1053
  else
1077
1054
  @index = i9
@@ -1081,62 +1058,85 @@ module Delorean
1081
1058
  r9 = SyntaxNode.new(input, (index-1)...index) if r9 == true
1082
1059
  r0 = r9
1083
1060
  else
1084
- i22, s22 = index, []
1085
- if (match_len = has_terminal?('(', false, index))
1086
- r23 = true
1061
+ i18, s18 = index, []
1062
+ if (match_len = has_terminal?('.', false, index))
1063
+ r19 = true
1087
1064
  @index += match_len
1088
1065
  else
1089
- terminal_parse_failure('\'(\'')
1090
- r23 = nil
1091
- end
1092
- s22 << r23
1093
- if r23
1094
- r25 = _nt_sp
1095
- if r25
1096
- r24 = r25
1066
+ terminal_parse_failure('\'.\'')
1067
+ r19 = nil
1068
+ end
1069
+ s18 << r19
1070
+ if r19
1071
+ r21 = _nt_sp
1072
+ if r21
1073
+ r20 = r21
1097
1074
  else
1098
- r24 = instantiate_node(SyntaxNode,input, index...index)
1099
- end
1100
- s22 << r24
1101
- if r24
1102
- r27 = _nt_kw_args
1103
- if r27
1104
- r26 = r27
1105
- else
1106
- r26 = instantiate_node(SyntaxNode,input, index...index)
1107
- end
1108
- s22 << r26
1109
- if r26
1110
- r29 = _nt_sp
1111
- if r29
1112
- r28 = r29
1075
+ r20 = instantiate_node(SyntaxNode,input, index...index)
1076
+ end
1077
+ s18 << r20
1078
+ if r20
1079
+ r22 = _nt_identifier
1080
+ s18 << r22
1081
+ if r22
1082
+ if (match_len = has_terminal?('(', false, index))
1083
+ r23 = true
1084
+ @index += match_len
1113
1085
  else
1114
- r28 = instantiate_node(SyntaxNode,input, index...index)
1086
+ terminal_parse_failure('\'(\'')
1087
+ r23 = nil
1115
1088
  end
1116
- s22 << r28
1117
- if r28
1118
- if (match_len = has_terminal?(')', false, index))
1119
- r30 = true
1120
- @index += match_len
1089
+ s18 << r23
1090
+ if r23
1091
+ r25 = _nt_sp
1092
+ if r25
1093
+ r24 = r25
1121
1094
  else
1122
- terminal_parse_failure('\')\'')
1123
- r30 = nil
1095
+ r24 = instantiate_node(SyntaxNode,input, index...index)
1096
+ end
1097
+ s18 << r24
1098
+ if r24
1099
+ r27 = _nt_fn_args
1100
+ if r27
1101
+ r26 = r27
1102
+ else
1103
+ r26 = instantiate_node(SyntaxNode,input, index...index)
1104
+ end
1105
+ s18 << r26
1106
+ if r26
1107
+ r29 = _nt_sp
1108
+ if r29
1109
+ r28 = r29
1110
+ else
1111
+ r28 = instantiate_node(SyntaxNode,input, index...index)
1112
+ end
1113
+ s18 << r28
1114
+ if r28
1115
+ if (match_len = has_terminal?(')', false, index))
1116
+ r30 = true
1117
+ @index += match_len
1118
+ else
1119
+ terminal_parse_failure('\')\'')
1120
+ r30 = nil
1121
+ end
1122
+ s18 << r30
1123
+ end
1124
+ end
1124
1125
  end
1125
- s22 << r30
1126
1126
  end
1127
1127
  end
1128
1128
  end
1129
1129
  end
1130
- if s22.last
1131
- r22 = instantiate_node(NodeCall,input, i22...index, s22)
1132
- r22.extend(DotExp2)
1130
+ if s18.last
1131
+ r18 = instantiate_node(Call,input, i18...index, s18)
1132
+ r18.extend(DotExp2)
1133
1133
  else
1134
- @index = i22
1135
- r22 = nil
1134
+ @index = i18
1135
+ r18 = nil
1136
1136
  end
1137
- if r22
1138
- r22 = SyntaxNode.new(input, (index-1)...index) if r22 == true
1139
- r0 = r22
1137
+ if r18
1138
+ r18 = SyntaxNode.new(input, (index-1)...index) if r18 == true
1139
+ r0 = r18
1140
1140
  else
1141
1141
  i31, s31 = index, []
1142
1142
  if (match_len = has_terminal?('.', false, index))
@@ -2520,122 +2520,128 @@ module Delorean
2520
2520
  r6 = SyntaxNode.new(input, (index-1)...index) if r6 == true
2521
2521
  r0 = r6
2522
2522
  else
2523
- r7 = _nt_self
2523
+ r7 = _nt_sup
2524
2524
  if r7
2525
2525
  r7 = SyntaxNode.new(input, (index-1)...index) if r7 == true
2526
2526
  r0 = r7
2527
2527
  else
2528
- r8 = _nt_list_expr
2528
+ r8 = _nt_self
2529
2529
  if r8
2530
2530
  r8 = SyntaxNode.new(input, (index-1)...index) if r8 == true
2531
2531
  r0 = r8
2532
2532
  else
2533
- r9 = _nt_set_expr
2533
+ r9 = _nt_list_expr
2534
2534
  if r9
2535
2535
  r9 = SyntaxNode.new(input, (index-1)...index) if r9 == true
2536
2536
  r0 = r9
2537
2537
  else
2538
- r10 = _nt_hash_expr
2538
+ r10 = _nt_set_expr
2539
2539
  if r10
2540
2540
  r10 = SyntaxNode.new(input, (index-1)...index) if r10 == true
2541
2541
  r0 = r10
2542
2542
  else
2543
- i11, s11 = index, []
2544
- i13, s13 = index, []
2545
- r14 = _nt_class_name
2546
- s13 << r14
2547
- if r14
2548
- if (match_len = has_terminal?('::', false, index))
2549
- r15 = instantiate_node(SyntaxNode,input, index...(index + match_len))
2550
- @index += match_len
2551
- else
2552
- terminal_parse_failure('\'::\'')
2553
- r15 = nil
2554
- end
2555
- s13 << r15
2556
- end
2557
- if s13.last
2558
- r13 = instantiate_node(SyntaxNode,input, i13...index, s13)
2559
- r13.extend(Value0)
2560
- else
2561
- @index = i13
2562
- r13 = nil
2563
- end
2564
- if r13
2565
- r12 = r13
2566
- else
2567
- r12 = instantiate_node(SyntaxNode,input, index...index)
2568
- end
2569
- s11 << r12
2570
- if r12
2571
- r16 = _nt_class_name
2572
- s11 << r16
2573
- end
2574
- if s11.last
2575
- r11 = instantiate_node(NodeAsValue,input, i11...index, s11)
2576
- r11.extend(Value1)
2577
- else
2578
- @index = i11
2579
- r11 = nil
2580
- end
2543
+ r11 = _nt_hash_expr
2581
2544
  if r11
2582
2545
  r11 = SyntaxNode.new(input, (index-1)...index) if r11 == true
2583
2546
  r0 = r11
2584
2547
  else
2585
- i17, s17 = index, []
2586
- if (match_len = has_terminal?('(', false, index))
2587
- r18 = true
2588
- @index += match_len
2548
+ i12, s12 = index, []
2549
+ i14, s14 = index, []
2550
+ r15 = _nt_class_name
2551
+ s14 << r15
2552
+ if r15
2553
+ if (match_len = has_terminal?('::', false, index))
2554
+ r16 = instantiate_node(SyntaxNode,input, index...(index + match_len))
2555
+ @index += match_len
2556
+ else
2557
+ terminal_parse_failure('\'::\'')
2558
+ r16 = nil
2559
+ end
2560
+ s14 << r16
2561
+ end
2562
+ if s14.last
2563
+ r14 = instantiate_node(SyntaxNode,input, i14...index, s14)
2564
+ r14.extend(Value0)
2565
+ else
2566
+ @index = i14
2567
+ r14 = nil
2568
+ end
2569
+ if r14
2570
+ r13 = r14
2571
+ else
2572
+ r13 = instantiate_node(SyntaxNode,input, index...index)
2573
+ end
2574
+ s12 << r13
2575
+ if r13
2576
+ r17 = _nt_class_name
2577
+ s12 << r17
2578
+ end
2579
+ if s12.last
2580
+ r12 = instantiate_node(NodeAsValue,input, i12...index, s12)
2581
+ r12.extend(Value1)
2589
2582
  else
2590
- terminal_parse_failure('\'(\'')
2591
- r18 = nil
2583
+ @index = i12
2584
+ r12 = nil
2592
2585
  end
2593
- s17 << r18
2594
- if r18
2595
- r20 = _nt_sp
2596
- if r20
2597
- r19 = r20
2586
+ if r12
2587
+ r12 = SyntaxNode.new(input, (index-1)...index) if r12 == true
2588
+ r0 = r12
2589
+ else
2590
+ i18, s18 = index, []
2591
+ if (match_len = has_terminal?('(', false, index))
2592
+ r19 = true
2593
+ @index += match_len
2598
2594
  else
2599
- r19 = instantiate_node(SyntaxNode,input, index...index)
2595
+ terminal_parse_failure('\'(\'')
2596
+ r19 = nil
2600
2597
  end
2601
- s17 << r19
2598
+ s18 << r19
2602
2599
  if r19
2603
- r21 = _nt_expression
2604
- s17 << r21
2600
+ r21 = _nt_sp
2605
2601
  if r21
2606
- r23 = _nt_sp
2607
- if r23
2608
- r22 = r23
2609
- else
2610
- r22 = instantiate_node(SyntaxNode,input, index...index)
2611
- end
2612
- s17 << r22
2602
+ r20 = r21
2603
+ else
2604
+ r20 = instantiate_node(SyntaxNode,input, index...index)
2605
+ end
2606
+ s18 << r20
2607
+ if r20
2608
+ r22 = _nt_expression
2609
+ s18 << r22
2613
2610
  if r22
2614
- if (match_len = has_terminal?(')', false, index))
2615
- r24 = true
2616
- @index += match_len
2611
+ r24 = _nt_sp
2612
+ if r24
2613
+ r23 = r24
2617
2614
  else
2618
- terminal_parse_failure('\')\'')
2619
- r24 = nil
2615
+ r23 = instantiate_node(SyntaxNode,input, index...index)
2616
+ end
2617
+ s18 << r23
2618
+ if r23
2619
+ if (match_len = has_terminal?(')', false, index))
2620
+ r25 = true
2621
+ @index += match_len
2622
+ else
2623
+ terminal_parse_failure('\')\'')
2624
+ r25 = nil
2625
+ end
2626
+ s18 << r25
2620
2627
  end
2621
- s17 << r24
2622
2628
  end
2623
2629
  end
2624
2630
  end
2625
- end
2626
- if s17.last
2627
- r17 = instantiate_node(Expr,input, i17...index, s17)
2628
- r17.extend(Value2)
2629
- else
2630
- @index = i17
2631
- r17 = nil
2632
- end
2633
- if r17
2634
- r17 = SyntaxNode.new(input, (index-1)...index) if r17 == true
2635
- r0 = r17
2636
- else
2637
- @index = i0
2638
- r0 = nil
2631
+ if s18.last
2632
+ r18 = instantiate_node(Expr,input, i18...index, s18)
2633
+ r18.extend(Value2)
2634
+ else
2635
+ @index = i18
2636
+ r18 = nil
2637
+ end
2638
+ if r18
2639
+ r18 = SyntaxNode.new(input, (index-1)...index) if r18 == true
2640
+ r0 = r18
2641
+ else
2642
+ @index = i0
2643
+ r0 = nil
2644
+ end
2639
2645
  end
2640
2646
  end
2641
2647
  end
@@ -3739,6 +3745,30 @@ module Delorean
3739
3745
  r0
3740
3746
  end
3741
3747
 
3748
+ def _nt_sup
3749
+ start_index = index
3750
+ if node_cache[:sup].has_key?(index)
3751
+ cached = node_cache[:sup][index]
3752
+ if cached
3753
+ node_cache[:sup][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
3754
+ @index = cached.interval.end
3755
+ end
3756
+ return cached
3757
+ end
3758
+
3759
+ if (match_len = has_terminal?('_sup', false, index))
3760
+ r0 = instantiate_node(Sup,input, index...(index + match_len))
3761
+ @index += match_len
3762
+ else
3763
+ terminal_parse_failure('\'_sup\'')
3764
+ r0 = nil
3765
+ end
3766
+
3767
+ node_cache[:sup][start_index] = r0
3768
+
3769
+ r0
3770
+ end
3771
+
3742
3772
  def _nt_self
3743
3773
  start_index = index
3744
3774
  if node_cache[:self].has_key?(index)
@@ -114,6 +114,7 @@ grammar Delorean
114
114
  boolean /
115
115
  nil_val /
116
116
  identifier /
117
+ sup /
117
118
  self /
118
119
  list_expr /
119
120
  set_expr /
@@ -162,6 +163,10 @@ grammar Delorean
162
163
  'true' <Literal> / 'false' <Literal>
163
164
  end
164
165
 
166
+ rule sup
167
+ '_sup' <Sup>
168
+ end
169
+
165
170
  rule self
166
171
  '_' <Self>
167
172
  end
@@ -238,6 +238,16 @@ eos
238
238
  end
239
239
  end
240
240
 
241
+ class Sup < SNode
242
+ def check(context, *)
243
+ []
244
+ end
245
+
246
+ def rewrite(context)
247
+ "superclass"
248
+ end
249
+ end
250
+
241
251
  class IString < Literal
242
252
  def rewrite(context)
243
253
  # FIXME: hacky to just fail
@@ -1,3 +1,3 @@
1
1
  module Delorean
2
- VERSION = "0.5.0"
2
+ VERSION = "0.5.1"
3
3
  end
data/spec/cache_spec.rb CHANGED
@@ -53,8 +53,10 @@ describe "Delorean cache" do
53
53
  )
54
54
  expect(item_2).to eq(nil)
55
55
 
56
- item_10, item_10_found = ::Delorean::Cache.adapter.fetch_item(
57
- klass: Dummy, cache_key: [:returns_cached_openstruct, 10, 10], default: :NF
56
+ item_10 = ::Delorean::Cache.adapter.fetch_item(
57
+ klass: Dummy,
58
+ cache_key: [:returns_cached_openstruct, 10, 10],
59
+ default: :NF
58
60
  )
59
61
 
60
62
  expect(item_10).to be_a(OpenStruct)
data/spec/eval_spec.rb CHANGED
@@ -1071,4 +1071,22 @@ eof
1071
1071
  r2 = engine.evaluate("B", "res2")
1072
1072
  expect(r2.values.uniq.length).to eq 1
1073
1073
  end
1074
+
1075
+ it "Implements ability to use overridden superclass attrs" do
1076
+ code = <<-DELOREAN
1077
+ A:
1078
+ x = 123
1079
+ y = x*2
1080
+ B: A
1081
+ x = 5
1082
+ y = _sup.y * 10
1083
+ xx = _sup.x + 5
1084
+ yy = _sup.x * 10
1085
+ DELOREAN
1086
+
1087
+ engine.parse code.gsub(/^ /, '')
1088
+
1089
+ r = engine.evaluate("B", ["x", "y", "xx", "yy"])
1090
+ expect(r).to eq [5, 2460, 128, 1230]
1091
+ end
1074
1092
  end
@@ -63,7 +63,7 @@ describe "Delorean Ruby whitelisting" do
63
63
  expect do
64
64
  matcher_with_args.match!(klass: Dummy, args: [1, 2])
65
65
  end.to raise_error(
66
- 'bad arg 1, method testmethod_with_args: 2/Fixnum [String, nil]'
66
+ "bad arg 1, method testmethod_with_args: 2/#{2.class} [String, nil]"
67
67
  )
68
68
  end
69
69
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delorean_lang
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arman Bostani
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-15 00:00:00.000000000 Z
11
+ date: 2019-01-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: treetop
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: A "compiler" for the Delorean programming language
84
98
  email:
85
99
  - arman.bostani@pnmac.com
@@ -88,8 +102,10 @@ extensions: []
88
102
  extra_rdoc_files: []
89
103
  files:
90
104
  - ".gitignore"
105
+ - ".gitlab-ci.yml"
91
106
  - ".rspec"
92
107
  - ".rubocop.yml"
108
+ - ".rubocop_todo.yml"
93
109
  - Gemfile
94
110
  - LICENSE
95
111
  - README.md