+using Gtk;
namespace Palete
{
public JsRender.Node? loadTemplate(string path)
{
- var pa = new Json.Parser();
- pa.load_from_file(path);
- var node = pa.get_root();
+ var pa = new Json.Parser();
+ pa.load_from_file(path);
+ var node = pa.get_root();
- if (node.get_node_type () != Json.NodeType.OBJECT) {
- return null;
- }
- var obj = node.get_object ();
+ if (node.get_node_type () != Json.NodeType.OBJECT) {
+ return null;
+ }
+ var obj = node.get_object ();
- var ret = new JsRender.Node();
+ var ret = new JsRender.Node();
- ret.loadFromJson(obj, 1);
- ret.ref(); // not sure if needed -- but we had a case where ret became uninitialized?
+ ret.loadFromJson(obj, 1);
+ ret.ref(); // not sure if needed -- but we had a case where ret became uninitialized?
- return ret;
- }
+ return ret;
+ }
- public void loadUsageFile (string fname) {
+ public void loadUsageFile (string fname) {
- print("Palete Load called\n");
- string raw;
- if (!FileUtils.test (fname, FileTest.EXISTS)) {
- throw new Error.MISSING_FILE(fname + " not found");
- }
+ print("Palete Load called\n");
+ string raw;
+ if (!FileUtils.test (fname, FileTest.EXISTS)) {
+ throw new Error.MISSING_FILE(fname + " not found");
+ }
- FileUtils.get_contents(fname, out raw);
- // print(data);
- var data = raw.split("\n");
- var state = 0;
- var cfg = new Gee.ArrayList<Usage>();
- var left = new Gee.ArrayList<string>();
- var right = new Gee.ArrayList<string>();
+ FileUtils.get_contents(fname, out raw);
+ // print(data);
+ var data = raw.split("\n");
+ var state = 0;
+ var cfg = new Gee.ArrayList<Usage>();
+ var left = new Gee.ArrayList<string>();
+ var right = new Gee.ArrayList<string>();
- for (var i = 0; i < data.length; i++) {
- var d = data[i].strip();
- //print("READ " + d + "\n");
- if (
- d.length < 1
- ||
- Regex.match_simple ("^\\s+$", d)
- ||
- Regex.match_simple ("^\\s*/", d)
- ){
- continue;
- }
+ for (var i = 0; i < data.length; i++) {
+ var d = data[i].strip();
+ //print("READ " + d + "\n");
+ if (
+ d.length < 1
+ ||
+ Regex.match_simple ("^\\s+$", d)
+ ||
+ Regex.match_simple ("^\\s*/", d)
+ ){
+ continue;
+ }
- if (Regex.match_simple ("^left:", d)) {
- state = 1;
- if (left.size > 0 ){
- cfg.add(new Usage( left, right));
- }
- left = new Gee.ArrayList<string>();
- right = new Gee.ArrayList<string>();
- continue;
- }
- if (Regex.match_simple ("^right:", d)) {
- state = 2;
- continue;
- }
- if (state == 1) {
- //print("add left: " + d + "\n");
- left.add(d);
- continue;
- }
- //print("add Right: " + d + "\n");
- right.add(d);
- //Seed.quit();
-
- }
- if (left.size > 0 ){
- cfg.add(new Usage( left, right));
- }
- this.map = cfg;
+ if (Regex.match_simple ("^left:", d)) {
+ state = 1;
+ if (left.size > 0 ){
+ cfg.add(new Usage( left, right));
+ }
+ left = new Gee.ArrayList<string>();
+ right = new Gee.ArrayList<string>();
+ continue;
+ }
+ if (Regex.match_simple ("^right:", d)) {
+ state = 2;
+ continue;
+ }
+ if (state == 1) {
+ //print("add left: " + d + "\n");
+ left.add(d);
+ continue;
+ }
+ //print("add Right: " + d + "\n");
+ right.add(d);
+ //Seed.quit();
+
+ }
+ if (left.size > 0 ){
+ cfg.add(new Usage( left, right));
+ }
+ this.map = cfg;
- }
+ }
-
-
- public async Gee.HashMap<int,string> validateVala(
- string code,
+
+ public void validateVala(
+ WindowState state,
+ string code,
string property,
string ptype,
JsRender.JsRender file,
JsRender.Node node
- )
- {
+ )
+ {
- print("validate code (%s) %s\n", file.language, code);
- var ret = new Gee.HashMap<int,string>();
+ print("validate code (%s) %s\n", file.language, code);
+
-
- if (file.language != "vala" ) { // not sure if we need to validate property
- return ret;
- }
- var vs = new ValaSource(file);
- //var cd = new JSCore.ClassDefinitionEmpty();
- ret = yield vs.checkFileWithNodePropChange(
- node,
- property,
- ptype,
- code
- );
- vs = null;
- return ret;
-
- }
- public Gee.HashMap<int,string> validateJavascript(
- string code,
- string property,
- string ptype,
- JsRender.JsRender file,
- JsRender.Node node
- )
- {
+
+ if (file.language != "vala" ) { // not sure if we need to validate property
+ return;
+ }
+ // file.project , file.path, file.build_module, ""
+
+
+
+ //var cd = new JSCore.ClassDefinitionEmpty();
+ state.valasource.checkFileWithNodePropChange(
+ file,
+ node,
+ property,
+ ptype,
+ code
+ );
+
- print("validate code (%s) %s\n", file.language, code);
- var ret = new Gee.HashMap<int,string>();
+ }
+
+
+
+
+ public Gee.HashMap<int,string> validateJavascript(
+ WindowState state,
+ string code,
+ string property,
+ string ptype,
+ JsRender.JsRender file,
+ JsRender.Node? node
+ )
+ {
+
+ print("validate code (%s) ptype=%s property=%s\n", file.language, ptype, property);
+ var ret = new Gee.HashMap<int,string>();
- if (file.language != "js") {
- return ret;
- }
- if (ptype != "listener" && property[0] == '|') {
- return ret;
- }
+ if (file.language != "js") {
+ return ret;
+ }
+ if (ptype != "listener" && property.length > 0 && property[0] == '|') {
+ return ret;
+ }
- //var cd = new JSCore.ClassDefinitionEmpty();
- //print("TESTING CODE %s\n", code);
- string errmsg;
- var line = Javascript.singleton().validate(
- "var __aaa___ = " + code, out errmsg);
+ //var cd = new JSCore.ClassDefinitionEmpty();
+ //print("TESTING CODE %s\n", code);
+ string errmsg;
+ var testcode = ptype == "file" ? code : "var __aaa___ = " + code;
+ var line = Javascript.singleton().validate(
+ testcode, out errmsg);
+
+ if (line > -1) {
+ if (ptype == "file") {
+ var err = new Json.Object();
+ err.set_int_member("ERR-TOTAL", 1);
+ var files_obj = new Json.Object();
+ var lines_obj = new Json.Object();
+ var lines_ar = new Json.Array();
+ lines_ar.add_string_element(errmsg);
+ lines_obj.set_array_member(line.to_string(), lines_ar);
+ files_obj.set_object_member(file.path, lines_obj);
+
+ err.set_object_member("ERR", files_obj);
+
+ state.showCompileResult(err);
+ return ret;
+ }
+ ret.set(line, errmsg); // depricated - this is used by the editor currently -- but we are planning to switch from that..
+ print("got errors\n");
+ return ret;
- if (line < 0) {
+ }
+ // now syntax is OK.. try the
+
+
+
+ if (ptype == "file") {
+ this.validateJavascriptCompression(file, state, code);
+ }
print("no errors\n");
return ret;
+
+ }
+
+ public void validateJavascriptCompression(JsRender.JsRender file, WindowState state, string code)
+ {
+ // this uses the roojspacker code to try and compress the code.
+ // it should highlight errors before we actually push live the code.
+
+ // standard error format: file %s, line %s, Error
+
+ var p = new JSDOC.Packer();
+ p.keepWhite = false;
+ p.skipScope = false;
+ p.dumpTokens = false;
+ p.cleanup = false;
+ var estr = "";
+ var ret = new Gee.HashMap<int,string>();
+
+ p.packFile(code, file.path,"");
+ if (!p.hasErrors("")) {
+ state.showCompileResult(new Json.Object());
+ }
+
+ if (estr.length > 0 ) {
+
+ var bits = estr.split(",");
+ if (bits.length > 2) {
+ var linebits = bits[1].strip().split(" ");
+ if (linebits.length > 1) {
+ var line = int.parse(linebits[1]);
+ // line is correct - but our standard for error messages is to do it start at '0'
+ ret.set(line -1 , bits[2]);
+ }
+
+ }
+ }
+
+ return ret;
+
}
- ret.set(line, errmsg);
- print("got errors\n");
- return ret;
-
-
- }
-
-
- public abstract void fillPack(JsRender.Node node,JsRender.Node parent);
- public abstract void load();
- public abstract Gee.HashMap<string,GirObject> getPropertiesFor(string ename, string type);
- public abstract GirObject? getClass(string ename);
-
- public abstract bool typeOptions(string fqn, string key, string type, out string[] opts);
+
+
+
+ public abstract void fillPack(JsRender.Node node,JsRender.Node parent);
+ public abstract void load();
+ public abstract Gee.HashMap<string,GirObject> getPropertiesFor(string ename, string type);
+ public abstract GirObject? getClass(string ename);
- }
+ public abstract bool typeOptions(string fqn, string key, string type, out string[] opts);
+ public abstract List<SourceCompletionItem> suggestComplete(
+ JsRender.JsRender file,
+ JsRender.Node? node,
+ string proptype,
+ string key,
+ string complete_string
+ );
+ }
}