File indexing completed on 2024-05-19 15:46:48
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('')