1 /*
   2  * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package jdk.nashorn.api.tree;
  27 
  28 import jdk.nashorn.internal.ir.Node;
  29 
  30 import jdk.nashorn.internal.parser.TokenType;
  31 
  32 abstract class TreeImpl implements Tree {
  33     protected final Node node;
  34 
  35     TreeImpl(final Node node) {
  36         this.node = node;
  37     }
  38 
  39     @Override
  40     public long getStartPosition() {
  41         return node.getStart();
  42     }
  43 
  44     @Override
  45     public long getEndPosition() {
  46         return node.getFinish();
  47     }
  48 
  49     @Override
  50     public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
  51         return visitor.visitUnknown(this, data);
  52     }
  53 
  54     static Kind getOperator(final TokenType tt) {
  55         switch(tt) {
  56             case NEW:
  57                 return Kind.NEW;
  58             case NOT:
  59                 return Kind.LOGICAL_COMPLEMENT;
  60             case NE:
  61                 return Kind.NOT_EQUAL_TO;
  62             case NE_STRICT:
  63                 return Kind.STRICT_NOT_EQUAL_TO;
  64             case MOD:
  65                 return Kind.REMAINDER;
  66             case ASSIGN_MOD:
  67                 return Kind.REMAINDER_ASSIGNMENT;
  68             case BIT_AND:
  69                 return Kind.AND;
  70             case AND:
  71                 return Kind.CONDITIONAL_AND;
  72             case ASSIGN_BIT_AND:
  73                 return Kind.AND_ASSIGNMENT;
  74             case MUL:
  75                 return Kind.MULTIPLY;
  76             case ASSIGN_MUL:
  77                 return Kind.MULTIPLY_ASSIGNMENT;
  78             case POS:
  79                 return Kind.UNARY_PLUS;
  80             case ADD:
  81                 return Kind.PLUS;
  82             case INCPREFIX:
  83                 return Kind.PREFIX_INCREMENT;
  84             case INCPOSTFIX:
  85                 return Kind.POSTFIX_INCREMENT;
  86             case ASSIGN_ADD:
  87                 return Kind.PLUS_ASSIGNMENT;
  88             case NEG:
  89                 return Kind.UNARY_MINUS;
  90             case SUB:
  91                 return Kind.MINUS;
  92             case DECPREFIX:
  93                 return Kind.PREFIX_DECREMENT;
  94             case DECPOSTFIX:
  95                 return Kind.POSTFIX_DECREMENT;
  96             case ASSIGN_SUB:
  97                 return Kind.MINUS_ASSIGNMENT;
  98             case DIV:
  99                 return Kind.DIVIDE;
 100             case ASSIGN_DIV:
 101                 return Kind.DIVIDE_ASSIGNMENT;
 102             case LT:
 103                 return Kind.LESS_THAN;
 104             case SHL:
 105                 return Kind.LEFT_SHIFT;
 106             case ASSIGN_SHL:
 107                 return Kind.LEFT_SHIFT_ASSIGNMENT;
 108             case LE:
 109                 return Kind.LESS_THAN_EQUAL;
 110             case ASSIGN:
 111                 return Kind.ASSIGNMENT;
 112             case EQ:
 113                 return Kind.EQUAL_TO;
 114             case EQ_STRICT:
 115                 return Kind.STRICT_EQUAL_TO;
 116             case GT:
 117                 return Kind.GREATER_THAN;
 118             case GE:
 119                 return Kind.GREATER_THAN_EQUAL;
 120             case SAR:
 121                 return Kind.RIGHT_SHIFT;
 122             case ASSIGN_SAR:
 123                 return Kind.RIGHT_SHIFT_ASSIGNMENT;
 124             case SHR:
 125                 return Kind.UNSIGNED_RIGHT_SHIFT;
 126             case ASSIGN_SHR:
 127                 return Kind.UNSIGNED_RIGHT_SHIFT_ASSIGNMENT;
 128             case TERNARY:
 129                 return Kind.CONDITIONAL_EXPRESSION;
 130             case BIT_XOR:
 131                 return Kind.XOR;
 132             case ASSIGN_BIT_XOR:
 133                 return Kind.XOR_ASSIGNMENT;
 134             case BIT_OR:
 135                 return Kind.OR;
 136             case ASSIGN_BIT_OR:
 137                 return Kind.OR_ASSIGNMENT;
 138             case OR:
 139                 return Kind.CONDITIONAL_OR;
 140             case BIT_NOT:
 141                 return Kind.BITWISE_COMPLEMENT;
 142             case DELETE:
 143                 return Kind.DELETE;
 144             case SPREAD_ARRAY:
 145             case SPREAD_ARGUMENT:
 146                 return Kind.SPREAD;
 147             case TYPEOF:
 148                 return Kind.TYPEOF;
 149             case VOID:
 150                 return Kind.VOID;
 151             case YIELD:
 152                 return Kind.YIELD;
 153             case IN:
 154                 return Kind.IN;
 155             case INSTANCEOF:
 156                 return Kind.INSTANCE_OF;
 157             case COMMARIGHT:
 158                 return Kind.COMMA;
 159             default:
 160                 throw new AssertionError("should not reach here: " + tt);
 161         }
 162     }
 163 }