28 import jdk.nashorn.internal.ir.annotations.Immutable;
29 import jdk.nashorn.internal.ir.visitor.NodeVisitor;
30 import jdk.nashorn.internal.parser.Token;
31
32 /**
33 * Node represents a var/let declaration.
34 */
35 @Immutable
36 public final class VarNode extends Statement implements Assignment<IdentNode> {
37 private static final long serialVersionUID = 1L;
38
39 /** Var name. */
40 private final IdentNode name;
41
42 /** Initialization expression. */
43 private final Expression init;
44
45 /** Is this a var statement (as opposed to a "var" in a for loop statement) */
46 private final int flags;
47
48 /** Flag for ES6 LET declaration */
49 public static final int IS_LET = 1 << 0;
50
51 /** Flag for ES6 CONST declaration */
52 public static final int IS_CONST = 1 << 1;
53
54 /** Flag that determines if this is the last function declaration in a function
55 * This is used to micro optimize the placement of return value assignments for
56 * a program node */
57 public static final int IS_LAST_FUNCTION_DECLARATION = 1 << 2;
58
59 /**
60 * Constructor
61 *
62 * @param lineNumber line number
63 * @param token token
64 * @param finish finish
65 * @param name name of variable
66 * @param init init node or null if just a declaration
67 */
68 public VarNode(final int lineNumber, final long token, final int finish, final IdentNode name, final Expression init) {
69 this(lineNumber, token, finish, name, init, 0);
70 }
71
72 private VarNode(final VarNode varNode, final IdentNode name, final Expression init, final int flags) {
73 super(varNode);
74 this.name = init == null ? name : name.setIsInitializedHere();
75 this.init = init;
76 this.flags = flags;
77 }
78
79 /**
80 * Constructor
81 *
82 * @param lineNumber line number
83 * @param token token
84 * @param finish finish
85 * @param name name of variable
86 * @param init init node or null if just a declaration
87 * @param flags flags
88 */
89 public VarNode(final int lineNumber, final long token, final int finish, final IdentNode name, final Expression init, final int flags) {
90 super(lineNumber, token, finish);
91
92 this.name = init == null ? name : name.setIsInitializedHere();
93 this.init = init;
94 this.flags = flags;
95 }
96
97 @Override
98 public boolean isAssignment() {
99 return hasInit();
100 }
101
102 @Override
103 public IdentNode getAssignmentDest() {
104 return isAssignment() ? name : null;
105 }
106
107 @Override
108 public VarNode setAssignmentDest(final IdentNode n) {
109 return setName(n);
110 }
111
112 @Override
113 public Expression getAssignmentSource() {
114 return isAssignment() ? getInit() : null;
|
28 import jdk.nashorn.internal.ir.annotations.Immutable;
29 import jdk.nashorn.internal.ir.visitor.NodeVisitor;
30 import jdk.nashorn.internal.parser.Token;
31
32 /**
33 * Node represents a var/let declaration.
34 */
35 @Immutable
36 public final class VarNode extends Statement implements Assignment<IdentNode> {
37 private static final long serialVersionUID = 1L;
38
39 /** Var name. */
40 private final IdentNode name;
41
42 /** Initialization expression. */
43 private final Expression init;
44
45 /** Is this a var statement (as opposed to a "var" in a for loop statement) */
46 private final int flags;
47
48 /**
49 * source order id to be used for this node. If this is -1, then we
50 * the default which is start position of this node. See also the
51 * method Node::getSourceOrder.
52 */
53 private final int sourceOrder;
54
55 /** Flag for ES6 LET declaration */
56 public static final int IS_LET = 1 << 0;
57
58 /** Flag for ES6 CONST declaration */
59 public static final int IS_CONST = 1 << 1;
60
61 /** Flag that determines if this is the last function declaration in a function
62 * This is used to micro optimize the placement of return value assignments for
63 * a program node */
64 public static final int IS_LAST_FUNCTION_DECLARATION = 1 << 2;
65
66 /**
67 * Constructor
68 *
69 * @param lineNumber line number
70 * @param token token
71 * @param finish finish
72 * @param name name of variable
73 * @param init init node or null if just a declaration
74 */
75 public VarNode(final int lineNumber, final long token, final int finish, final IdentNode name, final Expression init) {
76 this(lineNumber, token, finish, name, init, 0);
77 }
78
79 private VarNode(final VarNode varNode, final IdentNode name, final Expression init, final int flags) {
80 super(varNode);
81 this.sourceOrder = -1;
82 this.name = init == null ? name : name.setIsInitializedHere();
83 this.init = init;
84 this.flags = flags;
85 }
86
87 /**
88 * Constructor
89 *
90 * @param lineNumber line number
91 * @param token token
92 * @param finish finish
93 * @param name name of variable
94 * @param init init node or null if just a declaration
95 * @param flags flags
96 */
97 public VarNode(final int lineNumber, final long token, final int finish, final IdentNode name, final Expression init, final int flags) {
98 this(lineNumber, token, -1, finish, name, init, flags);
99 }
100
101 /**
102 * Constructor
103 *
104 * @param lineNumber line number
105 * @param token token
106 * @param sourceOrder source order
107 * @param finish finish
108 * @param name name of variable
109 * @param init init node or null if just a declaration
110 * @param flags flags
111 */
112 public VarNode(final int lineNumber, final long token, final int sourceOrder, final int finish, final IdentNode name, final Expression init, final int flags) {
113 super(lineNumber, token, finish);
114 this.sourceOrder = sourceOrder;
115 this.name = init == null ? name : name.setIsInitializedHere();
116 this.init = init;
117 this.flags = flags;
118 }
119
120 @Override
121 public int getSourceOrder() {
122 return sourceOrder == -1? super.getSourceOrder() : sourceOrder;
123 }
124
125 @Override
126 public boolean isAssignment() {
127 return hasInit();
128 }
129
130 @Override
131 public IdentNode getAssignmentDest() {
132 return isAssignment() ? name : null;
133 }
134
135 @Override
136 public VarNode setAssignmentDest(final IdentNode n) {
137 return setName(n);
138 }
139
140 @Override
141 public Expression getAssignmentSource() {
142 return isAssignment() ? getInit() : null;
|