Search in sources :

Example 1 with LanguageSpecificationV2

use of org.lara.language.specification.dsl.LanguageSpecificationV2 in project lara-framework by specs-feup.

the class ImportProcessor method importAndInitialize.

/**
 */
public void importAndInitialize() {
    for (Class<?> importingClass : LaraApis.getImportableClasses()) {
        importClassWithSimpleName(importingClass);
    }
    for (Class<?> importingClass : WeaverApis.getImportableClasses()) {
        importClassWithSimpleName(importingClass);
    }
    for (Class<?> importingClass : CLASSES_TO_IMPORT) {
        importClassWithSimpleName(importingClass);
    }
    final File jarDir = new File(LaraIUtils.getJarFoldername());
    final String laraPath = "var " + LARASystem.LARAPATH + "  = '" + jarDir.getAbsolutePath().replace('\\', '/') + "';\n";
    final String attribute = "var " + Interpreter.ATTRIBUTES + " = { set: function(newReport){ mergeObjects(this,newReport);}};\n";
    interpreter.evaluate(laraPath, "import_and_initialize");
    interpreter.evaluate(attribute, "import_and_initialize");
    LaraI laraI = interpreter.getLaraI();
    if (laraI.getOptions().useStackTrace()) {
        interpreter.put(CallStackTrace.STACKTRACE_NAME, interpreter.getStackStrace());
    }
    interpreter.put(MasterWeaver.WEAVER_NAME, laraI.getWeaver());
    interpreter.put(LARASystem.LARA_SYSTEM_NAME, new LARASystem(laraI));
    WeaverEngine engine = laraI.getWeaver().getEngine();
    LanguageSpecificationV2 ls = engine.getLanguageSpecificationV2();
    interpreter.put(MasterWeaver.LANGUAGE_SPECIFICATION_NAME, WeaverSpecification.newInstance(ls, engine.getScriptEngine()));
}
Also used : WeaverEngine(org.lara.interpreter.weaver.interf.WeaverEngine) LanguageSpecificationV2(org.lara.language.specification.dsl.LanguageSpecificationV2) LARASystem(Utils.LARASystem) LaraI(larai.LaraI) File(java.io.File)

Example 2 with LanguageSpecificationV2

use of org.lara.language.specification.dsl.LanguageSpecificationV2 in project lara-framework by specs-feup.

the class LangSpecsXmlParser method parse.

