summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/www/syntax-editor/ast.js34
-rw-r--r--src/www/syntax-editor/editor.js10
2 files changed, 37 insertions, 7 deletions
diff --git a/src/www/syntax-editor/ast.js b/src/www/syntax-editor/ast.js
index 2cad53600..5a80930d9 100644
--- a/src/www/syntax-editor/ast.js
+++ b/src/www/syntax-editor/ast.js
@@ -58,7 +58,7 @@ function ASTNode(data) {
function AST(fun, cat) {
// local helper function for building ASTNodes
- newNode = function(fun, cat) {
+ var newNode = function(fun, cat) {
return new ASTNode({
"fun": fun,
"cat": cat,
@@ -205,4 +205,36 @@ function AST(fun, cat) {
}
}
+
+// Parse type signature into a JSON object
+// (This probably needs a better home)
+AST.parse_type_signature = function(str) {
+ var obj = {
+ type: undefined,
+ name: [],
+ deps: [],
+ args: [],
+ ret: undefined
+ };
+ var ix = str.indexOf(":");
+
+ // judgement type
+ var bits = str.substr(0, ix).split(" ");
+ obj.type = bits[0];
+
+ // name (possibly with constructors)
+ obj.name = bits.slice(1);
+
+ // function args (possibly with type dependency)
+ var bits = map(function(s){return s.trim()}, str.substr(ix+1).split("->"));
+ for (var i=0 ; i<bits.length-1; i++) {
+ var bit = bits[i];
+ obj.args.push(bit);
+ }
+
+ // return type
+ obj.ret = bits[bits.length-1];
+
+ return obj;
+}
diff --git a/src/www/syntax-editor/editor.js b/src/www/syntax-editor/editor.js
index 8cf31921b..b2936e898 100644
--- a/src/www/syntax-editor/editor.js
+++ b/src/www/syntax-editor/editor.js
@@ -198,14 +198,12 @@ Editor.prototype.select_refinement=function(fun) {
// Parse out function arguments
var def = t.grammar_constructors.funs[fun].def;
- def = def.substr(def.lastIndexOf(":")+1);
- var fun_args = map(function(s){return s.trim()}, def.split("->"))
- fun_args = fun_args.slice(0,-1);
+ var typeobj = AST.parse_type_signature(def);
- if (fun_args.length > 0) {
+ if (typeobj.args.length > 0) {
// Add placeholders
- for (ci in fun_args) {
- t.ast.add(null, fun_args[ci]);
+ for (var i in typeobj.args) {
+ t.ast.add(null, typeobj.args[i]);
}
}