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 /**
  29  * Common interface for all nodes in an abstract syntax tree.
  30  *
  31  * <p><b>WARNING:</b> This interface and its sub-interfaces are
  32  * subject to change as the ECMAScript  programming language evolves.
  33  *
  34  * @deprecated Nashorn JavaScript script engine and APIs, and the jjs tool
  35  * are deprecated with the intent to remove them in a future release.
  36  *
  37  * @since 9
  38  */
  39 @Deprecated(since="11", forRemoval=true)
  40 public interface Tree {
  41 
  42     /**
  43      * Enumerates all kinds of trees.
  44      *
  45      * @deprecated Nashorn JavaScript script engine and APIs, and the jjs tool
  46      * are deprecated with the intent to remove them in a future release.
  47      */
  48     @Deprecated(since="11", forRemoval=true)
  49     public enum Kind {
  50         /**
  51          * Used for instances of {@link ArrayAccessTree}.
  52          */
  53         ARRAY_ACCESS(ArrayAccessTree.class),
  54 
  55         /**
  56          * Used for instances of {@link ArrayLiteralTree}.
  57          */
  58         ARRAY_LITERAL(ArrayLiteralTree.class),
  59 
  60         /**
  61          * Used for instances of {@link AssignmentTree}.
  62          */
  63         ASSIGNMENT(AssignmentTree.class),
  64 
  65         /**
  66          * Used for instances of {@link BlockTree}.
  67          */
  68         BLOCK(BlockTree.class),
  69 
  70         /**
  71          * Used for instances of {@link BreakTree}.
  72          */
  73         BREAK(BreakTree.class),
  74 
  75         /**
  76          * Used for instances of {@link ClassDeclarationTree}.
  77          */
  78         CLASS(ClassDeclarationTree.class),
  79 
  80         /**
  81          * Used for instances of {@link ClassExpressionTree}.
  82          */
  83         CLASS_EXPRESSION(ClassExpressionTree.class),
  84 
  85         /**
  86          * Used for instances of {@link CaseTree}.
  87          */
  88         CASE(CaseTree.class),
  89 
  90         /**
  91          * Used for instances of {@link CatchTree}.
  92          */
  93         CATCH(CatchTree.class),
  94 
  95         /**
  96          * Used for instances of {@link CompilationUnitTree}.
  97          */
  98         COMPILATION_UNIT(CompilationUnitTree.class),
  99 
 100         /**
 101          * Used for instances of {@link ConditionalExpressionTree}.
 102          */
 103         CONDITIONAL_EXPRESSION(ConditionalExpressionTree.class),
 104 
 105         /**
 106          * Used for instances of {@link ContinueTree}.
 107          */
 108         CONTINUE(ContinueTree.class),
 109 
 110         /**
 111          * Used for instances of {@link DoWhileLoopTree}.
 112          */
 113         DO_WHILE_LOOP(DoWhileLoopTree.class),
 114 
 115         /**
 116          * Used for instances of {@link DebuggerTree}.
 117          */
 118         DEBUGGER(DebuggerTree.class),
 119 
 120         /**
 121          * Used for instances of {@link ForInLoopTree}.
 122          */
 123         FOR_IN_LOOP(ForInLoopTree.class),
 124 
 125         /**
 126          * Used for instances of {@link FunctionExpressionTree}.
 127          */
 128         FUNCTION_EXPRESSION(FunctionExpressionTree.class),
 129 
 130         /**
 131          * Used for instances of {@link ErroneousTree}.
 132          */
 133         ERROR(ErroneousTree.class),
 134 
 135         /**
 136          * Used for instances of {@link ExpressionStatementTree}.
 137          */
 138         EXPRESSION_STATEMENT(ExpressionStatementTree.class),
 139 
 140         /**
 141          * Used for instances of {@link MemberSelectTree}.
 142          */
 143         MEMBER_SELECT(MemberSelectTree.class),
 144 
 145         /**
 146          * Used for instances of {@link ForLoopTree}.
 147          */
 148         FOR_LOOP(ForLoopTree.class),
 149 
 150         /**
 151          * Used for instances of {@link IdentifierTree}.
 152          */
 153         IDENTIFIER(IdentifierTree.class),
 154 
 155         /**
 156          * Used for instances of {@link IfTree}.
 157          */
 158         IF(IfTree.class),
 159 
 160         /**
 161          * Used for instances of {@link InstanceOfTree}.
 162          */
 163         INSTANCE_OF(InstanceOfTree.class),
 164 
 165         /**
 166          * Used for instances of {@link LabeledStatementTree}.
 167          */
 168         LABELED_STATEMENT(LabeledStatementTree.class),
 169 
 170         /**
 171          * Used for instances of {@link ModuleTree}.
 172          */
 173         MODULE(ModuleTree.class),
 174 
 175         /**
 176          * Used for instances of {@link ExportEntryTree}.
 177          */
 178         EXPORT_ENTRY(ExportEntryTree.class),
 179 
 180         /**
 181          * Used for instances of {@link ImportEntryTree}.
 182          */
 183         IMPORT_ENTRY(ImportEntryTree.class),
 184 
 185         /**
 186          * Used for instances of {@link FunctionDeclarationTree}.
 187          */
 188         FUNCTION(FunctionDeclarationTree.class),
 189 
 190         /**
 191          * Used for instances of {@link FunctionCallTree}.
 192          */
 193         FUNCTION_INVOCATION(FunctionCallTree.class),
 194 
 195         /**
 196          * Used for instances of {@link NewTree}.
 197          */
 198         NEW(NewTree.class),
 199 
 200         /**
 201          * Used for instances of {@link ObjectLiteralTree}.
 202          */
 203         OBJECT_LITERAL(ObjectLiteralTree.class),
 204 
 205         /**
 206          * Used for instances of {@link ParenthesizedTree}.
 207          */
 208         PARENTHESIZED(ParenthesizedTree.class),
 209 
 210         /**
 211          * Used for instances of {@link PropertyTree}.
 212          */
 213         PROPERTY(PropertyTree.class),
 214 
 215         /**
 216          * Used for instances of {@link RegExpLiteralTree}.
 217          */
 218         REGEXP_LITERAL(RegExpLiteralTree.class),
 219 
 220         /**
 221          * Used for instances of {@link TemplateLiteralTree}.
 222          */
 223         TEMPLATE_LITERAL(TemplateLiteralTree.class),
 224 
 225         /**
 226          * Used for instances of {@link ReturnTree}.
 227          */
 228         RETURN(ReturnTree.class),
 229 
 230         /**
 231          * Used for instances of {@link EmptyStatementTree}.
 232          */
 233         EMPTY_STATEMENT(EmptyStatementTree.class),
 234 
 235         /**
 236          * Used for instances of {@link SwitchTree}.
 237          */
 238         SWITCH(SwitchTree.class),
 239 
 240         /**
 241          * Used for instances of {@link ThrowTree}.
 242          */
 243         THROW(ThrowTree.class),
 244 
 245         /**
 246          * Used for instances of {@link TryTree}.
 247          */
 248         TRY(TryTree.class),
 249 
 250         /**
 251          * Used for instances of {@link VariableTree}.
 252          */
 253         VARIABLE(VariableTree.class),
 254 
 255         /**
 256          * Used for instances of {@link WhileLoopTree}.
 257          */
 258         WHILE_LOOP(WhileLoopTree.class),
 259 
 260         /**
 261          * Used for instances of {@link WithTree}.
 262          */
 263         WITH(WithTree.class),
 264 
 265         /**
 266          * Used for instances of {@link UnaryTree} representing postfix
 267          * increment operator {@code ++}.
 268          */
 269         POSTFIX_INCREMENT(UnaryTree.class),
 270 
 271         /**
 272          * Used for instances of {@link UnaryTree} representing postfix
 273          * decrement operator {@code --}.
 274          */
 275         POSTFIX_DECREMENT(UnaryTree.class),
 276 
 277         /**
 278          * Used for instances of {@link UnaryTree} representing prefix
 279          * increment operator {@code ++}.
 280          */
 281         PREFIX_INCREMENT(UnaryTree.class),
 282 
 283         /**
 284          * Used for instances of {@link UnaryTree} representing prefix
 285          * decrement operator {@code --}.
 286          */
 287         PREFIX_DECREMENT(UnaryTree.class),
 288 
 289         /**
 290          * Used for instances of {@link UnaryTree} representing unary plus
 291          * operator {@code +}.
 292          */
 293         UNARY_PLUS(UnaryTree.class),
 294 
 295         /**
 296          * Used for instances of {@link UnaryTree} representing unary minus
 297          * operator {@code -}.
 298          */
 299         UNARY_MINUS(UnaryTree.class),
 300 
 301         /**
 302          * Used for instances of {@link UnaryTree} representing bitwise
 303          * complement operator {@code ~}.
 304          */
 305         BITWISE_COMPLEMENT(UnaryTree.class),
 306 
 307         /**
 308          * Used for instances of {@link UnaryTree} representing logical
 309          * complement operator {@code !}.
 310          */
 311         LOGICAL_COMPLEMENT(UnaryTree.class),
 312 
 313         /**
 314          * Used for instances of {@link UnaryTree} representing logical
 315          * delete operator {@code delete}.
 316          */
 317         DELETE(UnaryTree.class),
 318 
 319         /**
 320          * Used for instances of {@link UnaryTree} representing logical
 321          * typeof operator {@code typeof}.
 322          */
 323         TYPEOF(UnaryTree.class),
 324 
 325         /**
 326          * Used for instances of {@link UnaryTree} representing logical
 327          * void operator {@code void}.
 328          */
 329         VOID(UnaryTree.class),
 330 
 331         /**
 332          * Used for instances of {@link BinaryTree} representing
 333          * comma {@code ,}.
 334          */
 335         COMMA(BinaryTree.class),
 336 
 337         /**
 338          * Used for instances of {@link BinaryTree} representing
 339          * multiplication {@code *}.
 340          */
 341         MULTIPLY(BinaryTree.class),
 342 
 343         /**
 344          * Used for instances of {@link BinaryTree} representing
 345          * division {@code /}.
 346          */
 347         DIVIDE(BinaryTree.class),
 348 
 349         /**
 350          * Used for instances of {@link BinaryTree} representing
 351          * remainder {@code %}.
 352          */
 353         REMAINDER(BinaryTree.class),
 354 
 355          /**
 356          * Used for instances of {@link BinaryTree} representing
 357          * addition or string concatenation {@code +}.
 358          */
 359         PLUS(BinaryTree.class),
 360 
 361         /**
 362          * Used for instances of {@link BinaryTree} representing
 363          * subtraction {@code -}.
 364          */
 365         MINUS(BinaryTree.class),
 366 
 367         /**
 368          * Used for instances of {@link BinaryTree} representing
 369          * left shift {@code <<}.
 370          */
 371         LEFT_SHIFT(BinaryTree.class),
 372 
 373         /**
 374          * Used for instances of {@link BinaryTree} representing
 375          * right shift {@code >>}.
 376          */
 377         RIGHT_SHIFT(BinaryTree.class),
 378 
 379         /**
 380          * Used for instances of {@link BinaryTree} representing
 381          * unsigned right shift {@code >>>}.
 382          */
 383         UNSIGNED_RIGHT_SHIFT(BinaryTree.class),
 384 
 385         /**
 386          * Used for instances of {@link BinaryTree} representing
 387          * less-than {@code <}.
 388          */
 389         LESS_THAN(BinaryTree.class),
 390 
 391         /**
 392          * Used for instances of {@link BinaryTree} representing
 393          * greater-than {@code >}.
 394          */
 395         GREATER_THAN(BinaryTree.class),
 396 
 397         /**
 398          * Used for instances of {@link BinaryTree} representing
 399          * less-than-equal {@code <=}.
 400          */
 401         LESS_THAN_EQUAL(BinaryTree.class),
 402 
 403         /**
 404          * Used for instances of {@link BinaryTree} representing
 405          * greater-than-equal {@code >=}.
 406          */
 407         GREATER_THAN_EQUAL(BinaryTree.class),
 408 
 409         /**
 410          * Used for instances of {@link BinaryTree} representing
 411          * in operator {@code in}.
 412          */
 413         IN(BinaryTree.class),
 414 
 415         /**
 416          * Used for instances of {@link BinaryTree} representing
 417          * equal-to {@code ==}.
 418          */
 419         EQUAL_TO(BinaryTree.class),
 420 
 421         /**
 422          * Used for instances of {@link BinaryTree} representing
 423          * not-equal-to {@code !=}.
 424          */
 425         NOT_EQUAL_TO(BinaryTree.class),
 426 
 427         /**
 428          * Used for instances of {@link BinaryTree} representing
 429          * equal-to {@code ===}.
 430          */
 431         STRICT_EQUAL_TO(BinaryTree.class),
 432 
 433         /**
 434          * Used for instances of {@link BinaryTree} representing
 435          * not-equal-to {@code !==}.
 436          */
 437         STRICT_NOT_EQUAL_TO(BinaryTree.class),
 438 
 439         /**
 440          * Used for instances of {@link BinaryTree} representing
 441          * bitwise and logical "and" {@code &}.
 442          */
 443         AND(BinaryTree.class),
 444 
 445         /**
 446          * Used for instances of {@link BinaryTree} representing
 447          * bitwise and logical "xor" {@code ^}.
 448          */
 449         XOR(BinaryTree.class),
 450 
 451         /**
 452          * Used for instances of {@link BinaryTree} representing
 453          * bitwise and logical "or" {@code |}.
 454          */
 455         OR(BinaryTree.class),
 456 
 457         /**
 458          * Used for instances of {@link BinaryTree} representing
 459          * conditional-and {@code &&}.
 460          */
 461         CONDITIONAL_AND(BinaryTree.class),
 462 
 463         /**
 464          * Used for instances of {@link BinaryTree} representing
 465          * conditional-or {@code ||}.
 466          */
 467         CONDITIONAL_OR(BinaryTree.class),
 468 
 469         /**
 470          * Used for instances of {@link CompoundAssignmentTree} representing
 471          * multiplication assignment {@code *=}.
 472          */
 473         MULTIPLY_ASSIGNMENT(CompoundAssignmentTree.class),
 474 
 475         /**
 476          * Used for instances of {@link CompoundAssignmentTree} representing
 477          * division assignment {@code /=}.
 478          */
 479         DIVIDE_ASSIGNMENT(CompoundAssignmentTree.class),
 480 
 481         /**
 482          * Used for instances of {@link CompoundAssignmentTree} representing
 483          * remainder assignment {@code %=}.
 484          */
 485         REMAINDER_ASSIGNMENT(CompoundAssignmentTree.class),
 486 
 487         /**
 488          * Used for instances of {@link CompoundAssignmentTree} representing
 489          * addition or string concatenation assignment {@code +=}.
 490          */
 491         PLUS_ASSIGNMENT(CompoundAssignmentTree.class),
 492 
 493         /**
 494          * Used for instances of {@link CompoundAssignmentTree} representing
 495          * subtraction assignment {@code -=}.
 496          */
 497         MINUS_ASSIGNMENT(CompoundAssignmentTree.class),
 498 
 499         /**
 500          * Used for instances of {@link CompoundAssignmentTree} representing
 501          * left shift assignment {@code <<=}.
 502          */
 503         LEFT_SHIFT_ASSIGNMENT(CompoundAssignmentTree.class),
 504 
 505         /**
 506          * Used for instances of {@link CompoundAssignmentTree} representing
 507          * right shift assignment {@code >>=}.
 508          */
 509         RIGHT_SHIFT_ASSIGNMENT(CompoundAssignmentTree.class),
 510 
 511         /**
 512          * Used for instances of {@link CompoundAssignmentTree} representing
 513          * unsigned right shift assignment {@code >>>=}.
 514          */
 515         UNSIGNED_RIGHT_SHIFT_ASSIGNMENT(CompoundAssignmentTree.class),
 516 
 517         /**
 518          * Used for instances of {@link CompoundAssignmentTree} representing
 519          * bitwise and logical "and" assignment {@code &=}.
 520          */
 521         AND_ASSIGNMENT(CompoundAssignmentTree.class),
 522 
 523         /**
 524          * Used for instances of {@link CompoundAssignmentTree} representing
 525          * bitwise and logical "xor" assignment {@code ^=}.
 526          */
 527         XOR_ASSIGNMENT(CompoundAssignmentTree.class),
 528 
 529         /**
 530          * Used for instances of {@link CompoundAssignmentTree} representing
 531          * bitwise and logical "or" assignment {@code |=}.
 532          */
 533         OR_ASSIGNMENT(CompoundAssignmentTree.class),
 534 
 535         /**
 536          * Used for instances of {@link SpreadTree} representing
 537          * spread "operator" for arrays and function call arguments.
 538          */
 539         SPREAD(SpreadTree.class),
 540 
 541         /**
 542          * Used for instances of {@link YieldTree} representing (generator)
 543          * yield expression {@code yield expr}.
 544          */
 545         YIELD(YieldTree.class),
 546 
 547         /**
 548          * Used for instances of {@link LiteralTree} representing
 549          * a number literal expression of type {@code double}.
 550          */
 551         NUMBER_LITERAL(LiteralTree.class),
 552 
 553         /**
 554          * Used for instances of {@link LiteralTree} representing
 555          * a boolean literal expression of type {@code boolean}.
 556          */
 557         BOOLEAN_LITERAL(LiteralTree.class),
 558 
 559         /**
 560          * Used for instances of {@link LiteralTree} representing
 561          * a string literal expression of type {@link String}.
 562          */
 563         STRING_LITERAL(LiteralTree.class),
 564 
 565         /**
 566          * Used for instances of {@link LiteralTree} representing
 567          * the use of {@code null}.
 568          */
 569         NULL_LITERAL(LiteralTree.class),
 570 
 571         /**
 572          * An implementation-reserved node. This is the not the node
 573          * you are looking for.
 574          */
 575         OTHER(null);
 576 
 577         Kind(final Class<? extends Tree> intf) {
 578             associatedInterface = intf;
 579         }
 580 
 581        /**
 582         * Returns the associated interface type that uses this kind.
 583         * @return the associated interface
 584         */
 585         public Class<? extends Tree> asInterface() {
 586             return associatedInterface;
 587         }
 588 
 589         /**
 590          * Returns if this is a literal tree kind or not.
 591          *
 592          * @return true if this is a literal tree kind, false otherwise
 593          */
 594         public boolean isLiteral() {
 595             return associatedInterface == LiteralTree.class;
 596         }
 597 
 598         /**
 599          * Returns if this is an expression tree kind or not.
 600          *
 601          * @return true if this is an expression tree kind, false otherwise
 602          */
 603         public boolean isExpression() {
 604             return ExpressionTree.class.isAssignableFrom(associatedInterface);
 605         }
 606 
 607         /**
 608          * Returns if this is a statement tree kind or not.
 609          *
 610          * @return true if this is a statement tree kind, false otherwise
 611          */
 612         public boolean isStatement() {
 613             return StatementTree.class.isAssignableFrom(associatedInterface);
 614         }
 615 
 616         private final Class<? extends Tree> associatedInterface;
 617     }
 618 
 619     /**
 620      * Start character offset of this Tree within the source.
 621      *
 622      * @return the position
 623      */
 624     long getStartPosition();
 625 
 626     /**
 627      * End character offset of this Tree within the source.
 628      *
 629      * @return the position
 630      */
 631     long getEndPosition();
 632 
 633     /**
 634      * Gets the kind of this tree.
 635      *
 636      * @return the kind of this tree.
 637      */
 638     Kind getKind();
 639 
 640     /**
 641      * Accept method used to implement the visitor pattern.  The
 642      * visitor pattern is used to implement operations on trees.
 643      *
 644      * @param <R> result type of this operation.
 645      * @param <D> type of additional data.
 646      * @param visitor tree visitor
 647      * @param data additional data passed to visitor methods
 648      * @return the value from visitor's visit methods
 649      */
 650     <R,D> R accept(TreeVisitor<R,D> visitor, D data);
 651 }