EclipseJDT Source Viewer

Home|eclipse_jdt/src/org/eclipse/jdt/core/dom/MemberValuePairBinding.java
1/*******************************************************************************
2 * Copyright (c) 2005, 2021 BEA Systems, Inc.
3 *
4 * This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License 2.0
6 * which accompanies this distribution, and is available at
7 * https://www.eclipse.org/legal/epl-2.0/
8 *
9 * SPDX-License-Identifier: EPL-2.0
10 *
11 * Contributors:
12 *    tyeung@bea.com - initial API and implementation
13 *    IBM Corporation - implemented methods from IBinding
14 *    IBM Corporation - renamed from ResolvedMemberValuePair to MemberValuePairBinding
15 *    jgarms@bea.com - Fix for IllegalStateException
16 *    IBM Corporation - Fix for 223225
17 *******************************************************************************/
18package org.eclipse.jdt.core.dom;
19
20import org.eclipse.jdt.core.IJavaElement;
21import org.eclipse.jdt.internal.compiler.impl.Constant;
22import org.eclipse.jdt.internal.compiler.lookup.ElementValuePair;
23import org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
24import org.eclipse.jdt.internal.compiler.lookup.TypeIds;
25
26/**
27 * Internal class.
28 */
29class MemberValuePairBinding implements IMemberValuePairBinding {
30    static final MemberValuePairBinding[] NoPair = new MemberValuePairBinding[0];
31    private static final Object NoValue = new Object();
32    private static final Object[] EmptyArray = new Object[0];
33
34    private ElementValuePair internalPair;
35    protected Object value = null;
36    protected BindingResolver bindingResolver;
37
38    static void appendValue(Object valueStringBuffer buffer) {
39        if (value instanceof Object[]) {
40            Object[] values = (Object[]) value;
41            buffer.append('{');
42            for (int i = 0l = values.lengthi < li++) {
43                if (i != 0)
44                    buffer.append(", "); //$NON-NLS-1$
45                appendValue(values[i], buffer);
46            }
47            buffer.append('}');
48        } else if (value instanceof ITypeBinding) {
49            buffer.append(((ITypeBindingvalue).getName());
50            buffer.append(".class"); //$NON-NLS-1$
51        } else {
52            buffer.append(value);
53        }
54    }
55
56    static Object buildDOMValue(final Object internalObjectBindingResolver resolver) {
57        if (internalObject == null)
58            return null;
59
60        if (internalObject instanceof Constant) {
61            Constant constant = (ConstantinternalObject;
62            switch (constant.typeID()) {
63                case TypeIds.T_boolean:
64                    return Boolean.valueOf(constant.booleanValue());
65                case TypeIds.T_byte:
66                    return Byte.valueOf(constant.byteValue());
67                case TypeIds.T_char:
68                    return Character.valueOf(constant.charValue());
69                case TypeIds.T_double:
70                    return Double.valueOf(constant.doubleValue());
71                case TypeIds.T_float:
72                    return Float.valueOf(constant.floatValue());
73                case TypeIds.T_int:
74                    return Integer.valueOf(constant.intValue());
75                case TypeIds.T_long:
76                    return Long.valueOf(constant.longValue());
77                case TypeIds.T_short:
78                    return Short.valueOf(constant.shortValue());
79                default:
80                    // TypeIds.T_JavaLangString:
81                    return constant.stringValue();
82            }
83        } else if (internalObject instanceof org.eclipse.jdt.internal.compiler.lookup.TypeBinding) {
84            return resolver.getTypeBinding((org.eclipse.jdt.internal.compiler.lookup.TypeBindinginternalObject);
85        } else if (internalObject instanceof org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding) {
86            return resolver.getAnnotationInstance((org.eclipse.jdt.internal.compiler.lookup.AnnotationBindinginternalObject);
87        } else if (internalObject instanceof org.eclipse.jdt.internal.compiler.lookup.FieldBinding) {
88            return resolver.getVariableBinding((org.eclipse.jdt.internal.compiler.lookup.FieldBindinginternalObject);
89        } else if (internalObject instanceof Object[]) {
90            Object[] elements = (Object[]) internalObject;
91            int length = elements.length;
92            Object[] values = length == 0 ? EmptyArray : new Object[length];
93            for (int i = 0i < lengthi++)
94                values[i] = buildDOMValue(elements[i], resolver);
95            return values;
96        }
97        return null;
98    }
99
100    MemberValuePairBinding(ElementValuePair pairBindingResolver resolver) {
101        this.internalPair = pair;
102        this.bindingResolver = resolver;
103    }
104
105    @Override
106    public IAnnotationBinding[] getAnnotations() {
107        return AnnotationBinding.NoAnnotations;
108    }
109
110    @Override
111    public IJavaElement getJavaElement() {
112        return null;
113    }
114
115    @Override
116    public String getKey() {
117        // TODO when implementing, update spec in IBinding
118        return null;
119    }
120
121    @Override
122    public int getKind() {
123        return IBinding.MEMBER_VALUE_PAIR;
124    }
125
126    @Override
127    public IMethodBinding getMethodBinding() {
128        return this.bindingResolver.getMethodBinding(this.internalPair.getMethodBinding());
129    }
130
131    @Override
132    public int getModifiers() {
133        return Modifier.NONE;
134    }
135
136    @Override
137    public String getName() {
138        if (this.internalPair == null)
139            return null;
140        final char[] membername = this.internalPair.getName();
141        return membername == null ? null : new String(membername);
142    }
143
144    @Override
145    public Object getValue() {
146        if (this.value == null)
147            init();
148        return this.value == NoValue ? null : this.value;
149    }
150
151    private void init() {
152        this.value = buildDOMValue(this.internalPair.getValue(), this.bindingResolver);
153        if (this.value == null)
154            this.value = NoValue;
155        IMethodBinding methodBinding = getMethodBinding();
156        if (methodBinding.getReturnType().isArray() && !this.value.getClass().isArray()) {
157            this.value = new Object[] { this.value };
158        }
159    }
160
161    char[] internalName() {
162        return this.internalPair == null ? null : this.internalPair.getName();
163    }
164
165    @Override
166    public boolean isDefault() {
167        Object value2 = getValue();
168        Object defaultValue = getMethodBinding().getDefaultValue();
169        if (value2 instanceof IBinding) {
170            if (defaultValue instanceof IBinding) {
171                return ((IBindingvalue2).isEqualTo((IBindingdefaultValue);
172            }
173            return false;
174        }
175        if (defaultValue == null) return false;
176        return defaultValue.equals(value2);
177    }
178
179    @Override
180    public boolean isDeprecated() {
181        MethodBinding methodBinding = this.internalPair.getMethodBinding();
182        return methodBinding == null ? false : methodBinding.isDeprecated();
183    }
184
185    @Override
186    public boolean isEqualTo(IBinding binding) {
187        if (this == binding)
188            return true;
189        if (binding.getKind() != IBinding.MEMBER_VALUE_PAIR)
190            return false;
191        IMemberValuePairBinding otherMemberValuePairBinding = (IMemberValuePairBindingbinding;
192        if (!getMethodBinding().isEqualTo(otherMemberValuePairBinding.getMethodBinding())) {
193            return false;
194        }
195        Object otherValue = otherMemberValuePairBinding.getValue();
196        Object currentValue = getValue();
197        if (currentValue == null) {
198            return otherValue == null;
199        }
200        if (currentValue instanceof IBinding) {
201            if (otherValue instanceof IBinding) {
202                return ((IBindingcurrentValue).isEqualTo((IBindingotherValue);
203            }
204            return false;
205        }
206        if (currentValue.getClass().isArray()) {
207            if (!otherValue.getClass().isArray()) {
208                return false;
209            }
210            Object[] currentValues = (Object[]) currentValue;
211            Object[] otherValues = (Object[]) otherValue;
212            final int length = currentValues.length;
213            if (length != otherValues.length) {
214                return false;
215            }
216            for (int i = 0i < lengthi++) {
217                Object current = currentValues[i];
218                Object other = otherValues[i];
219                if (current instanceof IBinding) {
220                    if (!(other instanceof IBinding)) {
221                        return false;
222                    }
223                    if (!((IBindingcurrent).isEqualTo((IBindingother)) {
224                        return false;
225                    }
226                } else if (!current.equals(other)) {
227                    return false;
228                }
229            }
230            return true;
231        } else {
232            return currentValue.equals(otherValue);
233        }
234    }
235
236    @Override
237    public boolean isRecovered() {
238        return false;
239    }
240
241    @Override
242    public boolean isSynthetic() {
243        return false;
244    }
245
246    @Override
247    public String toString() {
248        StringBuffer buffer = new StringBuffer();
249        buffer.append(getName());
250        buffer.append(" = "); //$NON-NLS-1$
251        appendValue(getValue(), buffer);
252        return buffer.toString();
253    }
254}
255
MembersX
MemberValuePairBinding:value
MemberValuePairBinding:NoPair
MemberValuePairBinding:isEqualTo:Block:Block:length
MemberValuePairBinding:isEqualTo:Block:Block:otherValues
MemberValuePairBinding:isDeprecated:Block:methodBinding
MemberValuePairBinding:getJavaElement
MemberValuePairBinding:getName:Block:membername
MemberValuePairBinding:isEqualTo:Block:currentValue
MemberValuePairBinding:buildDOMValue:Block:Block:values
MemberValuePairBinding:buildDOMValue
MemberValuePairBinding:isDefault:Block:value2
MemberValuePairBinding:appendValue
MemberValuePairBinding:internalName
MemberValuePairBinding:toString
MemberValuePairBinding:bindingResolver
MemberValuePairBinding:getModifiers
MemberValuePairBinding:getName
MemberValuePairBinding:buildDOMValue:Block:Block:constant
MemberValuePairBinding:getKind
MemberValuePairBinding:isDeprecated
MemberValuePairBinding:MemberValuePairBinding
MemberValuePairBinding:NoValue
MemberValuePairBinding:isDefault:Block:defaultValue
MemberValuePairBinding:buildDOMValue:Block:Block:length
MemberValuePairBinding:toString:Block:buffer
MemberValuePairBinding:EmptyArray
MemberValuePairBinding:isEqualTo:Block:otherMemberValuePairBinding
MemberValuePairBinding:isEqualTo:Block:Block:Block:other
MemberValuePairBinding:getValue
MemberValuePairBinding:internalPair
MemberValuePairBinding:getKey
MemberValuePairBinding:getMethodBinding
MemberValuePairBinding:buildDOMValue:Block:Block:elements
MemberValuePairBinding:isEqualTo
MemberValuePairBinding:isEqualTo:Block:Block:currentValues
MemberValuePairBinding:isSynthetic
MemberValuePairBinding:appendValue:Block:Block:values
MemberValuePairBinding:isEqualTo:Block:Block:Block:current
MemberValuePairBinding:isDefault
MemberValuePairBinding:isEqualTo:Block:otherValue
MemberValuePairBinding:init:Block:methodBinding
MemberValuePairBinding:init
MemberValuePairBinding:isRecovered
MemberValuePairBinding:getAnnotations
Members
X