public static LanguageSpecificationV2 parse(InputStream joinPointModel, InputStream attributeModel, InputStream actionModel, boolean validate) {
    // System.out.println("JP SCHEMA: " + SchemaResource.JOIN_POINT_SCHEMA.read());
    // System.out.println("JP SCHEMA: " + SchemaResource.JOIN_POINT_SCHEMA.getResource());
    var jpSchema = validate ? SchemaResource.JOIN_POINT_SCHEMA.toStream() : null;
    var attrSchema = validate ? SchemaResource.ATTRIBUTE_SCHEMA.toStream() : null;
    var actionSchema = validate ? SchemaResource.ACTION_SCHEMA.toStream() : null;
    var joinPointModelNode = XmlDocument.newInstance(joinPointModel, jpSchema);
    var attributeModelNode = XmlDocument.newInstance(attributeModel, attrSchema);
    var actionModelNode = XmlDocument.newInstance(actionModel, actionSchema);
    // Setup global JoinPointClass
    LanguageSpecificationV2 langSpecV2 = new LanguageSpecificationV2();
    JoinPointClass global = JoinPointClass.globalJoinPoint(langSpecV2);
    langSpecV2.setGlobal(global);
    // Initialize types (typedef, enums), to have access to available names
    for (var type : attributeModelNode.getElementsByName("object")) {
        var typeDef = new TypeDef(type.getAttribute("name"));
        langSpecV2.add(typeDef);
        setOptional(type.getAttribute("tooltip"), typeDef::setToolTip);
    }
    for (var type : attributeModelNode.getElementsByName("enum")) {
        var enumDef = new EnumDef(type.getAttribute("name"));
        langSpecV2.add(enumDef);
        setOptional(type.getAttribute("tooltip"), enumDef::setToolTip);
        List<EnumValue> valuesList = toEnumValues(type.getElementsByName("value"), langSpecV2);
        enumDef.setValues(valuesList);
    }
    List<JoinPointClass> jps = new ArrayList<>();
    for (var jpNode : joinPointModelNode.getElementsByName("joinpoint")) {
        var jp = new JoinPointClass(jpNode.getAttribute("class"), langSpecV2);
        setOptional(jpNode.getAttribute("tooltip"), jp::setToolTip);
        jps.add(jp);
    }
    Collections.sort(jps);
    jps.stream().forEach(langSpecV2::add);
    var joinpoints = joinPointModelNode.getElementsByName("joinpoints").get(0);
    langSpecV2.setRoot(joinpoints.getAttribute("root_class"));
    setOptional(joinpoints.getAttribute("root_alias"), langSpecV2::setRootAlias);
    // Map of actions according to class
    MultiMap<String, XmlElement> joinPointActions = new MultiMap<>();
    List<XmlElement> globalActions = new ArrayList<>();
    for (var actionNode : actionModelNode.getElementsByName("action")) {
        var classNames = actionNode.getAttribute("class");
        // Global actions do not have a class value, or its value is '*'
        if (classNames.isEmpty() || classNames.equals("*")) {
            globalActions.add(actionNode);
            continue;
        }
        // System.out.println("CLASS NAMES: " + classNames);
        for (String className : classNames.split(",")) {
            // System.out.println("NAME: " + className);
            joinPointActions.add(className.strip(), actionNode);
        }
    }
    populateGlobal(joinPointModelNode, attributeModelNode, actionModelNode, langSpecV2, global, globalActions);
    // Populate TypeDef
    for (var typeNode : attributeModelNode.getElementsByName("object")) {
        TypeDef typeDef = langSpecV2.getTypeDefs().get(typeNode.getAttribute("name"));
        List<Attribute> attributesList = convertAttributes(typeNode.getElementsByName("attribute"), langSpecV2);
        typeDef.setFields(attributesList);
    }
    for (var jpNode : joinPointModelNode.getElementsByName("joinpoint")) {
        String jpClass = jpNode.getAttribute("class");
        JoinPointClass jp = langSpecV2.getJoinPoint(jpClass);
        String extendsType = jpNode.getAttribute("extends");
        if (!extendsType.isEmpty()) {
            jp.setExtend(langSpecV2.getJoinPoint(extendsType));
        } else {
            jp.setExtend(global);
        }
        // Obtain attribute nodes from artifacts
        List<XmlElement> artifactNodes = attributeModelNode.getElementsByName("artifact").stream().filter(attribute -> attribute.getAttribute("class").equals(jpClass)).collect(Collectors.toList());
        var attributeNodes = artifactNodes.stream().flatMap(art -> art.getElementsByName("attribute").stream()).collect(Collectors.toList());
        // Add attributes
        jp.setAttributes(convertAttributes(attributeNodes, langSpecV2));
        // Add selects
        jp.setSelects(convertSelects(langSpecV2, jpNode.getElementsByName("select")));
        // Add actions
        jp.setActions(convertActions(langSpecV2, joinPointActions.get(jpClass)));
        // Set default attributes
        for (var artifact : attributeModelNode.getElementsByName("artifact")) {
            var defaultValue = artifact.getAttribute("default");
            if (defaultValue.isEmpty()) {
                continue;
            }
            // Get corresponding join point and set default
            // System.out.println("ARTIFACT CLASS: " + artifact.getAttribute("class"));
            // System.out.println("JP: " + langSpecV2.getJoinPoint(artifact.getAttribute("class")));
            var artifactJp = langSpecV2.getJoinPoint(artifact.getAttribute("class"));
            if (artifactJp == null) {
                SpecsLogs.info("Artifact without join point: " + artifact.getAttribute("class"));
                continue;
            }
            artifactJp.setDefaultAttribute(defaultValue);
        // System.out.println("SETTING DEFAULT '" + defaultValue + "' for JP " +
        // artifact.getAttribute("class"));
        }
    }
    // Add default global attributes (e.g., joinPointType, instanceOf)
    addDefaultGlobalAttributes(langSpecV2);
    return langSpecV2;
}
Also used : Arrays(java.util.Arrays) IType(org.lara.language.specification.dsl.types.IType) Attribute(org.lara.language.specification.dsl.Attribute) ResourceProvider(pt.up.fe.specs.util.providers.ResourceProvider) LanguageSpecificationV2(org.lara.language.specification.dsl.LanguageSpecificationV2) ArrayList(java.util.ArrayList) Action(org.lara.language.specification.dsl.Action) Parameter(org.lara.language.specification.dsl.Parameter) Select(org.lara.language.specification.dsl.Select) PrimitiveClasses(org.lara.language.specification.dsl.types.PrimitiveClasses) XmlDocument(pt.up.fe.specs.util.xml.XmlDocument) JoinPointClass(org.lara.language.specification.dsl.JoinPointClass) TypeDef(org.lara.language.specification.dsl.types.TypeDef) Declaration(org.lara.language.specification.dsl.Declaration) MultiMap(pt.up.fe.specs.util.collections.MultiMap) SpecsIo(pt.up.fe.specs.util.SpecsIo) EnumValue(org.lara.language.specification.dsl.types.EnumValue) XmlElement(pt.up.fe.specs.util.xml.XmlElement) Collectors(java.util.stream.Collectors) Consumer(java.util.function.Consumer) List(java.util.List) SpecsLogs(pt.up.fe.specs.util.SpecsLogs) Collections(java.util.Collections) InputStream(java.io.InputStream) EnumDef(org.lara.language.specification.dsl.types.EnumDef) EnumDef(org.lara.language.specification.dsl.types.EnumDef) Attribute(org.lara.language.specification.dsl.Attribute) EnumValue(org.lara.language.specification.dsl.types.EnumValue) ArrayList(java.util.ArrayList) LanguageSpecificationV2(org.lara.language.specification.dsl.LanguageSpecificationV2) MultiMap(pt.up.fe.specs.util.collections.MultiMap) TypeDef(org.lara.language.specification.dsl.types.TypeDef) JoinPointClass(org.lara.language.specification.dsl.JoinPointClass) XmlElement(pt.up.fe.specs.util.xml.XmlElement)

Aggregations

LanguageSpecificationV2 (org.lara.language.specification.dsl.LanguageSpecificationV2)2 LARASystem (Utils.LARASystem)1 File (java.io.File)1 InputStream (java.io.InputStream)1 ArrayList (java.util.ArrayList)1 Arrays (java.util.Arrays)1 Collections (java.util.Collections)1 List (java.util.List)1 Consumer (java.util.function.Consumer)1 Collectors (java.util.stream.Collectors)1 LaraI (larai.LaraI)1 WeaverEngine (org.lara.interpreter.weaver.interf.WeaverEngine)1 Action (org.lara.language.specification.dsl.Action)1 Attribute (org.lara.language.specification.dsl.Attribute)1 Declaration (org.lara.language.specification.dsl.Declaration)1 JoinPointClass (org.lara.language.specification.dsl.JoinPointClass)1 Parameter (org.lara.language.specification.dsl.Parameter)1 Select (org.lara.language.specification.dsl.Select)1 EnumDef (org.lara.language.specification.dsl.types.EnumDef)1 EnumValue (org.lara.language.specification.dsl.types.EnumValue)1