/*******************************************************************************
* Copyright © 2000, 2013 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*
*******************************************************************************/
package org.eclipse.edt.ide.core.internal.model;
import java.util.ArrayList;
import org.eclipse.edt.ide.core.model.EGLModelException;
import org.eclipse.edt.ide.core.model.IClassFile;
import org.eclipse.edt.ide.core.model.IEGLElement;
import org.eclipse.edt.ide.core.model.IFunction;
import org.eclipse.edt.ide.core.model.IMember;
import org.eclipse.edt.ide.core.model.IPart;
import org.eclipse.edt.ide.core.model.ISourceRange;
import org.eclipse.edt.ide.core.model.Signature;
/**
* @see IMember
*/
abstract class Member extends SourceRefElement implements IMember {
protected Member(int type, IEGLElement parent, String name) {
super(type, parent, name);
}
protected boolean areSimilarFunctions(
String name1, String[] params1,
String name2, String[] params2,
String[] simpleNames1) {
if (name1.equalsIgnoreCase(name2)) {
int params1Length = params1.length;
if (params1Length == params2.length) {
for (int i = 0; i < params1Length; i++) {
String simpleName1 =
simpleNames1 == null ?
Signature.getSimpleName(Signature.toString(params1[i])) :
simpleNames1[i];
String simpleName2 = Signature.getSimpleName(Signature.toString(params2[i]));
if (!simpleName1.equals(simpleName2)) {
return false;
}
}
return true;
}
}
return false;
}
/*
* Helper function for SourceType.findFunctions and BinaryType.findFunctions
*/
protected IFunction[] findFunctions(IFunction function, IFunction[] functions) {
String elementName = function.getElementName();
String[] parameters = function.getParameterTypes();
int paramLength = parameters.length;
String[] simpleNames = new String[paramLength];
for (int i = 0; i < paramLength; i++) {
simpleNames[i] = Signature.getSimpleName(Signature.toString(parameters[i]));
}
ArrayList list = new ArrayList();
next: for (int i = 0, length = functions.length; i < length; i++) {
IFunction existingFunction = functions[i];
if (this.areSimilarFunctions(
elementName,
parameters,
existingFunction.getElementName(),
existingFunction.getParameterTypes(),
simpleNames)) {
list.add(existingFunction);
}
}
int size = list.size();
if (size == 0) {
return null;
} else {
IFunction[] result = new IFunction[size];
list.toArray(result);
return result;
}
}
/**
* @see IMember
*/
public IPart getDeclaringPart() {
EGLElement parent = (EGLElement)getParent();
if (parent.fLEType == PART) {
return (IPart) parent;
}
return null;
}
/**
* @see IMember
*/
public int getFlags() throws EGLModelException {
MemberElementInfo info = (MemberElementInfo) getElementInfo();
return info.getModifiers();
}
/**
* @see EGLElement#getHandleMemento()
*/
protected char getHandleMementoDelimiter() {
return EGLElement.EGLM_PART;
}
/**
* @see IMember
*/
public ISourceRange getNameRange() throws EGLModelException {
MemberElementInfo info= (MemberElementInfo)getElementInfo();
return new SourceRange(info.getNameSourceStart(), info.getNameSourceEnd() - info.getNameSourceStart() + 1);
}
/**
* @see IMember
*/
public boolean isBinary() {
return false;
}
/**
* @see IEGLElement
*/
public boolean isReadOnly() {
return isBinary();
}
/**
*/
public String readableName() {
IEGLElement declaringType = getDeclaringPart();
if (declaringType != null) {
String declaringName = ((EGLElement) getDeclaringPart()).readableName();
StringBuffer buffer = new StringBuffer(declaringName);
buffer.append('.');
buffer.append(this.getElementName());
return buffer.toString();
} else {
return super.readableName();
}
}
/**
* Updates the name range for this element.
*/
protected void updateNameRange(int nameStart, int nameEnd) {
try {
MemberElementInfo info = (MemberElementInfo) getElementInfo();
info.setNameSourceStart(nameStart);
info.setNameSourceEnd(nameEnd);
} catch (EGLModelException npe) {
return;
}
}
@Override
public IClassFile getClassFile() {
// TODO Auto-generated method stub
return ((EGLElement)getParent()).getClassFile();
}
}