blob: b23a303298f98d03888a6021a3a195d28a413689 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Oracle Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Cameron Bateman/Oracle - initial API and implementation
*
********************************************************************************/
package org.eclipse.jst.jsf.context.symbol.internal.impl;
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.eclipse.emf.ecore.util.EDataTypeEList;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jst.jsf.common.util.TypeUtil;
import org.eclipse.jst.jsf.context.symbol.IObjectSymbol;
import org.eclipse.jst.jsf.context.symbol.ISymbol;
import org.eclipse.jst.jsf.context.symbol.ITypeDescriptor;
import org.eclipse.jst.jsf.context.symbol.SymbolPackage;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>IType Descriptor</b></em>'.
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getProperties <em>Properties</em>}</li>
* <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getTypeSignature <em>Type Signature</em>}</li>
* <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getSuperTypeSignatures <em>Super Type Signatures</em>}</li>
* <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getInterfaceTypeSignatures <em>Interface Type Signatures</em>}</li>
* <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getTypeSignatureDelegate <em>Type Signature Delegate</em>}</li>
* <li>{@link org.eclipse.jst.jsf.context.symbol.internal.impl.ITypeDescriptorImpl#getMethods <em>Methods</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public abstract class ITypeDescriptorImpl extends EObjectImpl implements ITypeDescriptor {
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public static final String copyright = "Copyright 2006 Oracle"; //$NON-NLS-1$
/**
* The default value of the '{@link #getTypeSignature() <em>Type Signature</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getTypeSignature()
* @generated
* @ordered
*/
protected static final String TYPE_SIGNATURE_EDEFAULT = ""; //$NON-NLS-1$
/**
* The default value of the '{@link #getTypeSignatureDelegate() <em>Type Signature Delegate</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getTypeSignatureDelegate()
* @generated
* @ordered
*/
protected static final String TYPE_SIGNATURE_DELEGATE_EDEFAULT = null;
/**
* The cached value of the '{@link #getTypeSignatureDelegate() <em>Type Signature Delegate</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getTypeSignatureDelegate()
* @generated
* @ordered
*/
protected String typeSignatureDelegate = TYPE_SIGNATURE_DELEGATE_EDEFAULT;
/**
* The cached value of the '{@link #getTypeParameterSignatures() <em>Type Parameter Signatures</em>}' attribute list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getTypeParameterSignatures()
* @generated
* @ordered
*/
protected EList typeParameterSignatures;
/**
* The default value of the '{@link #getJdtContext() <em>Jdt Context</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getJdtContext()
* @generated
* @ordered
*/
protected static final IJavaElement JDT_CONTEXT_EDEFAULT = null;
/**
* The cached value of the '{@link #getJdtContext() <em>Jdt Context</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getJdtContext()
* @generated
* @ordered
*/
protected IJavaElement jdtContext = JDT_CONTEXT_EDEFAULT;
/**
* The default value of the '{@link #isEnumType() <em>Enum Type</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isEnumType()
* @generated
* @ordered
*/
protected static final boolean ENUM_TYPE_EDEFAULT = false;
/**
* The cached value of the '{@link #isEnumType() <em>Enum Type</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #isEnumType()
* @generated
* @ordered
*/
protected boolean enumType = ENUM_TYPE_EDEFAULT;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected ITypeDescriptorImpl() {
super();
}
/**
* <!-- begin-user-doc -->
* @return the static class
* <!-- end-user-doc -->
* @generated
*/
protected EClass eStaticClass() {
return SymbolPackage.Literals.ITYPE_DESCRIPTOR;
}
/**
* <!-- begin-user-doc -->
* @return get properties for this type
* <!-- end-user-doc -->
* @generated NOT
*/
public abstract EList getProperties();
/**
* <!-- begin-user-doc -->
* @return the type signature in JVM/JDT signature form
* <!-- end-user-doc -->
* @generated NOT
*/
public abstract String getTypeSignature();
/**
* <!-- begin-user-doc -->
* @return the list of super types
* <!-- end-user-doc -->
* @generated NOT
*/
public abstract EList getSuperTypeSignatures();
/**
* <!-- begin-user-doc -->
* @return the list of implemented interfaces
* <!-- end-user-doc -->
* @generated NOT
*/
public abstract EList getInterfaceTypeSignatures();
/**
* <!-- begin-user-doc -->
* @return the type signature delegate. The descriptor may choose to use
* this delegate it if it is set and it cannot derive this information
* from other properties
* <!-- end-user-doc -->
* @generated
*/
public String getTypeSignatureDelegate() {
return typeSignatureDelegate;
}
/**
* <!-- begin-user-doc -->
* @param newTypeSignatureDelegate
* <!-- end-user-doc -->
* @generated
*/
public void setTypeSignatureDelegate(String newTypeSignatureDelegate) {
String oldTypeSignatureDelegate = typeSignatureDelegate;
typeSignatureDelegate = newTypeSignatureDelegate;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE, oldTypeSignatureDelegate, typeSignatureDelegate));
}
/**
* <!-- begin-user-doc -->
* @return the methods for this type or empty list if none exist
* <!-- end-user-doc -->
* @generated NOT
*/
public abstract EList getMethods();
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList getTypeParameterSignatures() {
if (typeParameterSignatures == null) {
typeParameterSignatures = new EDataTypeEList(String.class, this, SymbolPackage.ITYPE_DESCRIPTOR__TYPE_PARAMETER_SIGNATURES);
}
return typeParameterSignatures;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public IJavaElement getJdtContext() {
return jdtContext;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setJdtContext(IJavaElement newJdtContext) {
IJavaElement oldJdtContext = jdtContext;
jdtContext = newJdtContext;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.ITYPE_DESCRIPTOR__JDT_CONTEXT, oldJdtContext, jdtContext));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean isEnumType() {
return enumType;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setEnumType(boolean newEnumType) {
boolean oldEnumType = enumType;
enumType = newEnumType;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, SymbolPackage.ITYPE_DESCRIPTOR__ENUM_TYPE, oldEnumType, enumType));
}
/**
* <!-- begin-user-doc -->
* Note about generics:
*
* This call mimics the runtime instanceOf to the degree possible.
* Therefore, any type parameters (<...>) in typeSignature will be
* deleted using Signature.getTypeErasure() since this data won't be
* available at runtime.
* <!-- end-user-doc -->
* @generated NOT
*/
public boolean instanceOf(final String typeSignature)
{
final String typeErasedSignature = Signature.getTypeErasure(typeSignature);
if (Signature.getTypeErasure(getTypeSignature()) != null
&& Signature.getTypeErasure(getTypeSignature()).equals(typeErasedSignature))
{
return true;
}
for (final Iterator it = getSuperTypeSignatures().iterator(); it.hasNext();)
{
final String superType = (String) it.next();
if (Signature.getTypeErasure(superType).equals(typeErasedSignature))
{
return true;
}
}
for (final Iterator it = getInterfaceTypeSignatures().iterator(); it.hasNext();)
{
final String superType = (String) it.next();
if (Signature.getTypeErasure(superType).equals(typeErasedSignature))
{
return true;
}
}
return false;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public boolean isArray()
{
return Signature.getArrayCount(getTypeSignature()) > 0;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public IObjectSymbol getArrayElement()
{
if (isArray())
{
// sub-class of ITypeDescriptor must implement this if they which to provide
// array element support
throw new UnsupportedOperationException("Base type descriptor does not support this function"); //$NON-NLS-1$
}
// shouldn't be called if not an array
return null;
}
/**
/**
* <!-- begin-user-doc -->
*
* Tries to load an IType for a fully resolved (i.e. starts with L not Q)
* type signature using the current jdtContext.
*
* @return the resolved IType or null if none could be resolved.
*
* <!-- end-user-doc -->
* @generated NOT
*/
public IType resolveType(String resolvedTypeSignature)
{
// we need to obtain an IJavaProject within which to resolve
// the type.
IJavaProject project = null;
// see if a jdtContext hint has been set
if (getJdtContext() != null)
{
project = getJdtContext().getJavaProject();
}
if (project != null)
{
return TypeUtil.resolveType(project, resolvedTypeSignature);
}
return null;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public ISymbol calculateSyntheticCall(String methodName, EList methodArgs, String symbolName) {
// sub-classes need only implement if they have something meaningful
// the want to do here
// by default return null to indicate this type descriptor doesn't
// wish to handle calls
return null;
}
/**
* <!-- begin-user-doc -->
* @param featureID
* @param resolve
* @param coreType
* @return get the feature
* <!-- end-user-doc -->
* @generated
*/
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case SymbolPackage.ITYPE_DESCRIPTOR__PROPERTIES:
return getProperties();
case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE:
return getTypeSignature();
case SymbolPackage.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES:
return getSuperTypeSignatures();
case SymbolPackage.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES:
return getInterfaceTypeSignatures();
case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE:
return getTypeSignatureDelegate();
case SymbolPackage.ITYPE_DESCRIPTOR__METHODS:
return getMethods();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc -->
* @param featureID
* @param newValue
* <!-- end-user-doc -->
* @generated
*/
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case SymbolPackage.ITYPE_DESCRIPTOR__PROPERTIES:
getProperties().clear();
getProperties().addAll((Collection)newValue);
return;
case SymbolPackage.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES:
getSuperTypeSignatures().clear();
getSuperTypeSignatures().addAll((Collection)newValue);
return;
case SymbolPackage.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES:
getInterfaceTypeSignatures().clear();
getInterfaceTypeSignatures().addAll((Collection)newValue);
return;
case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE:
setTypeSignatureDelegate((String)newValue);
return;
case SymbolPackage.ITYPE_DESCRIPTOR__METHODS:
getMethods().clear();
getMethods().addAll((Collection)newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc -->
* @param featureID
* <!-- end-user-doc -->
* @generated
*/
public void eUnset(int featureID) {
switch (featureID) {
case SymbolPackage.ITYPE_DESCRIPTOR__PROPERTIES:
getProperties().clear();
return;
case SymbolPackage.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES:
getSuperTypeSignatures().clear();
return;
case SymbolPackage.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES:
getInterfaceTypeSignatures().clear();
return;
case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE:
setTypeSignatureDelegate(TYPE_SIGNATURE_DELEGATE_EDEFAULT);
return;
case SymbolPackage.ITYPE_DESCRIPTOR__METHODS:
getMethods().clear();
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc -->
* @param featureID
* @return true if feature has been set
* <!-- end-user-doc -->
* @generated
*/
public boolean eIsSet(int featureID) {
switch (featureID) {
case SymbolPackage.ITYPE_DESCRIPTOR__PROPERTIES:
return !getProperties().isEmpty();
case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE:
return TYPE_SIGNATURE_EDEFAULT == null ? getTypeSignature() != null : !TYPE_SIGNATURE_EDEFAULT.equals(getTypeSignature());
case SymbolPackage.ITYPE_DESCRIPTOR__SUPER_TYPE_SIGNATURES:
return !getSuperTypeSignatures().isEmpty();
case SymbolPackage.ITYPE_DESCRIPTOR__INTERFACE_TYPE_SIGNATURES:
return !getInterfaceTypeSignatures().isEmpty();
case SymbolPackage.ITYPE_DESCRIPTOR__TYPE_SIGNATURE_DELEGATE:
return TYPE_SIGNATURE_DELEGATE_EDEFAULT == null ? typeSignatureDelegate != null : !TYPE_SIGNATURE_DELEGATE_EDEFAULT.equals(typeSignatureDelegate);
case SymbolPackage.ITYPE_DESCRIPTOR__METHODS:
return !getMethods().isEmpty();
}
return super.eIsSet(featureID);
}
/**
* <!-- begin-user-doc -->
* @return the debug string format of the type signature
* <!-- end-user-doc -->
* @generated
*/
public String toString() {
if (eIsProxy()) return super.toString();
StringBuffer result = new StringBuffer(super.toString());
result.append(" (typeSignatureDelegate: "); //$NON-NLS-1$
result.append(typeSignatureDelegate);
result.append(')');
return result.toString();
}
} //ITypeDescriptorImpl