/*******************************************************************************
* Copyright (c) 2013 Bruno Medeiros and other Contributors.
* 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:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package dtool.engine.operations;
import static melnorme.utilbox.core.CoreUtil.tryCast;
import dtool.ast.definitions.AbstractFunctionDefinition;
import dtool.ast.definitions.DefUnit;
import dtool.ast.definitions.DefVarFragment;
import dtool.ast.definitions.DefinitionAggregate;
import dtool.ast.definitions.DefinitionAlias.DefinitionAliasFragment;
import dtool.ast.definitions.DefinitionAliasFunctionDecl;
import dtool.ast.definitions.DefinitionAliasVarDecl;
import dtool.ast.definitions.DefinitionAliasVarDecl.AliasVarDeclFragment;
import dtool.ast.definitions.DefinitionConstructor;
import dtool.ast.definitions.DefinitionFunction;
import dtool.ast.definitions.DefinitionVariable;
import dtool.ast.definitions.FunctionParameter;
import dtool.ast.references.Reference;
import dtool.ddoc.TextUI;
import dtool.engine.analysis.IVarDefinitionLike;
import melnorme.lang.tooling.symbols.INamedElement;
public class DeeNamedElementLabelProvider {
public static String getLabelForContentAssistPopup(INamedElement namedElement) {
return new DeeNamedElementLabelProvider().getLabel(namedElement);
}
public String getLabel(INamedElement namedElement) {
switch (namedElement.getArcheType()) {
case Module:
return namedElement.getName();
case Package:
return namedElement.getName();
default:
break;
}
// We should NOT try to resolve namedElement to its true defUnit because that can be a costly operation,
// and want to calculate a label quickly, without the need for parsing or other semantic operations
DefUnit defUnit = tryCast(namedElement, DefUnit.class);
if(defUnit == null) {
return namedElement.getName();
}
if(defUnit instanceof IVarDefinitionLike) {
// IVarDefinitionLike varDefinitionLike = (IVarDefinitionLike) defUnit;
// TODO: add more info to label, such as var type.
}
switch (defUnit.getNodeType()) {
case DEFINITION_VARIABLE: {
DefinitionVariable elem = (DefinitionVariable) defUnit;
return elem.getName() + getTypeSegmentForVar(elem.type);
}
case DEFINITION_VAR_FRAGMENT: {
DefVarFragment elem = (DefVarFragment) defUnit;
Reference type = elem.getDeclaredType();
return elem.getName() + getTypeSegmentForVar(type);
}
case FUNCTION_PARAMETER: {
FunctionParameter elem = (FunctionParameter) defUnit;
return elem.getName() + getTypeSegmentForVar(elem.type);
}
case DEFINITION_CONSTRUCTOR: {
DefinitionConstructor elem = (DefinitionConstructor) defUnit;
return getFnExtendedName(elem);
}
case DEFINITION_FUNCTION: {
DefinitionFunction elem = (DefinitionFunction) defUnit;
return getFnExtendedName(elem) + getTypeSegmentForVar(elem.getDeclaredReturnType());
}
case DEFINITION_ALIAS_FRAGMENT: {
DefinitionAliasFragment elem = (DefinitionAliasFragment) defUnit;
return elem.getName() + getAliasSegment(elem.target);
}
case DEFINITION_ALIAS_VAR_DECL: {
DefinitionAliasVarDecl elem = (DefinitionAliasVarDecl) defUnit;
return elem.getName() + getAliasSegment(elem.target);
}
case ALIAS_VAR_DECL_FRAGMENT: {
AliasVarDeclFragment elem = (AliasVarDeclFragment) defUnit;
return elem.getName() + getAliasSegment(elem.getAliasTarget());
}
case DEFINITION_ALIAS_FUNCTION_DECL: {
DefinitionAliasFunctionDecl elem = (DefinitionAliasFunctionDecl) defUnit;
// TODO: print the correct alias target (a function type)
return elem.getName() + getAliasSegment(elem.target) + "(?)";
}
default: break;
}
if(defUnit instanceof DefinitionAggregate) {
return defUnit.getName();
}
return defUnit.getName();
}
public String getTypeSegmentForVar(Reference typeRef) {
return " : " + TextUI.typeRefToUIString(typeRef);
}
public String getFnExtendedName(AbstractFunctionDefinition elem) {
return elem.getExtendedName(true, true);
}
public String getAliasSegment(Reference target) {
String targetToString = target == null ? "?" : target.toStringAsCode();
if(targetToString.isEmpty()) {
targetToString = "?";
}
return " -> " + targetToString;
}
/* ----------------- ----------------- */
public static class DeeNamedElementSimpleLabelProvider extends DeeNamedElementLabelProvider {
@Override
public String getTypeSegmentForVar(Reference typeRef) {
return "";
}
@Override
public String getFnExtendedName(AbstractFunctionDefinition elem) {
return elem.getExtendedName(true, false);
}
@Override
public String getAliasSegment(Reference target) {
return "";
}
}
}