@@ -70,16 +70,20 @@ public Value createIdentityFunction(Context context) {
70
70
@ Override
71
71
public Collection <? extends Snippet > createValueConstructors (Context context ) {
72
72
final List <Snippet > vals = new ArrayList <>();
73
- vals .add (createValueConstructor (context , "nil" , NULL ));
73
+ // Interop Primitives
74
+ vals .add (createValueConstructor (context , "nil" , NULL )); // should also be OBJECT?
74
75
vals .add (createValueConstructor (context , "false" , BOOLEAN ));
75
- vals .add (createValueConstructor (context , "7" , NUMBER ));
76
- vals .add (createValueConstructor (context , "1 << 42" , NUMBER ));
76
+ // NOTE: NUMBER is only for primitives and types which are instanceof java.lang.Number.
77
+ vals .add (createValueConstructor (context , "7" , NUMBER )); // int
78
+ vals .add (createValueConstructor (context , "1 << 42" , NUMBER )); // long
79
+ // vals.add(createValueConstructor(context, "1 << 84", NUMBER)); // Bignum
77
80
vals .add (createValueConstructor (context , "3.14" , NUMBER ));
78
- vals .add (createValueConstructor (context , "Rational(1, 3)" , OBJECT ));
79
- vals .add (createValueConstructor (context , "Complex(1, 2)" , OBJECT ));
80
81
vals .add (createValueConstructor (context , "'test'" , STRING ));
81
82
vals .add (createValueConstructor (context , "'0123456789' + '0123456789'" , STRING ));
82
83
84
+ // Everything but interop primitives have members in Ruby, so they are also OBJECT
85
+ vals .add (createValueConstructor (context , "Rational(1, 3)" , OBJECT ));
86
+ vals .add (createValueConstructor (context , "Complex(1, 2)" , OBJECT ));
83
87
vals .add (createValueConstructor (context , "Time.now" , DATE_TIME_ZONE_OBJECT ));
84
88
vals .add (createValueConstructor (context , "[1, 2]" , NUMBER_ARRAY_OBJECT ));
85
89
vals .add (createValueConstructor (context , "[1.2, 3.4]" , NUMBER_ARRAY_OBJECT ));
@@ -90,23 +94,58 @@ public Collection<? extends Snippet> createValueConstructors(Context context) {
90
94
vals .add (createValueConstructor (context , "[Object.new, 65]" , ARRAY_OBJECT ));
91
95
vals .add (createValueConstructor (context , "{ name: 'test' }" , OBJECT ));
92
96
vals .add (createValueConstructor (context , "Struct.new(:foo, :bar).new(1, 'two')" , OBJECT ));
93
- vals .add (
94
- createValueConstructor (
95
- context ,
96
- "Object.new.tap { |obj| obj.instance_variable_set(:@name, 'test') }" ,
97
- OBJECT ));
97
+ String objectWithIVar = "Object.new.tap { |obj| obj.instance_variable_set(:@name, 'test') }" ;
98
+ vals .add (createValueConstructor (context , objectWithIVar , OBJECT ));
98
99
vals .add (createValueConstructor (context , "proc { }" , intersection (OBJECT , executable (ANY , true ))));
99
100
vals .add (createValueConstructor (context , "lambda { }" , intersection (OBJECT , executable (ANY , false ))));
101
+ // vals.add(createValueConstructor(context, ":itself.to_proc", alsoRegularObject(executable(ANY, false, ANY))));
102
+ // vals.add(createValueConstructor(context, "1.method(:itself)", alsoRegularObject(executable(NUMBER, false))));
100
103
return Collections .unmodifiableList (vals );
101
104
}
102
105
103
106
@ Override
104
107
public Collection <? extends Snippet > createExpressions (Context context ) {
105
108
final List <Snippet > ops = new ArrayList <>();
109
+
110
+ // arithmetic
106
111
ops .add (createBinaryOperator (context , "a + b" , NUMBER , NUMBER , NUMBER ));
107
112
ops .add (createBinaryOperator (context , "a + b" , STRING , STRING , STRING ));
113
+ // ops.add(createBinaryOperator(context, "a + b", ARRAY, ARRAY, ARRAY));
108
114
ops .add (createBinaryOperator (context , "a - b" , NUMBER , NUMBER , NUMBER ));
115
+ // ops.add(createBinaryOperator(context, "a - b", ARRAY, ARRAY, ARRAY));
116
+ // ops.add(createBinaryOperator(context, "a * b", NUMBER, NUMBER, NUMBER));
117
+ // ops.add(createBinaryOperator(context, "a * b", STRING, NUMBER, STRING));
118
+ // ops.add(createBinaryOperator(context, "a * b", ARRAY, NUMBER, ARRAY));
109
119
ops .add (createBinaryOperator (context , "a / b" , NUMBER , NUMBER , NUMBER ));
120
+ // ops.add(createBinaryOperator(context, "a % b", NUMBER, NUMBER, NUMBER));
121
+ // ops.add(createBinaryOperator(context, "a ** b", NUMBER, NUMBER, NUMBER));
122
+
123
+ // comparison
124
+ // ops.add(createBinaryOperator(context, "a.equal?(b)", ANY, ANY, BOOLEAN));
125
+ // ops.add(createBinaryOperator(context, "a == b", ANY, ANY, BOOLEAN));
126
+ // ops.add(createBinaryOperator(context, "a != b", ANY, ANY, BOOLEAN));
127
+ // ops.add(createBinaryOperator(context, "a < b", NUMBER, NUMBER, BOOLEAN));
128
+ // ops.add(createBinaryOperator(context, "a > b", NUMBER, NUMBER, BOOLEAN));
129
+ // ops.add(createBinaryOperator(context, "a <= b", NUMBER, NUMBER, BOOLEAN));
130
+ // ops.add(createBinaryOperator(context, "a >= b", NUMBER, NUMBER, BOOLEAN));
131
+
132
+ // bitwise
133
+ // ops.add(createBinaryOperator(context, "a << b", NUMBER, NUMBER, NUMBER));
134
+ // ops.add(createBinaryOperator(context, "a >> b", NUMBER, NUMBER, NUMBER));
135
+ // ops.add(createBinaryOperator(context, "a & b", NUMBER, NUMBER, NUMBER));
136
+ // ops.add(createBinaryOperator(context, "a | b", NUMBER, NUMBER, NUMBER));
137
+ // ops.add(createBinaryOperator(context, "a ^ b", NUMBER, NUMBER, NUMBER));
138
+
139
+ // logical
140
+ // ops.add(createBinaryOperator(context, "a && b", ANY, ANY, ANY));
141
+ // ops.add(createBinaryOperator(context, "a || b", ANY, ANY, ANY));
142
+
143
+ // unary operators
144
+ // ops.add(createUnaryOperator(context, "+a", NUMBER, NUMBER));
145
+ // ops.add(createUnaryOperator(context, "-a", NUMBER, NUMBER));
146
+ // ops.add(createUnaryOperator(context, "~a", NUMBER, NUMBER));
147
+ // ops.add(createUnaryOperator(context, "!a", ANY, BOOLEAN));
148
+
110
149
return Collections .unmodifiableList (ops );
111
150
}
112
151
@@ -121,7 +160,9 @@ public Collection<? extends Snippet> createStatements(Context context) {
121
160
res .add (createStatement (context , "until" , "-> c { until c; break; end }" , ANY , NULL ));
122
161
res .add (createStatement (context , "do while" , "-> c { begin; break; end while c }" , ANY , NULL ));
123
162
res .add (createStatement (context , "do until" , "-> c { begin; break; end until c }" , ANY , NULL ));
163
+ // res.add(createStatement(context, "for", "-> array { for e in array do; end }", ARRAY, ARRAY));
124
164
res .add (createStatement (context , "case" , "-> e { case e; when Integer; 1; else 2; end }" , ANY , NUMBER ));
165
+ // res.add(createStatement(context, "raise", "-> msg { begin; raise msg; rescue => e; e; end}", STRING, OBJECT));
125
166
return Collections .unmodifiableList (res );
126
167
}
127
168
@@ -197,6 +238,12 @@ private Snippet createValueConstructor(Context context, String value, TypeDescri
197
238
return Snippet .newBuilder (value , context .eval (getId (), String .format ("-> { %s }" , value )), type ).build ();
198
239
}
199
240
241
+ // private Snippet createUnaryOperator(Context context, String operator, TypeDescriptor operandType,
242
+ // TypeDescriptor returnType) {
243
+ // final Value function = context.eval(getId(), String.format("-> a { %s }", operator));
244
+ // return Snippet.newBuilder(operator, function, returnType).parameterTypes(operandType).build();
245
+ // }
246
+
200
247
private Snippet createBinaryOperator (Context context , String operator , TypeDescriptor lhsType ,
201
248
TypeDescriptor rhsType , TypeDescriptor returnType ) {
202
249
final Value function = context .eval (getId (), String .format ("-> a, b { %s }" , operator ));
0 commit comments