Función metadata
Estrictamente hablando, hay dos funciones metadata, cada una con un dominio distinto. Pero debido a que ambas tratan el mismo propósito, generar los metadatos de MAPL, se implementarán juntas para que se vea su labor en conjunto.
Las funciones se definieron así:
metadata⟦program⟧ | metadata⟦program → varDefinition* statement*⟧ = #SOURCE {source_file} metadata⟦varDefinitioni⟧ |
metadata⟦varDefinition⟧ | metadata⟦varDefinition → type name:string⟧ = #GLOBAL {name}: {maplType(type)} |
Por tanto, su implementación sería la siguiente:
java
public class Metadata extends AbstractCodeFunction {
public Object visit(Program program, Object param) {
out("#source \"" + getSpecification().getSourceFile() + "\"");
metadata(program.varDefinitions());
return null;
}
public Object visit(VarDefinition varDefinition, Object param) {
out("#GLOBAL " + varDefinition.getName() + ":" + getMaplName(varDefinition.getType()));
return null;
}
//# ------------------------------------------------------------------
//# Auxiliary methods
private String getMaplName(Type type) {
if (type instanceof IntType)
return "int";
if (type instanceof FloatType)
return "float";
// Sealed classes + pattern matching would avoid this situation. Those features were not
// finished when this code was implemented
throw new IllegalArgumentException("Unknown Type: " + type);
}
}
De nuevo, como la función auxiliar getMaplName
es específica para esta función de código, se ha añadido en la clase Metadata.java
como método private
.