File indexing completed on 2024-05-19 04:42:04

0001 #!/usr/bin/env python3
0002 # -*- coding: utf-8 -*-
0003 #
0004 # SPDX-FileCopyrightText: 2014 Denis Steckelmacher <steckdenis@yahoo.fr>
0005 #
0006 # SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0007 
0008 class Member(object):
0009     def __init__(self, name):
0010         """
0011             Member of classes are identified by a name. A parent name can be
0012             given and will be used to build the string "Parent.prototype.name"
0013         """
0014         self._name = name
0015         self._full_name = name
0016 
0017     def setParentName(self, name, usePrototype = True):
0018         if usePrototype:
0019             self._full_name = '%s.prototype.%s' % (name, self.name())
0020         else:
0021             self._full_name = '%s.%s' % (name, self.name())
0022 
0023     def setName(self, name):
0024         self._name = name
0025 
0026     def name(self):
0027         return self._name
0028 
0029     def fullName(self):
0030         return self._full_name
0031 
0032     def print(self):
0033         print('%s = %s;' % (self.fullName(), self.valueToAssign()))
0034 
0035         if self.valueAfterAssignation() != '':
0036             print(self.valueAfterAssignation())
0037 
0038     def valueToAssign(self):
0039         """
0040             Value to assign to the member, for instance "function (){}"
0041         """
0042         return '""';
0043 
0044     def valueAfterAssignation(self):
0045         """
0046             Line that will be printed after the assignation. Can be used to call
0047             a function (therefore giving the type of its parameters.
0048         """
0049         return '';
0050 
0051 class F(Member):
0052     def __init__(self, returnValue, name, *args):
0053         """
0054             A function has a name, a return value, and arguments. Each argument,
0055             is a tuple whose first entry is the argument name, and the second
0056             one its type.
0057 
0058             Note that types are not given using names ("int", "bool", etc), but
0059             values of the type ("1" for an int, "true" or "false" for a boolean,
0060             "new X()" for class X, etc).
0061         """
0062         Member.__init__(self, name)
0063 
0064         self._return_value = returnValue
0065         self._args = args
0066 
0067     def print(self):
0068         if self.name() != '':
0069             # This function is not a member, no need to assign it to an object
0070             print(self.valueToAssign())
0071         else:
0072             Member.print(self)
0073 
0074     def valueToAssign(self):
0075         # Define the function
0076         return 'function %s(%s) { return %s; }' % (
0077             self.name(),
0078             ', '.join([arg[0] for arg in self._args]),
0079             self._return_value
0080         )
0081 
0082     def valueAfterAssignation(self):
0083         # Call it, so that its parameters have the correct type
0084         return '%s(%s);' % (
0085             self.fullName(),
0086             ', '.join([arg[1] for arg in self._args])
0087         )
0088 
0089 class Var(Member):
0090     def __init__(self, type, name):
0091         """
0092             A variable has a name and a type
0093         """
0094         Member.__init__(self, name)
0095 
0096         self._type = type
0097 
0098     def print(self):
0099         if self.name() != '':
0100             # This variable is not a member, declare it using 'var'
0101             print('var %s = %s;' % (self.name(), self.valueToAssign()))
0102         else:
0103             Member.print(self)
0104 
0105     def valueToAssign(self):
0106         return self._type
0107 
0108 
0109 class Class(F):
0110     def __init__(self, name, *args):
0111         F.__init__(self, '', name, *args)
0112         self._members = []
0113         self._prototype = None
0114 
0115     def prototype(self, proto):
0116         self._prototype = proto
0117         return self
0118 
0119     def member(self, member):
0120         self._members.append(member)
0121         return self
0122 
0123     def members(self, *args):
0124         for arg in args:
0125             self.member(arg)
0126 
0127         return self
0128 
0129     def print(self):
0130         # Declare the constructor (a function)
0131         print('/*\n * %s\n */' % self.fullName())
0132 
0133         # Always declare a function using the function keyword
0134         old_full_name = self._full_name
0135         old_name = self._name
0136 
0137         self._full_name = self._full_name.split('.')[-1]
0138         self._name = self._full_name
0139 
0140         F.print(self)
0141 
0142         if old_full_name != self._name:
0143             print('%s = %s;' % (old_full_name, self._name))
0144 
0145         self._full_name = old_full_name
0146         self._name = old_name
0147 
0148         # Print the prototype
0149         if self._prototype is not None:
0150             print('%s.prototype = %s;' % (self.fullName(), self._prototype))
0151 
0152         print('')
0153 
0154         # Declare the members
0155         for member in self._members:
0156             member.setParentName(self.fullName())
0157             member.setName('')
0158             member.print()
0159             print('')
0160 
0161 class Struct(Var):
0162     def __init__(self, name):
0163         Var.__init__(self, '{}', name)
0164         self._members = []
0165 
0166     def member(self, member):
0167         self._members.append(member)
0168         return self
0169 
0170     def members(self, *args):
0171         for arg in args:
0172             self.member(arg)
0173 
0174         return self
0175 
0176     def print(self):
0177         # Declare the object
0178         print('/*\n * %s\n */' % self.fullName())
0179         Var.print(self)
0180         print('')
0181 
0182         # Declare the members
0183         for member in self._members:
0184             member.setParentName(self.fullName(), False)
0185             member.setName('')
0186             member.print()
0187             print('')
0188 
0189 class Module(object):
0190     def __init__(self):
0191         self._members = []
0192 
0193     def member(self, member):
0194         self._members.append(member)
0195         return self
0196 
0197     def members(self, *args):
0198         for arg in args:
0199             self.member(arg)
0200 
0201         return self
0202 
0203     def print(self):
0204         # Declare the members in "exports"
0205         for member in self._members:
0206             member.setParentName('exports', False)
0207             member.setName('')
0208             member.print()
0209             print('')