217 final Node rhsNode = parent.getExpression();
218
219 if (!(rhsNode instanceof LiteralNode)) {
220 return null;
221 }
222
223 if (rhsNode instanceof ArrayLiteralNode) {
224 return null;
225 }
226
227 final LiteralNode<?> rhs = (LiteralNode<?>)rhsNode;
228 final Type rhsType = rhs.getType();
229 final boolean rhsInteger = rhsType.isInteger() || rhsType.isBoolean();
230
231 LiteralNode<?> literalNode;
232
233 switch (parent.tokenType()) {
234 case ADD:
235 if (rhsInteger) {
236 literalNode = LiteralNode.newInstance(token, finish, rhs.getInt32());
237 } else {
238 literalNode = LiteralNode.newInstance(token, finish, rhs.getNumber());
239 }
240 break;
241 case SUB:
242 if (rhsInteger && rhs.getInt32() != 0) { // @see test/script/basic/minuszero.js
243 literalNode = LiteralNode.newInstance(token, finish, -rhs.getInt32());
244 } else {
245 literalNode = LiteralNode.newInstance(token, finish, -rhs.getNumber());
246 }
247 break;
248 case NOT:
249 literalNode = LiteralNode.newInstance(token, finish, !rhs.getBoolean());
250 break;
251 case BIT_NOT:
252 literalNode = LiteralNode.newInstance(token, finish, ~rhs.getInt32());
253 break;
254 default:
255 return null;
256 }
257
258 return literalNode;
259 }
260 }
261
262 //TODO add AND and OR with one constant parameter (bitwise)
263 private static class BinaryNodeConstantEvaluator extends ConstantEvaluator<BinaryNode> {
|
217 final Node rhsNode = parent.getExpression();
218
219 if (!(rhsNode instanceof LiteralNode)) {
220 return null;
221 }
222
223 if (rhsNode instanceof ArrayLiteralNode) {
224 return null;
225 }
226
227 final LiteralNode<?> rhs = (LiteralNode<?>)rhsNode;
228 final Type rhsType = rhs.getType();
229 final boolean rhsInteger = rhsType.isInteger() || rhsType.isBoolean();
230
231 LiteralNode<?> literalNode;
232
233 switch (parent.tokenType()) {
234 case ADD:
235 if (rhsInteger) {
236 literalNode = LiteralNode.newInstance(token, finish, rhs.getInt32());
237 } else if (rhsType.isLong()) {
238 literalNode = LiteralNode.newInstance(token, finish, rhs.getLong());
239 } else {
240 literalNode = LiteralNode.newInstance(token, finish, rhs.getNumber());
241 }
242 break;
243 case SUB:
244 if (rhsInteger && rhs.getInt32() != 0) { // @see test/script/basic/minuszero.js
245 literalNode = LiteralNode.newInstance(token, finish, -rhs.getInt32());
246 } else if (rhsType.isLong() && rhs.getLong() != 0L) {
247 literalNode = LiteralNode.newInstance(token, finish, -rhs.getLong());
248 } else {
249 literalNode = LiteralNode.newInstance(token, finish, -rhs.getNumber());
250 }
251 break;
252 case NOT:
253 literalNode = LiteralNode.newInstance(token, finish, !rhs.getBoolean());
254 break;
255 case BIT_NOT:
256 literalNode = LiteralNode.newInstance(token, finish, ~rhs.getInt32());
257 break;
258 default:
259 return null;
260 }
261
262 return literalNode;
263 }
264 }
265
266 //TODO add AND and OR with one constant parameter (bitwise)
267 private static class BinaryNodeConstantEvaluator extends ConstantEvaluator<BinaryNode> {
|