From 6e9ce60e02f9d4f9da9ea79c0d3a41313d5c25e9 Mon Sep 17 00:00:00 2001 From: Andres Jorquera Date: Wed, 26 Mar 2014 05:27:39 +0000 Subject: [PATCH] Change to use REGEX. Added return feature. Change to using regular expressions to give more flexibility. Added feature: It gives a @returns {type} Description to the JSDocs --- main.js | 164 ++++++++++++++++++++++---------------------------------- 1 file changed, 65 insertions(+), 99 deletions(-) diff --git a/main.js b/main.js index 12ebd4d..b4fdd0a 100644 --- a/main.js +++ b/main.js @@ -39,144 +39,108 @@ define(function (require, exports, module) { var EMPTY_MSG = "No function found"; var COMMAND_ID = "annotate.annotate"; var MENU_NAME = "Annotate function"; - - + + var REGEX_PATTERNS = { + comment: '\\/\\*.*\\*\\/', + jsVariable: '[$A-Za-z_][0-9A-Za-z_$]*' + }; function insert(input) { - + var editor = EditorManager.getCurrentFullEditor(); var pos = editor.getCursorPos(); pos.ch = 0; - + editor._codeMirror.replaceRange(input, pos); EditorManager.focusEditor(); - + } - + /** * get the whitespace characters from line start to beginning of function def * @param string input lines from start of the function definition * @param string match function definition start */ function getPrefix(input, match) { - + var indexOf = input.indexOf(match), prefix = ""; if (indexOf !== -1) { - prefix = input.substr(0, indexOf); + prefix = input.substr(0, indexOf).replace(/[^\s\n]/g, ' '); } - + return prefix; - + } - + function getTarget() { + + var editor = EditorManager.getCurrentFullEditor(), + pos = editor.getCursorPos(), + functionDeclarationRegex = new RegExp('^[a-z0-9]*\\s*\\n*\\bfunction\\b\\s*' + REGEX_PATTERNS.jsVariable + '\\s*\\(\\s*(' + + REGEX_PATTERNS.jsVariable + '\\s*,?)*\\s*\\)','g'), + + functionExpresionRegex = new RegExp('^[a-z0-9]*\\s*\\n*(var)?\\s*'+ REGEX_PATTERNS.jsVariable + '\\s*=\\s*function\\s*\\(\\s*(' + + REGEX_PATTERNS.jsVariable + '\\s*(,\\s*)?)*\\s*\\)\\s*','g'); - var editor = EditorManager.getCurrentFullEditor(); - var pos = editor.getCursorPos(); pos.ch = 0; - + // Take the text of the document, starting with the current cursor line var txtFrom = editor._codeMirror.getRange(pos, {line: editor._codeMirror.lineCount() }); - - // For now, we generate annotations from the signature only (missing return statements) + + //checks if there is a return value + var returnsValue = txtFrom.substr( txtFrom.indexOf('{'), txtFrom.indexOf('}')).search('return') !== -1; + txtFrom = txtFrom.substr(0, txtFrom.indexOf("{")); - // Look for words - var re = /[$,\w]+/g; - var results = txtFrom.match(re); - - // The first word found should be "function", and next ones parameters - - if (results[0] === "function") { - return { - name: results[1], - params: results.slice(2), - prefix: getPrefix(txtFrom, results[0]) - }; - } else if (results[0] === "private" && results[1] === "function") { - return { - name: results[1], - params: results.slice(3), - prefix: getPrefix(txtFrom, results[0]) - }; - } else if (results[0] === "public" && results[1] === "function") { - return { - name: results[1], - params: results.slice(3), - prefix: getPrefix(txtFrom, results[0]) - }; - } else if (results[0] === "static" && results[1] === "function") { - return { - name: results[1], - params: results.slice(3), - prefix: getPrefix(txtFrom, results[0]) - }; - } else if (results[0] === "var" && results[2] === "function") { + //take any comment off + txtFrom = txtFrom.replace(new RegExp(REGEX_PATTERNS.comment,'g'), '') + + var results = txtFrom.match(new RegExp(REGEX_PATTERNS.jsVariable,'g')); + switch(true) { + case functionExpresionRegex.test(txtFrom): return { - name: results[1], - params: results.slice(3), - prefix: getPrefix(txtFrom, results[0]) + //check for 'var' + name:results[results.indexOf('var') === -1 ? 0:1], + params:results.slice(results.indexOf('var') === -1 ? 2:3), + prefix: getPrefix(txtFrom, results[0]), + returnsValue:returnsValue }; - } else if(results[0] === "this" && results[2] === "function"){ - - return { - name: results[1], - params: results.slice(3), - prefix: getPrefix(txtFrom, results[0]) + case functionDeclarationRegex.test(txtFrom): + console.log(results[1]); + return { + name:results[1], + params:results.slice(2), + prefix: getPrefix(txtFrom, results[0]), + returnsValue:returnsValue }; - } else if (results[1] === "function") { - - return { - name: results[0], - params: results.slice(2), - prefix: getPrefix(txtFrom, results[0]) - }; - } else if (results[1] === "function") { - return { - name: results[0], - params: results.slice(2), - prefix: getPrefix(txtFrom, results[0]) - }; - } else if(txtFrom.indexOf('.prototype.')){ - var i = 1; - for(;i 0) { var i; @@ -185,27 +149,29 @@ define(function (require, exports, module) { output.push(" * @param {type} " + param + " Description"); } } + + if (returnsValue) output.push(" * @returns {type} Description"); // TODO use if 'return' is found in the function body? //output += " * @return {type} ???\n"; output.push(" */"); - - return prefix + output.join("\n" + prefix) + "\n"; + + return prefix + output.join(prefix) + "\n"; } - - + + function annotate() { - + var target = getTarget(); - + if (target === null) { window.alert(EMPTY_MSG); return; } - - var comment = generateComment(target.name, target.params, target.prefix); - + + var comment = generateComment(target.name, target.params, target.returnsValue, target.prefix); + insert(comment); } @@ -215,6 +181,6 @@ define(function (require, exports, module) { var menu = Menus.getMenu(Menus.AppMenuBar.EDIT_MENU); menu.addMenuDivider(); - menu.addMenuItem(COMMAND_ID);//"menu-edit-annotate", + menu.addMenuItem(COMMAND_ID);//"menu-edit-annotate", });