001 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
002 // for details. All rights reserved. Use of this source code is governed by a
003 // BSD-style license that can be found in the LICENSE file.
004
005 package org.jetbrains.kotlin.js.backend.ast;
006
007 /**
008 * A JavaScript unary operator.
009 */
010 public enum JsUnaryOperator implements JsOperator {
011
012 /*
013 * Precedence indices from "JavaScript - The Definitive Guide" 4th Edition
014 * (page 57)
015 */
016 BIT_NOT("~", 14, PREFIX), DEC("--", 14, POSTFIX | PREFIX), DELETE("delete", 14, PREFIX), INC(
017 "++", 14, POSTFIX | PREFIX), NEG("-", 14, PREFIX), POS("+", 14, PREFIX),
018 NOT("!", 14, PREFIX), TYPEOF("typeof", 14, PREFIX), VOID("void", 14, PREFIX);
019
020 private final int mask;
021 private final int precedence;
022 private final String symbol;
023
024 private JsUnaryOperator(String symbol, int precedence, int mask) {
025 this.symbol = symbol;
026 this.precedence = precedence;
027 this.mask = mask;
028 }
029
030 @Override
031 public int getPrecedence() {
032 return precedence;
033 }
034
035 @Override
036 public String getSymbol() {
037 return symbol;
038 }
039
040 @Override
041 public boolean isKeyword() {
042 return this == DELETE || this == TYPEOF || this == VOID;
043 }
044
045 @Override
046 public boolean isLeftAssociative() {
047 return (mask & LEFT) != 0;
048 }
049
050 public boolean isModifying() {
051 return this == DEC || this == INC || this == DELETE;
052 }
053
054 @Override
055 public boolean isPrecedenceLessThan(JsOperator other) {
056 return precedence < other.getPrecedence();
057 }
058
059 @Override
060 public boolean isValidInfix() {
061 return (mask & INFIX) != 0;
062 }
063
064 @Override
065 public boolean isValidPostfix() {
066 return (mask & POSTFIX) != 0;
067 }
068
069 @Override
070 public boolean isValidPrefix() {
071 return (mask & PREFIX) != 0;
072 }
073
074 @Override
075 public String toString() {
076 return symbol;
077 }
078 }