| /* |
| * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package com.sun.codemodel.internal; |
| |
| |
| /** |
| * JClass for generating expressions containing operators |
| */ |
| |
| abstract public class JOp { |
| |
| private JOp() { |
| } |
| |
| |
| /** |
| * Determine whether the top level of an expression involves an |
| * operator. |
| */ |
| static boolean hasTopOp(JExpression e) { |
| return (e instanceof UnaryOp) || (e instanceof BinaryOp); |
| } |
| |
| /* -- Unary operators -- */ |
| |
| static private class UnaryOp extends JExpressionImpl { |
| |
| protected String op; |
| protected JExpression e; |
| protected boolean opFirst = true; |
| |
| UnaryOp(String op, JExpression e) { |
| this.op = op; |
| this.e = e; |
| } |
| |
| UnaryOp(JExpression e, String op) { |
| this.op = op; |
| this.e = e; |
| opFirst = false; |
| } |
| |
| public void generate(JFormatter f) { |
| if (opFirst) |
| f.p('(').p(op).g(e).p(')'); |
| else |
| f.p('(').g(e).p(op).p(')'); |
| } |
| |
| } |
| |
| public static JExpression minus(JExpression e) { |
| return new UnaryOp("-", e); |
| } |
| |
| /** |
| * Logical not {@code '!x'}. |
| */ |
| public static JExpression not(JExpression e) { |
| if (e == JExpr.TRUE) return JExpr.FALSE; |
| if (e == JExpr.FALSE) return JExpr.TRUE; |
| return new UnaryOp("!", e); |
| } |
| |
| public static JExpression complement(JExpression e) { |
| return new UnaryOp("~", e); |
| } |
| |
| static private class TightUnaryOp extends UnaryOp { |
| |
| TightUnaryOp(JExpression e, String op) { |
| super(e, op); |
| } |
| |
| public void generate(JFormatter f) { |
| if (opFirst) |
| f.p(op).g(e); |
| else |
| f.g(e).p(op); |
| } |
| |
| } |
| |
| public static JExpression incr(JExpression e) { |
| return new TightUnaryOp(e, "++"); |
| } |
| |
| public static JExpression decr(JExpression e) { |
| return new TightUnaryOp(e, "--"); |
| } |
| |
| |
| /* -- Binary operators -- */ |
| |
| static private class BinaryOp extends JExpressionImpl { |
| |
| String op; |
| JExpression left; |
| JGenerable right; |
| |
| BinaryOp(String op, JExpression left, JGenerable right) { |
| this.left = left; |
| this.op = op; |
| this.right = right; |
| } |
| |
| public void generate(JFormatter f) { |
| f.p('(').g(left).p(op).g(right).p(')'); |
| } |
| |
| } |
| |
| public static JExpression plus(JExpression left, JExpression right) { |
| return new BinaryOp("+", left, right); |
| } |
| |
| public static JExpression minus(JExpression left, JExpression right) { |
| return new BinaryOp("-", left, right); |
| } |
| |
| public static JExpression mul(JExpression left, JExpression right) { |
| return new BinaryOp("*", left, right); |
| } |
| |
| public static JExpression div(JExpression left, JExpression right) { |
| return new BinaryOp("/", left, right); |
| } |
| |
| public static JExpression mod(JExpression left, JExpression right) { |
| return new BinaryOp("%", left, right); |
| } |
| |
| public static JExpression shl(JExpression left, JExpression right) { |
| return new BinaryOp("<<", left, right); |
| } |
| |
| public static JExpression shr(JExpression left, JExpression right) { |
| return new BinaryOp(">>", left, right); |
| } |
| |
| public static JExpression shrz(JExpression left, JExpression right) { |
| return new BinaryOp(">>>", left, right); |
| } |
| |
| public static JExpression band(JExpression left, JExpression right) { |
| return new BinaryOp("&", left, right); |
| } |
| |
| public static JExpression bor(JExpression left, JExpression right) { |
| return new BinaryOp("|", left, right); |
| } |
| |
| public static JExpression cand(JExpression left, JExpression right) { |
| if (left == JExpr.TRUE) return right; |
| if (right == JExpr.TRUE) return left; |
| if (left == JExpr.FALSE) return left; // JExpr.FALSE |
| if (right == JExpr.FALSE) return right; // JExpr.FALSE |
| return new BinaryOp("&&", left, right); |
| } |
| |
| public static JExpression cor(JExpression left, JExpression right) { |
| if (left == JExpr.TRUE) return left; // JExpr.TRUE |
| if (right == JExpr.TRUE) return right; // JExpr.FALSE |
| if (left == JExpr.FALSE) return right; |
| if (right == JExpr.FALSE) return left; |
| return new BinaryOp("||", left, right); |
| } |
| |
| public static JExpression xor(JExpression left, JExpression right) { |
| return new BinaryOp("^", left, right); |
| } |
| |
| public static JExpression lt(JExpression left, JExpression right) { |
| return new BinaryOp("<", left, right); |
| } |
| |
| public static JExpression lte(JExpression left, JExpression right) { |
| return new BinaryOp("<=", left, right); |
| } |
| |
| public static JExpression gt(JExpression left, JExpression right) { |
| return new BinaryOp(">", left, right); |
| } |
| |
| public static JExpression gte(JExpression left, JExpression right) { |
| return new BinaryOp(">=", left, right); |
| } |
| |
| public static JExpression eq(JExpression left, JExpression right) { |
| return new BinaryOp("==", left, right); |
| } |
| |
| public static JExpression ne(JExpression left, JExpression right) { |
| return new BinaryOp("!=", left, right); |
| } |
| |
| public static JExpression _instanceof(JExpression left, JType right) { |
| return new BinaryOp("instanceof", left, right); |
| } |
| |
| /* -- Ternary operators -- */ |
| |
| static private class TernaryOp extends JExpressionImpl { |
| |
| String op1; |
| String op2; |
| JExpression e1; |
| JExpression e2; |
| JExpression e3; |
| |
| TernaryOp(String op1, String op2, |
| JExpression e1, JExpression e2, JExpression e3) { |
| this.e1 = e1; |
| this.op1 = op1; |
| this.e2 = e2; |
| this.op2 = op2; |
| this.e3 = e3; |
| } |
| |
| public void generate(JFormatter f) { |
| f.p('(').g(e1).p(op1).g(e2).p(op2).g(e3).p(')'); |
| } |
| |
| } |
| |
| public static JExpression cond(JExpression cond, |
| JExpression ifTrue, JExpression ifFalse) { |
| return new TernaryOp("?", ":", cond, ifTrue, ifFalse); |
| } |
| |
| } |