package org.rascalmpl.eclipse.editor.proposer;
import java.util.HashMap;
import java.util.Set;
import io.usethesource.vallang.ISourceLocation;
public class Symbol implements ISymbol {
public static final String symbol_type_void = "Void";
public static final String symbol_type_module = "Module";
public static final String symbol_type_function = "Function";
public static final String symbol_type_var = "Variable";
public static final String symbol_type_arg = "Argument";
public static final String symbol_type_alias = "Alias";
public static final String symbol_type_adt = "ADT";
public static final String symbol_type_constructor = "Constructor";
public static final String symbol_attribute_datatype = "Datatype";
// Basic datatypes
public static final String symbol_datatype_unknown = "Unknown";
public static final String symbol_datatype_string = "str";
public static final String symbol_datatype_boolean = "bool";
public static final String symbol_datatype_bag = "bag";
public static final String symbol_datatype_datetime = "datetime";
public static final String symbol_datatype_integer = "int";
public static final String symbol_datatype_list = "list";
public static final String symbol_datatype_location = "loc";
public static final String symbol_datatype_map = "map";
public static final String symbol_datatype_node = "node";
public static final String symbol_datatype_number = "num";
public static final String symbol_datatype_rational = "rational";
public static final String symbol_datatype_real = "real";
public static final String symbol_datatype_relation = "rel";
public static final String symbol_datatype_set = "set";
public static final String symbol_datatype_tuple = "tuple";
public static final String symbol_datatype_type = "type";
public static final String symbol_datatype_value = "value";
public static final String symbol_datatype_void = "void";
private final String name;
private final String type;
private final ISourceLocation location;
private String label;
private final HashMap<String, String> attributes = new HashMap<String, String>();
public Symbol(String name, String type, ISourceLocation location) {
this.name = name;
this.type = type;
this.location = location;
this.label = name;
}
@Override
public <T> T accept(SymbolVisitor<T> visitor) {
return visitor.visitSymbol(this);
}
@Override
public String getLabel() {
return label;
}
@Override
public ISourceLocation getLocation() {
return location;
}
@Override
public String getName() {
return name;
}
@Override
public String getType() {
return type;
}
@Override
public String getAttribute(String key) {
return attributes.get(key);
}
@Override
public void setAttribute(String key, String value) {
attributes.put(key, value);
}
@Override
public void setLabel(String label) {
this.label = label;
}
@Override
public String toString() {
// symbol(str name, str symbolType)
// symbol(str name, str symbolType, map[str, str] attributes)
//TODO: Serialize location. Find way to add multiple annotations.
String labelAnnotation = label.isEmpty() ? "" : "[@label=\"" + label + "\"]";
if (attributes.size() > 0) {
Set<String> attributeKeys = attributes.keySet();
String attributeMapString = "";
for (String key : attributeKeys) {
if (!attributeMapString.isEmpty()) attributeMapString += ", ";
attributeMapString += String.format("\"%s\" : \"%s\"", key, attributes.get(key));
}
attributeMapString = "(" + attributeMapString + ")";
return String.format("symbol(\"%s\", \"%s\", %s)%s", name, type, attributeMapString, labelAnnotation);
}
return String.format("symbol(\"%s\", \"%s\")%s", name, type, labelAnnotation);
}
}