]> code.delx.au - gnu-emacs-elpa/commitdiff
imenu hint for orphan function
authorChen Bin <chenbin.sh@gmail.com>
Wed, 18 Dec 2013 10:04:50 +0000 (21:04 +1100)
committerChen Bin <chenbin.sh@gmail.com>
Wed, 18 Dec 2013 12:02:54 +0000 (23:02 +1100)
js2-imenu-extras.el

index a431989317285e16123c0aece9fdf2d77de5b3a3..e8d3601d8f25d8bdeb5cb998d8bfeb6346c2e035 100644 (file)
@@ -212,6 +212,32 @@ Currently used for jQuery widgets, Dojo and Enyo declarations."
          (js2-imenu-record-module-pattern node)))\r
        t))))\r
 \r
+(defun js2-imenu-get-parent-keyname-list (node)\r
+  "get the list of keys of parent of node\r
+for example, for javascript code, {rules:{ password {required: function(){}}}}\r
+the return will be '(rules password)."\r
+  (let (rlt\r
+        (n node))\r
+    (while (setq n (js2-imenu-parent-prop-node n))\r
+      (add-to-list 'rlt (js2-prop-node-name (js2-object-prop-node-left n))))\r
+    rlt\r
+    ))\r
+\r
+(defun js2-imenu-parent-prop-node (node)\r
+  "for javascript code: parent-key-name:{ required:function(){} }\r
+we need know the  parent-key-name.\r
+ step1, 'required:function(){}' is the js2-object-prop-node\r
+ step2, '{ required:function(){} }' is the js2-object-node\r
+ step3, 'parent-key-name:{ required:function(){} }' is js2-object-prop-node\r
+"\r
+  (let (p2 p3)\r
+    ;; step 2\r
+    (setq p2 (js2-node-parent node))\r
+    ;; step 3\r
+    (when (and p2 (js2-object-node-p p2))\r
+      (setq p3 (js2-node-parent p2))\r
+      (if (and p3 (js2-object-prop-node-p p3)) p3))))\r
+\r
 (defun js2-imenu-record-orphan-function (node)\r
   "Record orphan function when it's the value of NODE.\r
 NODE must be `js2-object-prop-node'."\r
@@ -219,10 +245,13 @@ NODE must be `js2-object-prop-node'."
     (let ((fn-node (js2-object-prop-node-right node)))\r
       (unless (and js2-imenu-function-map\r
                    (gethash fn-node js2-imenu-function-map))\r
-        (let ((key-node (js2-object-prop-node-left node)))\r
-          (js2-record-imenu-entry fn-node\r
-                                  (list js2-imenu-other-functions-ns\r
-                                        (js2-prop-node-name key-node))\r
+        (let ((key-node (js2-object-prop-node-left node))\r
+              (parent-prop-node (js2-imenu-parent-prop-node node))\r
+              mylist)\r
+          (setq mylist (append (js2-imenu-get-parent-keyname-list node)\r
+                               (list (js2-prop-node-name key-node))))\r
+          (add-to-list 'mylist js2-imenu-other-functions-ns)\r
+          (js2-record-imenu-entry fn-node mylist\r
                                   (js2-node-abs-pos key-node)))))))\r
 \r
 (defun js2-imenu-record-module-pattern (node)\r