blob: e5a5e6dc6b971649c78f34c724e5d22f207eda0c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.api.tools.internal.model;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiComponent;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiElement;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiMember;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiType;
/**
* Base implementation of {@link IApiMember}
*
* @since 1.0.0
* @noextend This class is not intended to be subclassed by clients.
*/
public abstract class ApiMember extends ApiElement implements IApiMember {
private int fFlags = -1;
private String fSignature;
private String fGenericSignature;
/**
* Constructs a member enclosed by the given type with the specified name,
* type constant, and flags (modifiers).
*
* @param parent the parent {@link IApiElement} for this type
* @param name member name
* @param signature signature (type or method)
* @param type see element type constants in {@link IApiMember}
* @param flags modifier flags
*/
protected ApiMember(IApiElement parent, String name, String signature, String genericSig, int type, int flags) {
super(parent, type, name);
fFlags = flags;
fSignature = signature;
fGenericSignature = genericSig;
}
/**
* Returns this member's signature.
*
* @return signature
*/
@Override
public String getSignature() {
return fSignature;
}
/**
* Returns generic signature or <code>null</code> if none.
*
* @return
*/
@Override
public String getGenericSignature() {
return fGenericSignature;
}
@Override
public int getModifiers() {
return fFlags;
}
@Override
public IApiType getEnclosingType() throws CoreException {
return (IApiType) getAncestor(IApiElement.TYPE);
}
@Override
public IApiComponent getApiComponent() {
return (IApiComponent) getAncestor(IApiElement.COMPONENT);
}
@Override
public String getPackageName() {
try {
IApiType type = getEnclosingType();
if (type != null) {
return type.getPackageName();
}
} catch (CoreException ce) {
ApiPlugin.log("Failed to read package name for " + getName(), ce); //$NON-NLS-1$
}
return ""; //$NON-NLS-1$
}
@Override
public boolean equals(Object obj) {
if (obj instanceof IApiElement) {
IApiElement element = (IApiElement) obj;
if (element.getType() == this.getType()) {
return enclosingTypesEqual(this, element) && getName().equals(element.getName());
}
}
return false;
}
/**
* Returns if the immediate enclosing {@link IApiType}s of the two members
* are equal: where both enclosing type being <code>null</code> is
* considered equal
*
* @param e1
* @param e2
* @return true if both immediate enclosing type are equal
*/
protected boolean enclosingTypesEqual(IApiElement e1, IApiElement e2) {
IApiType t1 = (IApiType) e1.getAncestor(IApiElement.TYPE);
IApiType t2 = (IApiType) e2.getAncestor(IApiElement.TYPE);
if (t1 == null) {
return t2 == null;
}
return t1.equals(t2);
}
@Override
public int hashCode() {
IApiType enclosing = (IApiType) getAncestor(IApiElement.TYPE);
return getType() + getName().hashCode() + (enclosing == null ? 0 : enclosing.hashCode());
}
/**
* Used when building a member type.
*
* @param access modifiers
*/
public void setModifiers(int access) {
fFlags = access;
}
}