Minsky: 3.17.0
typescriptAPI.cc
Go to the documentation of this file.
1 #include "function.h"
2 #include "typescriptAPI_base.h"
3 #include "minsky.h"
4 #include "minsky.tcd"
5 
6 #include "assetClass.tcd"
7 #include "bookmark.h"
8 #include "bookmark.tcd"
9 #include "cairoSurfaceImage.tcd"
10 #include "callableFunction.tcd"
11 #include "canvas.tcd"
12 #include "CSVDialog.tcd"
13 #include "CSVParser.tcd"
14 #include "constMap.tcd"
15 #include "dataSpecSchema.tcd"
16 #include "dataOp.h"
17 #include "dataOp.tcd"
18 #include "dimension.tcd"
19 #include "engNotation.tcd"
20 #include "equationDisplay.tcd"
21 #include "evalGodley.tcd"
22 #include "eventInterface.tcd"
23 #include "fontDisplay.tcd"
24 #include "godleyIcon.tcd"
25 #include "godleyTable.tcd"
26 #include "godleyTableWindow.tcd"
27 #include "grid.tcd"
28 #include "group.tcd"
29 #include "handleLockInfo.tcd"
30 #include "hypercube.tcd"
31 #include "index.tcd"
32 #include "intOp.tcd"
33 #include "item.tcd"
34 #include "itemT.tcd"
35 #include "lasso.tcd"
36 #include "lock.tcd"
37 #include "noteBase.tcd"
38 #include "operation.tcd"
39 #include "operationBase.tcd"
40 #include "operationType.tcd"
41 #include "pango.tcd"
42 #include "pannableTab.tcd"
43 #include "phillipsDiagram.tcd"
44 #include "plot.tcd"
45 #include "plotOptions.tcd"
46 #include "plotWidget.tcd"
47 #include "polyRESTProcessBase.tcd"
48 #include "port.h"
49 #include "port.tcd"
50 #include "publication.tcd"
51 #include "pubTab.tcd"
52 #include "ravelState.tcd"
53 #include "renderNativeWindow.tcd"
54 #include "ravelWrap.tcd"
55 #include "rungeKutta.tcd"
56 #include "selection.tcd"
57 #include "sheet.tcd"
58 #include "simulation.tcd"
59 #include "slider.tcd"
60 #include "SVGItem.tcd"
61 #include "switchIcon.tcd"
62 #include "tensorInterface.tcd"
63 #include "tensorVal.tcd"
64 #include "units.tcd"
65 #include "userFunction.h"
66 #include "userFunction.tcd"
67 #include "variableInstanceList.h"
68 #include "variableInstanceList.tcd"
69 #include "variable.tcd"
70 #include "variablePane.tcd"
71 #include "variableType.tcd"
72 #include "variableValue.tcd"
73 #include "variableValues.tcd"
74 #include "wire.tcd"
75 #include "xvector.tcd"
76 
77 namespace classdesc_access
78 {
79  // clobbers
80  template <class T>
81  struct access_typescriptAPI<classdesc::Exclude<T>>:
82  public classdesc::NullDescriptor<classdesc::typescriptAPI_t> {};
83 
84  template <>
85  struct access_typescriptAPI<classdesc::PolyPackBase>:
86  public classdesc::NullDescriptor<classdesc::typescriptAPI_t> {};
87 
88  template <class T>
89  struct access_typescriptAPI<classdesc::PolyPack<T>>:
90  public classdesc::NullDescriptor<classdesc::typescriptAPI_t> {};
91 
92  template <>
93  struct access_typescriptAPI<std::vector<civita::any>>:
94  public classdesc::NullDescriptor<classdesc::typescriptAPI_t> {};
95 
96  template <class T>
98  public classdesc::NullDescriptor<classdesc::typescriptAPI_t> {};
99 }
100 
101 namespace classdesc
102 {
103  // dummies
104  template <> string typeName<cairo_t>() {return "minsky__dummy";}
105  template <> string typeName<cairo_surface_t>() {return "minsky__dummy";}
106 
107  template <>
108  struct tn<civita::any>
109  {
110  static string name() {return "minsky__dummy";}
111  };
112  template <class T>
113  struct tn<boost::geometry::model::d2::point_xy<T>>
114  {
115  static string name() {return "minsky__dummy";}
116  };
117  template <>
118  struct tn<RESTProcess_t>
119  {
120  static string name() {return "minsky__dummy";}
121  };
122  template <class C, class D>
123  struct tn<std::chrono::time_point<C,D>>
124  {
125  static string name() {return "minsky__dummy";}
126  };
127  template <>
128  struct tn<std::istream>
129  {
130  static string name() {return "minsky__dummy";}
131  };
132 
133  // typescript has difficulties with specialised templates
134  template <>
135  struct tn<minsky::PannableTab<minsky::EquationDisplay>>
136  {
137  static string name() {return "EquationDisplay";}
138  };
139 
140 }
141 
142 #include "minsky_epilogue.h"
143 
144 namespace classdesc
145 {
146  template <class T, class Base>
147  typename enable_if<Not<is_map<Base>>, void>::T
148  typescriptAPI(typescriptAPI_t& t, const string& d)
149  {
150  // bail out of object heirarchy drill down once reaching named base class
151  if (typescriptType<Base>()==t[typescriptType<T>()].super) return;
152  classdesc_access::access_typescriptAPI<Base>().template type<T>(t,d);
153  }
154 
155  template <class T> void typescriptAPI_t::addClass() {typescriptAPI<T,T>(*this,"");}
156  template <class T, class Base> void typescriptAPI_t::addSubclass()
157  {
158  operator[](typescriptType<T>()).super=typescriptType<Base>();
159  typescriptAPI<T,T>(*this,"");
160  }
161 }
162 
163 namespace minsky
164 {
165  Minsky& minsky()
166  {
167  static Minsky s_minsky;
168  return s_minsky;
169  }
170 
173 
174  // GUI callback needed only to solve linkage problems
175  void doOneEvent(bool idleTasksOnly) {}
176 }
177 
178 using namespace classdesc;
179 using namespace std;
180 using namespace minsky;
181 
182 void exportClass(const std::string& name, const minsky::typescriptAPI_ns::ClassType& klass)
183 {
184  cout << "export class "+name+" extends "+(klass.super.empty()? "CppClass": klass.super)+" {\n";
185 
186  // properties
187  for (auto& prop: klass.properties)
188  cout << " "<<prop.first <<": "<<prop.second.type<<";\n";
189 
190  // constructor
191  if (!klass.super.empty())
192  {
193  cout << " constructor(prefix: string|"<<klass.super<<"){\n";
194  cout << " if (typeof prefix==='string')\n";
195  cout << " super(prefix";
196  if (!klass.valueType.empty())
197  cout <<","<<klass.valueType;
198  cout << ")\n";
199  cout << " else\n";
200  cout << " super(prefix.$prefix()";
201  if (!klass.valueType.empty())
202  cout <<","<<klass.valueType;
203  cout <<")\n";
204  }
205  else
206  {
207  cout << " constructor(prefix: string){\n";
208  cout << " super(prefix);\n";
209  }
210  for (auto& prop: klass.properties)
211  {
212  if (!prop.second.construction.empty())
213  cout << " this."<<prop.first<<"="<<prop.second.construction<<"\n";
214  else
215  cout << " this."<<prop.first<<"=new "<<prop.second.type<<"(this.$prefix()+'."<<prop.first<<"');\n";
216  }
217  cout << " }\n";
218 
219  // methods
220  for (auto& method: klass.methods)
221  {
222  cout << " async "<<method.first<<"(";
223  for (size_t i=0; i<method.second.args.size(); ++i)
224  {
225  if (i>0) cout<<",";
226  cout<<method.second.args[i].name<<": "<<method.second.args[i].type;
227  }
228  cout << "): Promise<"<<method.second.returnType<<"> {return this.$callMethod('"<<method.first<<"'";
229  for (auto& arg: method.second.args)
230  cout<<","<<arg.name;
231  cout<<");}\n";
232  }
233  cout << "}\n\n";
234 }
235 
236 int main()
237 {
238  typescriptAPI_t api;
239  api.addClass<Minsky>();
240 
241  // supporting types
242  api.addClass<Bookmark>();
243  api.addClass<Canvas::ZoomCrop>();
244  api.addClass<civita::Dimension>();
245  api.addClass<civita::Hypercube>();
246  api.addClass<civita::Index>();
247  api.addClass<civita::ITensor>();
248  api.addClass<civita::XVector>();
249  api.addClass<DataSpecSchema>();
250  api.addClass<ecolab::Plot::LineStyle>();
251  api.addClass<EngNotation>();
252  api.addClass<EventInterface>();
253  api.addClass<GroupItems>();
254  api.addClass<HandleLockInfo>();
255  api.addClass<Port>();
256  api.addClass<PubItem>();
257  api.addClass<ravel::HandleState>();
258  api.addClass<ravel::RavelState>();
259  api.addClass<Units>();
260  api.addClass<VariablePaneCell>();
261  api.addClass<VariableValue>();
262  api.addClass<VariableValues>();
263  api["VariableValues"].valueType="VariableValue";
264 
265  // Item subclasses
266  api.addSubclass<DataOp,Item>();
267  api.addSubclass<Group,Item>();
268  api.addSubclass<GodleyIcon,Item>();
269  api.addSubclass<IntOp,Item>();
270  api.addSubclass<Lock,Item>();
274  api.addSubclass<PlotWidget,Item>();
275  api.addSubclass<Ravel,Item>();
276  api.addSubclass<Sheet,Item>();
277  api.addSubclass<SwitchIcon,Item>();
280 
281  // RenderNativeWindow subclasses
287 
288 
289  // to prevent Group recursively calling itself on construction
290  api["Group"].properties.erase("parent");
291 
292  cout << "/*\nThis is a built file, please do not edit.\n";
293  cout << "See RESTService/typescriptAPI for more information.\n*/\n\n";
294  cout << "import {CppClass, Sequence, Container, Map, Pair} from './backend';\n\n";
295 
296  // dummy types
297  cout << "class minsky__dummy {}\n";
298  cout << "class minsky__EventInterface__KeyPressArgs {}\n";
299  cout << "class minsky__GodleyIcon__MoveCellArgs {}\n";
300  cout << "class minsky__RenderNativeWindow__RenderFrameArgs {}\n";
301  cout << "class minsky__VariableType__TypeT {}\n";
302  cout << "class civita__ITensor__Args {}\n";
303  cout << "class classdesc__json_pack_t {}\n";
304  cout << "class classdesc__pack_t {}\n";
305  cout << "class classdesc__RESTProcess_t {}\n";
306  cout << "class ecolab__cairo__Surface {}\n";
307  cout<<endl;
308 
309  // these need to be declared in a specific order
310  vector<string> exportFirst{"EventInterface","Item","OperationBase","RenderNativeWindow","VariableBase"};
311  for (auto& i: exportFirst) exportClass(i,api[i]);
312 
313  cout << "class minsky__Variable<T> extends VariableBase {}\n";
314 
315  // then export the rest
316  for (auto& i: api)
317  if (find(exportFirst.begin(), exportFirst.end(), i.first)==exportFirst.end())
318  exportClass(i.first, i.second);
319 
320  cout << "export var minsky=new Minsky('minsky');\n";
321 }
void doOneEvent(bool idleTasksOnly)
checks if any GUI events are waiting, and proces an event if so
Definition: addon.cc:550
LocalMinsky(Minsky &m)
Definition: addon.cc:548
STL namespace.
string typeName< cairo_surface_t >()
convenience class to omit writing XML records when data absent or empty
Definition: optional.h:39
int main()
enable_if< Not< is_map< B > >, void >::T typescriptAPI(typescriptAPI_t &, const std::string &)
Mixin implementing common panning functionality in tabs.
Definition: pannableTab.h:36
represents the units (in sense of dimensional analysis) of a variable.
Definition: units.h:34
string typeName< cairo_t >()
void exportClass(const std::string &name, const minsky::typescriptAPI_ns::ClassType &klass)
legacy data importer object
Definition: dataOp.h:28
Minsky & minsky()
global minsky object
Definition: addon.cc:545
a container item for a plot widget
Definition: plotWidget.h:45