/*
* #%~
* org.overture.ide.ui
* %%
* Copyright (C) 2008 - 2014 Overture
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #~%
*/
package org.overture.ide.ui.internal.viewsupport;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.viewers.StyledString;
import org.overture.ast.definitions.AExplicitFunctionDefinition;
import org.overture.ast.definitions.AExplicitOperationDefinition;
import org.overture.ast.definitions.AImplicitFunctionDefinition;
import org.overture.ast.definitions.AImplicitOperationDefinition;
import org.overture.ast.definitions.AImportedDefinition;
import org.overture.ast.definitions.AInheritedDefinition;
import org.overture.ast.definitions.AInstanceVariableDefinition;
import org.overture.ast.definitions.ALocalDefinition;
import org.overture.ast.definitions.ANamedTraceDefinition;
import org.overture.ast.definitions.APerSyncDefinition;
import org.overture.ast.definitions.ARenamedDefinition;
import org.overture.ast.definitions.ATypeDefinition;
import org.overture.ast.definitions.AUntypedDefinition;
import org.overture.ast.definitions.AValueDefinition;
import org.overture.ast.definitions.PDefinition;
import org.overture.ast.definitions.SClassDefinition;
import org.overture.ast.intf.lex.ILexLocation;
import org.overture.ast.modules.AAllImport;
import org.overture.ast.modules.AFromModuleImports;
import org.overture.ast.modules.AModuleImports;
import org.overture.ast.modules.AModuleModules;
import org.overture.ast.modules.ATypeImport;
import org.overture.ast.modules.PImport;
import org.overture.ast.modules.SValueImport;
import org.overture.ast.types.AFieldField;
import org.overture.ast.types.AFunctionType;
import org.overture.ast.types.ANamedInvariantType;
import org.overture.ast.types.AOperationType;
import org.overture.ast.types.AProductType;
import org.overture.ast.types.ARecordInvariantType;
import org.overture.ast.types.AUnresolvedType;
import org.overture.ast.types.AVoidType;
import org.overture.ast.types.PType;
public class VdmElementLabels {
/**
* Specifies to apply color styles to labels. This flag only applies to
* methods taking or returning a {@link StyledString}.
*
* @since 3.4
*/
public final static long COLORIZE = 1L << 55;
/**
* Default options (M_PARAMETER_TYPES, M_APP_TYPE_PARAMETERS &
* T_TYPE_PARAMETERS enabled)
*/
public final static long ALL_DEFAULT = 1231;
// /**
// * Returns the styled string for the given resource. The returned label is
// * BiDi-processed with {@link TextProcessor#process(String, String)}.
// *
// * @param resource
// * the resource
// * @return the styled string
// * @since 3.4
// */
// private static StyledString getStyledResourceLabel(IResource resource) {
// StyledString result = new StyledString(resource.getName());
// return Strings.markLTR(result);
// }
// TODO: this map should be deleted when the AST fix is made
// so that definitions contain a reference to the module they belong
static Map<String, AModuleModules> activeModule = new HashMap<String, AModuleModules>();
public static StyledString getStyledTextLabel(Object element, long flags) {
// if (element instanceof IVdmElement) {
// return getElementLabel((IVdmElement) element, flags);
// }
if (element instanceof SClassDefinition) {
// activeModule = null;
return getClassDefinitionLabel((SClassDefinition) element, flags);
}
if (element instanceof AModuleModules) {
activeModule.put(((AModuleModules) element).getName().getName(), ((AModuleModules) element));
return getModuleLabel((AModuleModules) element, flags);
}
if (element instanceof AInstanceVariableDefinition) {
return getInstanceVariableDefinitionLabel((AInstanceVariableDefinition) element);
}
if (element instanceof ATypeDefinition) {
return getTypeDefinitionLabel((ATypeDefinition) element);
}
if (element instanceof AExplicitOperationDefinition) {
return getExplicitOperationDefinitionLabel((AExplicitOperationDefinition) element);
}
if (element instanceof AImplicitOperationDefinition) {
return getImplicitOperationDefinitionLabel((AImplicitOperationDefinition) element);
}
if (element instanceof AExplicitFunctionDefinition) {
return getExplicitFunctionDefinitionLabel((AExplicitFunctionDefinition) element);
}
if (element instanceof AImplicitFunctionDefinition) {
return getImplicitFunctionDefinitionLabel((AImplicitFunctionDefinition) element);
}
if (element instanceof ALocalDefinition) {
return getLocalDefinitionLabel((ALocalDefinition) element);
}
if (element instanceof AValueDefinition) {
// System.out.println("VALUE DEF");
}
if (element instanceof ANamedTraceDefinition) {
return getNamedTraceDefinitionLabel((ANamedTraceDefinition) element);
}
if (element instanceof AUntypedDefinition) {
return getUntypedDefinition((AUntypedDefinition) element);
}
if (element instanceof AModuleImports) {
StyledString result = new StyledString();
result.append("import definitions");
return result;
}
if (element instanceof AFromModuleImports) {
return getImportFromModuleLabel((AFromModuleImports) element);
}
if (element instanceof PImport) {
return getImportLabel((PImport) element);
}
if (element instanceof AFieldField) {
StyledString result = new StyledString();
result.append(((AFieldField) element).getTag());
result.append(" : " + processUnresolved(((AFieldField) element).getType()),
StyledString.DECORATIONS_STYLER);
return result;
}
if (element instanceof APerSyncDefinition) {
return getPerSyncDefinitionLabel((APerSyncDefinition) element);
}
if (element instanceof AInheritedDefinition) {
return getInheritedDefinition((AInheritedDefinition) element, flags);
}
if (element instanceof ImportsContainer) {
return getStyledTextLabel(
(AModuleImports) ((ImportsContainer) element).getImports(),
flags);
}
if (element instanceof ARenamedDefinition) {
return getRenamedDefinitionLabel((ARenamedDefinition) element, flags);
}
if(element instanceof AImportedDefinition)
{
return getImportedDefinitionLabel(element, flags);
}
// StyledString result = new StyledString();
// result.append("Unsupported type reached: " + element);
// return result;
return null;
}
private static StyledString getImportedDefinitionLabel(Object element, long flags)
{
AImportedDefinition e = (AImportedDefinition) element;
StyledString defStr = getStyledTextLabel(e.getDef(), flags);
if(defStr == null)
{
return null;
}
else
{
PDefinition def = e.getDef();
if (def != null)
{
ILexLocation loc = def.getLocation();
if (loc != null)
{
String module = loc.getModule();
if (module != null)
{
StyledString fromModuleStr = new StyledString(module
+ ": ");
return fromModuleStr.append(defStr);
}
}
}
return defStr;
}
}
private static StyledString getRenamedDefinitionLabel(
ARenamedDefinition element, long flags) {
return getStyledTextLabel(element.getDef(), flags);
}
private static StyledString getInheritedDefinition(
AInheritedDefinition element, long flags) {
StyledString res = getStyledTextLabel(element.getSuperdef(), flags);
return res;
}
private static StyledString getPerSyncDefinitionLabel(
APerSyncDefinition element) {
StyledString result = new StyledString();
result.append(element.getName().getSimpleName());
result.append(" : sync predicate", StyledString.DECORATIONS_STYLER);
return result;
}
private static StyledString getImplicitOperationDefinitionLabel(
AImplicitOperationDefinition element) {
StyledString result = new StyledString();
result.append(element.getName().getSimpleName());
if (element.getType() instanceof AOperationType) {
AOperationType type = (AOperationType)element.getType();
if (type.getParameters().size() == 0) {
result.append("() ");
} else {
result.append("(");
int i = 0;
while (i < type.getParameters().size() - 1) {
PType definition = (PType) type.getParameters().get(i);
result.append(getSimpleTypeString(definition) + ", ");
i++;
}
PType definition = (PType) type.getParameters().get(i);
result.append(getSimpleTypeString(definition) + ")");
}
if (type.getResult() instanceof AVoidType) {
result.append(" : ()", StyledString.DECORATIONS_STYLER);
} else {
result.append(" : " + getSimpleTypeString(type.getResult()),
StyledString.DECORATIONS_STYLER);
}
}
return result;
}
private static StyledString getImplicitFunctionDefinitionLabel(
AImplicitFunctionDefinition element) {
StyledString result = new StyledString();
result.append(element.getName().getSimpleName());
if (element.getType() instanceof AFunctionType) {
AFunctionType type = (AFunctionType)element.getType();
if (type.getParameters().size() == 0) {
result.append("() ");
} else {
result.append("(");
int i = 0;
while (i < type.getParameters().size() - 1) {
PType definition = (PType) type.getParameters().get(i);
result.append(getSimpleTypeString(definition) + ", ");
i++;
}
PType definition = (PType) type.getParameters().get(i);
result.append(getSimpleTypeString(definition) + ")");
}
if (type.getResult() instanceof AVoidType) {
result.append(" : ()", StyledString.DECORATIONS_STYLER);
} else {
result.append(" : " + getSimpleTypeString(type.getResult()),
StyledString.DECORATIONS_STYLER);
}
}
return result;
}
private static StyledString getImportLabel(PImport element) {
StyledString result = new StyledString();
if (element instanceof AAllImport) {
result.append(element.getName().getSimpleName());
} else if (element instanceof ATypeImport) {
ATypeImport type = (ATypeImport) element;
result.append(type.getName().getSimpleName());
if(type.getDef()!=null)
{
result.append(" : " + getSimpleTypeString(type.getDef().getType()), StyledString.DECORATIONS_STYLER);
}else
{
result.append(" : " , StyledString.DECORATIONS_STYLER);
}
result.append(type.getRenamed().getName(), StyledString.DECORATIONS_STYLER);
} else if (element instanceof SValueImport) {
SValueImport value = (SValueImport) element;
result.append(value.getName().getSimpleName());
if (value.getImportType() != null) {
String typeString = value.getImportType().toString();
typeString = typeString.replaceFirst("[(]", "");
typeString = typeString.substring(0, typeString.length() - 1);
result.append(" : " + typeString);
}
}
if (element.getRenamed()!= null) {
result.append(" (renamed as: " + element.getRenamed().getFullName() + ")",
StyledString.DECORATIONS_STYLER);
}
return result;
}
private static StyledString getImportFromModuleLabel(
AFromModuleImports element) {
StyledString result = new StyledString();
result.append(element.getName().getName());
return result;
}
private static StyledString getNamedTraceDefinitionLabel(
ANamedTraceDefinition element) {
StyledString result = new StyledString();
result.append(element.getName().getSimpleName());
return result;
}
private static StyledString getUntypedDefinition(AUntypedDefinition element) {
StyledString result = new StyledString();
result.append(element.getName().getSimpleName());
List<PDefinition> definitions = null;
if (element.getClassDefinition() != null) {
SClassDefinition classDef = element.getClassDefinition();
definitions = classDef.getDefinitions();
} else {
if (activeModule != null && activeModule.containsKey(element.getName().getModule()))
{
definitions = activeModule.get(element.getName().getModule()).getDefs();
}
}
if (definitions != null) {
for (PDefinition def : definitions) {
if (def instanceof AValueDefinition) {
for (int i = 0; i < ((AValueDefinition)def).getDefs().size(); i++) {
if (((AValueDefinition)def).getDefs().get(i).getLocation()
.equals(element.getLocation())) {
PType type = ((AValueDefinition) def).getType();
if (type instanceof AProductType) {
return result
.append(" : "
+ getSimpleTypeString(((AProductType) type).getTypes()
.get(i)),
StyledString.DECORATIONS_STYLER);
} else if (type instanceof AUnresolvedType) {
return result.append(" : "
+ getSimpleTypeString(type),
StyledString.DECORATIONS_STYLER);
} else if (type != null) {
return result.append(" : "
+ getSimpleTypeString(type),
StyledString.DECORATIONS_STYLER);
} else {
// System.err.println("Could not translate type");
return result.append(" : "
+ ((AValueDefinition) def).getExpression(),
StyledString.DECORATIONS_STYLER);
}
}
}
}
}
}
// Type elemType = element.getType();
// result.append(" : " + getSimpleTypeString(elemType),
// StyledString.DECORATIONS_STYLER);
return result;
}
private static StyledString getLocalDefinitionLabel(ALocalDefinition element) {
StyledString result = new StyledString();
result.append(element.getName().getSimpleName());
if (element.getType().getLocation().getModule().toLowerCase().equals("default")) {
result.append(" : " + getSimpleTypeString(element.getType()),
StyledString.DECORATIONS_STYLER);
} else {
result.append(" : " + element.getType().getLocation().getModule() + "`"
+ getSimpleTypeString(element.getType()),
StyledString.DECORATIONS_STYLER);
}
return result;
}
private static StyledString getExplicitFunctionDefinitionLabel(
AExplicitFunctionDefinition element) {
StyledString result = new StyledString();
result.append(element.getName().getSimpleName());
AFunctionType type = (AFunctionType)element.getType();
if (type.getParameters().size() == 0)
{
result.append("() ");
} else
{
result.append("(");
int i = 0;
while (i < type.getParameters().size() - 1)
{
PType definition = (PType) type.getParameters().get(i);
result.append(getSimpleTypeString(definition) + ", ");
i++;
}
PType definition = (PType) type.getParameters().get(i);
result.append(getSimpleTypeString(definition) + ")");
}
if (type.getResult() instanceof AVoidType) {
result.append(" : ()", StyledString.DECORATIONS_STYLER);
} else {
result.append(" : " + getSimpleTypeString(type.getResult()),
StyledString.DECORATIONS_STYLER);
}
return result;
}
private static StyledString getTypeDefinitionLabel(ATypeDefinition element) {
StyledString result = new StyledString();
if (element.getType() instanceof ARecordInvariantType) {
result.append(element.getName().getSimpleName());
result.append(" : record type", StyledString.DECORATIONS_STYLER);
} else if (element.getType() instanceof ANamedInvariantType) {
result.append(element.getName().getSimpleName());
result.append(" : "
+ getSimpleTypeString(((ANamedInvariantType)element.getType()).getType()),
StyledString.DECORATIONS_STYLER);
}
else
result.append(element.getName().getFullName());
return result;
}
private static StyledString getExplicitOperationDefinitionLabel(
AExplicitOperationDefinition element) {
StyledString result = new StyledString();
result.append(element.getName().getSimpleName());
if (element.getType() instanceof AOperationType) {
AOperationType type = (AOperationType)element.getType();
if (type.getParameters().size() == 0) {
result.append("() ");
} else {
result.append("(");
int i = 0;
while (i < type.getParameters().size() - 1) {
PType definition = (PType) type.getParameters().get(i);
result.append(getSimpleTypeString(definition) + ", ");
i++;
}
PType definition = (PType) type.getParameters().get(i);
result.append(getSimpleTypeString(definition) + ")");
}
if (type.getResult() instanceof AVoidType) {
result.append(" : ()", StyledString.DECORATIONS_STYLER);
} else {
result.append(" : " + getSimpleTypeString(type.getResult()),
StyledString.DECORATIONS_STYLER);
}
}
return result;
}
private static StyledString getInstanceVariableDefinitionLabel(
AInstanceVariableDefinition element) {
StyledString result = new StyledString();
result.append(element.getName().getSimpleName());
result.append(" : " + getSimpleTypeString(element.getType()),
StyledString.DECORATIONS_STYLER);
return result;
}
private static StyledString getClassDefinitionLabel(
SClassDefinition element, long flags) {
StyledString result = new StyledString();
result.append(element.getName().getSimpleName());
return result;
}
private static StyledString getModuleLabel(AModuleModules element, long flags) {
StyledString result = new StyledString();
result.append(element.getName().getName());
return result;
}
public static String getTextLabel(Object element, long evaluateTextFlags) {
// TODO Auto-generated method stub
return null;
}
private static String processUnresolved(PType definition) {
String defString = definition.toString();
if (defString.contains("unresolved ")) {
defString = defString.replace("(", "");
defString = defString.replace(")", "");
defString = defString.replace("unresolved ", "");
return defString;
}
return definition.toString();
}
protected static String getSimpleTypeString(PType type) {
String typeName = processUnresolved(type);
typeName = typeName.replace("(", "");
typeName = typeName.replace(")", "");
return typeName;
}
}