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