blob: c00db2fb1ce830d3ca8067311bc86d7279ab6f51 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2016 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
*
*******************************************************************************/
package org.eclipse.dltk.internal.core;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IField;
import org.eclipse.dltk.core.IMember;
import org.eclipse.dltk.core.IMethod;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.INamespace;
import org.eclipse.dltk.core.IScriptFolder;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.core.ModelException;
public abstract class NamedMember extends Member {
/*
* This element's name, or an empty <code>String</code> if this element does
* not have a name.
*/
protected String name;
public NamedMember(ModelElement parent, String name) {
super(parent);
this.name = name;
}
@Override
public String getElementName() {
return this.name;
}
protected IScriptFolder getScriptFolder() {
return null;
}
public String getFullyQualifiedName(String enclosingTypeSeparator,
boolean showParameters) throws ModelException {
INamespace namespace = getNamespace();
if (namespace != null && !namespace.isRoot()) {
return namespace.getQualifiedName(enclosingTypeSeparator)
+ enclosingTypeSeparator
+ getTypeQualifiedName(enclosingTypeSeparator,
showParameters);
}
return getTypeQualifiedName(enclosingTypeSeparator, showParameters);
}
public String getTypeQualifiedName(String typeSeparator,
boolean showParameters) throws ModelException {
NamedMember declaringType;
String thisName = this.name;
if (thisName.startsWith(typeSeparator))
return thisName;
switch (this.parent.getElementType()) {
case IModelElement.SOURCE_MODULE:
// thisName = /*typeSeparator + */thisName;
if (showParameters) {
StringBuffer buffer = new StringBuffer(thisName);
// appendTypeParameters(buffer);
if (DLTKCore.DEBUG) {
System.err
.println("TODO: NamedMember: add type parameters"); //$NON-NLS-1$
}
return buffer.toString();
}
return thisName;
case IModelElement.TYPE:
declaringType = (NamedMember) this.parent;
break;
case IModelElement.FIELD:
case IModelElement.METHOD:
declaringType = (NamedMember) ((IMember) this.parent)
.getDeclaringType();
break;
default:
return null;
}
String declTName = ""; //$NON-NLS-1$
if (declaringType != null) {
declTName = declaringType.getTypeQualifiedName(typeSeparator,
showParameters);
}
StringBuffer buffer = new StringBuffer(declTName);
buffer.append(typeSeparator);
String simpleName = this.name.length() == 0 ? Integer
.toString(this.occurrenceCount) : this.name;
buffer.append(simpleName);
if (showParameters) {
// appendTypeParameters(buffer);
if (DLTKCore.DEBUG) {
System.err.println("TODO: NamedMember: Add type parameters."); //$NON-NLS-1$
}
}
return buffer.toString();
}
protected String getKey(IField field, boolean forceOpen)
throws ModelException {
StringBuffer key = new StringBuffer();
// declaring class
String declaringKey = getKey((IType) field.getParent(), forceOpen);
key.append(declaringKey);
// field name
key.append('.');
key.append(field.getElementName());
return key.toString();
}
protected String getKey(IMethod method, boolean forceOpen)
throws ModelException {
StringBuffer key = new StringBuffer();
// declaring class
String declaringKey = getKey((IType) method.getParent(), forceOpen);
key.append(declaringKey);
// selector
key.append('.');
String selector = method.getElementName();
key.append(selector);
// type parameters
// parameters
key.append('(');
String[] parameters = method.getParameterNames();
for (int i = 0, length = parameters.length; i < length; i++)
key.append(parameters[i].replace('.', '/'));
key.append(')');
// return type
key.append('V');
return key.toString();
}
protected String getKey(IType type, boolean forceOpen)
throws ModelException {
StringBuffer key = new StringBuffer();
key.append('L');
String packageName = type.getScriptFolder().getElementName();
key.append(packageName.replace('.', '/'));
if (packageName.length() > 0)
key.append('/');
String typeQualifiedName = type.getTypeQualifiedName("$"); //$NON-NLS-1$
ISourceModule cu = (ISourceModule) type
.getAncestor(IModelElement.SOURCE_MODULE);
if (cu != null) {
String cuName = cu.getElementName();
String mainTypeName = cuName.substring(0, cuName.lastIndexOf('.'));
int end = typeQualifiedName.indexOf('$');
if (end == -1)
end = typeQualifiedName.length();
String topLevelTypeName = typeQualifiedName.substring(0, end);
if (!mainTypeName.equals(topLevelTypeName)) {
key.append(mainTypeName);
key.append('~');
}
}
key.append(typeQualifiedName);
key.append(';');
return key.toString();
}
}