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