{"action":"created","comment":{"url":"https://api.github.com/repos/josteink/csharp-mode/pulls/comments/64988945","id":64988945,"diff_hunk":"@@ -2077,1076 +1837,282 @@ to the beginning of the prior namespace.\n ;; ==================================================================\n ;;; imenu stuff\n \n-;; define some advice for menu construction.\n-\n-;; The way imenu constructs menus from the index alist, in\n-;; `imenu--split-menu', is ... ah ... perplexing.  If the csharp\n-;; create-index fn returns an ordered menu, and the imenu \"sort\" fn has\n-;; been set to nil, imenu still sorts the menu, according to the rule\n-;; that all submenus must appear at the top of any menu. Why?  I don't\n-;; know. This advice disables that weirdness in C# buffers.\n-\n-(defadvice imenu--split-menu (around\n-                              csharp--imenu-split-menu-patch\n-                              activate compile)\n-  ;; This advice will run in all buffers.  Let's may sure we\n-  ;; actually execute the important bits only when a C# buffer is active.\n-  (if (and (string-match \"\\\\.[Cc][Ss]$\"  (file-relative-name buffer-file-name))\n-           (boundp 'csharp-want-imenu)\n-           csharp-want-imenu)\n-      (let ((menulist (copy-sequence menulist))\n-            keep-at-top)\n-        (if (memq imenu--rescan-item menulist)\n-            (setq keep-at-top (list imenu--rescan-item)\n-                  menulist (delq imenu--rescan-item menulist)))\n-        ;; This is the part from the original imenu code\n-        ;; that puts submenus at the top.  huh? why?\n-        ;; --------------------------------------------\n-        ;; (setq tail menulist)\n-        ;; (dolist (item tail)\n-        ;;   (when (imenu--subalist-p item)\n-        ;;     (push item keep-at-top)\n-        ;;     (setq menulist (delq item menulist))))\n-        (if imenu-sort-function\n-            (setq menulist (sort menulist imenu-sort-function)))\n-        (if (> (length menulist) imenu-max-items)\n-            (setq menulist\n-                  (mapcar\n-                   (lambda (menu)\n-                     (cons (format \"From: %s\" (caar menu)) menu))\n-                   (imenu--split menulist imenu-max-items))))\n-        (setq ad-return-value\n-              (cons title\n-                    (nconc (nreverse keep-at-top) menulist))))\n-    ;; else\n-    ad-do-it))\n-\n-\n-;;\n-;; I used this to examine the performance of the imenu scanning.\n-;; It's not necessary during normal operation.\n-;;\n-;; (defun csharp-imenu-begin-profile ()\n-;;   \"turn on profiling\"\n-;;   (interactive)\n-;;   (let ((fns '(csharp--on-class-open-curly-p\n-;;              csharp--on-namespace-open-curly-p\n-;;              csharp--on-ctor-open-curly-p\n-;;              csharp--on-enum-open-curly-p\n-;;              csharp--on-intf-open-curly-p\n-;;              csharp--on-prop-open-curly-p\n-;;              csharp--on-indexer-open-curly-p\n-;;              csharp--on-defun-open-curly-p\n-;;              csharp--imenu-create-index-helper\n-;;              looking-back\n-;;              looking-at)))\n-;;     (if (fboundp 'elp-reset-all)\n-;;         (elp-reset-all))\n-;;     (mapc 'elp-instrument-function fns)))\n-\n-\n-\n-(defun csharp--imenu-remove-param-names-from-paramlist (s)\n-  \"The input string S is a parameter list, of the form seen in a\n-C# method.  TYPE1 NAME1 [, TYPE2 NAME2 ...]\n-\n-This fn returns a string of the form TYPE1 [, TYPE2...]\n-\n-Upon entry, it's assumed that the parens included in S.\n-\n-\"\n-  (if (string= s \"()\")\n-      s\n-    (save-match-data\n-      (let* (new\n-             (state 0)  ;; 0 => ws, 1=>slurping param...\n-             c\n-             cs\n-             quoting\n-             nesting\n-             need-type\n-             ix2\n-             (s2 (substring s 1 -1))\n-             (len (length s2))\n-             (i (1- len)))\n-\n-        (while (> i 0)\n-          (setq c (aref s2 i) ;; current character\n-                cs (char-to-string c)) ;; s.t. as a string\n-\n-          (cond\n-\n-           ;; backing over whitespace \"after\" the param\n-           ((= state 0)\n-            (cond\n-             ;; more ws. = is equal to whitespace in the sense that its follows a param-name.\n-             ((string-match \"[ \\t\\f\\v\\n\\r=]\" cs)\n-              t)\n-             ((string-match \"[\\\"']\" cs)\n-              ;; a quote means we're probably dealing with a stringy default-value\n-              ;; back out until we're back into unquoted context\n-              (setq quoting cs\n-                    state 5))\n-             ;; a legal char for an identifier\n-             ((string-match \"[A-Za-z_0-9]\" cs)\n-              (setq state 1))\n-             (t\n-              (error \"unexpected char (A)\"))))\n-\n-\n-           ;; slurping param name\n-           ((= state 1)\n-            (cond\n-             ;; ws signifies the end of the param\n-             ((string-match \"[ \\t\\f\\v\\n\\r]\" cs)\n-              (setq state 2))\n-             ((string-match \"[=]\" cs)\n-              ;; = means what we slurped was a default-value for a param\n-              ;; go back to slurping param-name\n-              (setq state 0))\n-             ;; a legal char for an identifier\n-             ;; (or . for object-access in default value)\n-             ((string-match \"[A-Za-z_0-9\\.]\" cs)\n-              t)\n-             (t\n-              (error \"unexpected char (B)\"))))\n-\n-\n-           ;; ws between typespec and param name\n-           ((= state 2)\n-            (cond\n-             ((string-match \"[ \\t\\f\\v\\n\\r]\" cs)\n-              t)\n-             ((string-match \"[=]\" cs)\n-              ;; = means what we slurped was a default-value for a param\n-              ;; go back to slurping param-name\n-              (setq state 0))\n-             ;; non-ws indicates the type spec is beginning\n-             (t\n-              (cl-incf i)\n-              (setq state 3\n-                    need-type nil\n-                    nesting 0\n-                    ix2 i))))\n-\n-\n-           ;; slurping type\n-           ((= state 3)\n-            (cond\n-             ((= ?> c) (cl-incf nesting))\n-             ((= ?< c)\n-              (cl-decf nesting)\n-              (setq need-type t))\n-\n-             ;; ws or comma maybe signifies the end of the typespec\n-             ((string-match \"[ \\t\\f\\v\\n\\r,]\" cs)\n-              (if (and (= nesting 0) (not need-type))\n-                  (progn\n-                    (setq new (cons (substring s2 (1+ i) ix2) new))\n-                    (setq state\n-                          (if (= c ?,) 0 4)))))\n-\n-             ((string-match \"[A-Za-z_0-9]\" cs)\n-              (setq need-type nil))))\n-\n-\n-           ;; awaiting comma or b-o-s\n-           ((= state 4)\n-            (cond\n-\n-             ((= ?, c)\n-              (if  (= nesting 0)\n-                  (setq state 0)))\n-\n-             ((string-match \"[ \\t\\f\\v\\n\\r]\" cs)\n-              t)\n-\n-             ((= 93 c) (cl-incf nesting)) ;; sq brack\n-             ((= 91 c)  ;; open sq brack\n-              (cl-decf nesting))\n-\n-             ;; handle this (extension methods), out, ref, params\n-             ((and (>= i 5)\n-                   (string= (substring s2 (- i 5) (1+ i)) \"params\"))\n-              (setf (car new) (concat \"params \" (car new)))\n-              (setq i (- i 5)))\n-\n-             ((and (>= i 3)\n-                   (string= (substring s2 (- i 3) (1+ i)) \"this\"))\n-              (setf (car new) (concat \"this \" (car new)))\n-              (setq i (- i 3)))\n-\n-             ((and (>= i 2)\n-                   (string= (substring s2 (- i 2) (1+ i)) \"ref\"))\n-              (setf (car new) (concat \"ref \" (car new)))\n-              (setq i (- i 2)))\n-\n-             ((and (>= i 2)\n-                   (string= (substring s2 (- i 2) (1+ i)) \"out\"))\n-              (setf (car new) (concat \"out \" (car new)))\n-              (setq i (- i 2)))\n-\n-             (t\n-              (error \"unexpected char (C)\"))))\n-\n-           ;; in a quoted context of a default-value.\n-           ;; we're basically waiting for a matching quote, to go back to slurping param-name\n-           ((= state 5)\n-            (cond\n-             ((equal quoting cs)\n-              ;; we're back to unquoted! slurp param-name!\n-              (setq state 0))\n-             (t\n-              t)))\n-           )\n-\n-          (cl-decf i))\n-\n-        (if (and (= state 3) (= nesting 0))\n-            (setq new (cons (substring s2 i ix2) new)))\n-\n-        (concat \"(\"\n-                (if new\n-                    (mapconcat 'identity new \", \")\n-                  \"\")\n-                \")\")))))\n-\n-\n-(defun csharp--imenu-item-basic-comparer (a b)\n-  \"Compares the car of each element, assumed to be a string.\"\n-  (string-lessp (car a) (car b)))\n-\n-\n-(defun csharp--imenu-get-method-name-from-sig (sig)\n-  \"Extract a method name with its parameter list from a method\n-signature, SIG. This is used to aid in sorting methods by name,\n-and secondarily by parameter list.\n-\n-For this input:\n-\n-    private Dict<String, int>  DoSomething(int, string)\n-\n-...the output is:\n-\n-   DoSomething(int, string)\n-\n-\"\n-  (let* (c\n-         result\n-         (state 0)\n-         (len (length sig))\n-         (i (1- len)))\n-    (while (> i 0)\n-      (setq c (aref sig i))\n-\n-      (cond\n-       ((and (= state 0) (= c 40))\n-        (setq state 1))\n-\n-       ((and (= state 1) (or (= c 9) (= c 32)))\n-        (setq result (substring sig (1+ i))\n-              i 0)))\n-      (cl-decf i))\n-    result))\n-\n-\n-\n-(defun csharp--imenu-item-method-name-comparer (a b)\n-  \"Compares the method names in the respective cars of each element.\n-\n-The car of each element is assumed to be a string with multiple\n-tokens in it, representing a method signature, including access\n-modifier, return type, and parameter list (surrounded by parens).\n-If the method takes no params, then it's just an empty pair of\n-parens.\n-\n-This fn extracts the method name and param list from that\n-signature and compares *that*.\n-\n-\"\n-  (let ((methoda (csharp--imenu-get-method-name-from-sig (car a)))\n-        (methodb (csharp--imenu-get-method-name-from-sig (car b))))\n-    ;;(csharp-log -1 \"compare '%s' <> '%s'\" methoda methodb)\n-    (string-lessp methoda methodb)))\n-\n-\n-\n-(defun csharp--imenu-create-index-helper (&optional parent-ns indent-level\n-                                                    consider-usings consider-namespaces)\n-  \"Helper fn for `csharp-imenu-create-index'.\n-\n-Scans a possibly narrowed section of a c# buffer.  It finds\n-namespaces, classes, structs, enums, interfaces, and methods\n-within classes and structs.\n-\n-The way it works: it looks for an open-curly.  If the open-curly\n-is a namespace or a class, it narrows to whatever is inside the\n-curlies, then recurses.\n-\n-Otherwise (the open-curly is neither of those things), this fn\n-tries to recognize the open-curly as the beginning of an enum,\n-method, or interface.\n-\n-If it succeeds, then a menu item is created for the thing. Then\n-it jumps to the matching close-curly, and continues. Stop when no\n-more open-curlies are found.\n-\n-\"\n-\n-  ;; A C# module consists of zero of more explicitly denoted (and\n-  ;; possibly nested) namespaces. In the absence of an\n-  ;; explicitly-denoted namespace, the global namespace is implicitly\n-  ;; applied.  Within each namespace there can be zero or more\n-  ;; \"container\" things - like class, struct, or interface; each with\n-  ;; zero or more indexable items - like methods, constructors.\n-  ;; and so on.\n-\n-  ;; This fn parses the module and indexes those items, creating a\n-  ;; hierarchically organized list to describe them.  Each container\n-  ;; (ns/class/struct/etc) is represented on a separate submenu.\n-\n-  ;; It works like this:\n-  ;; (start at the top of the module)\n-  ;;\n-  ;; 1. look for a using clause\n-  ;;    yes - insert an item in the menu; move past all using clauses.\n-  ;;\n-  ;; 2. go to next open curly\n-  ;;\n-  ;; 2. beginning of a container? (a class or namespace)\n-  ;;\n-  ;;    yes - narrow, and recurse\n+(defconst csharp--imenu-expression\n+  (let* ((single-space                   \"[ \\t\\n\\r\\f\\v]\")\n+         (optional-space                 (concat single-space \"*\"))\n+         (bol                            (concat \"^\" optional-space))\n+         (space                          (concat single-space \"+\"))\n+         (access-modifier (regexp-opt '( \"public\" \"private\" \"protected\" \"internal\"\n+                                         \"static\" \"sealed\" \"partial\" \"override\"\n+                                         \"abstract\")))\n+         ;; this will allow syntactically invalid combinations of modifiers\n+         ;; but that's a compiler problem, not a imenu-problem\n+         (access-modifier-list (concat \"\\\\(?:\" access-modifier space \"\\\\)\"))\n+         (access-modifiers (concat access-modifier-list \"*\"))\n+         (return-type                    \"\\\\(?:[[:alpha:]_][^ =\\t\\(\\n\\r\\f\\v]+\\\\)\")\n+         (identifier                     \"[[:alpha:]_][[:alnum:]_]*\")\n+         (interface-prefix               (concat \"\\\\(?:\" identifier \"\\\\.\\\\)\"))\n+         (optional-interface-prefix      (concat interface-prefix \"?\")) ;; possible prefix interface\n+         (generic-identifier (concat identifier\n+                                     ;; optional generic arguments\n+                                     \"\\\\(?:<\" optional-space identifier\n+                                     \"\\\\(?:\" \",\" optional-space identifier optional-space \"\\\\)*\"\n+                                     \">\\\\)?\"\n+                                     ))\n+         ;; param-list with parens\n+         (parameter-list \"\\\\(?:\\([^!\\)]*\\)\\\\)\")\n+         (inheritance-clause (concat \"\\\\(?:\"\n+                                     optional-space\n+                                     \":\"\n+                                     optional-space generic-identifier\n+                                     \"\\\\(?:\" optional-space \",\" optional-space generic-identifier \"\\\\)*\"\n+                                     \"\\\\)?\")))\n+\n+    (list (list \"namespace\"\n+                (concat bol \"namespace\" space\n+                        \"\\\\(\" identifier \"\\\\)\") 1)\n+          ;; not all these are classes, but they can hold other\n+          ;; members, so they are treated uniformly.\n+          (list \"class\"\n+                (concat bol\n+                        access-modifiers\n+                        \"\\\\(\"\n+                        (regexp-opt '(\"class\" \"struct\" \"interface\")) space\n+                        generic-identifier inheritance-clause \"\\\\)\")  1)\n+          (list \"enum\"\n+                (concat bol\n+                        access-modifiers\n+                        \"\\\\(\" \"enum\" space\n+                        identifier \"\\\\)\")  1)\n+          (list \"ctor\"\n+                (concat bol\n+                        ;; ctor MUST have access modifiers, or else we pick\n+                        ;; every if statement in the file...\n+                        access-modifier-list \"+\"\n+                        \"\\\\(\"\n+                        identifier\n+                        optional-space\n+                        parameter-list\n+                        \"\\\\)\"\n+                        \"\\\\(?:\"\n+                        optional-space\n+                        \":\"\n+                        optional-space\n+                        \"\\\\(?:this\\\\|base\\\\)\"\n+                        optional-space\n+                        parameter-list\n+                        \"\\\\)?\"\n+                        optional-space \"{\") 1)\n+          (list \"method\"\n+                (concat bol\n+                        ;; we MUST require modifiers, or else we cannot reliably\n+                        ;; identify declarations, without also dragging in lots of\n+                        ;; if statements and what not.\n+                        access-modifier-list \"+\"\n+                        return-type space\n+                        \"\\\\(\"\n+                        optional-interface-prefix\n+                        generic-identifier\n+                        optional-space\n+                        parameter-list\n+                        \"\\\\)\"\n+                        ;; optional // or /* comment at end\n+                        \"\\\\(?:[ \\t]*/[/*].*\\\\)?\"\n+                        optional-space\n+                        \"{\") 1)\n+          (list \"method-inf\"\n+                (concat bol\n+                        return-type space\n+                        \"\\\\(\"\n+                        interface-prefix\n+                        generic-identifier\n+                        optional-space\n+                        parameter-list\n+                        \"\\\\)\"\n+                        ;; optional // or /* comment at end\n+                        \"\\\\(?:[ \\t]*/[/*].*\\\\)?\"\n+                        optional-space\n+                        \"{\") 1)\n+          (list \"prop\"\n+                (concat bol\n+                        ;; must require access modifiers, or else we\n+                        ;; pick up pretty much anything.\n+                        access-modifiers\n+                        return-type space\n+                        \"\\\\(\"\n+                        optional-interface-prefix\n+                        generic-identifier\n+                        \"\\\\)\"\n+                        optional-space \"{\" optional-space\n+                        ;; unless we are super-specific and expect the accesors,\n+                        ;; lots of weird things gets slurped into the name.\n+                        ;; including the accessors themselves.\n+                        (regexp-opt '(\"get\" \"set\"))\n+                        ) 1)\n+          ;; adding fields... too much?\n+          (list \"field\"\n+                (concat bol\n+                        access-modifier-list \"+\"\n+                        ;; fields can be readonly/const\n+                        \"\\\\(?:\" (regexp-opt '(\"readonly\" \"const\")) space \"\\\\)?\"\n+                        \"\\\\(\"\n+                        return-type space\n+                        generic-identifier\n+                        \"\\\\)\"\n+                        optional-space\n+                        ;; optional assignment\n+                        \"\\\\(?:=[^;]+\\\\)?\"\n+                        \";\") 1)\n+          (list \"indexer\"\n+                (concat bol\n+                        access-modifiers\n+                        return-type space\n+                        \"this\" optional-space\n+                        \"\\\\(\"\n+                        ;; opening bracket\n+                        \"\\\\[\" optional-space\n+                        ;; type\n+                        \"\\\\([^\\]]+\\\\)\" optional-space\n+                        identifier\n+                        ;; closing brackets\n+                        \"\\\\]\"\n+                        \"\\\\)\"\n+                        optional-space \"{\" optional-space\n+                        ;; unless we are super-specific and expect the accesors,\n+                        ;; lots of weird things gets slurped into the name.\n+                        ;; including the accessors themselves.\n+                        (regexp-opt '(\"get\" \"set\"))) 1)\n+          (list \"event\"\n+                (concat bol\n+                        access-modifier-list \"+\"\n+                        optional-space \"event\" optional-space\n+                        \"\\\\(\"\n+                        return-type space\n+                        generic-identifier\n+                        \"\\\\)\"\n+                        optional-space\n+                        \";\") 1))))\n+\n+(defun csharp--imenu-get-pos (pair)\n+  (let ((pos (cdr pair)))\n+    (if (markerp pos)\n+        (marker-position pos)\n+      pos)))\n+\n+(defun csharp--imenu-get-container (item containers previous)\n+  (if (not containers)\n+      previous\n+    (let* ((item-pos (csharp--imenu-get-pos item))\n+           (container (car containers))\n+           (container-pos (csharp--imenu-get-pos container))\n+           (rest      (cdr containers)))\n+      (if (and container-pos\n+               (< item-pos container-pos))\n+          previous\n+        (csharp--imenu-get-container item rest container)))))\n+\n+(defun csharp--imenu-get-container-name (item containers)\n+  (let ((container (csharp--imenu-get-container item containers nil)))\n+    (if (not container)\n+        nil\n+      (let* (;; namespace\n+             (container-p1 (car (split-string (car container))))\n+             ;; class/interface\n+             (container-p2 (cadr (split-string (car container)))))\n+        ;; use p1 (namespace) when there is no p2\n+        (if container-p2\n+            container-p2\n+          container-p1)))))\n+\n+(defun csharp--imenu-sort (items)\n+  (sort items (lambda (item1 item2)\n+                (string< (car item1) (car item2)))))\n+\n+(defun csharp--imenu-get-class-name (class namespaces)\n+  (let ((namespace (csharp--imenu-get-container-name class namespaces))\n+        (class-name (car class)))\n+    (if (not namespace)\n+        class-name\n+      ;; reformat to include namespace\n+      (let* ((words (split-string class-name))\n+             (type  (car words))\n+             (name  (cadr words)))\n+        (concat type \" \" namespace \".\" name)))))\n+\n+(defun csharp--imenu-get-class-nodes (classes namespaces)\n+  \"Creates a new alist with classes as root nodes with namespaces added.\"\n+\n+  (mapcar (lambda (class)\n+            (let* ((class-name (csharp--imenu-get-class-name class namespaces))\n+                   (class-pos  (cdr class)))\n+              (cons class-name\n+                    (list\n+                     (cons \"( top )\" class-pos)))))\n+          classes))\n+\n+(defun csharp--imenu-get-class-node (result item classes namespaces)\n+  (let* ((class-item (csharp--imenu-get-container item classes nil))\n+         (class-name (csharp--imenu-get-class-name class-item namespaces)))\n+    (assoc class-name result)))\n+\n+(defun csharp--imenu-format-item-node (item type)\n+  (cons\n+   (concat \"(\" type \") \" (car item))\n+   (cdr item)))\n+\n+(defun csharp--imenu-append-items-to-menu (result type index classes namespaces)\n+  ;; items = all methods, all events, etc based on \"type\"\n+  (let* ((items (cdr (assoc type index))))\n+    (dolist (item items)\n+      (let ((class-node (csharp--imenu-get-class-node result item classes namespaces))\n+            (item-node  (csharp--imenu-format-item-node item type)))\n+        (nconc class-node (list item-node))))))","path":"csharp-mode.el","position":986,"original_position":986,"commit_id":"6df554fb27b811f03e2ed3adcb28788ff387d73b","original_commit_id":"6df554fb27b811f03e2ed3adcb28788ff387d73b","user":{"login":"wasamasa","id":3588994,"avatar_url":"https://avatars.githubusercontent.com/u/3588994?v=3","gravatar_id":"","url":"https://api.github.com/users/wasamasa","html_url":"https://github.com/wasamasa","followers_url":"https://api.github.com/users/wasamasa/followers","following_url":"https://api.github.com/users/wasamasa/following{/other_user}","gists_url":"https://api.github.com/users/wasamasa/gists{/gist_id}","starred_url":"https://api.github.com/users/wasamasa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wasamasa/subscriptions","organizations_url":"https://api.github.com/users/wasamasa/orgs","repos_url":"https://api.github.com/users/wasamasa/repos","events_url":"https://api.github.com/users/wasamasa/events{/privacy}","received_events_url":"https://api.github.com/users/wasamasa/received_events","type":"User","site_admin":false},"body":"It's highly unusual to use `nconc` as it's an error-prone operation that's usually expressed as an `append` over lists.  Perhaps you're looking for `cl-mapcan`?","created_at":"2016-05-28T13:30:49Z","updated_at":"2016-05-28T13:30:49Z","html_url":"https://github.com/josteink/csharp-mode/pull/74#discussion_r64988945","pull_request_url":"https://api.github.com/repos/josteink/csharp-mode/pulls/74","_links":{"self":{"href":"https://api.github.com/repos/josteink/csharp-mode/pulls/comments/64988945"},"html":{"href":"https://github.com/josteink/csharp-mode/pull/74#discussion_r64988945"},"pull_request":{"href":"https://api.github.com/repos/josteink/csharp-mode/pulls/74"}}},"pull_request":{"url":"https://api.github.com/repos/josteink/csharp-mode/pulls/74","id":71801616,"html_url":"https://github.com/josteink/csharp-mode/pull/74","diff_url":"https://github.com/josteink/csharp-mode/pull/74.diff","patch_url":"https://github.com/josteink/csharp-mode/pull/74.patch","issue_url":"https://api.github.com/repos/josteink/csharp-mode/issues/74","number":74,"state":"open","locked":false,"title":"New imenu-implementation for csharp-mode.","user":{"login":"josteink","id":411338,"avatar_url":"https://avatars.githubusercontent.com/u/411338?v=3","gravatar_id":"","url":"https://api.github.com/users/josteink","html_url":"https://github.com/josteink","followers_url":"https://api.github.com/users/josteink/followers","following_url":"https://api.github.com/users/josteink/following{/other_user}","gists_url":"https://api.github.com/users/josteink/gists{/gist_id}","starred_url":"https://api.github.com/users/josteink/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/josteink/subscriptions","organizations_url":"https://api.github.com/users/josteink/orgs","repos_url":"https://api.github.com/users/josteink/repos","events_url":"https://api.github.com/users/josteink/events{/privacy}","received_events_url":"https://api.github.com/users/josteink/received_events","type":"User","site_admin":false},"body":"**Main features:**\r\n\r\n* all data collected through single scan, using standard regexpes.\r\n* most code is 100% pure and functional, with near zero state kept. (Good bye FSM)\r\n* orders of magnitudes faster than before\r\n* orders of magnitudes more maintainable than before (you can make feature-requests now!)\r\n* less hierarchies, less clicky (for those using the menus)\r\n* indexes \"everything\": fields, props, methods, ctors, indexers, classes, enums, etc.\r\n\r\n**Inherent limitations:**\r\n\r\n* Does not support/resolve names correctly for nested types. At all. Will not be supported.\r\n* Some imenu targets are hard to pick by regexp without getting tons of noise. For this reason methods and props does *require* access-modifiers to be indexed. Other types are less strict.\r\n\r\n**Plans**\r\n\r\n* to increase configurability (what to index, how to present it etc)\r\n* Maybe be less restrictive about access-modifiers if we find a way around it.\r\n\r\nThis PR also fixes/addresses the following github issues:\r\n\r\n* https://github.com/josteink/csharp-mode/issues/71\r\n* https://github.com/josteink/csharp-mode/issues/68\r\n* https://github.com/josteink/csharp-mode/issues/67\r\n* https://github.com/josteink/csharp-mode/issues/60\r\n\r\nSo yay!\r\n\r\nFor now, I think this is a big enough chunk of code to toss into master. Any opinions? Any objections?\r\n\r\nCC: @sithUO, @wasamasa , @binki , @sp3ctum, @nosami, @jesse-black\r\n\r\n","created_at":"2016-05-28T13:08:43Z","updated_at":"2016-05-28T13:30:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":"39ad762a95872538b1d735a4faa18f3fae24e41e","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/josteink/csharp-mode/pulls/74/commits","review_comments_url":"https://api.github.com/repos/josteink/csharp-mode/pulls/74/comments","review_comment_url":"https://api.github.com/repos/josteink/csharp-mode/pulls/comments{/number}","comments_url":"https://api.github.com/repos/josteink/csharp-mode/issues/74/comments","statuses_url":"https://api.github.com/repos/josteink/csharp-mode/statuses/6df554fb27b811f03e2ed3adcb28788ff387d73b","head":{"label":"josteink:imenu-rewrite","ref":"imenu-rewrite","sha":"6df554fb27b811f03e2ed3adcb28788ff387d73b","user":{"login":"josteink","id":411338,"avatar_url":"https://avatars.githubusercontent.com/u/411338?v=3","gravatar_id":"","url":"https://api.github.com/users/josteink","html_url":"https://github.com/josteink","followers_url":"https://api.github.com/users/josteink/followers","following_url":"https://api.github.com/users/josteink/following{/other_user}","gists_url":"https://api.github.com/users/josteink/gists{/gist_id}","starred_url":"https://api.github.com/users/josteink/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/josteink/subscriptions","organizations_url":"https://api.github.com/users/josteink/orgs","repos_url":"https://api.github.com/users/josteink/repos","events_url":"https://api.github.com/users/josteink/events{/privacy}","received_events_url":"https://api.github.com/users/josteink/received_events","type":"User","site_admin":false},"repo":{"id":27216771,"name":"csharp-mode","full_name":"josteink/csharp-mode","owner":{"login":"josteink","id":411338,"avatar_url":"https://avatars.githubusercontent.com/u/411338?v=3","gravatar_id":"","url":"https://api.github.com/users/josteink","html_url":"https://github.com/josteink","followers_url":"https://api.github.com/users/josteink/followers","following_url":"https://api.github.com/users/josteink/following{/other_user}","gists_url":"https://api.github.com/users/josteink/gists{/gist_id}","starred_url":"https://api.github.com/users/josteink/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/josteink/subscriptions","organizations_url":"https://api.github.com/users/josteink/orgs","repos_url":"https://api.github.com/users/josteink/repos","events_url":"https://api.github.com/users/josteink/events{/privacy}","received_events_url":"https://api.github.com/users/josteink/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/josteink/csharp-mode","description":"A major-mode for editing C# in emacs","fork":false,"url":"https://api.github.com/repos/josteink/csharp-mode","forks_url":"https://api.github.com/repos/josteink/csharp-mode/forks","keys_url":"https://api.github.com/repos/josteink/csharp-mode/keys{/key_id}","collaborators_url":"https://api.github.com/repos/josteink/csharp-mode/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/josteink/csharp-mode/teams","hooks_url":"https://api.github.com/repos/josteink/csharp-mode/hooks","issue_events_url":"https://api.github.com/repos/josteink/csharp-mode/issues/events{/number}","events_url":"https://api.github.com/repos/josteink/csharp-mode/events","assignees_url":"https://api.github.com/repos/josteink/csharp-mode/assignees{/user}","branches_url":"https://api.github.com/repos/josteink/csharp-mode/branches{/branch}","tags_url":"https://api.github.com/repos/josteink/csharp-mode/tags","blobs_url":"https://api.github.com/repos/josteink/csharp-mode/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/josteink/csharp-mode/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/josteink/csharp-mode/git/refs{/sha}","trees_url":"https://api.github.com/repos/josteink/csharp-mode/git/trees{/sha}","statuses_url":"https://api.github.com/repos/josteink/csharp-mode/statuses/{sha}","languages_url":"https://api.github.com/repos/josteink/csharp-mode/languages","stargazers_url":"https://api.github.com/repos/josteink/csharp-mode/stargazers","contributors_url":"https://api.github.com/repos/josteink/csharp-mode/contributors","subscribers_url":"https://api.github.com/repos/josteink/csharp-mode/subscribers","subscription_url":"https://api.github.com/repos/josteink/csharp-mode/subscription","commits_url":"https://api.github.com/repos/josteink/csharp-mode/commits{/sha}","git_commits_url":"https://api.github.com/repos/josteink/csharp-mode/git/commits{/sha}","comments_url":"https://api.github.com/repos/josteink/csharp-mode/comments{/number}","issue_comment_url":"https://api.github.com/repos/josteink/csharp-mode/issues/comments{/number}","contents_url":"https://api.github.com/repos/josteink/csharp-mode/contents/{+path}","compare_url":"https://api.github.com/repos/josteink/csharp-mode/compare/{base}...{head}","merges_url":"https://api.github.com/repos/josteink/csharp-mode/merges","archive_url":"https://api.github.com/repos/josteink/csharp-mode/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/josteink/csharp-mode/downloads","issues_url":"https://api.github.com/repos/josteink/csharp-mode/issues{/number}","pulls_url":"https://api.github.com/repos/josteink/csharp-mode/pulls{/number}","milestones_url":"https://api.github.com/repos/josteink/csharp-mode/milestones{/number}","notifications_url":"https://api.github.com/repos/josteink/csharp-mode/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/josteink/csharp-mode/labels{/name}","releases_url":"https://api.github.com/repos/josteink/csharp-mode/releases{/id}","deployments_url":"https://api.github.com/repos/josteink/csharp-mode/deployments","created_at":"2014-11-27T08:52:58Z","updated_at":"2016-05-20T20:15:03Z","pushed_at":"2016-05-28T13:08:44Z","git_url":"git://github.com/josteink/csharp-mode.git","ssh_url":"git@github.com:josteink/csharp-mode.git","clone_url":"https://github.com/josteink/csharp-mode.git","svn_url":"https://github.com/josteink/csharp-mode","homepage":"","size":986,"stargazers_count":46,"watchers_count":46,"language":"Emacs Lisp","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"open_issues_count":9,"forks":13,"open_issues":9,"watchers":46,"default_branch":"master"}},"base":{"label":"josteink:master","ref":"master","sha":"3c1143d52570461ef16ae83b8566564e66ee6165","user":{"login":"josteink","id":411338,"avatar_url":"https://avatars.githubusercontent.com/u/411338?v=3","gravatar_id":"","url":"https://api.github.com/users/josteink","html_url":"https://github.com/josteink","followers_url":"https://api.github.com/users/josteink/followers","following_url":"https://api.github.com/users/josteink/following{/other_user}","gists_url":"https://api.github.com/users/josteink/gists{/gist_id}","starred_url":"https://api.github.com/users/josteink/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/josteink/subscriptions","organizations_url":"https://api.github.com/users/josteink/orgs","repos_url":"https://api.github.com/users/josteink/repos","events_url":"https://api.github.com/users/josteink/events{/privacy}","received_events_url":"https://api.github.com/users/josteink/received_events","type":"User","site_admin":false},"repo":{"id":27216771,"name":"csharp-mode","full_name":"josteink/csharp-mode","owner":{"login":"josteink","id":411338,"avatar_url":"https://avatars.githubusercontent.com/u/411338?v=3","gravatar_id":"","url":"https://api.github.com/users/josteink","html_url":"https://github.com/josteink","followers_url":"https://api.github.com/users/josteink/followers","following_url":"https://api.github.com/users/josteink/following{/other_user}","gists_url":"https://api.github.com/users/josteink/gists{/gist_id}","starred_url":"https://api.github.com/users/josteink/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/josteink/subscriptions","organizations_url":"https://api.github.com/users/josteink/orgs","repos_url":"https://api.github.com/users/josteink/repos","events_url":"https://api.github.com/users/josteink/events{/privacy}","received_events_url":"https://api.github.com/users/josteink/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/josteink/csharp-mode","description":"A major-mode for editing C# in emacs","fork":false,"url":"https://api.github.com/repos/josteink/csharp-mode","forks_url":"https://api.github.com/repos/josteink/csharp-mode/forks","keys_url":"https://api.github.com/repos/josteink/csharp-mode/keys{/key_id}","collaborators_url":"https://api.github.com/repos/josteink/csharp-mode/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/josteink/csharp-mode/teams","hooks_url":"https://api.github.com/repos/josteink/csharp-mode/hooks","issue_events_url":"https://api.github.com/repos/josteink/csharp-mode/issues/events{/number}","events_url":"https://api.github.com/repos/josteink/csharp-mode/events","assignees_url":"https://api.github.com/repos/josteink/csharp-mode/assignees{/user}","branches_url":"https://api.github.com/repos/josteink/csharp-mode/branches{/branch}","tags_url":"https://api.github.com/repos/josteink/csharp-mode/tags","blobs_url":"https://api.github.com/repos/josteink/csharp-mode/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/josteink/csharp-mode/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/josteink/csharp-mode/git/refs{/sha}","trees_url":"https://api.github.com/repos/josteink/csharp-mode/git/trees{/sha}","statuses_url":"https://api.github.com/repos/josteink/csharp-mode/statuses/{sha}","languages_url":"https://api.github.com/repos/josteink/csharp-mode/languages","stargazers_url":"https://api.github.com/repos/josteink/csharp-mode/stargazers","contributors_url":"https://api.github.com/repos/josteink/csharp-mode/contributors","subscribers_url":"https://api.github.com/repos/josteink/csharp-mode/subscribers","subscription_url":"https://api.github.com/repos/josteink/csharp-mode/subscription","commits_url":"https://api.github.com/repos/josteink/csharp-mode/commits{/sha}","git_commits_url":"https://api.github.com/repos/josteink/csharp-mode/git/commits{/sha}","comments_url":"https://api.github.com/repos/josteink/csharp-mode/comments{/number}","issue_comment_url":"https://api.github.com/repos/josteink/csharp-mode/issues/comments{/number}","contents_url":"https://api.github.com/repos/josteink/csharp-mode/contents/{+path}","compare_url":"https://api.github.com/repos/josteink/csharp-mode/compare/{base}...{head}","merges_url":"https://api.github.com/repos/josteink/csharp-mode/merges","archive_url":"https://api.github.com/repos/josteink/csharp-mode/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/josteink/csharp-mode/downloads","issues_url":"https://api.github.com/repos/josteink/csharp-mode/issues{/number}","pulls_url":"https://api.github.com/repos/josteink/csharp-mode/pulls{/number}","milestones_url":"https://api.github.com/repos/josteink/csharp-mode/milestones{/number}","notifications_url":"https://api.github.com/repos/josteink/csharp-mode/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/josteink/csharp-mode/labels{/name}","releases_url":"https://api.github.com/repos/josteink/csharp-mode/releases{/id}","deployments_url":"https://api.github.com/repos/josteink/csharp-mode/deployments","created_at":"2014-11-27T08:52:58Z","updated_at":"2016-05-20T20:15:03Z","pushed_at":"2016-05-28T13:08:44Z","git_url":"git://github.com/josteink/csharp-mode.git","ssh_url":"git@github.com:josteink/csharp-mode.git","clone_url":"https://github.com/josteink/csharp-mode.git","svn_url":"https://github.com/josteink/csharp-mode","homepage":"","size":986,"stargazers_count":46,"watchers_count":46,"language":"Emacs Lisp","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"open_issues_count":9,"forks":13,"open_issues":9,"watchers":46,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/josteink/csharp-mode/pulls/74"},"html":{"href":"https://github.com/josteink/csharp-mode/pull/74"},"issue":{"href":"https://api.github.com/repos/josteink/csharp-mode/issues/74"},"comments":{"href":"https://api.github.com/repos/josteink/csharp-mode/issues/74/comments"},"review_comments":{"href":"https://api.github.com/repos/josteink/csharp-mode/pulls/74/comments"},"review_comment":{"href":"https://api.github.com/repos/josteink/csharp-mode/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/josteink/csharp-mode/pulls/74/commits"},"statuses":{"href":"https://api.github.com/repos/josteink/csharp-mode/statuses/6df554fb27b811f03e2ed3adcb28788ff387d73b"}}}}
{"actor":{"display_login":"wasamasa"}}