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;
50 public static Palete factory(project)
53 cache = new Gee.HashMap<string,Palete>();
55 if (cache.get(xtype) != null) {
56 return cache.get(xtype);
60 cache.set(xtype, new Gtk());
63 cache.set(xtype, new Roo());
66 throw new Error.INVALID_TYPE("invalid argument to Palete factory");
68 return cache.get(xtype);
72 public abstract class Palete : Object
78 public Gee.ArrayList<Usage> map;
80 public Gee.HashMap<string,GirObject> classes; // used in roo..
82 public Project.Project project;
84 public Palete(Project.Project project)
87 this.project = project;
93 //map : false, // array of mappings left: [] , right : []
95 //items : false, // the tree of nodes.
100 string guessName(JsRender.Node ar) throws Error // turns the object into full name.
102 throw new Error.NEED_IMPLEMENTING("xxx. guessName needs implimenting");
108 // this is the old verison using 'Usage'... see flutter for a better version..
110 public string[] original_getChildList(string in_rval)
113 if (this.map == null) {
118 var rval = in_rval == "" ? "*top" : in_rval;
120 // should be a bit more than this..
121 // -> it should look for all elements that inherit
123 var rt = new Gee.ArrayList<string>();
124 for (var i = 0; i < this.map.size; i++) {
125 var m = this.map.get(i);
127 if (!m.leftHas(rval)) {
130 print("found LEFT, adding right\n");
132 for(var ii =0; ii < m.right.size; ii++) {
133 var l = m.right.get(ii);
135 if (rt.index_of(l) > -1) {
138 //print("ADD " + string.joinv(", ", ret) + "\n");
145 print ("drop list for %s is:\n%s\n", rval, string.joinv("\n", ret));
146 //console.log("DROP LIST:");
154 public string[] default_getDropList(string rval)
157 if (this.map == null) {
162 // should be a bit more than this..
163 // -> it should look for all elements that inherit
165 var rt = new Gee.ArrayList<string>();
166 for (var i = 0; i < this.map.size; i++) {
167 var m = this.map.get(i);
169 if (m.right.index_of(rval) < 0) {
172 //print("found RIGHT, adding left\n");
174 for(var ii =0; ii < m.left.size; ii++) {
175 var l = m.left.get(ii);
177 if (rt.index_of(l) > -1) {
180 //print("ADD " + string.joinv(", ", ret) + "\n");
187 print ("drop list for %s is:\n%s\n", rval, string.joinv("\n", ret));
188 //console.log("DROP LIST:");
194 public void saveTemplate (string name, JsRender.Node data)
198 // store it in user's directory..
199 var appdir = GLib.Environment.get_home_dir() + "/.Builder";
202 if (!GLib.FileUtils.test(appdir+ "/" + gn, GLib.FileTest.IS_DIR)) {
203 GLib.File.new_for_path (appdir+ "/" + gn).make_directory ();
206 GLib.FileUtils.set_contents(appdir+ "/" + gn + "/" + name + ".json", data.toJsonString());
211 * list templates - in home directory (and app dir in future...)
212 * @param {String} name - eg. Gtk.Window..
213 * @return {Array} list of templates available..
216 public GLib.List<string> listTemplates (JsRender.Node node)
221 var ret = new GLib.List<string>();
222 var dir= GLib.Environment.get_home_dir() + "/.Builder/" + gn;
223 if (!GLib.FileUtils.test(dir, GLib.FileTest.IS_DIR)) {
230 var f = File.new_for_path(dir);
232 var file_enum = f.enumerate_children(GLib.FileAttribute.STANDARD_DISPLAY_NAME, GLib.FileQueryInfoFlags.NONE, null);
235 while ((next_file = file_enum.next_file(null)) != null) {
236 var n = next_file.get_display_name();
237 if (!Regex.match_simple ("\\.json$", n)) {
240 ret.append( dir + "/" + n);
246 public JsRender.Node? loadTemplate(string path)
249 var pa = new Json.Parser();
250 pa.load_from_file(path);
251 var node = pa.get_root();
253 if (node.get_node_type () != Json.NodeType.OBJECT) {
256 var obj = node.get_object ();
258 var ret = new JsRender.Node();
261 ret.loadFromJson(obj, 1);
262 ret.ref(); // not sure if needed -- but we had a case where ret became uninitialized?
269 public void loadUsageFile (string fname) {
274 print("Palete Load called\n");
276 if (!FileUtils.test (fname, FileTest.EXISTS)) {
277 throw new Error.MISSING_FILE(fname + " not found");
280 FileUtils.get_contents(fname, out raw);
282 var data = raw.split("\n");
284 var cfg = new Gee.ArrayList<Usage>();
285 var left = new Gee.ArrayList<string>();
286 var right = new Gee.ArrayList<string>();
288 for (var i = 0; i < data.length; i++) {
289 var d = data[i].strip();
290 //print("READ " + d + "\n");
294 Regex.match_simple ("^\\s+$", d)
296 Regex.match_simple ("^\\s*/", d)
301 if (Regex.match_simple ("^left:", d)) {
304 cfg.add(new Usage( left, right));
306 left = new Gee.ArrayList<string>();
307 right = new Gee.ArrayList<string>();
310 if (Regex.match_simple ("^right:", d)) {
315 //print("add left: " + d + "\n");
319 //print("add Right: " + d + "\n");
325 cfg.add(new Usage( left, right));
332 public void validateVala(
337 JsRender.JsRender file,
342 print("validate code (%s) %s\n", file.language, code);
346 if (file.language != "vala" ) { // not sure if we need to validate property
349 // file.project , file.path, file.build_module, ""
353 //var cd = new JSCore.ClassDefinitionEmpty();
354 state.valasource.checkFileWithNodePropChange(
368 public bool javascriptHasErrors(
373 JsRender.JsRender file,
374 out Gee.HashMap<int,string> errors
378 print("validate code (%s) ptype=%s property=%s\n", file.language, ptype, property);
379 errors = new Gee.HashMap<int,string>();
381 if (file.language != "js") {
384 if (ptype != "listener" && property.length > 0 && property[0] == '|') {
388 //var cd = new JSCore.ClassDefinitionEmpty();
389 //print("TESTING CODE %s\n", code);
391 var testcode = ptype == "file" ? code : "var __aaa___ = " + code;
392 var line = Javascript.singleton().validate(
393 testcode, out errmsg);
396 if (ptype == "file") {
397 var err = new Json.Object();
398 err.set_int_member("ERR-TOTAL", 1);
399 var files_obj = new Json.Object();
400 var lines_obj = new Json.Object();
401 var lines_ar = new Json.Array();
402 lines_ar.add_string_element(errmsg);
403 lines_obj.set_array_member(line.to_string(), lines_ar);
404 files_obj.set_object_member(file.path, lines_obj);
406 err.set_object_member("ERR", files_obj);
408 state.showCompileResult(err);
409 // do not set errors.. that's not done here..
412 errors.set(line, errmsg); // depricated - this is used by the editor currently -- but we are planning to switch from that..
413 print("got errors\n");
417 // now syntax is OK.. try the
421 if (ptype == "file") {
422 return this.javascriptHasCompressionErrors(file, state, code);
424 print("no errors\n");
429 public bool javascriptHasCompressionErrors(JsRender.JsRender file, WindowState state, string code)
431 // this uses the roojspacker code to try and compress the code.
432 // it should highlight errors before we actually push live the code.
434 // standard error format: file %s, line %s, Error
436 var cfg = new JSDOC.PackerRun();
437 cfg.opt_keep_whitespace = false;
438 cfg.opt_skip_scope = false;
439 cfg.opt_dump_tokens = false;
440 cfg.opt_clean_cache = false;
443 var p = new JSDOC.Packer(cfg);
447 p.packFile(code, file.path,"");
448 state.showCompileResult(p.result);
449 if (p.hasErrors("")) {
460 public abstract void fillPack(JsRender.Node node,JsRender.Node parent);
461 public abstract void load();
462 public abstract Gee.HashMap<string,GirObject> getPropertiesFor(string ename, string type);
463 public abstract GirObject? getClass(string ename);
465 public abstract bool typeOptions(string fqn, string key, string type, out string[] opts);
466 public abstract List<SourceCompletionItem> suggestComplete(
467 JsRender.JsRender file,
471 string complete_string
473 public abstract string[] getChildList(string in_rval);
474 public abstract string[] getDropList(string rval);