7 public errordomain Error {
14 public class Usage : Object
16 public Gee.ArrayList<string> left;
17 public Gee.ArrayList<string> right;
18 public Usage(Gee.ArrayList<string> ileft, Gee.ArrayList<string> iright)
23 public bool leftHas(string s)
25 for(var i = 0 ; i < this.left.size; i++) {
26 var m = this.left.get(i);
30 if (!m.contains(":")) {
33 var ar = m.split(":");
47 static Gee.HashMap<string,Palete>? cache = null;
49 public static Palete factory(string xtype)
52 cache = new Gee.HashMap<string,Palete>();
54 if (cache.get(xtype) != null) {
55 return cache.get(xtype);
59 cache.set(xtype, new Gtk());
62 cache.set(xtype, new Roo());
65 throw new Error.INVALID_TYPE("invalid argument to Palete factory");
67 return cache.get(xtype);
71 public abstract class Palete : Object
77 public Gee.ArrayList<Usage> map;
79 public Gee.HashMap<string,GirObject> classes; // used in roo..
81 public Project.Project project;
83 public Palete(Project.Project project)
86 this.project = project;
92 //map : false, // array of mappings left: [] , right : []
94 //items : false, // the tree of nodes.
99 string guessName(JsRender.Node ar) throws Error // turns the object into full name.
101 throw new Error.NEED_IMPLEMENTING("xxx. guessName needs implimenting");
109 public string[] getChildList(string in_rval)
112 if (this.map == null) {
117 var rval = in_rval == "" ? "*top" : in_rval;
119 // should be a bit more than this..
120 // -> it should look for all elements that inherit
122 var rt = new Gee.ArrayList<string>();
123 for (var i = 0; i < this.map.size; i++) {
124 var m = this.map.get(i);
126 if (!m.leftHas(rval)) {
129 print("found LEFT, adding right\n");
131 for(var ii =0; ii < m.right.size; ii++) {
132 var l = m.right.get(ii);
134 if (rt.index_of(l) > -1) {
137 //print("ADD " + string.joinv(", ", ret) + "\n");
144 print ("drop list for %s is:\n%s\n", rval, string.joinv("\n", ret));
145 //console.log("DROP LIST:");
152 public string[] getDropList(string rval)
155 if (this.map == null) {
160 // should be a bit more than this..
161 // -> it should look for all elements that inherit
163 var rt = new Gee.ArrayList<string>();
164 for (var i = 0; i < this.map.size; i++) {
165 var m = this.map.get(i);
167 if (m.right.index_of(rval) < 0) {
170 //print("found RIGHT, adding left\n");
172 for(var ii =0; ii < m.left.size; ii++) {
173 var l = m.left.get(ii);
175 if (rt.index_of(l) > -1) {
178 //print("ADD " + string.joinv(", ", ret) + "\n");
185 print ("drop list for %s is:\n%s\n", rval, string.joinv("\n", ret));
186 //console.log("DROP LIST:");
192 public void saveTemplate (string name, JsRender.Node data)
196 // store it in user's directory..
197 var appdir = GLib.Environment.get_home_dir() + "/.Builder";
200 if (!GLib.FileUtils.test(appdir+ "/" + gn, GLib.FileTest.IS_DIR)) {
201 GLib.File.new_for_path (appdir+ "/" + gn).make_directory ();
204 GLib.FileUtils.set_contents(appdir+ "/" + gn + "/" + name + ".json", data.toJsonString());
209 * list templates - in home directory (and app dir in future...)
210 * @param {String} name - eg. Gtk.Window..
211 * @return {Array} list of templates available..
214 public GLib.List<string> listTemplates (JsRender.Node node)
219 var ret = new GLib.List<string>();
220 var dir= GLib.Environment.get_home_dir() + "/.Builder/" + gn;
221 if (!GLib.FileUtils.test(dir, GLib.FileTest.IS_DIR)) {
228 var f = File.new_for_path(dir);
230 var file_enum = f.enumerate_children(GLib.FileAttribute.STANDARD_DISPLAY_NAME, GLib.FileQueryInfoFlags.NONE, null);
233 while ((next_file = file_enum.next_file(null)) != null) {
234 var n = next_file.get_display_name();
235 if (!Regex.match_simple ("\\.json$", n)) {
238 ret.append( dir + "/" + n);
244 public JsRender.Node? loadTemplate(string path)
247 var pa = new Json.Parser();
248 pa.load_from_file(path);
249 var node = pa.get_root();
251 if (node.get_node_type () != Json.NodeType.OBJECT) {
254 var obj = node.get_object ();
256 var ret = new JsRender.Node();
259 ret.loadFromJson(obj, 1);
260 ret.ref(); // not sure if needed -- but we had a case where ret became uninitialized?
267 public void loadUsageFile (string fname) {
272 print("Palete Load called\n");
274 if (!FileUtils.test (fname, FileTest.EXISTS)) {
275 throw new Error.MISSING_FILE(fname + " not found");
278 FileUtils.get_contents(fname, out raw);
280 var data = raw.split("\n");
282 var cfg = new Gee.ArrayList<Usage>();
283 var left = new Gee.ArrayList<string>();
284 var right = new Gee.ArrayList<string>();
286 for (var i = 0; i < data.length; i++) {
287 var d = data[i].strip();
288 //print("READ " + d + "\n");
292 Regex.match_simple ("^\\s+$", d)
294 Regex.match_simple ("^\\s*/", d)
299 if (Regex.match_simple ("^left:", d)) {
302 cfg.add(new Usage( left, right));
304 left = new Gee.ArrayList<string>();
305 right = new Gee.ArrayList<string>();
308 if (Regex.match_simple ("^right:", d)) {
313 //print("add left: " + d + "\n");
317 //print("add Right: " + d + "\n");
323 cfg.add(new Usage( left, right));
330 public void validateVala(
335 JsRender.JsRender file,
340 print("validate code (%s) %s\n", file.language, code);
344 if (file.language != "vala" ) { // not sure if we need to validate property
347 // file.project , file.path, file.build_module, ""
351 //var cd = new JSCore.ClassDefinitionEmpty();
352 state.valasource.checkFileWithNodePropChange(
366 public bool javascriptHasErrors(
371 JsRender.JsRender file,
372 out Gee.HashMap<int,string> errors
376 print("validate code (%s) ptype=%s property=%s\n", file.language, ptype, property);
377 errors = new Gee.HashMap<int,string>();
379 if (file.language != "js") {
382 if (ptype != "listener" && property.length > 0 && property[0] == '|') {
386 //var cd = new JSCore.ClassDefinitionEmpty();
387 //print("TESTING CODE %s\n", code);
389 var testcode = ptype == "file" ? code : "var __aaa___ = " + code;
390 var line = Javascript.singleton().validate(
391 testcode, out errmsg);
394 if (ptype == "file") {
395 var err = new Json.Object();
396 err.set_int_member("ERR-TOTAL", 1);
397 var files_obj = new Json.Object();
398 var lines_obj = new Json.Object();
399 var lines_ar = new Json.Array();
400 lines_ar.add_string_element(errmsg);
401 lines_obj.set_array_member(line.to_string(), lines_ar);
402 files_obj.set_object_member(file.path, lines_obj);
404 err.set_object_member("ERR", files_obj);
406 state.showCompileResult(err);
407 // do not set errors.. that's not done here..
410 errors.set(line, errmsg); // depricated - this is used by the editor currently -- but we are planning to switch from that..
411 print("got errors\n");
415 // now syntax is OK.. try the
419 if (ptype == "file") {
420 return this.javascriptHasCompressionErrors(file, state, code);
422 print("no errors\n");
427 public bool javascriptHasCompressionErrors(JsRender.JsRender file, WindowState state, string code)
429 // this uses the roojspacker code to try and compress the code.
430 // it should highlight errors before we actually push live the code.
432 // standard error format: file %s, line %s, Error
434 var p = new JSDOC.Packer();
437 p.dumpTokens = false;
441 p.packFile(code, file.path,"");
442 state.showCompileResult(p.result);
443 if (p.hasErrors("")) {
454 public abstract void fillPack(JsRender.Node node,JsRender.Node parent);
455 public abstract void load();
456 public abstract Gee.HashMap<string,GirObject> getPropertiesFor(string ename, string type);
457 public abstract GirObject? getClass(string ename);
459 public abstract bool typeOptions(string fqn, string key, string type, out string[] opts);
460 public abstract List<SourceCompletionItem> suggestComplete(
461 JsRender.JsRender file,
465 string complete_string