(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
(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