diff -r 752ec68da94d -r bbd1e1744c91 plcopen/VariableInfoCollector.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plcopen/VariableInfoCollector.py Tue Feb 20 11:24:10 2018 +0100 @@ -0,0 +1,87 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# This file is part of Beremiz. +# See COPYING file for copyrights details. + +from __future__ import absolute_import +from plcopen.XSLTModelQuery import XSLTModelQuery, _StringValue, _BoolValue, _translate_args + +# ------------------------------------------------------------------------------- +# Helpers object for generating pou var list +# ------------------------------------------------------------------------------- + +class _VariableInfos(object): + __slots__ = ["Name", "Class", "Option", "Location", "InitialValue", + "Edit", "Documentation", "Type", "Tree", "Number"] + + def __init__(self, *args): + for attr, value in zip(self.__slots__, args): + setattr(self, attr, value if value is not None else "") + + def copy(self): + return _VariableInfos(*[getattr(self, attr) for attr in self.__slots__]) + + +class VariablesInfosFactory(object): + """ Helpers object for generating pou var list """ + + def __init__(self, variables): + self.Variables = variables + self.TreeStack = [] + self.Type = None + self.Dimensions = None + + def SetType(self, context, *args): + self.Type = args[0][0] + + def GetType(self): + if len(self.Dimensions) > 0: + return ("array", self.Type, self.Dimensions) + return self.Type + + def GetTree(self): + return (self.TreeStack.pop(-1), self.Dimensions) + + def AddDimension(self, context, *args): + self.Dimensions.append(tuple( + _translate_args([_StringValue] * 2, args))) + + def AddTree(self, context, *args): + self.TreeStack.append([]) + self.Dimensions = [] + + def AddVarToTree(self, context, *args): + var = (args[0][0], self.Type, self.GetTree()) + self.TreeStack[-1].append(var) + + def AddVariable(self, context, *args): + self.Variables.append(_VariableInfos(*( + _translate_args([_StringValue] * 5 + [_BoolValue] + [_StringValue], args) + + [self.GetType(), self.GetTree()]))) + + +class VariableInfoCollector(XSLTModelQuery): + def __init__(self, controller): + XSLTModelQuery.__init__(self, + controller, + "variables_infos.xslt", + [(name, self.FactoryCaller(name)) + for name in [ + "SetType", + "AddDimension", + "AddTree", + "AddVarToTree", + "AddVariable"]]) + + def FactoryCaller(self, funcname): + def CallFactory(*args): + return getattr(self.factory, funcname)(*args) + return CallFactory + + def Collect(self, root, debug, variables, tree): + self.factory = VariablesInfosFactory(variables) + self._process_xslt(root, debug, tree=str(tree)) + res = self.factory + self.factory = None + return res +