From c57a071cbe9ab2e555dc719ada64c20ccb19eacd Mon Sep 17 00:00:00 2001
From: Franco Pariani <franco19ps@gmail.com>
Date: Wed, 20 Feb 2019 23:38:53 -0300
Subject: [PATCH] Jump to definition feature

---
 .../codemirror/functions_definition.js        | 38 +++++++++++++++++++
 .../app/layout/matefun/matefun.component.html |  1 +
 .../app/layout/matefun/matefun.component.ts   |  5 +--
 Frontend Angular 4/src/assets/i18n/en.json    |  3 +-
 Frontend Angular 4/src/assets/i18n/es.json    |  3 +-
 5 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/Frontend Angular 4/src/app/layout/matefun/codemirror/functions_definition.js b/Frontend Angular 4/src/app/layout/matefun/codemirror/functions_definition.js
index eea736df..a42e1e72 100644
--- a/Frontend Angular 4/src/app/layout/matefun/codemirror/functions_definition.js	
+++ b/Frontend Angular 4/src/app/layout/matefun/codemirror/functions_definition.js	
@@ -484,4 +484,42 @@ var mac = /Mac/.test(navigator.platform);
       return {list: list, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)};
     }
   };
+
+  CodeMirror.defineExtension("jumpToDefinition", function(editor, options) {
+    var word = options && options.word || WORD;
+    var range = options && options.range || RANGE;
+    var cur = editor.getCursor(), curLine = editor.getLine(cur.line);
+    var end = cur.ch, start = end;
+    while (start && word.test(curLine.charAt(start - 1))) --start;
+    while (end && word.test(curLine.charAt(end + 1))) ++end;
+    var curWord = start != end && curLine.slice(start, end + 1);
+
+    if (curWord.length > 0){
+      var list = [], seen = {};
+      var re_digits = new RegExp(/^\d+$/, "g");
+
+      var found = false;
+
+      var re_funs = new RegExp(COMPLETE_FUNS.source, "g");
+      for (var dir = -1; dir <= 1; dir += 2) {
+        var line = cur.line, endLine = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir;
+        for (; line != endLine && !found; line += dir) {
+          var text = editor.getLine(line), m;
+          while (m = re_funs.exec(text)) {
+            if (!re_digits.exec(m[1]) && (!curWord || m[1] == curWord) && !Object.prototype.hasOwnProperty.call(seen, m[1])) {
+              seen[m[1]] = true;
+              found = true;
+              
+              var newCursor = editor.getCursor();
+              newCursor.line = line;
+              newCursor.ch = text.indexOf(m[1]);
+              editor.setCursor(newCursor);
+
+              editor.cm.closeFunctionDefinition();
+            }
+          }
+        }
+      }
+    }
+  });
 });
diff --git a/Frontend Angular 4/src/app/layout/matefun/matefun.component.html b/Frontend Angular 4/src/app/layout/matefun/matefun.component.html
index 08f1d823..d23c8e87 100755
--- a/Frontend Angular 4/src/app/layout/matefun/matefun.component.html	
+++ b/Frontend Angular 4/src/app/layout/matefun/matefun.component.html	
@@ -135,6 +135,7 @@
                                     <label><b>Ctrl+G</b> {{ "i18n.shortcuts.saveFile" | translate }}</label>
                                     <label><b>Ctrl+{{ "i18n.shortcuts.space" | translate }}</b> {{ "i18n.shortcuts.autocomplete" | translate }}</label>
                                     <label><b>Ctrl+Shift+K</b> {{ "i18n.shortcuts.comment" | translate }}</label>
+                                    <label><b>Alt+.</b> {{ "i18n.shortcuts.functionNavigation" | translate }}</label>
                                 </div>
                             </div>
                         </ng-template>
diff --git a/Frontend Angular 4/src/app/layout/matefun/matefun.component.ts b/Frontend Angular 4/src/app/layout/matefun/matefun.component.ts
index 33af3cec..da9f407b 100755
--- a/Frontend Angular 4/src/app/layout/matefun/matefun.component.ts	
+++ b/Frontend Angular 4/src/app/layout/matefun/matefun.component.ts	
@@ -453,9 +453,8 @@ export class MateFunComponent {
             }else{
                 this.modificado = false;
             }
-        }
-        if (event.ctrlKey && event.shiftKey && event.key == 'K')
-            this.codemirror.instance.toggleComment();
+        }else if (event.ctrlKey && event.shiftKey && event.key == 'K') this.codemirror.instance.toggleComment();
+        else if (event.altKey && event.key == '.') this.codemirror.instance.jumpToDefinition(this.codemirror.instance.doc, event);
     }
 
     clickEnEditor(event){
diff --git a/Frontend Angular 4/src/assets/i18n/en.json b/Frontend Angular 4/src/assets/i18n/en.json
index e9902a07..f8d6d324 100644
--- a/Frontend Angular 4/src/assets/i18n/en.json	
+++ b/Frontend Angular 4/src/assets/i18n/en.json	
@@ -129,7 +129,8 @@
             "saveFile" : "Save File",
             "autocomplete" : "Autocomplete",
             "space" : "Space",
-            "comment" : "Comment/Uncomment"
+            "comment" : "Comment/Uncomment",
+            "functionNavigation" : "Jump to the definition"
         }
     }
 }
diff --git a/Frontend Angular 4/src/assets/i18n/es.json b/Frontend Angular 4/src/assets/i18n/es.json
index 323268ae..f13b7b15 100644
--- a/Frontend Angular 4/src/assets/i18n/es.json	
+++ b/Frontend Angular 4/src/assets/i18n/es.json	
@@ -129,7 +129,8 @@
             "saveFile" : "Guardar archivo",
             "autocomplete" : "Autocompletar",
             "space" : "Espacio",
-            "comment" : "Comentar/Descomentar"
+            "comment" : "Comentar/Descomentar",
+            "functionNavigation" : "Saltar a la definición"
         }
     }
 }
-- 
GitLab