/******************************************************************************* * 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(); } }