From ee90854917cb5ec02158a0a471ece29fd0f09df8 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sun, 19 Apr 2015 08:18:04 -0400 Subject: [PATCH 01/14] bug fix & typo fix --- demo/kitchen-sink/docs/sqlserver.sqlserver | 19 ++++++++++++------- lib/ace/mode/sqlserver_highlight_rules.js | 6 ++++-- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/demo/kitchen-sink/docs/sqlserver.sqlserver b/demo/kitchen-sink/docs/sqlserver.sqlserver index 329930af..86c679a5 100644 --- a/demo/kitchen-sink/docs/sqlserver.sqlserver +++ b/demo/kitchen-sink/docs/sqlserver.sqlserver @@ -1,9 +1,9 @@ -- ============================================= -- Author: Morgan Yarbrough -- Create date: 4/27/2015 --- Description: Test Procedure that shows off language features. --- Includes non-standard folding using region comments using either --- line comments or block comments (both are demonstrated below) +-- Description: Test procedure that shows off language features. +-- Includes non-standard folding with region comments using either +-- line comments or block comments (both are demonstrated below). -- This mode imitates SSMS and it designed to be used with SQL Server theme. -- ============================================= CREATE PROCEDURE dbo.TestProcedure @@ -11,7 +11,7 @@ CREATE PROCEDURE dbo.TestProcedure --#region parameters @vint INT = 1 ,@vdate DATE = NULL - ,@vdatetime DATETIME = DATEADD (dd, 1, GETDATE()) + ,@vdatetime DATETIME = DATEADD(dd, 1, GETDATE()) ,@vvarchar VARCHAR(MAX) = '' --#endregion @@ -38,8 +38,8 @@ BEGIN -- another folding demonstration IF @vint = 1 BEGIN - SET @vvarchar='one' - SET @vint = DATEDIFFT(dd, @vdate, @vdatetime) + SET @vvarchar = 'one' + SET @vint = DATEDIFF(dd, @vdate, @vdatetime) END -- this mode handles strings properly @@ -47,7 +47,7 @@ BEGIN FROM Orders WHERE @OrderDate > GETDATE()' - -- this mode is aware of build in stored procedures + -- this mode is aware of built in stored procedures EXECUTE sp_executesql @sql -- demonstrating some syntax highlighting @@ -60,4 +60,9 @@ BEGIN WHERE CompanyName NOT LIKE '%something' OR CompanyName IS NULL OR CompanyName IN ('bla', 'nothing') + + -- this mode includes snippets + -- place your cusor at the end of the line below and trigger auto complete (Ctrl+Space) + createpr + END diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 42e193d7..5e703e5b 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -121,10 +121,12 @@ var SqlServerHighlightRules = function() { // createKeywordMapper ignores case which we want because SqlServer keywords are not case sensitive which causes our keywords to get changed to lowercase. // However, the preferred standard for keywords is uppercase, so this transforms them back to uppercase for code completion - // EXCEPTION: build in stored procedures are lower case + // EXCEPTION: built in stored procedures are lower case + builtInStoredProcedures = builtInStoredProcedures.split('|'); for (var i = 0; i < this.$keywordList.length; i++) { var keyword = this.$keywordList[i]; if (builtInStoredProcedures.indexOf(keyword) !== -1) continue; + this.$keywordList[i] = keyword.toUpperCase(); } @@ -171,7 +173,7 @@ var SqlServerHighlightRules = function() { regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" }, { token: keywordMapper, - regex: "@{0,2}[a-zA-Z_$][a-zA-Z0-9_$]*\\b" //up to 2 @symbols for some build in functions + regex: "@{0,2}[a-zA-Z_$][a-zA-Z0-9_$]*\\b" //up to 2 @symbols for some built in functions }, { token: "constant.class", regex: "@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b" From cf0c81a25fa5373409b086d824e4405698622f64 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sun, 19 Apr 2015 08:37:22 -0400 Subject: [PATCH 02/14] more snippets --- lib/ace/snippets/sqlserver.snippets | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/ace/snippets/sqlserver.snippets b/lib/ace/snippets/sqlserver.snippets index 51c00ae4..403bd6bc 100644 --- a/lib/ace/snippets/sqlserver.snippets +++ b/lib/ace/snippets/sqlserver.snippets @@ -22,6 +22,16 @@ snippet dateadd # DATEFROMPARTS snippet datefromparts DATEFROMPARTS(${1:year}, ${2:month}, ${3:day}) +# OBJECT_DEFINITION +snippet objectdef + SELECT OBJECT_DEFINITION(OBJECT_ID('${1:sys.server_permissions /*object name*/}')) +# STUFF XML +snippet stuffxml + STUFF((SELECT ', ' + ${1:ColumnName} + FROM ${2:TableName} + WHERE ${3:WhereClause} + FOR XML PATH('')), 1, 1, '') AS ${4:Alias} + ${5:/*https://msdn.microsoft.com/en-us/library/ms188043.aspx*/} # Create Procedure snippet createproc -- ============================================= @@ -30,12 +40,14 @@ snippet createproc -- Description: ${3:Description} -- ============================================= CREATE PROCEDURE ${4:Procedure_Name} - -- Add the parameters for the stored procedure here + ${5:/*Add the parameters for the stored procedure here*/} AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements. SET NOCOUNT ON; + ${6:/*Add the T-SQL statements to compute the return value here*/} + END GO # Create Scalar Function @@ -52,5 +64,7 @@ snippet createfn BEGIN DECLARE @Result ${5:Function_Data_Type} + ${6:/*Add the T-SQL statements to compute the return value here*/} + END GO \ No newline at end of file From 27284cd29ff284769b49e453b7473467881b75be Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sun, 19 Apr 2015 11:23:10 -0400 Subject: [PATCH 03/14] added completionModifier allows a highlight rule modify keyword completions --- lib/ace/mode/text.js | 6 +++++- lib/ace/mode/text_highlight_rules.js | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/ace/mode/text.js b/lib/ace/mode/text.js index f04f1722..f8f0581d 100644 --- a/lib/ace/mode/text.js +++ b/lib/ace/mode/text.js @@ -368,14 +368,18 @@ var Mode = function() { }; this.getCompletions = function(state, session, pos, prefix) { + var self = this; var keywords = this.$keywordList || this.$createKeywordList(); return keywords.map(function(word) { - return { + var r = { name: word, value: word, score: 0, meta: "keyword" }; + return self.$highlightRules.completionModifier ? self.$highlightRules.completionModifier.call(self, r) : r; + }).filter(function(value) { + return value !== undefined; }); }; diff --git a/lib/ace/mode/text_highlight_rules.js b/lib/ace/mode/text_highlight_rules.js index ae72040b..fc481442 100644 --- a/lib/ace/mode/text_highlight_rules.js +++ b/lib/ace/mode/text_highlight_rules.js @@ -227,6 +227,14 @@ var TextHighlightRules = function() { this.getKeywords = function() { return this.$keywords; }; + + /** + * Function that can be set by HighlightRules to modify a keyword completion. + * The function receives {name, value, score, meta} + * and should return the same type or undefined to skip adding the result to + * the completion list. + */ + this.completionModifier = null; }).call(TextHighlightRules.prototype); From 961f8c4893ff397b9ca5e5bfff8b4cf04c04586f Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sun, 19 Apr 2015 11:24:30 -0400 Subject: [PATCH 04/14] completion modifier for SQL and JavaScript --- lib/ace/mode/javascript_highlight_rules.js | 24 +++++++++++ lib/ace/mode/sqlserver_highlight_rules.js | 49 +++++++++++++++------- 2 files changed, 59 insertions(+), 14 deletions(-) diff --git a/lib/ace/mode/javascript_highlight_rules.js b/lib/ace/mode/javascript_highlight_rules.js index 5bdcce12..fd23e7d9 100644 --- a/lib/ace/mode/javascript_highlight_rules.js +++ b/lib/ace/mode/javascript_highlight_rules.js @@ -64,6 +64,30 @@ var JavaScriptHighlightRules = function(options) { "alert", "constant.language.boolean": "true|false" }, "identifier"); + + // modify keyword completions meta display and remove things that are irrelevant + var modCache = {}; + this.completionModifier = function(obj) { + var n = obj.name; + if (n.search('__parent__|__count__|proto__') !== -1) return; //can't cache reserved keys + + if (modCache[n] === undefined) { + if (n.search('enum|await|implements|package|protected|static|interface|private|public') !== -1) modCache[n] = ''; //future + else if (n.search('Namespace|QName|XML|XMLList') !== -1) modCache[n] = ''; //E4X is obsolete + else if (n.search('Iterator|ParallelArray|StopIeration') !== -1) modCache[n] = ''; //non standard + else if (n.search('Array|Boolean|Date|Function|Number|Object|RegExp|String|Proxy') !== -1) modCache[n] = 'object'; + else if (n.search('Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError') !== -1) modCache[n] = 'object'; + else if (n.search('alert|eval|isFinite|isNan|parseFloat|parseInt|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|escape|unescape') !== -1) modCache[n] = 'function'; + else if (n.search('null|Infinity|NaN|undefined') !== -1) modCache[n] = 'constant'; + else if (n.search('const|let|var|function|class|get|set') !== -1) modCache[n] = 'declaration'; + else if (n.search('true|false') !== -1) modCache[n] = 'boolean'; + else modCache[n] = 'keyword'; + } + + obj.meta = modCache[n]; + if (obj.meta === '') return; //don't show obsolete + return obj; + }; // keywords which can be followed by regular expressions var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 5e703e5b..1098764e 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -77,7 +77,9 @@ var SqlServerHighlightRules = function() { /* https://msdn.microsoft.com/en-us/library/ms177520.aspx */ "@@CONNECTIONS|@@CPU_BUSY|@@IDLE|@@IO_BUSY|@@PACKET_ERRORS|@@PACK_RECEIVED|@@PACK_SENT|@@TIMETICKS|@@TOTAL_ERRORS|@@TOTAL_READ|@@TOTAL_WRITE|FN_VIRTUALFILESTATS|" + /* https://msdn.microsoft.com/en-us/library/ms188353.aspx */ - "PATINDEX|TEXTPTR|TEXTVALID" + "PATINDEX|TEXTPTR|TEXTVALID|" + + /* other */ + "COALESCE|NULLIF" ); @@ -104,12 +106,14 @@ var SqlServerHighlightRules = function() { keywords += "|TYPE"; - //remove any other built in things from key word list + //remove specific built in types from keyword list keywords = keywords.split('|'); keywords = keywords.filter(function(value, index, self) { return logicalOperators.split('|').indexOf(value) === -1 && builtinFunctions.split('|').indexOf(value) === -1 && dataTypes.split('|').indexOf(value) === -1; }); keywords = keywords.sort().join('|'); + + var keywordMapper = this.createKeywordMapper({ "constant.language": logicalOperators, "storage.type": dataTypes, @@ -117,19 +121,7 @@ var SqlServerHighlightRules = function() { "support.storedprocedure": builtInStoredProcedures, "keyword": keywords, }, "identifier", true); - - - // createKeywordMapper ignores case which we want because SqlServer keywords are not case sensitive which causes our keywords to get changed to lowercase. - // However, the preferred standard for keywords is uppercase, so this transforms them back to uppercase for code completion - // EXCEPTION: built in stored procedures are lower case - builtInStoredProcedures = builtInStoredProcedures.split('|'); - for (var i = 0; i < this.$keywordList.length; i++) { - var keyword = this.$keywordList[i]; - if (builtInStoredProcedures.indexOf(keyword) !== -1) continue; - this.$keywordList[i] = keyword.toUpperCase(); - } - //https://msdn.microsoft.com/en-us/library/ms190356.aspx var setStatements = "SET ANSI_DEFAULTS|SET ANSI_NULLS|SET ANSI_NULL_DFLT_OFF|SET ANSI_NULL_DFLT_ON|SET ANSI_PADDING|SET ANSI_WARNINGS|SET ARITHABORT|SET ARITHIGNORE|SET CONCAT_NULL_YIELDS_NULL|SET CURSOR_CLOSE_ON_COMMIT|SET DATEFIRST|SET DATEFORMAT|SET DEADLOCK_PRIORITY|SET FIPS_FLAGGER|SET FMTONLY|SET FORCEPLAN|SET IDENTITY_INSERT|SET IMPLICIT_TRANSACTIONS|SET LANGUAGE|SET LOCK_TIMEOUT|SET NOCOUNT|SET NOEXEC|SET NUMERIC_ROUNDABORT|SET OFFSETS|SET PARSEONLY|SET QUERY_GOVERNOR_COST_LIMIT|SET QUOTED_IDENTIFIER|SET REMOTE_PROC_TRANSACTIONS|SET ROWCOUNT|SET SHOWPLAN_ALL|SET SHOWPLAN_TEXT|SET SHOWPLAN_XML|SET STATISTICS IO|SET STATISTICS PROFILE|SET STATISTICS TIME|SET STATISTICS XML|SET TEXTSIZE|SET XACT_ABORT".split('|'); @@ -218,6 +210,35 @@ var SqlServerHighlightRules = function() { this.embedRules(DocCommentHighlightRules, "doc-", [DocCommentHighlightRules.getEndRule("start")]); this.normalizeRules(); + + + // prepare key word types for completion modifier + builtInStoredProcedures = builtInStoredProcedures.split('|'); + logicalOperators = logicalOperators.split('|'); + builtinFunctions = builtinFunctions.split('|'); + dataTypes = dataTypes.split('|'); + + this.completionModifier = function(obj) { + var word = obj.name, + meta = 'keyword'; + + if (builtInStoredProcedures.indexOf(word) !== -1) meta = "storedProcedure"; + else { + //all others are upper case + word = word.toUpperCase(); + if (builtinFunctions.indexOf(word) !== -1) meta = "function"; + else if (dataTypes.indexOf(word) !== -1) meta = "dataType"; + else if (setStatements.indexOf(word) !== -1) meta = "setStatement"; + else if (logicalOperators.indexOf(word) !== -1) meta = "logicalOperator"; + } + + return { + name: word, + value: word, + score: 0, + meta: meta + }; + }; }; oop.inherits(SqlServerHighlightRules, TextHighlightRules); From 1027dcea7c892c6aa076148a373f3ada99f882b4 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sun, 19 Apr 2015 11:52:54 -0400 Subject: [PATCH 05/14] cache modifier --- lib/ace/mode/sqlserver_highlight_rules.js | 36 +++++++++++++---------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 1098764e..6d23f6a3 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -218,26 +218,30 @@ var SqlServerHighlightRules = function() { builtinFunctions = builtinFunctions.split('|'); dataTypes = dataTypes.split('|'); + var modCache = {}; this.completionModifier = function(obj) { var word = obj.name, meta = 'keyword'; - - if (builtInStoredProcedures.indexOf(word) !== -1) meta = "storedProcedure"; - else { - //all others are upper case - word = word.toUpperCase(); - if (builtinFunctions.indexOf(word) !== -1) meta = "function"; - else if (dataTypes.indexOf(word) !== -1) meta = "dataType"; - else if (setStatements.indexOf(word) !== -1) meta = "setStatement"; - else if (logicalOperators.indexOf(word) !== -1) meta = "logicalOperator"; + + if (modCache[word] === undefined) { + if (builtInStoredProcedures.indexOf(word) !== -1) meta = "storedProcedure"; + else { + //all others are upper case + word = word.toUpperCase(); + if (builtinFunctions.indexOf(word) !== -1) meta = "function"; + else if (dataTypes.indexOf(word) !== -1) meta = "dataType"; + else if (setStatements.indexOf(word) !== -1) meta = "setStatement"; + else if (logicalOperators.indexOf(word) !== -1) meta = "logicalOperator"; + } + modCache[word] = { + word: word, + value: word, + meta: meta, + score: 0 + }; } - - return { - name: word, - value: word, - score: 0, - meta: meta - }; + + return modCache[word]; }; }; From 1ec6eb7b5d1f779972f08e1d293e1c39174a57f6 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sun, 19 Apr 2015 11:59:31 -0400 Subject: [PATCH 06/14] shorter names --- lib/ace/mode/sqlserver_highlight_rules.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 6d23f6a3..4a7a7658 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -224,14 +224,14 @@ var SqlServerHighlightRules = function() { meta = 'keyword'; if (modCache[word] === undefined) { - if (builtInStoredProcedures.indexOf(word) !== -1) meta = "storedProcedure"; + if (builtInStoredProcedures.indexOf(word) !== -1) meta = "procedure"; else { //all others are upper case word = word.toUpperCase(); if (builtinFunctions.indexOf(word) !== -1) meta = "function"; - else if (dataTypes.indexOf(word) !== -1) meta = "dataType"; - else if (setStatements.indexOf(word) !== -1) meta = "setStatement"; - else if (logicalOperators.indexOf(word) !== -1) meta = "logicalOperator"; + else if (dataTypes.indexOf(word) !== -1) meta = "type"; + else if (setStatements.indexOf(word) !== -1) meta = "statement"; + else if (logicalOperators.indexOf(word) !== -1) meta = "operator"; } modCache[word] = { word: word, From e58fa3e6d74c6aeecdcac435e38ff390b060fb39 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Mon, 20 Apr 2015 04:50:25 -0400 Subject: [PATCH 07/14] remove completionModifer, one off for SQL Server Mode --- lib/ace/mode/javascript_highlight_rules.js | 24 ------------- lib/ace/mode/sqlserver.js | 30 ++++++++++++++++ lib/ace/mode/sqlserver_highlight_rules.js | 40 +++++----------------- lib/ace/mode/text.js | 6 +--- lib/ace/mode/text_highlight_rules.js | 8 ----- 5 files changed, 40 insertions(+), 68 deletions(-) diff --git a/lib/ace/mode/javascript_highlight_rules.js b/lib/ace/mode/javascript_highlight_rules.js index fd23e7d9..5bdcce12 100644 --- a/lib/ace/mode/javascript_highlight_rules.js +++ b/lib/ace/mode/javascript_highlight_rules.js @@ -64,30 +64,6 @@ var JavaScriptHighlightRules = function(options) { "alert", "constant.language.boolean": "true|false" }, "identifier"); - - // modify keyword completions meta display and remove things that are irrelevant - var modCache = {}; - this.completionModifier = function(obj) { - var n = obj.name; - if (n.search('__parent__|__count__|proto__') !== -1) return; //can't cache reserved keys - - if (modCache[n] === undefined) { - if (n.search('enum|await|implements|package|protected|static|interface|private|public') !== -1) modCache[n] = ''; //future - else if (n.search('Namespace|QName|XML|XMLList') !== -1) modCache[n] = ''; //E4X is obsolete - else if (n.search('Iterator|ParallelArray|StopIeration') !== -1) modCache[n] = ''; //non standard - else if (n.search('Array|Boolean|Date|Function|Number|Object|RegExp|String|Proxy') !== -1) modCache[n] = 'object'; - else if (n.search('Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError') !== -1) modCache[n] = 'object'; - else if (n.search('alert|eval|isFinite|isNan|parseFloat|parseInt|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|escape|unescape') !== -1) modCache[n] = 'function'; - else if (n.search('null|Infinity|NaN|undefined') !== -1) modCache[n] = 'constant'; - else if (n.search('const|let|var|function|class|get|set') !== -1) modCache[n] = 'declaration'; - else if (n.search('true|false') !== -1) modCache[n] = 'boolean'; - else modCache[n] = 'keyword'; - } - - obj.meta = modCache[n]; - if (obj.meta === '') return; //don't show obsolete - return obj; - }; // keywords which can be followed by regular expressions var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void"; diff --git a/lib/ace/mode/sqlserver.js b/lib/ace/mode/sqlserver.js index 0f66c1e5..352e2ac8 100644 --- a/lib/ace/mode/sqlserver.js +++ b/lib/ace/mode/sqlserver.js @@ -46,6 +46,36 @@ oop.inherits(Mode, TextMode); (function() { this.lineCommentStart = "--"; this.blockComment = {start: "/*", end: "*/"}; + + /** + * Override keyword completions to ensure proper case for completions + * and use smart meta tags instead of 'keyword' for all completions. + */ + this.getCompletions = function(state, session, pos, prefix) { + if (this.getCompletionsResult) return this.getCompletionsResult; + + var keywords = this.$keywordList || this.$createKeywordList(); + var types = session.$mode.$highlightRules.keywordTypes; + + this.getCompletionsResult = keywords.map(function(word) { + var meta = 'keyword'; + if (types.builtInStoredProcedures.indexOf(word) !== -1) meta = "procedure"; + else { + word = word.toUpperCase(); //all others are upper case + if (types.builtinFunctions.indexOf(word) !== -1) meta = "function"; + else if (types.dataTypes.indexOf(word) !== -1) meta = "type"; + else if (types.setStatements.indexOf(word) !== -1) meta = "statement"; + else if (types.logicalOperators.indexOf(word) !== -1) meta = "operator"; + } + return { + name: word, + value: word, + score: 0, + meta: meta + }; + }); + return this.getCompletionsResult; + }; this.$id = "ace/mode/sql"; }).call(Mode.prototype); diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 4a7a7658..c8770641 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -211,41 +211,19 @@ var SqlServerHighlightRules = function() { this.normalizeRules(); - - // prepare key word types for completion modifier - builtInStoredProcedures = builtInStoredProcedures.split('|'); - logicalOperators = logicalOperators.split('|'); - builtinFunctions = builtinFunctions.split('|'); - dataTypes = dataTypes.split('|'); - - var modCache = {}; - this.completionModifier = function(obj) { - var word = obj.name, - meta = 'keyword'; - - if (modCache[word] === undefined) { - if (builtInStoredProcedures.indexOf(word) !== -1) meta = "procedure"; - else { - //all others are upper case - word = word.toUpperCase(); - if (builtinFunctions.indexOf(word) !== -1) meta = "function"; - else if (dataTypes.indexOf(word) !== -1) meta = "type"; - else if (setStatements.indexOf(word) !== -1) meta = "statement"; - else if (logicalOperators.indexOf(word) !== -1) meta = "operator"; - } - modCache[word] = { - word: word, - value: word, - meta: meta, - score: 0 - }; - } - - return modCache[word]; + // export types for overriding get completions + this.keywordTypes = { + builtInStoredProcedures: builtInStoredProcedures.split('|'), + logicalOperators: logicalOperators.split('|'), + builtinFunctions: builtinFunctions.split('|'), + dataTypes: dataTypes.split('|'), + setStatements: setStatements, }; + }; oop.inherits(SqlServerHighlightRules, TextHighlightRules); exports.SqlHighlightRules = SqlServerHighlightRules; +console.log('exports',exports); }); diff --git a/lib/ace/mode/text.js b/lib/ace/mode/text.js index f8f0581d..f04f1722 100644 --- a/lib/ace/mode/text.js +++ b/lib/ace/mode/text.js @@ -368,18 +368,14 @@ var Mode = function() { }; this.getCompletions = function(state, session, pos, prefix) { - var self = this; var keywords = this.$keywordList || this.$createKeywordList(); return keywords.map(function(word) { - var r = { + return { name: word, value: word, score: 0, meta: "keyword" }; - return self.$highlightRules.completionModifier ? self.$highlightRules.completionModifier.call(self, r) : r; - }).filter(function(value) { - return value !== undefined; }); }; diff --git a/lib/ace/mode/text_highlight_rules.js b/lib/ace/mode/text_highlight_rules.js index fc481442..ae72040b 100644 --- a/lib/ace/mode/text_highlight_rules.js +++ b/lib/ace/mode/text_highlight_rules.js @@ -227,14 +227,6 @@ var TextHighlightRules = function() { this.getKeywords = function() { return this.$keywords; }; - - /** - * Function that can be set by HighlightRules to modify a keyword completion. - * The function receives {name, value, score, meta} - * and should return the same type or undefined to skip adding the result to - * the completion list. - */ - this.completionModifier = null; }).call(TextHighlightRules.prototype); From 68d531ecb29d5d23bedcbc157533c9b067d83f31 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Mon, 20 Apr 2015 04:52:18 -0400 Subject: [PATCH 08/14] cleanup --- lib/ace/mode/sqlserver_highlight_rules.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index c8770641..1f5a8697 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -225,5 +225,4 @@ var SqlServerHighlightRules = function() { oop.inherits(SqlServerHighlightRules, TextHighlightRules); exports.SqlHighlightRules = SqlServerHighlightRules; -console.log('exports',exports); }); From 662cd11975b368753f54a2970cd318edd374b6ac Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Mon, 20 Apr 2015 05:08:54 -0400 Subject: [PATCH 09/14] no cache as its storing reference in filtered list --- lib/ace/mode/sqlserver.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/ace/mode/sqlserver.js b/lib/ace/mode/sqlserver.js index 352e2ac8..82542640 100644 --- a/lib/ace/mode/sqlserver.js +++ b/lib/ace/mode/sqlserver.js @@ -52,12 +52,10 @@ oop.inherits(Mode, TextMode); * and use smart meta tags instead of 'keyword' for all completions. */ this.getCompletions = function(state, session, pos, prefix) { - if (this.getCompletionsResult) return this.getCompletionsResult; - var keywords = this.$keywordList || this.$createKeywordList(); var types = session.$mode.$highlightRules.keywordTypes; - this.getCompletionsResult = keywords.map(function(word) { + return keywords.map(function(word) { var meta = 'keyword'; if (types.builtInStoredProcedures.indexOf(word) !== -1) meta = "procedure"; else { @@ -74,7 +72,6 @@ oop.inherits(Mode, TextMode); meta: meta }; }); - return this.getCompletionsResult; }; this.$id = "ace/mode/sql"; From 67c7da75b67aea2e49aee4111117cf1c2f6e1700 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Mon, 20 Apr 2015 08:52:03 -0400 Subject: [PATCH 10/14] fix escape character was using wrong escape char for string, sqlserver uses double single quote to escape a single quote --- lib/ace/mode/sqlserver_highlight_rules.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 1f5a8697..335e702c 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -141,7 +141,7 @@ var SqlServerHighlightRules = function() { regex: "'", next: [{ token: "constant.language.escape", - regex: /\\'/ + regex: /''/ }, { token: "string.end", next: "start", From 82453d884b1ee588ae54924e4792d18b6c38a988 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Wed, 22 Apr 2015 05:28:31 -0400 Subject: [PATCH 11/14] better completions, no unneeded string rule --- lib/ace/mode/sqlserver.js | 26 ++--------- lib/ace/mode/sqlserver_highlight_rules.js | 57 ++++++++++++----------- 2 files changed, 33 insertions(+), 50 deletions(-) diff --git a/lib/ace/mode/sqlserver.js b/lib/ace/mode/sqlserver.js index 82542640..5f24730c 100644 --- a/lib/ace/mode/sqlserver.js +++ b/lib/ace/mode/sqlserver.js @@ -48,32 +48,12 @@ oop.inherits(Mode, TextMode); this.blockComment = {start: "/*", end: "*/"}; /** - * Override keyword completions to ensure proper case for completions - * and use smart meta tags instead of 'keyword' for all completions. + * Override keyword completions using list created in highlight rules */ this.getCompletions = function(state, session, pos, prefix) { - var keywords = this.$keywordList || this.$createKeywordList(); - var types = session.$mode.$highlightRules.keywordTypes; - - return keywords.map(function(word) { - var meta = 'keyword'; - if (types.builtInStoredProcedures.indexOf(word) !== -1) meta = "procedure"; - else { - word = word.toUpperCase(); //all others are upper case - if (types.builtinFunctions.indexOf(word) !== -1) meta = "function"; - else if (types.dataTypes.indexOf(word) !== -1) meta = "type"; - else if (types.setStatements.indexOf(word) !== -1) meta = "statement"; - else if (types.logicalOperators.indexOf(word) !== -1) meta = "operator"; - } - return { - name: word, - value: word, - score: 0, - meta: meta - }; - }); + return session.$mode.$highlightRules.completions; }; - + this.$id = "ace/mode/sql"; }).call(Mode.prototype); diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 335e702c..c0179e93 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -86,15 +86,15 @@ var SqlServerHighlightRules = function() { // https://msdn.microsoft.com/en-us/library/ms187752.aspx var dataTypes = ("BIGINT|BINARY|BIT|CHAR|CURSOR|DATE|DATETIME|DATETIME2|DATETIMEOFFSET|DECIMAL|FLOAT|HIERARCHYID|IMAGE|INTEGER|INT|MONEY|NCHAR|NTEXT|NUMERIC|NVARCHAR|REAL|SMALLDATETIME|SMALLINT|SMALLMONEY|SQL_VARIANT|TABLE|TEXT|TIME|TIMESTAMP|TINYINT|UNIQUEIDENTIFIER|VARBINARY|VARCHAR|XML"); - + //https://msdn.microsoft.com/en-us/library/ms176007.aspx (these are lower case!) var builtInStoredProcedures = "sp_addextendedproc|sp_addextendedproperty|sp_addmessage|sp_addtype|sp_addumpdevice|sp_add_data_file_recover_suspect_db|sp_add_log_file_recover_suspect_db|sp_altermessage|sp_attach_db|sp_attach_single_file_db|sp_autostats|sp_bindefault|sp_bindrule|sp_bindsession|sp_certify_removable|sp_clean_db_file_free_space|sp_clean_db_free_space|sp_configure|sp_control_plan_guide|sp_createstats|sp_create_plan_guide|sp_create_plan_guide_from_handle|sp_create_removable|sp_cycle_errorlog|sp_datatype_info|sp_dbcmptlevel|sp_dbmmonitoraddmonitoring|sp_dbmmonitorchangealert|sp_dbmmonitorchangemonitoring|sp_dbmmonitordropalert|sp_dbmmonitordropmonitoring|sp_dbmmonitorhelpalert|sp_dbmmonitorhelpmonitoring|sp_dbmmonitorresults|sp_db_increased_partitions|sp_delete_backuphistory|sp_depends|sp_describe_first_result_set|sp_describe_undeclared_parameters|sp_detach_db|sp_dropdevice|sp_dropextendedproc|sp_dropextendedproperty|sp_dropmessage|sp_droptype|sp_execute|sp_executesql|sp_getapplock|sp_getbindtoken|sp_help|sp_helpconstraint|sp_helpdb|sp_helpdevice|sp_helpextendedproc|sp_helpfile|sp_helpfilegroup|sp_helpindex|sp_helplanguage|sp_helpserver|sp_helpsort|sp_helpstats|sp_helptext|sp_helptrigger|sp_indexoption|sp_invalidate_textptr|sp_lock|sp_monitor|sp_prepare|sp_prepexec|sp_prepexecrpc|sp_procoption|sp_recompile|sp_refreshview|sp_releaseapplock|sp_rename|sp_renamedb|sp_resetstatus|sp_sequence_get_range|sp_serveroption|sp_setnetname|sp_settriggerorder|sp_spaceused|sp_tableoption|sp_unbindefault|sp_unbindrule|sp_unprepare|sp_updateextendedproperty|sp_updatestats|sp_validname|sp_who|sys.sp_merge_xtp_checkpoint_files|sys.sp_xtp_bind_db_resource_pool|sys.sp_xtp_checkpoint_force_garbage_collection|sys.sp_xtp_control_proc_exec_stats|sys.sp_xtp_control_query_exec_stats|sys.sp_xtp_unbind_db_resource_pool"; - + // https://msdn.microsoft.com/en-us/library/ms189822.aspx var keywords = "ABSOLUTE|ACTION|ADA|ADD|ADMIN|AFTER|AGGREGATE|ALIAS|ALL|ALLOCATE|ALTER|AND|ANY|ARE|ARRAY|AS|ASC|ASENSITIVE|ASSERTION|ASYMMETRIC|AT|ATOMIC|AUTHORIZATION|BACKUP|BEFORE|BEGIN|BETWEEN|BIT_LENGTH|BLOB|BOOLEAN|BOTH|BREADTH|BREAK|BROWSE|BULK|BY|CALL|CALLED|CARDINALITY|CASCADE|CASCADED|CASE|CATALOG|CHARACTER|CHARACTER_LENGTH|CHAR_LENGTH|CHECK|CHECKPOINT|CLASS|CLOB|CLOSE|CLUSTERED|COALESCE|COLLATE|COLLATION|COLLECT|COLUMN|COMMIT|COMPLETION|COMPUTE|CONDITION|CONNECT|CONNECTION|CONSTRAINT|CONSTRAINTS|CONSTRUCTOR|CONTAINS|CONTAINSTABLE|CONTINUE|CORR|CORRESPONDING|COVAR_POP|COVAR_SAMP|CREATE|CROSS|CUBE|CUME_DIST|CURRENT|CURRENT_CATALOG|CURRENT_DATE|CURRENT_DEFAULT_TRANSFORM_GROUP|CURRENT_PATH|CURRENT_ROLE|CURRENT_SCHEMA|CURRENT_TIME|CURRENT_TRANSFORM_GROUP_FOR_TYPE|CYCLE|DATA|DATABASE|DBCC|DEALLOCATE|DEC|DECLARE|DEFAULT|DEFERRABLE|DEFERRED|DELETE|DENY|DEPTH|DEREF|DESC|DESCRIBE|DESCRIPTOR|DESTROY|DESTRUCTOR|DETERMINISTIC|DIAGNOSTICS|DICTIONARY|DISCONNECT|DISK|DISTINCT|DISTRIBUTED|DOMAIN|DOUBLE|DROP|DUMP|DYNAMIC|EACH|ELEMENT|ELSE|END|END-EXEC|EQUALS|ERRLVL|ESCAPE|EVERY|EXCEPT|EXCEPTION|EXEC|EXECUTE|EXISTS|EXIT|EXTERNAL|EXTRACT|FETCH|FILE|FILLFACTOR|FILTER|FIRST|FOR|FOREIGN|FORTRAN|FOUND|FREE|FREETEXT|FREETEXTTABLE|FROM|FULL|FULLTEXTTABLE|FUNCTION|FUSION|GENERAL|GET|GLOBAL|GO|GOTO|GRANT|GROUP|HAVING|HOLD|HOLDLOCK|HOST|HOUR|IDENTITY|IDENTITYCOL|IDENTITY_INSERT|IF|IGNORE|IMMEDIATE|IN|INCLUDE|INDEX|INDICATOR|INITIALIZE|INITIALLY|INNER|INOUT|INPUT|INSENSITIVE|INSERT|INTEGER|INTERSECT|INTERSECTION|INTERVAL|INTO|IS|ISOLATION|ITERATE|JOIN|KEY|KILL|LANGUAGE|LARGE|LAST|LATERAL|LEADING|LESS|LEVEL|LIKE|LIKE_REGEX|LIMIT|LINENO|LN|LOAD|LOCAL|LOCALTIME|LOCALTIMESTAMP|LOCATOR|MAP|MATCH|MEMBER|MERGE|METHOD|MINUTE|MOD|MODIFIES|MODIFY|MODULE|MULTISET|NAMES|NATIONAL|NATURAL|NCLOB|NEW|NEXT|NO|NOCHECK|NONCLUSTERED|NONE|NORMALIZE|NOT|NULL|NULLIF|OBJECT|OCCURRENCES_REGEX|OCTET_LENGTH|OF|OFF|OFFSETS|OLD|ON|ONLY|OPEN|OPERATION|OPTION|OR|ORDER|ORDINALITY|OUT|OUTER|OUTPUT|OVER|OVERLAPS|OVERLAY|PAD|PARAMETER|PARAMETERS|PARTIAL|PARTITION|PASCAL|PATH|PERCENT|PERCENTILE_CONT|PERCENTILE_DISC|PERCENT_RANK|PIVOT|PLAN|POSITION|POSITION_REGEX|POSTFIX|PRECISION|PREFIX|PREORDER|PREPARE|PRESERVE|PRIMARY|PRINT|PRIOR|PRIVILEGES|PROC|PROCEDURE|PUBLIC|RAISERROR|RANGE|READ|READS|READTEXT|RECONFIGURE|RECURSIVE|REF|REFERENCES|REFERENCING|REGR_AVGX|REGR_AVGY|REGR_COUNT|REGR_INTERCEPT|REGR_R2|REGR_SLOPE|REGR_SXX|REGR_SXY|REGR_SYY|RELATIVE|RELEASE|REPLICATION|RESTORE|RESTRICT|RESULT|RETURN|RETURNS|REVERT|REVOKE|ROLE|ROLLBACK|ROLLUP|ROUTINE|ROW|ROWCOUNT|ROWGUIDCOL|ROWS|RULE|SAVE|SAVEPOINT|SCHEMA|SCOPE|SCROLL|SEARCH|SECOND|SECTION|SECURITYAUDIT|SELECT|SEMANTICKEYPHRASETABLE|SEMANTICSIMILARITYDETAILSTABLE|SEMANTICSIMILARITYTABLE|SENSITIVE|SEQUENCE|SESSION|SET|SETS|SETUSER|SHUTDOWN|SIMILAR|SIZE|SOME|SPECIFIC|SPECIFICTYPE|SQL|SQLCA|SQLCODE|SQLERROR|SQLEXCEPTION|SQLSTATE|SQLWARNING|START|STATE|STATEMENT|STATIC|STATISTICS|STDDEV_POP|STDDEV_SAMP|STRUCTURE|SUBMULTISET|SUBSTRING_REGEX|SYMMETRIC|SYSTEM|TABLESAMPLE|TEMPORARY|TERMINATE|TEXTSIZE|THAN|THEN|TIMEZONE_HOUR|TIMEZONE_MINUTE|TO|TOP|TRAILING|TRAN|TRANSACTION|TRANSLATE|TRANSLATE_REGEX|TRANSLATION|TREAT|TRIGGER|TRIM|TRUNCATE|TSEQUAL|UESCAPE|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNPIVOT|UPDATE|UPDATETEXT|USAGE|USE|USER|USING|VALUE|VALUES|VARIABLE|VARYING|VAR_POP|VAR_SAMP|VIEW|WAITFOR|WHEN|WHENEVER|WHERE|WHILE|WIDTH_BUCKET|WINDOW|WITH|WITHIN|WITHIN GROUP|WITHOUT|WORK|WRITE|WRITETEXT|XMLAGG|XMLATTRIBUTES|XMLBINARY|XMLCAST|XMLCOMMENT|XMLCONCAT|XMLDOCUMENT|XMLELEMENT|XMLEXISTS|XMLFOREST|XMLITERATE|XMLNAMESPACES|XMLPARSE|XMLPI|XMLQUERY|XMLSERIALIZE|XMLTABLE|XMLTEXT|XMLVALIDATE|ZONE"; - + // Microsoft's keyword list is missing a lot of things that are located on various other pages // https://msdn.microsoft.com/en-us/library/ms187373.aspx, https://msdn.microsoft.com/en-us/library/ms181714.aspx keywords += "|KEEPIDENTITY|KEEPDEFAULTS|IGNORE_CONSTRAINTS|IGNORE_TRIGGERS|XLOCK|FORCESCAN|FORCESEEK|HOLDLOCK|NOLOCK|NOWAIT|PAGLOCK|READCOMMITTED|READCOMMITTEDLOCK|READPAST|READUNCOMMITTED|REPEATABLEREAD|ROWLOCK|SERIALIZABLE|SNAPSHOT|SPATIAL_WINDOW_MAX_CELLS|TABLOCK|TABLOCKX|UPDLOCK|XLOCK|IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX|EXPAND|VIEWS|FAST|FORCE|KEEP|KEEPFIXED|MAXDOP|MAXRECURSION|OPTIMIZE|PARAMETERIZATION|SIMPLE|FORCED|RECOMPILE|ROBUST|PLAN|SPATIAL_WINDOW_MAX_CELLS|NOEXPAND|HINT"; @@ -105,7 +105,7 @@ var SqlServerHighlightRules = function() { // highlighted words in SSMS that I'm not even sure where they come from keywords += "|TYPE"; - + //remove specific built in types from keyword list keywords = keywords.split('|'); keywords = keywords.filter(function(value, index, self) { @@ -122,19 +122,15 @@ var SqlServerHighlightRules = function() { "keyword": keywords, }, "identifier", true); - + //https://msdn.microsoft.com/en-us/library/ms190356.aspx var setStatements = "SET ANSI_DEFAULTS|SET ANSI_NULLS|SET ANSI_NULL_DFLT_OFF|SET ANSI_NULL_DFLT_ON|SET ANSI_PADDING|SET ANSI_WARNINGS|SET ARITHABORT|SET ARITHIGNORE|SET CONCAT_NULL_YIELDS_NULL|SET CURSOR_CLOSE_ON_COMMIT|SET DATEFIRST|SET DATEFORMAT|SET DEADLOCK_PRIORITY|SET FIPS_FLAGGER|SET FMTONLY|SET FORCEPLAN|SET IDENTITY_INSERT|SET IMPLICIT_TRANSACTIONS|SET LANGUAGE|SET LOCK_TIMEOUT|SET NOCOUNT|SET NOEXEC|SET NUMERIC_ROUNDABORT|SET OFFSETS|SET PARSEONLY|SET QUERY_GOVERNOR_COST_LIMIT|SET QUOTED_IDENTIFIER|SET REMOTE_PROC_TRANSACTIONS|SET ROWCOUNT|SET SHOWPLAN_ALL|SET SHOWPLAN_TEXT|SET SHOWPLAN_XML|SET STATISTICS IO|SET STATISTICS PROFILE|SET STATISTICS TIME|SET STATISTICS XML|SET TEXTSIZE|SET XACT_ABORT".split('|'); var isolationLevels = "READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SNAPSHOP|SERIALIZABLE".split('|'); for (var i = 0; i < isolationLevels.length; i++) { setStatements.push('SET TRANSACTION ISOLATION LEVEL ' + isolationLevels[i]); } - //add set statements to keywordList for completions - for (var i = 0; i < setStatements.length; i++) { - this.$keywordList.push(setStatements[i]); - } - + this.$rules = { start: [{ token: "string.start", @@ -157,9 +153,6 @@ var SqlServerHighlightRules = function() { token: "comment", start: "/\\*", end: "\\*/" - }, { - token: "string", // ' string - regex: "'.*?'" }, { token: "constant.numeric", // float regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" @@ -196,30 +189,40 @@ var SqlServerHighlightRules = function() { caseInsensitive: true }], }; - + //add each set statment as regex at top of rules so that they are processed first because they require multiple words - //note, this makes the statements not match if they are not upper case.. which is not ideal but I don't know of an easy way to fix this + //note: this makes the statements not match if they are not upper case.. which is not ideal but I don't know of an easy way to fix this for (var i = 0; i < setStatements.length; i++) { - var statement = setStatements[i]; this.$rules.start.unshift({ token: "set.statement", - regex: statement + regex: setStatements[i] }); } - + this.embedRules(DocCommentHighlightRules, "doc-", [DocCommentHighlightRules.getEndRule("start")]); - this.normalizeRules(); - // export types for overriding get completions - this.keywordTypes = { - builtInStoredProcedures: builtInStoredProcedures.split('|'), - logicalOperators: logicalOperators.split('|'), - builtinFunctions: builtinFunctions.split('|'), - dataTypes: dataTypes.split('|'), - setStatements: setStatements, - }; + //prepare custom keyword completions used by mode to override default completor + //this allows for custom 'meta' and proper case of completions + var completions = []; + var addCompletions = function(arr, meta) { + arr.forEach(function(v) { + completions.push({ + name: v, + value: v, + score: 0, + meta: meta, + }); + }); + }; + addCompletions(builtInStoredProcedures.split('|'), 'procedure'); + addCompletions(logicalOperators.split('|'), 'operator'); + addCompletions(builtinFunctions.split('|'), 'function'); + addCompletions(dataTypes.split('|'), 'type'); + addCompletions(setStatements, 'statement'); + + this.completions = completions; }; oop.inherits(SqlServerHighlightRules, TextHighlightRules); From 87044e881680fd88997987a71a9ab1bb98a398a0 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Wed, 22 Apr 2015 05:38:01 -0400 Subject: [PATCH 12/14] forgot keyword completions --- lib/ace/mode/sqlserver_highlight_rules.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index c0179e93..5844be18 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -221,6 +221,7 @@ var SqlServerHighlightRules = function() { addCompletions(builtinFunctions.split('|'), 'function'); addCompletions(dataTypes.split('|'), 'type'); addCompletions(setStatements, 'statement'); + addCompletions(keywords.split('|'), 'keyword'); this.completions = completions; }; From 2d7ebc34b69ff647214cf9575cf95331143480f6 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Wed, 22 Apr 2015 06:05:54 -0400 Subject: [PATCH 13/14] no keyword if in brackets --- demo/kitchen-sink/docs/sqlserver.sqlserver | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/demo/kitchen-sink/docs/sqlserver.sqlserver b/demo/kitchen-sink/docs/sqlserver.sqlserver index 86c679a5..7efd2b7e 100644 --- a/demo/kitchen-sink/docs/sqlserver.sqlserver +++ b/demo/kitchen-sink/docs/sqlserver.sqlserver @@ -65,4 +65,8 @@ BEGIN -- place your cusor at the end of the line below and trigger auto complete (Ctrl+Space) createpr + -- SQL Server allows using keywords as object names (not recommended) as long as they are wrapped in brackets + DATABASE -- keyword + [DATABASE] -- not a keyword + END From 5a3bf2570f09af9c915b364bede48e8cd05df163 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Wed, 22 Apr 2015 06:06:52 -0400 Subject: [PATCH 14/14] no keyword if in brackets --- lib/ace/mode/sqlserver_highlight_rules.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 5844be18..c914c0ae 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -158,7 +158,7 @@ var SqlServerHighlightRules = function() { regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" }, { token: keywordMapper, - regex: "@{0,2}[a-zA-Z_$][a-zA-Z0-9_$]*\\b" //up to 2 @symbols for some built in functions + regex: "@{0,2}[a-zA-Z_$][a-zA-Z0-9_$]*\\b(?!])" //up to 2 @symbols for some built in functions }, { token: "constant.class", regex: "@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b"