/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.devtools.j2objc.jdt;
import com.google.devtools.j2objc.types.GeneratedVariableElement;
import java.util.ArrayList;
import java.util.List;
import javax.lang.model.element.AnnotationValue;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ElementVisitor;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeParameterElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
/**
* An ExecutableElement implementation backed by a JDT method binding.
*/
class JdtExecutableElement extends JdtElement implements ExecutableElement {
private VariableElement superOuterParam = null;
public JdtExecutableElement(IMethodBinding binding) {
super(binding.getMethodDeclaration(), getMethodName(binding),
binding.getMethodDeclaration().getModifiers());
}
private static String getMethodName(IMethodBinding binding) {
return binding.isConstructor() ? "<init>" : binding.getMethodDeclaration().getName();
}
@Override
public ElementKind getKind() {
return ((IMethodBinding) binding).isConstructor()
? ElementKind.CONSTRUCTOR : ElementKind.METHOD;
}
@Override
public List<? extends TypeParameterElement> getTypeParameters() {
List<TypeParameterElement> typeParams = new ArrayList<>();
for (ITypeBinding tp : ((IMethodBinding) binding).getTypeParameters()) {
Element tpe = BindingConverter.getElement(tp);
assert tpe instanceof TypeParameterElement;
typeParams.add((TypeParameterElement) tpe);
}
return typeParams;
}
@Override
public TypeMirror getReturnType() {
return BindingConverter.getType(((IMethodBinding) binding).getReturnType());
}
@Override
public TypeMirror asType() {
return BindingConverter.getType((IMethodBinding) binding);
}
void setSuperOuterParam(VariableElement superOuterParam) {
this.superOuterParam = superOuterParam;
}
boolean hasSuperOuter() {
return superOuterParam != null;
}
@Override
public List<? extends VariableElement> getParameters() {
IMethodBinding methodBinding = (IMethodBinding) binding;
List<VariableElement> params = new ArrayList<>();
if (superOuterParam != null) {
params.add(superOuterParam);
}
ITypeBinding[] paramTypes = methodBinding.getParameterTypes();
for (int i = 0; i < paramTypes.length; i++) {
params.add(GeneratedVariableElement.newParameter(
"param" + i, BindingConverter.getType(paramTypes[i]), this));
}
return params;
}
@Override
public TypeMirror getReceiverType() {
throw new AssertionError("not implemented");
}
@Override
public Element getEnclosingElement() {
return BindingConverter.getElement(((IMethodBinding) binding).getDeclaringClass());
}
@Override
public boolean isVarArgs() {
return ((IMethodBinding) binding).isVarargs();
}
@Override
public boolean isDefault() {
throw new AssertionError("not implemented");
}
@Override
public List<? extends TypeMirror> getThrownTypes() {
List<TypeMirror> thrownTypes = new ArrayList<>();
for (ITypeBinding type : ((IMethodBinding) binding).getExceptionTypes()) {
thrownTypes.add(BindingConverter.getType(type));
}
return thrownTypes;
}
@Override
public AnnotationValue getDefaultValue() {
Object value = ((IMethodBinding) binding).getDefaultValue();
return value == null ? null : new JdtAnnotationValue(value);
}
@Override
public <R, P> R accept(ElementVisitor<R, P> v, P p) {
return v.visitExecutable(this, p);
}
@Override
public String toString() {
return ((IMethodBinding) binding).toString();
}
}