plcopen/variables_infos.ysl2
author Surkov Sergey <surkovsv93@gmail.com>
Tue, 28 Mar 2017 11:31:05 +0300
changeset 1668 cd9db17c7ab5
parent 1368 e567e4bee11f
child 1936 b85b13b1c2ec
permissions -rw-r--r--
clear variable location cell in variable panel, if variable class or type changed
if variable class is not local or global, or variable type is not locatable, variable location cell would be empty and read-only
include yslt.yml2
estylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
            xmlns:xhtml="http://www.w3.org/1999/xhtml"
            xmlns:ns="var_infos_ns" 
            extension-element-prefixes="ns" 
            exclude-result-prefixes="ns" {
    
    param "tree";
    
    template "text()";
    
    variable "project" {
        copy "document('project')/project/*";
    }
    
    variable "stdlib" {
        copy "document('stdlib')/stdlib/*";
    }
    variable "extensions" {
        copy "document('extensions')/extensions/*";
    }
    
    template "ppx:configuration" {
        apply "ppx:globalVars";
    }
    
    template "ppx:resource" {
        apply "ppx:globalVars";
    }
    
    template "ppx:pou" {
        apply "ppx:interface/*";
    }
    
    template "ppx:returnType" {
        value "ns:AddTree()";
        apply ".", mode="var_type";
    }
    
    function "variables_infos" {
        param "var_class";
        variable "var_option" {
            choose {
                when "@constant='true' or @constant='1'" > Constant
                when "@retain='true' or @retain='1'" > Retain
                when "@nonretain='true' or @nonretain='1'" > Non-Retain
            }
        }
        foreach "ppx:variable" {
            variable "initial_value" {
                apply "ppx:initialValue";
            }
            variable "edit" {
                choose {
                    when "$var_class='Global' or $var_class='External'" > true
                    otherwise {
                        apply "ppx:type", mode="var_edit";
                    }
                }
            }
            value "ns:AddTree()";
            apply "ppx:type", mode="var_type";
            value "ns:AddVariable(@name, $var_class, $var_option, @address, $initial_value, $edit, ppx:documentation/xhtml:p/text())";
        }
    }
    
    template "ppx:localVars" {
        call "variables_infos" {
            with "var_class" > Local
        }
    }
    
    template "ppx:globalVars" {
        call "variables_infos" {
            with "var_class" > Global
        }
    }
    
    template "ppx:externalVars" {
        call "variables_infos" {
            with "var_class" > External
        }
    }
    
    template "ppx:tempVars" {
        call "variables_infos" {
            with "var_class" > Temp
        }
    }
    
    template "ppx:inputVars" {
        call "variables_infos" {
            with "var_class" > Input
        }
    }
    
    template "ppx:outputVars" {
        call "variables_infos" {
            with "var_class" > Output
        }
    }
    
    template "ppx:inOutVars" {
        call "variables_infos" {
            with "var_class" > InOut
        }
    }
    
    template "ppx:pou", mode="var_type" {
        apply "ppx:interface/*[self::ppx:inputVars or self::ppx:inOutVars or self::ppx:outputVars]/ppx:variable", mode="var_type";
    }
    
    template "ppx:variable", mode="var_type" {
        variable "name" > «@name»
        value "ns:AddTree()";
        apply "ppx:type", mode="var_type";
        value "ns:AddVarToTree($name)";
    }
    
    template "ppx:dataType", mode="var_type" {
        apply "ppx:baseType", mode="var_type";
    }
    
    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:struct", mode="var_type" {
        apply "ppx:variable", mode="var_type";
    }
    
    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived", mode="var_type" {
        variable "type_name" > «@name»
        choose {
            when "$tree='True'" {
                apply """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
                         exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]""", mode="var_type";
            }
        }
        value "ns:SetType($type_name)";
    }
     
    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:array", mode="var_type" {
        apply "ppx:baseType", mode="var_type";
        foreach "ppx:dimension" {
            variable "lower" > «@lower»
            variable "upper" > «@upper»
            value "ns:AddDimension($lower, $upper)";
        }
    }
    
    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:string", mode="var_type" {
        variable "name" > STRING
        value "ns:SetType($name)";
    }
    
    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:wstring", mode="var_type" {
        variable "name" > WSTRING
        value "ns:SetType($name)";
    }
    
    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*", mode="var_type" {
        variable "name" > «local-name()»
        value "ns:SetType($name)";
    }
    
    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived", mode="var_edit" {
        variable "type_name" > «@name»
        variable "pou_infos" {
            copy """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
                    exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
                    exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]""";
        }
        choose {
            when "$pou_infos != ''" > false
            otherwise > true
        }
    }
    
    template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*", mode="var_edit" {
        > true
    }
    
    template "ppx:value" {
        choose {
            when "@repetitionValue" {
                > «@repetitionValue»(
                apply;
                > )
            }
            when "@member" {
                 > «@member» := 
                 apply;
            }
            otherwise {
                apply;
            }
        }
    }
    
    template "ppx:simpleValue" {
        > «@value»
    }
    
    function "complex_type_value" {
        param "start_bracket";
        param "end_bracket";
        > «$start_bracket»
        foreach "ppx:value" {
            apply ".";
            choose {
                when "position()!=last()" > , 
            }
        }
        > «$end_bracket»
    }
    
    template "ppx:arrayValue" {
        call "complex_type_value" {
            with "start_bracket" > [
            with "end_bracket" > ]
        }
    }
    
    template "ppx:structValue" {
        call "complex_type_value" {
            with "start_bracket" > (
            with "end_bracket" > )
        }
    }

}