1 /*
2 * Copyright (c) 2010, 2013, 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
31
32 /**
33 * IR representation of a property access (period operator.)
34 */
35 @Immutable
36 public final class AccessNode extends BaseNode {
37 private static final long serialVersionUID = 1L;
38
39 /** Property name. */
40 private final String property;
41
42 /**
43 * Constructor
44 *
45 * @param token token
46 * @param finish finish
47 * @param base base node
48 * @param property property
49 */
50 public AccessNode(final long token, final int finish, final Expression base, final String property) {
51 super(token, finish, base, false);
52 this.property = property;
53 }
54
55 private AccessNode(final AccessNode accessNode, final Expression base, final String property, final boolean isFunction, final Type type, final int id) {
56 super(accessNode, base, isFunction, type, id);
57 this.property = property;
58 }
59
60 /**
61 * Assist in IR navigation.
62 * @param visitor IR navigating visitor.
63 */
64 @Override
65 public Node accept(final NodeVisitor<? extends LexicalContext> visitor) {
66 if (visitor.enterAccessNode(this)) {
67 return visitor.leaveAccessNode(
68 setBase((Expression)base.accept(visitor)));
69 }
70 return this;
71 }
72
73 @Override
74 public void toString(final StringBuilder sb, final boolean printType) {
75 final boolean needsParen = tokenType().needsParens(getBase().tokenType(), true);
76
88 sb.append(')');
89 }
90 sb.append('.');
91
92 sb.append(property);
93 }
94
95 /**
96 * Get the property name
97 *
98 * @return the property name
99 */
100 public String getProperty() {
101 return property;
102 }
103
104 private AccessNode setBase(final Expression base) {
105 if (this.base == base) {
106 return this;
107 }
108 return new AccessNode(this, base, property, isFunction(), type, programPoint);
109 }
110
111 @Override
112 public AccessNode setType(final Type type) {
113 if (this.type == type) {
114 return this;
115 }
116 return new AccessNode(this, base, property, isFunction(), type, programPoint);
117 }
118
119 @Override
120 public AccessNode setProgramPoint(final int programPoint) {
121 if (this.programPoint == programPoint) {
122 return this;
123 }
124 return new AccessNode(this, base, property, isFunction(), type, programPoint);
125 }
126
127 @Override
128 public AccessNode setIsFunction() {
129 if (isFunction()) {
130 return this;
131 }
132 return new AccessNode(this, base, property, true, type, programPoint);
133 }
134 }
|
1 /*
2 * Copyright (c) 2010, 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
31
32 /**
33 * IR representation of a property access (period operator.)
34 */
35 @Immutable
36 public final class AccessNode extends BaseNode {
37 private static final long serialVersionUID = 1L;
38
39 /** Property name. */
40 private final String property;
41
42 /**
43 * Constructor
44 *
45 * @param token token
46 * @param finish finish
47 * @param base base node
48 * @param property property
49 */
50 public AccessNode(final long token, final int finish, final Expression base, final String property) {
51 super(token, finish, base, false, false);
52 this.property = property;
53 }
54
55 private AccessNode(final AccessNode accessNode, final Expression base, final String property, final boolean isFunction,
56 final Type type, final int id, final boolean isSuper) {
57 super(accessNode, base, isFunction, type, id, isSuper);
58 this.property = property;
59 }
60
61 /**
62 * Assist in IR navigation.
63 * @param visitor IR navigating visitor.
64 */
65 @Override
66 public Node accept(final NodeVisitor<? extends LexicalContext> visitor) {
67 if (visitor.enterAccessNode(this)) {
68 return visitor.leaveAccessNode(
69 setBase((Expression)base.accept(visitor)));
70 }
71 return this;
72 }
73
74 @Override
75 public void toString(final StringBuilder sb, final boolean printType) {
76 final boolean needsParen = tokenType().needsParens(getBase().tokenType(), true);
77
89 sb.append(')');
90 }
91 sb.append('.');
92
93 sb.append(property);
94 }
95
96 /**
97 * Get the property name
98 *
99 * @return the property name
100 */
101 public String getProperty() {
102 return property;
103 }
104
105 private AccessNode setBase(final Expression base) {
106 if (this.base == base) {
107 return this;
108 }
109 return new AccessNode(this, base, property, isFunction(), type, programPoint, isSuper());
110 }
111
112 @Override
113 public AccessNode setType(final Type type) {
114 if (this.type == type) {
115 return this;
116 }
117 return new AccessNode(this, base, property, isFunction(), type, programPoint, isSuper());
118 }
119
120 @Override
121 public AccessNode setProgramPoint(final int programPoint) {
122 if (this.programPoint == programPoint) {
123 return this;
124 }
125 return new AccessNode(this, base, property, isFunction(), type, programPoint, isSuper());
126 }
127
128 @Override
129 public AccessNode setIsFunction() {
130 if (isFunction()) {
131 return this;
132 }
133 return new AccessNode(this, base, property, true, type, programPoint, isSuper());
134 }
135
136 @Override
137 public AccessNode setIsSuper() {
138 if (isSuper()) {
139 return this;
140 }
141 return new AccessNode(this, base, property, isFunction(), type, programPoint, true);
142 }
143 }
|