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 com.google.dart.compiler.backend.js.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    }