/* * Copyright 2011 Google Inc. All Rights Reserved. * * 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.common.collect.Sets; import com.google.devtools.j2objc.util.BindingUtil; import java.util.Set; import javax.lang.model.element.PackageElement; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.IPackageBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.IVariableBinding; import org.eclipse.jdt.core.dom.Modifier; /** * Binding class for types created during translation. * * @author Keith Stanger */ class GeneratedTypeBinding extends AbstractTypeBinding { protected final String name; private int modifiers; private final PackageElement packageElement; private final ITypeBinding superClass; private final boolean isInterface; private final ITypeBinding componentType; private final Set<IVariableBinding> fields = Sets.newHashSet(); private final Set<IMethodBinding> methods = Sets.newHashSet(); public GeneratedTypeBinding( String name, PackageElement packageElement, ITypeBinding superClass, boolean isInterface, ITypeBinding componentType) { this.name = name; this.packageElement = packageElement; this.superClass = superClass; this.isInterface = isInterface; this.componentType = componentType; } /** * Creates a new non-array type, extracting the package from the provided name. */ public static GeneratedTypeBinding newTypeBinding( String name, ITypeBinding superClass, boolean isInterface) { int idx = name.lastIndexOf('.'); String packageName = idx < 0 ? "" : name.substring(0, idx); PackageElement packageElement = (PackageElement) BindingConverter.getElement(new GeneratedPackageBinding(packageName)); name = name.substring(idx + 1); return new GeneratedTypeBinding(name, packageElement, superClass, isInterface, null); } public static GeneratedTypeBinding newArrayType(ITypeBinding componentType) { return new GeneratedTypeBinding( componentType.getName() + "[]", (PackageElement) null, null, false, componentType); } @Override public String getKey() { return name; } @Override public boolean isEqualTo(IBinding binding) { if (binding == this) { return true; } if (binding instanceof GeneratedTypeBinding) { return name.equals(((GeneratedTypeBinding) binding).name); } return false; } @Override public String getBinaryName() { return getQualifiedName(); } @Override public String getName() { return name; } @Override public int getModifiers() { return modifiers; } public void setModifiers(int newModifiers) { modifiers = newModifiers; } public void addModifiers(int modifiersToAdd) { modifiers |= modifiersToAdd; } @Override public String getQualifiedName() { if (packageElement != null) { return packageElement.getQualifiedName() + "." + name; } return name; } @Override public boolean isArray() { return componentType != null; } @Override public boolean isClass() { return !isInterface; } @Override public boolean isInterface() { return isInterface; } @Override public ITypeBinding getComponentType() { return componentType; } @Override public IVariableBinding[] getDeclaredFields() { return fields.toArray(new IVariableBinding[0]); } public void addField(IVariableBinding field) { fields.add(field); } @Override public IMethodBinding[] getDeclaredMethods() { return methods.toArray(new IMethodBinding[0]); } public void addMethod(IMethodBinding method) { methods.add(method); } @Override public int getDeclaredModifiers() { return Modifier.PUBLIC; } @Override public int getDimensions() { if (componentType != null) { return componentType.getDimensions() + 1; } return 0; } @Override public ITypeBinding getElementType() { ITypeBinding elementType = componentType; while (elementType != null && elementType.isArray()) { elementType = elementType.getComponentType(); } return elementType; } @Override public IPackageBinding getPackage() { return (IPackageBinding) BindingConverter.unwrapElement(packageElement); } @Override public ITypeBinding getSuperclass() { return superClass; } @Override public boolean isAssignmentCompatible(ITypeBinding variableType) { if (componentType != null && variableType.isArray()) { return componentType.isAssignmentCompatible(variableType.getComponentType()); } return isEqualTo(variableType); } @Override public boolean isCastCompatible(ITypeBinding type) { return isEqualTo(type); } @Override public String toString() { return name; } @Override public boolean isSynthetic() { return BindingUtil.isSynthetic(this); } }