/* * Copyright 2014 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.errorprone.util; import com.sun.source.tree.Tree; /** * The precedence for an operator kind in the {@link com.sun.source.tree} API. * * As documented at: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html */ public enum OperatorPrecedence { POSTFIX(13), UNARY(12), MULTIPLICATIVE(11), ADDITIVE(10), SHIFT(9), RELATIONAL(8), EQUALITY(7), AND(6), XOR(5), OR(4), CONDITIONAL_AND(3), CONDITIONAL_OR(2), TERNARY(1), ASSIGNMENT(0); private final int precedence; private OperatorPrecedence(int precedence) { this.precedence = precedence; } public boolean isHigher(OperatorPrecedence other) { return precedence > other.precedence; } public static OperatorPrecedence from(Tree.Kind kind) { switch (kind) { case POSTFIX_DECREMENT: case POSTFIX_INCREMENT: return OperatorPrecedence.POSTFIX; case PREFIX_DECREMENT: case PREFIX_INCREMENT: return OperatorPrecedence.UNARY; case MULTIPLY: case DIVIDE: case REMAINDER: return OperatorPrecedence.MULTIPLICATIVE; case PLUS: case MINUS: return OperatorPrecedence.ADDITIVE; case RIGHT_SHIFT: case UNSIGNED_RIGHT_SHIFT: case LEFT_SHIFT: return OperatorPrecedence.SHIFT; case LESS_THAN: case LESS_THAN_EQUAL: case GREATER_THAN: case GREATER_THAN_EQUAL: case INSTANCE_OF: return OperatorPrecedence.RELATIONAL; case EQUAL_TO: case NOT_EQUAL_TO: return OperatorPrecedence.EQUALITY; case AND: return OperatorPrecedence.AND; case XOR: return OperatorPrecedence.XOR; case OR: return OperatorPrecedence.OR; case CONDITIONAL_AND: return OperatorPrecedence.CONDITIONAL_AND; case CONDITIONAL_OR: return OperatorPrecedence.CONDITIONAL_OR; case ASSIGNMENT: case MULTIPLY_ASSIGNMENT: case DIVIDE_ASSIGNMENT: case REMAINDER_ASSIGNMENT: case PLUS_ASSIGNMENT: case MINUS_ASSIGNMENT: case LEFT_SHIFT_ASSIGNMENT: case AND_ASSIGNMENT: case XOR_ASSIGNMENT: case OR_ASSIGNMENT: case RIGHT_SHIFT_ASSIGNMENT: case UNSIGNED_RIGHT_SHIFT_ASSIGNMENT: return OperatorPrecedence.ASSIGNMENT; default: throw new IllegalArgumentException("Unexpected operator kind: " + kind); } } }