From f0b3aa0a6f697898fb07a36a92019b0db5902b4e Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Fri, 17 Apr 2015 07:37:17 -0400 Subject: [PATCH 01/26] PARTIAL --- demo/kitchen-sink/docs/sqlserver.sqlserver | 19 +++ lib/ace/ext/modelist.js | 1 + lib/ace/mode/folding/sqlserver.js | 97 +++++++++++++ lib/ace/mode/sqlserver.js | 55 ++++++++ lib/ace/mode/sqlserver_highlight_rules.js | 151 +++++++++++++++++++++ lib/ace/snippets/sqlserver.js | 7 + lib/ace/snippets/sqlserver.snippets | 18 +++ 7 files changed, 348 insertions(+) create mode 100644 demo/kitchen-sink/docs/sqlserver.sqlserver create mode 100644 lib/ace/mode/folding/sqlserver.js create mode 100644 lib/ace/mode/sqlserver.js create mode 100644 lib/ace/mode/sqlserver_highlight_rules.js create mode 100644 lib/ace/snippets/sqlserver.js create mode 100644 lib/ace/snippets/sqlserver.snippets diff --git a/demo/kitchen-sink/docs/sqlserver.sqlserver b/demo/kitchen-sink/docs/sqlserver.sqlserver new file mode 100644 index 00000000..bf8b0aeb --- /dev/null +++ b/demo/kitchen-sink/docs/sqlserver.sqlserver @@ -0,0 +1,19 @@ +CREATE VIEW V_Orders +AS +SELECT + +--#region Orders + Orders.OrderID + ,Orders.CustomerID + ,Orders.OrderDate +--#endregion + + +/*#region Customers*/ + ,Customers.CompanyName + ,Customers.ContactName +/*#endregion*/ + +FROM Orders +INNER JOIN Customers + ON Orders.CustomerID = Customers.CustomerID diff --git a/lib/ace/ext/modelist.js b/lib/ace/ext/modelist.js index 0351567b..7a5a1e9c 100644 --- a/lib/ace/ext/modelist.js +++ b/lib/ace/ext/modelist.js @@ -146,6 +146,7 @@ var supportedModes = { Soy_Template:["soy"], Space: ["space"], SQL: ["sql"], + SQLServer: ["sqlserver"], Stylus: ["styl|stylus"], SVG: ["svg"], Tcl: ["tcl"], diff --git a/lib/ace/mode/folding/sqlserver.js b/lib/ace/mode/folding/sqlserver.js new file mode 100644 index 00000000..12993757 --- /dev/null +++ b/lib/ace/mode/folding/sqlserver.js @@ -0,0 +1,97 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +define(function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function() {}; + +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + // Currently the only supported folding is #region comments + // TODO: add more folding (will require in depth testing because this has never existed before) for things like: + // CASE ... END https://msdn.microsoft.com/en-us/library/ms181765.aspx + // BEGIN ... END https://msdn.microsoft.com/en-us/library/ms182717.aspx + + // this.foldingStartMarker = + // this.foldingStopMarker = + + this.startRegionRe = /^\s*(\/\*|--)#region\b/; + + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return "start"; + + return ""; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + return; + }; + + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|--)#(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); diff --git a/lib/ace/mode/sqlserver.js b/lib/ace/mode/sqlserver.js new file mode 100644 index 00000000..0f66c1e5 --- /dev/null +++ b/lib/ace/mode/sqlserver.js @@ -0,0 +1,55 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +define(function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var SqlServerHighlightRules = require("./sqlserver_highlight_rules").SqlHighlightRules; +var Range = require("../range").Range; +var SqlServerFoldMode = require("./folding/sqlserver").FoldMode; + +var Mode = function() { + this.HighlightRules = SqlServerHighlightRules; + this.foldingRules = new SqlServerFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.lineCommentStart = "--"; + this.blockComment = {start: "/*", end: "*/"}; + + this.$id = "ace/mode/sql"; +}).call(Mode.prototype); + +exports.Mode = Mode; + +}); diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js new file mode 100644 index 00000000..fd09e256 --- /dev/null +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -0,0 +1,151 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +define(function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SqlServerHighlightRules = function() { + /** + * each section has a link and some javacript code. + * go to the link, open dev tools, run code to get the string + */ + + var builtinConstants = ( + "TRUE|FALSE" + ); + + // multiple pages for built in functions, the following code works for all + // var r = []; $('.tableSection').find('td').find('a').each(function() { var t = $(this).text().trim().toUpperCase(); /*dont add things with spaces */ if (t.indexOf(' ') !== -1) return; r.push(t); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|')); + + var builtinFunctions = ( + /* https://msdn.microsoft.com/en-us/library/ms187957.aspx */ + "OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML" + + /* https://msdn.microsoft.com/en-us/library/ms173454.aspx */ + "AVG|CHECKSUM_AGG|COUNT|COUNT_BIG|GROUPING|GROUPING_ID|MAX|MIN|STDEV|STDEVP|SUM|VAR|VARP" + + /* https://msdn.microsoft.com/en-us/library/ms189798.aspx */ + "DENSE_RANK|NTILE|RANK|ROW_NUMBER" + + /* https://msdn.microsoft.com/en-us/library/ms173823.aspx */ + "@@DATEFIRST|@@DBTS|@@LANGID|@@LANGUAGE|@@LOCK_TIMEOUT|@@MAX_CONNECTIONS|@@MAX_PRECISION|@@NESTLEVEL|@@OPTIONS|@@REMSERVER|@@SERVERNAME|@@SERVICENAME|@@SPID|@@TEXTSIZE|@@VERSION" + + /* https://msdn.microsoft.com/en-us/library/hh231076.aspx (MANUAL) */ + "CAST|CONVERT|PARSE|TRY_CAST|TRY_CONVERT|TRY_PARSE" + + /* https://msdn.microsoft.com/en-us/library/ms186285.aspx */ + "@@CURSOR_ROWS|@@FETCH_STATUS|CURSOR_STATUS" + + /* https://msdn.microsoft.com/en-us/library/ms186724.aspx (MANUAL) */ + "@@DATEFIRST|@@LANGUAGE|CURRENT_TIMESTAMP|DATEADD|DATEDIFF|DATEFROMPARTS|DATENAME|DATEPART|DATETIME2FROMPARTS|DATETIMEFROMPARTS|DATETIMEOFFSETFROMPARTS|DAY|EOMONTH|GETDATE|GETUTCDATE|ISDATE|MONTH|SET DATEFIRST|SET DATEFORMAT|SET LANGUAGE|SMALLDATETIMEFROMPARTS|SP_HELPLANGUAGE|SWITCHOFFSET|SYSDATETIME|SYSDATETIMEOFFSET|SYSUTCDATETIME|TIMEFROMPARTS|TODATETIMEOFFSET|YEAR" + + /* https://msdn.microsoft.com/en-us/library/hh213226.aspx (MANUAL) */ + "CHOOSE|IIF" + + /* https://msdn.microsoft.com/en-us/library/ms177516.aspx */ + "ABS|ACOS|ASIN|ATAN|ATN2|CEILING|COS|COT|DEGREES|EXP|FLOOR|LOG|LOG10|PI|POWER|RADIANS|RAND|ROUND|SIGN|SIN|SQRT|SQUARE|TAN" + + /* https://msdn.microsoft.com/en-us/library/ms187812.aspx */ + "@@PROCID|APPLOCK_MODE|APPLOCK_TEST|APP_NAME|ASSEMBLYPROPERTY|COLUMNPROPERTY|COL_LENGTH|COL_NAME|DATABASEPROPERTYEX|DATABASE_PRINCIPAL_ID|DB_ID|DB_NAME|FILEGROUPPROPERTY|FILEGROUP_ID|FILEGROUP_NAME|FILEPROPERTY|FILE_ID|FILE_IDEX|FILE_NAME|FULLTEXTCATALOGPROPERTY|FULLTEXTSERVICEPROPERTY|INDEXKEY_PROPERTY|INDEXPROPERTY|INDEX_COL|OBJECTPROPERTY|OBJECTPROPERTYEX|OBJECT_DEFINITION|OBJECT_ID|OBJECT_NAME|OBJECT_SCHEMA_NAME|ORIGINAL_DB_NAME|PARSENAME|SCHEMA_ID|SCHEMA_NAME|SCOPE_IDENTITY|SERVERPROPERTY|STATS_DATE|TYPEPROPERTY|TYPE_ID|TYPE_NAME" + + /* https://msdn.microsoft.com/en-us/library/ms186236.aspx (MANUAL) */ + "CERTENCODED|CERTPRIVATEKEY|CURRENT_USER|DATABASE_PRINCIPAL_ID|HAS_PERMS_BY_NAME|IS_MEMBER|IS_ROLEMEMBER|IS_SRVROLEMEMBER|ORIGINAL_LOGIN|PERMISSIONS|PWDCOMPARE|PWDENCRYPT|SCHEMA_ID|SCHEMA_NAME|SESSION_USER|SUSER_ID|SUSER_NAME|SUSER_SID|SUSER_SNAME|SYS.FN_BUILTIN_PERMISSIONS|SYS.FN_GET_AUDIT_FILE|SYS.FN_MY_PERMISSIONS|SYSTEM_USER|USER_ID|USER_NAME" + + /* https://msdn.microsoft.com/en-us/library/ms181984.aspx */ + "ASCII|CHAR|CHARINDEX|CONCAT|DIFFERENCE|FORMAT|LEFT|LEN|LOWER|LTRIM|NCHAR|PATINDEX|QUOTENAME|REPLACE|REPLICATE|REVERSE|RIGHT|RTRIM|SOUNDEX|SPACE|STR|STUFF|SUBSTRING|UNICODE|UPPER" + + /* https://msdn.microsoft.com/en-us/library/ms187786.aspx */ + "$PARTITION|@@ERROR|@@IDENTITY|@@PACK_RECEIVED|@@ROWCOUNT|@@TRANCOUNT|BINARY_CHECKSUM|CHECKSUM|CONNECTIONPROPERTY|CONTEXT_INFO|CURRENT_REQUEST_ID|ERROR_LINE|ERROR_MESSAGE|ERROR_NUMBER|ERROR_PROCEDURE|ERROR_SEVERITY|ERROR_STATE|FORMATMESSAGE|GETANSINULL|GET_FILESTREAM_TRANSACTION_CONTEXT|HOST_ID|HOST_NAME|ISNULL|ISNUMERIC|MIN_ACTIVE_ROWVERSION|NEWID|NEWSEQUENTIALID|ROWCOUNT_BIG|XACT_STATE" + + /* 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" + + /* */ + "" + + + "COUNT|MIN|MAX|AVG|SUM|RANK|NOW|COALESCE" + ); + + // https://msdn.microsoft.com/en-us/library/ms187752.aspx + // var r = []; $('.tableSection').find('td').find('a').each(function() { var t = $(this).text().trim().toUpperCase(); /*dont add things with spaces */ if (t.indexOf(' ') !== -1) return; r.push($(this).text().trim().toUpperCase()); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|')); + + var dataTypes = ( + "BIGINT|BINARY|BIT|CHAR|CURSOR|DATE|DATETIME|DATETIME2|DATETIMEOFFSET|DECIMAL|FLOAT|HIERARCHYID|IMAGE|INT|MONEY|NCHAR|NTEXT|NUMERIC|NVARCHAR|REAL|SMALLDATETIME|SMALLINT|SMALLMONEY|SQL_VARIANT|TABLE|TEXT|TIME|TIMESTAMP|TINYINT|UNIQUEIDENTIFIER|VARBINARY|VARCHAR|XML" + ); + + + + var keywordMapper = this.createKeywordMapper({ + "support.function": builtinFunctions, + "keyword": keywords, + "constant.language": builtinConstants, + "storage.type": dataTypes + }, "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 + for (var i = 0; i < this.$keywordList.length; i++) { + this.$keywordList[i] = this.$keywordList[i].toUpperCase(); + } + + this.$rules = { + "start" : [ { + token : "comment", + regex : "--.*$" + }, { + token : "comment", + start : "/\\*", + end : "\\*/" + }, { + token : "string", // " string + regex : '".*?"' + }, { + token : "string", // ' string + regex : "'.*?'" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : keywordMapper, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "paren.lparen", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } ] + }; + this.normalizeRules(); +}; + +oop.inherits(SqlServerHighlightRules, TextHighlightRules); + +exports.SqlHighlightRules = SqlServerHighlightRules; +}); + diff --git a/lib/ace/snippets/sqlserver.js b/lib/ace/snippets/sqlserver.js new file mode 100644 index 00000000..f84694dc --- /dev/null +++ b/lib/ace/snippets/sqlserver.js @@ -0,0 +1,7 @@ +define(function(require, exports, module) { +"use strict"; + +exports.snippetText = require("../requirejs/text!./sqlserver.snippets"); +exports.scope = "sqlserver"; + +}); diff --git a/lib/ace/snippets/sqlserver.snippets b/lib/ace/snippets/sqlserver.snippets new file mode 100644 index 00000000..c1007485 --- /dev/null +++ b/lib/ace/snippets/sqlserver.snippets @@ -0,0 +1,18 @@ +# Create Procedure +snippet createproc + -- ============================================= + -- Author: ${1:Author} + -- Create date: ${2:Date} + -- Description: ${3:Description} + -- ============================================= + CREATE PROCEDURE ${4:Procedure_Name} + -- 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; + + -- Insert statements for procedure here + END + GO From ede82e7137516dcc0f4e6afa155fa4e93f8d35c4 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Fri, 17 Apr 2015 08:11:21 -0400 Subject: [PATCH 02/26] progress- save comments for reuse here --- demo/kitchen-sink/docs/sqlserver.sqlserver | 9 +- lib/ace/ext/themelist.js | 2 + lib/ace/mode/sqlserver_highlight_rules.js | 50 +++--- lib/ace/theme/sqlserver.css | 196 +++++++++++++++++++++ lib/ace/theme/sqlserver.js | 39 ++++ 5 files changed, 270 insertions(+), 26 deletions(-) create mode 100644 lib/ace/theme/sqlserver.css create mode 100644 lib/ace/theme/sqlserver.js diff --git a/demo/kitchen-sink/docs/sqlserver.sqlserver b/demo/kitchen-sink/docs/sqlserver.sqlserver index bf8b0aeb..ff9ad353 100644 --- a/demo/kitchen-sink/docs/sqlserver.sqlserver +++ b/demo/kitchen-sink/docs/sqlserver.sqlserver @@ -8,11 +8,14 @@ SELECT ,Orders.OrderDate --#endregion - -/*#region Customers*/ + /*#region Customers*/ ,Customers.CompanyName ,Customers.ContactName -/*#endregion*/ + /*#endregion*/ + +--#region Other + ,DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS FirstDayOfYear +--#endregion FROM Orders INNER JOIN Customers diff --git a/lib/ace/ext/themelist.js b/lib/ace/ext/themelist.js index 8914c776..f96d88ad 100644 --- a/lib/ace/ext/themelist.js +++ b/lib/ace/ext/themelist.js @@ -57,6 +57,8 @@ var themeData = [ ["XCode" ], ["Kuroir"], ["KatzenMilch"], + // ["SQL Server"], + ["SQL Server" ,"sqlserver" , "light"], ["Ambiance" ,"ambiance" , "dark"], ["Chaos" ,"chaos" , "dark"], ["Clouds Midnight" ,"clouds_midnight" , "dark"], diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index fd09e256..e860cfae 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -40,58 +40,62 @@ var SqlServerHighlightRules = function() { * go to the link, open dev tools, run code to get the string */ - var builtinConstants = ( - "TRUE|FALSE" - ); + var builtinConstants = "TRUE|FALSE"; + // multiple pages for built in functions, the following code works for all - // var r = []; $('.tableSection').find('td').find('a').each(function() { var t = $(this).text().trim().toUpperCase(); /*dont add things with spaces */ if (t.indexOf(' ') !== -1) return; r.push(t); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|')); - + // var r = []; $('.tableSection').find('td').find('a').each(function() { var t = $(this).text().trim().toUpperCase(); /*dont add things with spaces */ if (t.indexOf(' ') !== -1) return; r.push(t); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|') + '|'); var builtinFunctions = ( /* https://msdn.microsoft.com/en-us/library/ms187957.aspx */ - "OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML" + + "OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML|" + /* https://msdn.microsoft.com/en-us/library/ms173454.aspx */ - "AVG|CHECKSUM_AGG|COUNT|COUNT_BIG|GROUPING|GROUPING_ID|MAX|MIN|STDEV|STDEVP|SUM|VAR|VARP" + + "AVG|CHECKSUM_AGG|COUNT|COUNT_BIG|GROUPING|GROUPING_ID|MAX|MIN|STDEV|STDEVP|SUM|VAR|VARP|" + /* https://msdn.microsoft.com/en-us/library/ms189798.aspx */ "DENSE_RANK|NTILE|RANK|ROW_NUMBER" + /* https://msdn.microsoft.com/en-us/library/ms173823.aspx */ - "@@DATEFIRST|@@DBTS|@@LANGID|@@LANGUAGE|@@LOCK_TIMEOUT|@@MAX_CONNECTIONS|@@MAX_PRECISION|@@NESTLEVEL|@@OPTIONS|@@REMSERVER|@@SERVERNAME|@@SERVICENAME|@@SPID|@@TEXTSIZE|@@VERSION" + + "@@DATEFIRST|@@DBTS|@@LANGID|@@LANGUAGE|@@LOCK_TIMEOUT|@@MAX_CONNECTIONS|@@MAX_PRECISION|@@NESTLEVEL|@@OPTIONS|@@REMSERVER|@@SERVERNAME|@@SERVICENAME|@@SPID|@@TEXTSIZE|@@VERSION|" + /* https://msdn.microsoft.com/en-us/library/hh231076.aspx (MANUAL) */ "CAST|CONVERT|PARSE|TRY_CAST|TRY_CONVERT|TRY_PARSE" + /* https://msdn.microsoft.com/en-us/library/ms186285.aspx */ - "@@CURSOR_ROWS|@@FETCH_STATUS|CURSOR_STATUS" + + "@@CURSOR_ROWS|@@FETCH_STATUS|CURSOR_STATUS|" + /* https://msdn.microsoft.com/en-us/library/ms186724.aspx (MANUAL) */ - "@@DATEFIRST|@@LANGUAGE|CURRENT_TIMESTAMP|DATEADD|DATEDIFF|DATEFROMPARTS|DATENAME|DATEPART|DATETIME2FROMPARTS|DATETIMEFROMPARTS|DATETIMEOFFSETFROMPARTS|DAY|EOMONTH|GETDATE|GETUTCDATE|ISDATE|MONTH|SET DATEFIRST|SET DATEFORMAT|SET LANGUAGE|SMALLDATETIMEFROMPARTS|SP_HELPLANGUAGE|SWITCHOFFSET|SYSDATETIME|SYSDATETIMEOFFSET|SYSUTCDATETIME|TIMEFROMPARTS|TODATETIMEOFFSET|YEAR" + + "@@DATEFIRST|@@LANGUAGE|CURRENT_TIMESTAMP|DATEADD|DATEDIFF|DATEFROMPARTS|DATENAME|DATEPART|DATETIME2FROMPARTS|DATETIMEFROMPARTS|DATETIMEOFFSETFROMPARTS|DAY|EOMONTH|GETDATE|GETUTCDATE|ISDATE|MONTH|SET DATEFIRST|SET DATEFORMAT|SET LANGUAGE|SMALLDATETIMEFROMPARTS|SP_HELPLANGUAGE|SWITCHOFFSET|SYSDATETIME|SYSDATETIMEOFFSET|SYSUTCDATETIME|TIMEFROMPARTS|TODATETIMEOFFSET|YEAR|" + /* https://msdn.microsoft.com/en-us/library/hh213226.aspx (MANUAL) */ - "CHOOSE|IIF" + + "CHOOSE|IIF|" + /* https://msdn.microsoft.com/en-us/library/ms177516.aspx */ - "ABS|ACOS|ASIN|ATAN|ATN2|CEILING|COS|COT|DEGREES|EXP|FLOOR|LOG|LOG10|PI|POWER|RADIANS|RAND|ROUND|SIGN|SIN|SQRT|SQUARE|TAN" + + "ABS|ACOS|ASIN|ATAN|ATN2|CEILING|COS|COT|DEGREES|EXP|FLOOR|LOG|LOG10|PI|POWER|RADIANS|RAND|ROUND|SIGN|SIN|SQRT|SQUARE|TAN|" + /* https://msdn.microsoft.com/en-us/library/ms187812.aspx */ - "@@PROCID|APPLOCK_MODE|APPLOCK_TEST|APP_NAME|ASSEMBLYPROPERTY|COLUMNPROPERTY|COL_LENGTH|COL_NAME|DATABASEPROPERTYEX|DATABASE_PRINCIPAL_ID|DB_ID|DB_NAME|FILEGROUPPROPERTY|FILEGROUP_ID|FILEGROUP_NAME|FILEPROPERTY|FILE_ID|FILE_IDEX|FILE_NAME|FULLTEXTCATALOGPROPERTY|FULLTEXTSERVICEPROPERTY|INDEXKEY_PROPERTY|INDEXPROPERTY|INDEX_COL|OBJECTPROPERTY|OBJECTPROPERTYEX|OBJECT_DEFINITION|OBJECT_ID|OBJECT_NAME|OBJECT_SCHEMA_NAME|ORIGINAL_DB_NAME|PARSENAME|SCHEMA_ID|SCHEMA_NAME|SCOPE_IDENTITY|SERVERPROPERTY|STATS_DATE|TYPEPROPERTY|TYPE_ID|TYPE_NAME" + + "@@PROCID|APPLOCK_MODE|APPLOCK_TEST|APP_NAME|ASSEMBLYPROPERTY|COLUMNPROPERTY|COL_LENGTH|COL_NAME|DATABASEPROPERTYEX|DATABASE_PRINCIPAL_ID|DB_ID|DB_NAME|FILEGROUPPROPERTY|FILEGROUP_ID|FILEGROUP_NAME|FILEPROPERTY|FILE_ID|FILE_IDEX|FILE_NAME|FULLTEXTCATALOGPROPERTY|FULLTEXTSERVICEPROPERTY|INDEXKEY_PROPERTY|INDEXPROPERTY|INDEX_COL|OBJECTPROPERTY|OBJECTPROPERTYEX|OBJECT_DEFINITION|OBJECT_ID|OBJECT_NAME|OBJECT_SCHEMA_NAME|ORIGINAL_DB_NAME|PARSENAME|SCHEMA_ID|SCHEMA_NAME|SCOPE_IDENTITY|SERVERPROPERTY|STATS_DATE|TYPEPROPERTY|TYPE_ID|TYPE_NAME|" + /* https://msdn.microsoft.com/en-us/library/ms186236.aspx (MANUAL) */ - "CERTENCODED|CERTPRIVATEKEY|CURRENT_USER|DATABASE_PRINCIPAL_ID|HAS_PERMS_BY_NAME|IS_MEMBER|IS_ROLEMEMBER|IS_SRVROLEMEMBER|ORIGINAL_LOGIN|PERMISSIONS|PWDCOMPARE|PWDENCRYPT|SCHEMA_ID|SCHEMA_NAME|SESSION_USER|SUSER_ID|SUSER_NAME|SUSER_SID|SUSER_SNAME|SYS.FN_BUILTIN_PERMISSIONS|SYS.FN_GET_AUDIT_FILE|SYS.FN_MY_PERMISSIONS|SYSTEM_USER|USER_ID|USER_NAME" + + "CERTENCODED|CERTPRIVATEKEY|CURRENT_USER|DATABASE_PRINCIPAL_ID|HAS_PERMS_BY_NAME|IS_MEMBER|IS_ROLEMEMBER|IS_SRVROLEMEMBER|ORIGINAL_LOGIN|PERMISSIONS|PWDCOMPARE|PWDENCRYPT|SCHEMA_ID|SCHEMA_NAME|SESSION_USER|SUSER_ID|SUSER_NAME|SUSER_SID|SUSER_SNAME|SYS.FN_BUILTIN_PERMISSIONS|SYS.FN_GET_AUDIT_FILE|SYS.FN_MY_PERMISSIONS|SYSTEM_USER|USER_ID|USER_NAME|" + /* https://msdn.microsoft.com/en-us/library/ms181984.aspx */ - "ASCII|CHAR|CHARINDEX|CONCAT|DIFFERENCE|FORMAT|LEFT|LEN|LOWER|LTRIM|NCHAR|PATINDEX|QUOTENAME|REPLACE|REPLICATE|REVERSE|RIGHT|RTRIM|SOUNDEX|SPACE|STR|STUFF|SUBSTRING|UNICODE|UPPER" + + "ASCII|CHAR|CHARINDEX|CONCAT|DIFFERENCE|FORMAT|LEFT|LEN|LOWER|LTRIM|NCHAR|PATINDEX|QUOTENAME|REPLACE|REPLICATE|REVERSE|RIGHT|RTRIM|SOUNDEX|SPACE|STR|STUFF|SUBSTRING|UNICODE|UPPER|" + /* https://msdn.microsoft.com/en-us/library/ms187786.aspx */ - "$PARTITION|@@ERROR|@@IDENTITY|@@PACK_RECEIVED|@@ROWCOUNT|@@TRANCOUNT|BINARY_CHECKSUM|CHECKSUM|CONNECTIONPROPERTY|CONTEXT_INFO|CURRENT_REQUEST_ID|ERROR_LINE|ERROR_MESSAGE|ERROR_NUMBER|ERROR_PROCEDURE|ERROR_SEVERITY|ERROR_STATE|FORMATMESSAGE|GETANSINULL|GET_FILESTREAM_TRANSACTION_CONTEXT|HOST_ID|HOST_NAME|ISNULL|ISNUMERIC|MIN_ACTIVE_ROWVERSION|NEWID|NEWSEQUENTIALID|ROWCOUNT_BIG|XACT_STATE" + + "$PARTITION|@@ERROR|@@IDENTITY|@@PACK_RECEIVED|@@ROWCOUNT|@@TRANCOUNT|BINARY_CHECKSUM|CHECKSUM|CONNECTIONPROPERTY|CONTEXT_INFO|CURRENT_REQUEST_ID|ERROR_LINE|ERROR_MESSAGE|ERROR_NUMBER|ERROR_PROCEDURE|ERROR_SEVERITY|ERROR_STATE|FORMATMESSAGE|GETANSINULL|GET_FILESTREAM_TRANSACTION_CONTEXT|HOST_ID|HOST_NAME|ISNULL|ISNUMERIC|MIN_ACTIVE_ROWVERSION|NEWID|NEWSEQUENTIALID|ROWCOUNT_BIG|XACT_STATE|" + /* 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" + + "@@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" + - /* */ - "" + - - "COUNT|MIN|MAX|AVG|SUM|RANK|NOW|COALESCE" + "PATINDEX|TEXTPTR|TEXTVALID|" ); + // https://msdn.microsoft.com/en-us/library/ms187752.aspx // var r = []; $('.tableSection').find('td').find('a').each(function() { var t = $(this).text().trim().toUpperCase(); /*dont add things with spaces */ if (t.indexOf(' ') !== -1) return; r.push($(this).text().trim().toUpperCase()); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|')); - var dataTypes = ( "BIGINT|BINARY|BIT|CHAR|CURSOR|DATE|DATETIME|DATETIME2|DATETIMEOFFSET|DECIMAL|FLOAT|HIERARCHYID|IMAGE|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/ms189822.aspx + // var r = []; $('.tableSection').find('td').each(function() { r.push($(this).text().trim()); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|')); + 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"; + + //after modifying above data sets, copy above code and run this to remove data types, functions, and constants from keywords + // keywords = keywords.split('|'); + // keywords = keywords.filter(function(value,index,self){ + // return builtinConstants.split('|').indexOf(value) === -1 && builtinFunctions.split('|').indexOf(value) === -1 && dataTypes.split('|').indexOf(value) === -1; + // }); + // console.log(keywords.sort().join('|')); var keywordMapper = this.createKeywordMapper({ "support.function": builtinFunctions, diff --git a/lib/ace/theme/sqlserver.css b/lib/ace/theme/sqlserver.css new file mode 100644 index 00000000..a752280d --- /dev/null +++ b/lib/ace/theme/sqlserver.css @@ -0,0 +1,196 @@ +.ace-sqlserver .ace_gutter { + background: #ebebeb; + color: #333; + overflow : hidden; +} + +.ace-sqlserver .ace_print-margin { + width: 1px; + background: #e8e8e8; +} + +.ace-sqlserver { + background-color: #FFFFFF; + color: black; +} + +.ace-sqlserver .ace_identifier{ + color: #008080; +} + +.ace-sqlserver .ace_function{ + color: #FF00FF; + text-transform: uppercase; +} + +.ace-sqlserver .ace_string{ + color: #FF0000; +} + +.ace-sqlserver .ace_keyword{ + color: #0000FF; + text-transform: uppercase; +} + +.ace-sqlserver .ace_comment{ + color: #FD971F; +} + +.ace-sqlserver .ace_numeric{ + color: black; +} + +.ace-sqlserver .ace_language{ + color: #979797; + font-style: italic; + text-transform: uppercase; +} + +.ace-sqlserver .ace_bracket { + border: 1px solid magenta; +} + + + + + + +.ace-sqlserver .ace_cursor { + color: black; +} + +.ace-sqlserver .ace_invisible { + color: rgb(191, 191, 191); +} + +.ace-sqlserver .ace_constant.ace_buildin { + color: rgb(88, 72, 246); +} + +.ace-sqlserver .ace_constant.ace_language { + color: rgb(88, 92, 246); +} + +.ace-sqlserver .ace_constant.ace_library { + color: rgb(6, 150, 14); +} + +.ace-sqlserver .ace_invalid { + background-color: rgb(153, 0, 0); + color: white; +} + +.ace-sqlserver .ace_fold { +} + +.ace-sqlserver .ace_support.ace_function { + color: #FF00FF; + text-transform: uppercase; +} + +.ace-sqlserver .ace_support.ace_constant { + color: rgb(6, 150, 14); +} + +.ace-sqlserver .ace_support.ace_type, +.ace-sqlserver .ace_support.ace_class +.ace-sqlserver .ace_support.ace_other { + color: rgb(109, 121, 222); +} + +.ace-sqlserver .ace_variable.ace_parameter { + font-style:italic; + color:#FD971F; +} +.ace-sqlserver .ace_keyword.ace_operator { + color: rgb(104, 118, 135); +} + +.ace-sqlserver .ace_comment { + color: #236e24; +} + +.ace-sqlserver .ace_comment.ace_doc { + color: #236e24; +} + +.ace-sqlserver .ace_comment.ace_doc.ace_tag { + color: #236e24; +} + +.ace-sqlserver .ace_constant.ace_numeric { + color: rgb(0, 0, 205); +} + +.ace-sqlserver .ace_variable { + color: rgb(49, 132, 149); +} + +.ace-sqlserver .ace_xml-pe { + color: rgb(104, 104, 91); +} + +.ace-sqlserver .ace_entity.ace_name.ace_function { + color: #0000A2; +} + + +.ace-sqlserver .ace_heading { + color: rgb(12, 7, 255); +} + +.ace-sqlserver .ace_list { + color:rgb(185, 6, 144); +} + +.ace-sqlserver .ace_marker-layer .ace_selection { + background: rgb(181, 213, 255); +} + +.ace-sqlserver .ace_marker-layer .ace_step { + background: rgb(252, 255, 0); +} + +.ace-sqlserver .ace_marker-layer .ace_stack { + background: rgb(164, 229, 101); +} + +.ace-sqlserver .ace_marker-layer .ace_bracket { + margin: -1px 0 0 -1px; + border: 1px solid rgb(192, 192, 192); +} + +.ace-sqlserver .ace_marker-layer .ace_active-line { + background: rgba(0, 0, 0, 0.07); +} + +.ace-sqlserver .ace_gutter-active-line { + background-color : #dcdcdc; +} + +.ace-sqlserver .ace_marker-layer .ace_selected-word { + background: rgb(250, 250, 255); + border: 1px solid rgb(200, 200, 250); +} + +.ace-sqlserver .ace_storage, +.ace-sqlserver .ace_keyword, +.ace-sqlserver .ace_meta.ace_tag { + color: rgb(147, 15, 128); +} + +.ace-sqlserver .ace_string.ace_regex { + color: rgb(255, 0, 0) +} + +.ace-sqlserver .ace_string { + color: #1A1AA6; +} + +.ace-sqlserver .ace_entity.ace_other.ace_attribute-name { + color: #994409; +} + +.ace-sqlserver .ace_indent-guide { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y; +} diff --git a/lib/ace/theme/sqlserver.js b/lib/ace/theme/sqlserver.js new file mode 100644 index 00000000..ab657483 --- /dev/null +++ b/lib/ace/theme/sqlserver.js @@ -0,0 +1,39 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ***** END LICENSE BLOCK ***** */ + +define(function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-sqlserver"; +exports.cssText = require("../requirejs/text!./sqlserver.css"); + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); From 461faa9184a1f408da128508f24b542976f04476 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Fri, 17 Apr 2015 08:37:54 -0400 Subject: [PATCH 03/26] more progress --- demo/kitchen-sink/docs/sqlserver.sqlserver | 42 +++++++++++----------- lib/ace/mode/sqlserver_highlight_rules.js | 3 ++ lib/ace/theme/sqlserver.css | 35 ++++++++---------- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/demo/kitchen-sink/docs/sqlserver.sqlserver b/demo/kitchen-sink/docs/sqlserver.sqlserver index ff9ad353..94360e3f 100644 --- a/demo/kitchen-sink/docs/sqlserver.sqlserver +++ b/demo/kitchen-sink/docs/sqlserver.sqlserver @@ -1,22 +1,24 @@ -CREATE VIEW V_Orders +-- ============================================= +-- 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) +-- ============================================= +CREATE PROCEDURE dbo.TestProcedure + +--#region parameters + @vint INT = 1; +--#endregion + AS -SELECT - ---#region Orders - Orders.OrderID - ,Orders.CustomerID - ,Orders.OrderDate ---#endregion +BEGIN + -- SET NOCOUNT ON added to prevent extra result sets from + -- interfering with SELECT statements. + SET NOCOUNT ON; - /*#region Customers*/ - ,Customers.CompanyName - ,Customers.ContactName - /*#endregion*/ - ---#region Other - ,DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS FirstDayOfYear ---#endregion - -FROM Orders -INNER JOIN Customers - ON Orders.CustomerID = Customers.CustomerID + SELECT Orders.OrderID, Customers.CompanyName, DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS FirstDayOfYear + FROM Orders + INNER JOIN Customers + ON Orders.CustomerID = Customers.CustomerID +END \ No newline at end of file diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index e860cfae..277bdc6c 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -131,6 +131,9 @@ var SqlServerHighlightRules = function() { }, { token : keywordMapper, regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "constant.class", + regex : "@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b" }, { token : "keyword.operator", regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" diff --git a/lib/ace/theme/sqlserver.css b/lib/ace/theme/sqlserver.css index a752280d..ad6fe1f6 100644 --- a/lib/ace/theme/sqlserver.css +++ b/lib/ace/theme/sqlserver.css @@ -18,14 +18,6 @@ color: #008080; } -.ace-sqlserver .ace_function{ - color: #FF00FF; - text-transform: uppercase; -} - -.ace-sqlserver .ace_string{ - color: #FF0000; -} .ace-sqlserver .ace_keyword{ color: #0000FF; @@ -40,7 +32,7 @@ color: black; } -.ace-sqlserver .ace_language{ +.ace-sqlserver .ace_storage{ color: #979797; font-style: italic; text-transform: uppercase; @@ -92,10 +84,15 @@ color: rgb(6, 150, 14); } -.ace-sqlserver .ace_support.ace_type, -.ace-sqlserver .ace_support.ace_class +/*.ace-sqlserver .ace_support.ace_type, +.ace-sqlserver .ace_support*/ + +.ace-sqlserver .ace_class{ + /*font-style:italic;*/ + color: #008080; +} .ace-sqlserver .ace_support.ace_other { - color: rgb(109, 121, 222); + color: #6D79DE; } .ace-sqlserver .ace_variable.ace_parameter { @@ -107,15 +104,15 @@ } .ace-sqlserver .ace_comment { - color: #236e24; + color: #FD971F; } .ace-sqlserver .ace_comment.ace_doc { - color: #236e24; + color: #FD971F; } .ace-sqlserver .ace_comment.ace_doc.ace_tag { - color: #236e24; + color: #FD971F; } .ace-sqlserver .ace_constant.ace_numeric { @@ -173,18 +170,16 @@ border: 1px solid rgb(200, 200, 250); } -.ace-sqlserver .ace_storage, -.ace-sqlserver .ace_keyword, .ace-sqlserver .ace_meta.ace_tag { - color: rgb(147, 15, 128); + color: #0000FF; } .ace-sqlserver .ace_string.ace_regex { - color: rgb(255, 0, 0) + color: #FF0000; } .ace-sqlserver .ace_string { - color: #1A1AA6; + color: #FF0000; } .ace-sqlserver .ace_entity.ace_other.ace_attribute-name { From 6b62974118f0ee72c1da3d0a26f447b7925156e1 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Fri, 17 Apr 2015 09:28:56 -0400 Subject: [PATCH 04/26] good progress --- demo/kitchen-sink/docs/sqlserver.sqlserver | 22 +++++++++--- lib/ace/mode/sqlserver_highlight_rules.js | 41 +++++++++++++++++----- lib/ace/snippets/sqlserver.snippets | 24 +++++++++++++ lib/ace/theme/sqlserver.css | 9 ++--- 4 files changed, 78 insertions(+), 18 deletions(-) diff --git a/demo/kitchen-sink/docs/sqlserver.sqlserver b/demo/kitchen-sink/docs/sqlserver.sqlserver index 94360e3f..5205e68b 100644 --- a/demo/kitchen-sink/docs/sqlserver.sqlserver +++ b/demo/kitchen-sink/docs/sqlserver.sqlserver @@ -8,17 +8,29 @@ CREATE PROCEDURE dbo.TestProcedure --#region parameters - @vint INT = 1; + @Vint INT = 1 + ,@vdate DATE = NULL + ,@vdatetime DATETIME = DATEADD(dd,1,GETDATE()) --#endregion AS BEGIN - -- SET NOCOUNT ON added to prevent extra result sets from - -- interfering with SELECT statements. - SET NOCOUNT ON; - SELECT Orders.OrderID, Customers.CompanyName, DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS FirstDayOfYear + /*#region set statements */ + SET NOCOUNT ON; + SET XACT_ABORT ON; + SET QUOTED_IDENTIFIER ON; + /*#endregion*/ + + + SELECT Orders.OrderID + ,Customers.CompanyName + ,DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS FirstDayOfYear FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID + WHERE CompanyName NOT LIKE '%something' + OR CompanyName IS NULL + OR CompanyName IN ('bla','nothing') + END \ No newline at end of file diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 277bdc6c..5ad3a410 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -37,10 +37,14 @@ var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; var SqlServerHighlightRules = function() { /** * each section has a link and some javacript code. - * go to the link, open dev tools, run code to get the string + * go to the link, open dev tools, run code to get the string. + * + * Right now this code is optimized to make it easy for a developer to modify. + * Once I'm certain that this is not missing anything it can be 'compiled' into a cleaner/faster format that is not executing stuff on the fly for no reason. */ - - var builtinConstants = "TRUE|FALSE"; + + // some of these are other types but I want sytanx highlighting to match SSMS + var builtinConstants = "TRUE|FALSE|NULL|IS|IN"; // multiple pages for built in functions, the following code works for all @@ -86,20 +90,39 @@ var SqlServerHighlightRules = function() { ); + //https://msdn.microsoft.com/en-us/library/ms190356.aspx + // var r = []; $('.tableSection').find('td').find('a').each(function() { var t = $(this).text().trim().toUpperCase(); r.push($(this).text().trim().toUpperCase()); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|')); + 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 TRANSACTION ISOLATION LEVEL|SET XACT_ABORT"; + + // https://msdn.microsoft.com/en-us/library/ms189822.aspx // var r = []; $('.tableSection').find('td').each(function() { r.push($(this).text().trim()); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|')); 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"; - //after modifying above data sets, copy above code and run this to remove data types, functions, and constants from keywords - // keywords = keywords.split('|'); - // keywords = keywords.filter(function(value,index,self){ - // return builtinConstants.split('|').indexOf(value) === -1 && builtinFunctions.split('|').indexOf(value) === -1 && dataTypes.split('|').indexOf(value) === -1; - // }); - // console.log(keywords.sort().join('|')); + //add isolation levels https://msdn.microsoft.com/en-us/library/ms173763.aspx + keywords += "|UNCOMMITTED|COMMITTED|REPEATABLE|SNAPSHOP|SERIALIZABLE"; + + //add each part of set statement to keywords for highlighting, yet keep set statements as is for code completion + //NOTE: there is likely a better way to do this but I don't fully understand the syntax highlighting part yet + var eachSet = setStatements.split('|'); + eachSet.forEach(function(v) { + v.split(' ').forEach(function(v) { + keywords += '|' + v; + }); + }); + + + //remove any other built in things from key word list + keywords = keywords.split('|'); + keywords = keywords.filter(function(value, index, self) { + return builtinConstants.split('|').indexOf(value) === -1 && builtinFunctions.split('|').indexOf(value) === -1 && dataTypes.split('|').indexOf(value) === -1; + }); + keywords = keywords.sort().join('|'); var keywordMapper = this.createKeywordMapper({ "support.function": builtinFunctions, "keyword": keywords, + "keyword.set": setStatements, "constant.language": builtinConstants, "storage.type": dataTypes }, "identifier", true); diff --git a/lib/ace/snippets/sqlserver.snippets b/lib/ace/snippets/sqlserver.snippets index c1007485..97c197dc 100644 --- a/lib/ace/snippets/sqlserver.snippets +++ b/lib/ace/snippets/sqlserver.snippets @@ -1,3 +1,27 @@ +# ISNULL +snippet isnull + ISNULL(${1:check_expression}, ${2:replacement_value}) +# FORMAT +snippet format + FORMAT(${1:value}, ${2:format}) +# CAST +snippet cast + CAST(${1:expression} AS ${2:data_type}) +# CONVERT +snippet convert + CONVERT(${1:data_type}, ${2:expression}) +# DATEPART +snippet datepart + DATEPART(${1:datepart}, ${2:date}) +# DATEDIFF +snippet datediff + DATEDIFFT(${1:datepart}, ${2:startdate}, ${3:enddate}) +# DATEADD +snippet dateadd + DATEADD(${1:datepart}, ${2:number}, ${3:date}) +# DATEFROMPARTS +snippet datefromparts + DATEFROMPARTS(${1:year}, ${2:month}, ${3:day}) # Create Procedure snippet createproc -- ============================================= diff --git a/lib/ace/theme/sqlserver.css b/lib/ace/theme/sqlserver.css index ad6fe1f6..0151a998 100644 --- a/lib/ace/theme/sqlserver.css +++ b/lib/ace/theme/sqlserver.css @@ -21,7 +21,7 @@ .ace-sqlserver .ace_keyword{ color: #0000FF; - text-transform: uppercase; + /*text-transform: uppercase;*/ } .ace-sqlserver .ace_comment{ @@ -35,7 +35,7 @@ .ace-sqlserver .ace_storage{ color: #979797; font-style: italic; - text-transform: uppercase; + /*text-transform: uppercase;*/ } .ace-sqlserver .ace_bracket { @@ -60,7 +60,8 @@ } .ace-sqlserver .ace_constant.ace_language { - color: rgb(88, 92, 246); + color: #979797; + /*font-style: italic;*/ } .ace-sqlserver .ace_constant.ace_library { @@ -77,7 +78,7 @@ .ace-sqlserver .ace_support.ace_function { color: #FF00FF; - text-transform: uppercase; + /*text-transform: uppercase;*/ } .ace-sqlserver .ace_support.ace_constant { From 1a6e2f83f228df83d720bdc1501d2a2ca44b15d9 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Fri, 17 Apr 2015 09:35:58 -0400 Subject: [PATCH 05/26] small fixes --- lib/ace/mode/sqlserver_highlight_rules.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 5ad3a410..30293e2e 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -79,7 +79,7 @@ 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|" ); @@ -154,10 +154,12 @@ var SqlServerHighlightRules = function() { }, { token : keywordMapper, regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" - }, { + } + /* this works to make variables designated with @ symbol show as a single token... but it screws up built in functions that start with @ symbol + , { token : "constant.class", regex : "@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b" - }, { + }*/, { token : "keyword.operator", regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" }, { From 76ac79f1169b65a2a27e32c4ac06a6a1d731dc80 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Fri, 17 Apr 2015 10:00:13 -0400 Subject: [PATCH 06/26] more progress --- lib/ace/mode/sqlserver_highlight_rules.js | 73 ++++++++++++----------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 30293e2e..df6c9b4b 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -43,8 +43,8 @@ var SqlServerHighlightRules = function() { * Once I'm certain that this is not missing anything it can be 'compiled' into a cleaner/faster format that is not executing stuff on the fly for no reason. */ - // some of these are other types but I want sytanx highlighting to match SSMS - var builtinConstants = "TRUE|FALSE|NULL|IS|IN"; + // https://msdn.microsoft.com/en-us/library/ms189773.aspx + var logicalOperators = "ALL|AND|ANY|BETWEEN|EXISTS|IN|LIKE|NOT|OR|SOME"; // multiple pages for built in functions, the following code works for all @@ -115,7 +115,7 @@ var SqlServerHighlightRules = function() { //remove any other built in things from key word list keywords = keywords.split('|'); keywords = keywords.filter(function(value, index, self) { - return builtinConstants.split('|').indexOf(value) === -1 && builtinFunctions.split('|').indexOf(value) === -1 && dataTypes.split('|').indexOf(value) === -1; + return logicalOperators.split('|').indexOf(value) === -1 && builtinFunctions.split('|').indexOf(value) === -1 && dataTypes.split('|').indexOf(value) === -1; }); keywords = keywords.sort().join('|'); @@ -123,7 +123,7 @@ var SqlServerHighlightRules = function() { "support.function": builtinFunctions, "keyword": keywords, "keyword.set": setStatements, - "constant.language": builtinConstants, + "constant.language": logicalOperators, "storage.type": dataTypes }, "identifier", true); @@ -135,43 +135,44 @@ var SqlServerHighlightRules = function() { } this.$rules = { - "start" : [ { - token : "comment", - regex : "--.*$" - }, { - token : "comment", - start : "/\\*", - end : "\\*/" + "start": [{ + token: "comment", + regex: "--.*$" }, { - token : "string", // " string - regex : '".*?"' + token: "comment", + start: "/\\*", + end: "\\*/" }, { - token : "string", // ' string - regex : "'.*?'" + token: "string", // " string + regex: '".*?"' }, { - token : "constant.numeric", // float - regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + token: "string", // ' string + regex: "'.*?'" }, { - token : keywordMapper, - regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + token: "constant.numeric", // float + 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 + }, { + token: "constant.class", + regex: "@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + //https://msdn.microsoft.com/en-us/library/ms174986.aspx + token: "keyword.operator", + regex: "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token: "paren.lparen", + regex: "[\\(]" + }, { + token: "paren.rparen", + regex: "[\\)]" } - /* this works to make variables designated with @ symbol show as a single token... but it screws up built in functions that start with @ symbol - , { - token : "constant.class", - regex : "@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b" - }*/, { - token : "keyword.operator", - regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" - }, { - token : "paren.lparen", - regex : "[\\(]" - }, { - token : "paren.rparen", - regex : "[\\)]" - }, { - token : "text", - regex : "\\s+" - } ] + /*, { + token : "text", + regex : "\\s+" + }*/ + ] }; this.normalizeRules(); }; From d8f7003fb80a75b566142fa5dfba8ea46fc606f1 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Fri, 17 Apr 2015 10:03:56 -0400 Subject: [PATCH 07/26] add null back --- lib/ace/mode/sqlserver_highlight_rules.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index df6c9b4b..7dd1df33 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -45,6 +45,8 @@ var SqlServerHighlightRules = function() { // https://msdn.microsoft.com/en-us/library/ms189773.aspx var logicalOperators = "ALL|AND|ANY|BETWEEN|EXISTS|IN|LIKE|NOT|OR|SOME"; + logicalOperators+= "|NULL";//SSMS colors this gray too + // multiple pages for built in functions, the following code works for all From 7ae5c862c2f21b140b260330c6916e6a83f9beb7 Mon Sep 17 00:00:00 2001 From: Morgan Yarbrough Date: Fri, 17 Apr 2015 11:17:31 -0400 Subject: [PATCH 08/26] progress but not working yet --- lib/ace/mode/sqlserver_highlight_rules.js | 39 +++++++++++++++++------ 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 7dd1df33..84af7656 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -3,7 +3,7 @@ * * Copyright (c) 2010, Ajax.org B.V. * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright @@ -14,7 +14,7 @@ * * Neither the name of Ajax.org B.V. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -36,9 +36,9 @@ var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; var SqlServerHighlightRules = function() { /** - * each section has a link and some javacript code. + * each section has a link and some javacript code. * go to the link, open dev tools, run code to get the string. - * + * * Right now this code is optimized to make it easy for a developer to modify. * Once I'm certain that this is not missing anything it can be 'compiled' into a cleaner/faster format that is not executing stuff on the fly for no reason. */ @@ -81,7 +81,7 @@ 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" ); @@ -106,12 +106,12 @@ var SqlServerHighlightRules = function() { //add each part of set statement to keywords for highlighting, yet keep set statements as is for code completion //NOTE: there is likely a better way to do this but I don't fully understand the syntax highlighting part yet - var eachSet = setStatements.split('|'); + /*var eachSet = setStatements.split('|'); eachSet.forEach(function(v) { v.split(' ').forEach(function(v) { keywords += '|' + v; }); - }); + });*/ //remove any other built in things from key word list @@ -124,17 +124,35 @@ var SqlServerHighlightRules = function() { var keywordMapper = this.createKeywordMapper({ "support.function": builtinFunctions, "keyword": keywords, - "keyword.set": setStatements, "constant.language": logicalOperators, "storage.type": dataTypes }, "identifier", true); + //store keywordList created by createKeywordMapper so we can merge it with second call + var keywordList = this.$keywordList; + + var statementMapper = this.createKeywordMapper({ + "keyword.set": setStatements, + }, "identifier", true); + + //merge first keyword list back in + for (var i = 0; i < keywordList.length; i++) { + this.$keywordList.push(keywordList[i]); + } + // 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 for (var i = 0; i < this.$keywordList.length; i++) { this.$keywordList[i] = this.$keywordList[i].toUpperCase(); } + + var originalStatementMapper = statementMapper; + statementMapper= function(value){ + var r = originalStatementMapper(value); + console.log('value: ' + value + '\tresult: ' + r); + return r; + }; this.$rules = { "start": [{ @@ -153,10 +171,13 @@ var SqlServerHighlightRules = function() { }, { token: "constant.numeric", // float regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token: statementMapper, + regex: "SET [a-zA-Z_$][a-zA-Z0-9_$]*\\b" }, { token: keywordMapper, regex: "@{0,2}[a-zA-Z_$][a-zA-Z0-9_$]*\\b" //up to 2 @symbols for some build in functions - }, { + },{ token: "constant.class", regex: "@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b" }, { From 12be2202973e73a83ce354b2283bd30cd386f957 Mon Sep 17 00:00:00 2001 From: Morgan Yarbrough Date: Fri, 17 Apr 2015 12:53:42 -0400 Subject: [PATCH 09/26] even more keywords! --- lib/ace/mode/sqlserver_highlight_rules.js | 85 ++++++++++------------- lib/ace/theme/sqlserver.css | 9 ++- 2 files changed, 42 insertions(+), 52 deletions(-) diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 84af7656..06cd063b 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -36,6 +36,7 @@ var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; var SqlServerHighlightRules = function() { /** + * Transact-SQL Syntax Conventions: https://msdn.microsoft.com/en-us/library/ms177563.aspx * each section has a link and some javacript code. * go to the link, open dev tools, run code to get the string. * @@ -45,7 +46,7 @@ var SqlServerHighlightRules = function() { // https://msdn.microsoft.com/en-us/library/ms189773.aspx var logicalOperators = "ALL|AND|ANY|BETWEEN|EXISTS|IN|LIKE|NOT|OR|SOME"; - logicalOperators+= "|NULL";//SSMS colors this gray too + logicalOperators+= "|NULL|IS";//SSMS colors these gray too @@ -92,26 +93,15 @@ var SqlServerHighlightRules = function() { ); - //https://msdn.microsoft.com/en-us/library/ms190356.aspx - // var r = []; $('.tableSection').find('td').find('a').each(function() { var t = $(this).text().trim().toUpperCase(); r.push($(this).text().trim().toUpperCase()); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|')); - 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 TRANSACTION ISOLATION LEVEL|SET XACT_ABORT"; - - // https://msdn.microsoft.com/en-us/library/ms189822.aspx // var r = []; $('.tableSection').find('td').each(function() { r.push($(this).text().trim()); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|')); 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"; - //add isolation levels https://msdn.microsoft.com/en-us/library/ms173763.aspx - keywords += "|UNCOMMITTED|COMMITTED|REPEATABLE|SNAPSHOP|SERIALIZABLE"; - - //add each part of set statement to keywords for highlighting, yet keep set statements as is for code completion - //NOTE: there is likely a better way to do this but I don't fully understand the syntax highlighting part yet - /*var eachSet = setStatements.split('|'); - eachSet.forEach(function(v) { - v.split(' ').forEach(function(v) { - keywords += '|' + v; - }); - });*/ + //add table hints and query hints (many overlap): 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"; + //add join hints: https://msdn.microsoft.com/en-us/library/ms173815.aspx + keywords+= "|LOOP|HASH|MERGE|REMOTE"; //remove any other built in things from key word list @@ -128,18 +118,6 @@ var SqlServerHighlightRules = function() { "storage.type": dataTypes }, "identifier", true); - //store keywordList created by createKeywordMapper so we can merge it with second call - var keywordList = this.$keywordList; - - var statementMapper = this.createKeywordMapper({ - "keyword.set": setStatements, - }, "identifier", true); - - //merge first keyword list back in - for (var i = 0; i < keywordList.length; i++) { - this.$keywordList.push(keywordList[i]); - } - // 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 @@ -147,12 +125,19 @@ var SqlServerHighlightRules = function() { this.$keywordList[i] = this.$keywordList[i].toUpperCase(); } - var originalStatementMapper = statementMapper; - statementMapper= function(value){ - var r = originalStatementMapper(value); - console.log('value: ' + value + '\tresult: ' + r); - return r; - }; + + //https://msdn.microsoft.com/en-us/library/ms190356.aspx + // var r = []; $('.tableSection').find('td').find('a').each(function() { var t = $(this).text().trim().toUpperCase(); r.push($(this).text().trim().toUpperCase()); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|')); + 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": [{ @@ -162,22 +147,16 @@ var SqlServerHighlightRules = function() { token: "comment", start: "/\\*", end: "\\*/" - }, { - token: "string", // " string - regex: '".*?"' }, { token: "string", // ' string regex: "'.*?'" }, { token: "constant.numeric", // float regex: "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" - }, { - token: statementMapper, - regex: "SET [a-zA-Z_$][a-zA-Z0-9_$]*\\b" }, { token: keywordMapper, regex: "@{0,2}[a-zA-Z_$][a-zA-Z0-9_$]*\\b" //up to 2 @symbols for some build in functions - },{ + }, { token: "constant.class", regex: "@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\b" }, { @@ -190,13 +169,22 @@ var SqlServerHighlightRules = function() { }, { token: "paren.rparen", regex: "[\\)]" - } - /*, { - token : "text", - regex : "\\s+" - }*/ - ] + }, { + token: "text", + regex: "\\s+" + }] }; + + //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 + for (var i = 0; i < setStatements.length; i++) { + var statement = setStatements[i]; + this.$rules.start.unshift({ + token: "set.statement", + regex: statement //"("+statement+")(| ON| OFF)"// new RegExp(statement, 'i') + }); + } + this.normalizeRules(); }; @@ -204,4 +192,3 @@ oop.inherits(SqlServerHighlightRules, TextHighlightRules); exports.SqlHighlightRules = SqlServerHighlightRules; }); - diff --git a/lib/ace/theme/sqlserver.css b/lib/ace/theme/sqlserver.css index 0151a998..65659516 100644 --- a/lib/ace/theme/sqlserver.css +++ b/lib/ace/theme/sqlserver.css @@ -42,9 +42,12 @@ border: 1px solid magenta; } - - - +.ace-sqlserver .ace_set.ace_statement{ + /*color: #11B7BE;*/ + color: #0000FF; + /*font-style:italic;*/ + text-decoration:underline; +} .ace-sqlserver .ace_cursor { From e42bc9a2659d59251e77147f107db8911afe2732 Mon Sep 17 00:00:00 2001 From: Morgan Yarbrough Date: Fri, 17 Apr 2015 14:09:38 -0400 Subject: [PATCH 10/26] progress, and about to work on folding --- lib/ace/mode/folding/sqlserver.js | 10 +++-- lib/ace/mode/sqlserver_highlight_rules.js | 50 ++++++++++++++++++----- lib/ace/theme/sqlserver.css | 44 +++++++++----------- 3 files changed, 65 insertions(+), 39 deletions(-) diff --git a/lib/ace/mode/folding/sqlserver.js b/lib/ace/mode/folding/sqlserver.js index 12993757..218bc98a 100644 --- a/lib/ace/mode/folding/sqlserver.js +++ b/lib/ace/mode/folding/sqlserver.js @@ -42,19 +42,21 @@ oop.inherits(FoldMode, BaseFoldMode); (function() { // Currently the only supported folding is #region comments - // TODO: add more folding (will require in depth testing because this has never existed before) for things like: + // TODO: add more folding (will require in depth testing because this has never existed before) for things like: // CASE ... END https://msdn.microsoft.com/en-us/library/ms181765.aspx // BEGIN ... END https://msdn.microsoft.com/en-us/library/ms182717.aspx - // this.foldingStartMarker = - // this.foldingStopMarker = + this.foldingStartMarker = /CASE|BEGIN/; + this.foldingStopMarker = /END/; this.startRegionRe = /^\s*(\/\*|--)#region\b/; this.getFoldWidget = function(session, foldStyle, row) { var line = session.getLine(row); - if (this.startRegionRe.test(line)) + // var fw = this.getFoldWidget(session, foldStyle, row); + + if (this.startRegionRe.test(line)) return "start"; return ""; diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 06cd063b..70231a49 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -46,7 +46,8 @@ var SqlServerHighlightRules = function() { // https://msdn.microsoft.com/en-us/library/ms189773.aspx var logicalOperators = "ALL|AND|ANY|BETWEEN|EXISTS|IN|LIKE|NOT|OR|SOME"; - logicalOperators+= "|NULL|IS";//SSMS colors these gray too + logicalOperators+= "|NULL|IS|APPLY|INNER|OUTER|LEFT|RIGHT|JOIN|CROSS";//SSMS colors these gray too + //note: manually removed LEFT and RIGHT from built in functions below to color it same way SSMS does @@ -76,7 +77,7 @@ var SqlServerHighlightRules = function() { /* https://msdn.microsoft.com/en-us/library/ms186236.aspx (MANUAL) */ "CERTENCODED|CERTPRIVATEKEY|CURRENT_USER|DATABASE_PRINCIPAL_ID|HAS_PERMS_BY_NAME|IS_MEMBER|IS_ROLEMEMBER|IS_SRVROLEMEMBER|ORIGINAL_LOGIN|PERMISSIONS|PWDCOMPARE|PWDENCRYPT|SCHEMA_ID|SCHEMA_NAME|SESSION_USER|SUSER_ID|SUSER_NAME|SUSER_SID|SUSER_SNAME|SYS.FN_BUILTIN_PERMISSIONS|SYS.FN_GET_AUDIT_FILE|SYS.FN_MY_PERMISSIONS|SYSTEM_USER|USER_ID|USER_NAME|" + /* https://msdn.microsoft.com/en-us/library/ms181984.aspx */ - "ASCII|CHAR|CHARINDEX|CONCAT|DIFFERENCE|FORMAT|LEFT|LEN|LOWER|LTRIM|NCHAR|PATINDEX|QUOTENAME|REPLACE|REPLICATE|REVERSE|RIGHT|RTRIM|SOUNDEX|SPACE|STR|STUFF|SUBSTRING|UNICODE|UPPER|" + + "ASCII|CHAR|CHARINDEX|CONCAT|DIFFERENCE|FORMAT|LEN|LOWER|LTRIM|NCHAR|PATINDEX|QUOTENAME|REPLACE|REPLICATE|REVERSE|RTRIM|SOUNDEX|SPACE|STR|STUFF|SUBSTRING|UNICODE|UPPER|" + /* https://msdn.microsoft.com/en-us/library/ms187786.aspx */ "$PARTITION|@@ERROR|@@IDENTITY|@@PACK_RECEIVED|@@ROWCOUNT|@@TRANCOUNT|BINARY_CHECKSUM|CHECKSUM|CONNECTIONPROPERTY|CONTEXT_INFO|CURRENT_REQUEST_ID|ERROR_LINE|ERROR_MESSAGE|ERROR_NUMBER|ERROR_PROCEDURE|ERROR_SEVERITY|ERROR_STATE|FORMATMESSAGE|GETANSINULL|GET_FILESTREAM_TRANSACTION_CONTEXT|HOST_ID|HOST_NAME|ISNULL|ISNUMERIC|MIN_ACTIVE_ROWVERSION|NEWID|NEWSEQUENTIALID|ROWCOUNT_BIG|XACT_STATE|" + /* https://msdn.microsoft.com/en-us/library/ms177520.aspx */ @@ -93,15 +94,24 @@ var SqlServerHighlightRules = function() { ); + //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 r = []; $('.tableSection').find('td').each(function() { r.push($(this).text().trim()); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|')); 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"; //add table hints and query hints (many overlap): 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"; + 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"; //add join hints: https://msdn.microsoft.com/en-us/library/ms173815.aspx - keywords+= "|LOOP|HASH|MERGE|REMOTE"; + keywords += "|LOOP|HASH|MERGE|REMOTE"; + //https://msdn.microsoft.com/en-us/library/ms175976.aspx -seems messed up that microsofts offical reserved words does not contain these... + keywords += "|TRY|CATCH|THROW"; + //highlighted words in SSMS that I'm not even sure where they come from + keywords += "|TYPE"; //remove any other built in things from key word list @@ -112,17 +122,21 @@ var SqlServerHighlightRules = function() { keywords = keywords.sort().join('|'); var keywordMapper = this.createKeywordMapper({ - "support.function": builtinFunctions, - "keyword": keywords, "constant.language": logicalOperators, - "storage.type": dataTypes + "storage.type": dataTypes, + "support.function": builtinFunctions, + "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: build in stored procedures are lower case for (var i = 0; i < this.$keywordList.length; i++) { - this.$keywordList[i] = this.$keywordList[i].toUpperCase(); + var keyword = this.$keywordList[i]; + if (builtInStoredProcedures.indexOf(keyword) !== -1) continue; + this.$keywordList[i] = keyword.toUpperCase(); } @@ -140,7 +154,20 @@ var SqlServerHighlightRules = function() { } this.$rules = { - "start": [{ + start: [{ + token: "string.start", + regex: "'", + next: [{ + token: "constant.language.escape", + regex: /\\'/ + }, { + token: "string.end", + next: "start", + regex: "'" + }, { + defaultToken: "string" + }] + }, { token: "comment", regex: "--.*$" }, { @@ -162,13 +189,16 @@ var SqlServerHighlightRules = function() { }, { //https://msdn.microsoft.com/en-us/library/ms174986.aspx token: "keyword.operator", - regex: "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + regex: "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=|\\*" }, { token: "paren.lparen", regex: "[\\(]" }, { token: "paren.rparen", regex: "[\\)]" + }, { + token: "punctuation", + regex: ",|;" }, { token: "text", regex: "\\s+" diff --git a/lib/ace/theme/sqlserver.css b/lib/ace/theme/sqlserver.css index 65659516..95c6f36e 100644 --- a/lib/ace/theme/sqlserver.css +++ b/lib/ace/theme/sqlserver.css @@ -1,3 +1,7 @@ + +.ace_line{ + font-family:Consolas +} .ace-sqlserver .ace_gutter { background: #ebebeb; color: #333; @@ -15,7 +19,8 @@ } .ace-sqlserver .ace_identifier{ - color: #008080; + /*color: #008080;*/ + color:black; } @@ -24,24 +29,27 @@ /*text-transform: uppercase;*/ } -.ace-sqlserver .ace_comment{ - color: #FD971F; -} .ace-sqlserver .ace_numeric{ color: black; } .ace-sqlserver .ace_storage{ - color: #979797; - font-style: italic; + /*color: #979797;*/ + color: #11B7BE; + /*color: #00A2FF;*/ + /*font-style: italic;*/ /*text-transform: uppercase;*/ } -.ace-sqlserver .ace_bracket { - border: 1px solid magenta; +.ace-sqlserver .ace_keyword.ace_operator, +.ace-sqlserver .ace_lparen, +.ace-sqlserver .ace_rparen, +.ace-sqlserver .ace_punctuation{ + color: #808080; } + .ace-sqlserver .ace_set.ace_statement{ /*color: #11B7BE;*/ color: #0000FF; @@ -76,9 +84,6 @@ color: white; } -.ace-sqlserver .ace_fold { -} - .ace-sqlserver .ace_support.ace_function { color: #FF00FF; /*text-transform: uppercase;*/ @@ -103,20 +108,9 @@ font-style:italic; color:#FD971F; } -.ace-sqlserver .ace_keyword.ace_operator { - color: rgb(104, 118, 135); -} .ace-sqlserver .ace_comment { - color: #FD971F; -} - -.ace-sqlserver .ace_comment.ace_doc { - color: #FD971F; -} - -.ace-sqlserver .ace_comment.ace_doc.ace_tag { - color: #FD971F; + color:#008000; } .ace-sqlserver .ace_constant.ace_numeric { @@ -131,8 +125,8 @@ color: rgb(104, 104, 91); } -.ace-sqlserver .ace_entity.ace_name.ace_function { - color: #0000A2; +.ace-sqlserver .ace_support.ace_storedprocedure { + color: #800000; } From 1b9c8bfc882d6540bc643a0f21287a87c6394a16 Mon Sep 17 00:00:00 2001 From: Morgan Yarbrough Date: Fri, 17 Apr 2015 14:24:38 -0400 Subject: [PATCH 11/26] FOLDING --- demo/kitchen-sink/docs/sqlserver.sqlserver | 22 ++++----- lib/ace/mode/folding/sqlserver.js | 54 +++++++++++++++++----- 2 files changed, 54 insertions(+), 22 deletions(-) diff --git a/demo/kitchen-sink/docs/sqlserver.sqlserver b/demo/kitchen-sink/docs/sqlserver.sqlserver index 5205e68b..1d8ae116 100644 --- a/demo/kitchen-sink/docs/sqlserver.sqlserver +++ b/demo/kitchen-sink/docs/sqlserver.sqlserver @@ -2,15 +2,13 @@ -- 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 +-- Includes non-standard folding using region comments using either -- line comments or block comments (both are demonstrated below) -- ============================================= CREATE PROCEDURE dbo.TestProcedure --#region parameters - @Vint INT = 1 - ,@vdate DATE = NULL - ,@vdatetime DATETIME = DATEADD(dd,1,GETDATE()) + @vint INT = 1, @vdate DATE = NULL, @vdatetime DATETIME = DATEADD (dd, 1, GETDATE()) --#endregion AS @@ -22,15 +20,17 @@ BEGIN SET QUOTED_IDENTIFIER ON; /*#endregion*/ - - SELECT Orders.OrderID - ,Customers.CompanyName - ,DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS FirstDayOfYear + SET @vint = CASE + WHEN @vdate IS NULL + THEN 1 + ELSE 2 + END + + SELECT Orders.OrderID, Customers.CompanyName, DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS FirstDayOfYear FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID WHERE CompanyName NOT LIKE '%something' OR CompanyName IS NULL - OR CompanyName IN ('bla','nothing') - -END \ No newline at end of file + OR CompanyName IN ('bla', 'nothing') +END diff --git a/lib/ace/mode/folding/sqlserver.js b/lib/ace/mode/folding/sqlserver.js index 218bc98a..b0a81d92 100644 --- a/lib/ace/mode/folding/sqlserver.js +++ b/lib/ace/mode/folding/sqlserver.js @@ -45,31 +45,63 @@ oop.inherits(FoldMode, BaseFoldMode); // TODO: add more folding (will require in depth testing because this has never existed before) for things like: // CASE ... END https://msdn.microsoft.com/en-us/library/ms181765.aspx // BEGIN ... END https://msdn.microsoft.com/en-us/library/ms182717.aspx + // -- LEFT OFF TRYING TO ADD ADVANCED FOLDING... UNCOMMENT TO CONTINUE - this.foldingStartMarker = /CASE|BEGIN/; - this.foldingStopMarker = /END/; + + // this.foldingStartMarker = /\bCASE\b|\bBEGIN\b/i; + // this.foldingStopMarker = /\bEND\b/i; this.startRegionRe = /^\s*(\/\*|--)#region\b/; + + this._getFoldWidgetBase = this.getFoldWidget; this.getFoldWidget = function(session, foldStyle, row) { var line = session.getLine(row); - // var fw = this.getFoldWidget(session, foldStyle, row); + //var fw = this._getFoldWidgetBase(session, foldStyle, row); - if (this.startRegionRe.test(line)) + if (/*!fw && */this.startRegionRe.test(line)) return "start"; - return ""; + return fw; }; - this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + /*this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { var line = session.getLine(row); - - if (this.startRegionRe.test(line)) - return this.getCommentRegionBlock(session, line, row); - + + if (this.startRegionRe.test(line)) return this.getCommentRegionBlock(session, line, row); + + // var match = line.match(this.foldingStartMarker); + // if (match) { + // var i = match.index; + + // if (match[1]) return this.openingBracketBlock(session, match[1], row, i); + + // var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + // if (range && !range.isMultiLine()) { + // if (forceMultiline) { + // range = this.getSectionRange(session, row); + // } + // else if (foldStyle != "all") range = null; + // } + + // return range; + // } + + if (foldStyle === "markbegin") return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, - 1); + } + return; - }; + };*/ this.getCommentRegionBlock = function(session, line, row) { var startColumn = line.search(/\s*$/); From ff0cc12efcead0eecf12ff4cd41931c7de5bc799 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 06:37:29 -0400 Subject: [PATCH 12/26] folding partially working.. --- lib/ace/mode/folding/sqlserver.js | 92 ++++++++++++++++++++++++------- 1 file changed, 71 insertions(+), 21 deletions(-) diff --git a/lib/ace/mode/folding/sqlserver.js b/lib/ace/mode/folding/sqlserver.js index b0a81d92..69b5851a 100644 --- a/lib/ace/mode/folding/sqlserver.js +++ b/lib/ace/mode/folding/sqlserver.js @@ -48,8 +48,10 @@ oop.inherits(FoldMode, BaseFoldMode); // -- LEFT OFF TRYING TO ADD ADVANCED FOLDING... UNCOMMENT TO CONTINUE - // this.foldingStartMarker = /\bCASE\b|\bBEGIN\b/i; - // this.foldingStopMarker = /\bEND\b/i; + //this.foldingStartMarker = /\bCASE\b|\bBEGIN\b/i; + this.foldingStartMarker = /(\bCASE\b|\bBEGIN\b)|^\s*(\/\*)/; + this.foldingStopMarker = /\bEND\b/i; + this.startRegionRe = /^\s*(\/\*|--)#region\b/; @@ -58,39 +60,43 @@ oop.inherits(FoldMode, BaseFoldMode); this.getFoldWidget = function(session, foldStyle, row) { var line = session.getLine(row); - //var fw = this._getFoldWidgetBase(session, foldStyle, row); + var fw = this._getFoldWidgetBase(session, foldStyle, row); - if (/*!fw && */this.startRegionRe.test(line)) + if (!fw && this.startRegionRe.test(line)) return "start"; return fw; }; - /*this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + //this is called when a fold widget is clicked + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { var line = session.getLine(row); if (this.startRegionRe.test(line)) return this.getCommentRegionBlock(session, line, row); - // var match = line.match(this.foldingStartMarker); - // if (match) { - // var i = match.index; + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; - // if (match[1]) return this.openingBracketBlock(session, match[1], row, i); + //if first capturing group, then match is for bracket, either '{' or '[', which match[1] will contain + if (match[1]) return this.getEndBlock(session, row, i, match[1]); + //return this.openingBracketBlock(session, match[1], row, i); - // var range = session.getCommentFoldRange(row, i + match[0].length, 1); + //still going: match is for second capturing group, which is blockcomment + var range = session.getCommentFoldRange(row, i + match[0].length, 1); - // if (range && !range.isMultiLine()) { - // if (forceMultiline) { - // range = this.getSectionRange(session, row); - // } - // else if (foldStyle != "all") range = null; - // } + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } + else if (foldStyle != "all") range = null; + } - // return range; - // } + return range; + } if (foldStyle === "markbegin") return; - + /* this is when end fold has marker, and user clicks it, in which case we want to find the opening braket var match = line.match(this.foldingStopMarker); if (match) { var i = match.index + match[0].length; @@ -98,10 +104,54 @@ oop.inherits(FoldMode, BaseFoldMode); if (match[1]) return this.closingBracketBlock(session, match[1], row, i); return session.getCommentFoldRange(row, i, - 1); - } + }*/ return; - };*/ + }; + + + /** + * finds the next 'END' for closing a fold range + * @param {string} matchSequence - the sequence of charaters that started the fold widget, which should remain visible when the fold widget is folded + */ + this.getEndBlock = function(session, row, column, matchSequence) { + var start = { + row: row, + column: column + matchSequence.length + }; + var maxRow = session.getLength(); + var line; + + var depth = 1; + var re = /\bEND\b/i; ///^\s*(?:\/\*|--)#(end)?region\b/; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[0]) depth--; + else depth++; + + if (!depth) break; + } + var endRow = row; + if (endRow > start.row) { + return new Range(start.row, start.column, endRow, line.length); + } + + + /* var end = session.$findClosingBracket(bracket, start, typeRe); + if (!end) return; + + var fw = session.foldWidgets[end.row]; + if (fw == null) fw = session.getFoldWidget(end.row); + + if (fw == "start" && end.row > start.row) { + end.row--; + end.column = session.getLine(end.row).length; + } + return Range.fromPoints(start, end);*/ + }; + this.getCommentRegionBlock = function(session, line, row) { var startColumn = line.search(/\s*$/); From 184df6d18eb1a24b9a93786d9e45d06622af6aa2 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 07:29:10 -0400 Subject: [PATCH 13/26] inherit cstyle... trying to figure out best end marker --- demo/kitchen-sink/docs/sqlserver.sqlserver | 37 +++++-- lib/ace/mode/folding/cstyle.js | 6 +- lib/ace/mode/folding/sqlserver.js | 109 +++++---------------- 3 files changed, 56 insertions(+), 96 deletions(-) diff --git a/demo/kitchen-sink/docs/sqlserver.sqlserver b/demo/kitchen-sink/docs/sqlserver.sqlserver index 1d8ae116..cf747864 100644 --- a/demo/kitchen-sink/docs/sqlserver.sqlserver +++ b/demo/kitchen-sink/docs/sqlserver.sqlserver @@ -7,26 +7,43 @@ -- ============================================= CREATE PROCEDURE dbo.TestProcedure ---#region parameters - @vint INT = 1, @vdate DATE = NULL, @vdatetime DATETIME = DATEADD (dd, 1, GETDATE()) ---#endregion +--region parameters + @vint INT = 1 + ,@vdate DATE = NULL + ,@vdatetime DATETIME = DATEADD (dd, 1, GETDATE()) + ,@vvarchar VARCHAR(MAX) = '' +--endregion AS BEGIN - /*#region set statements */ + /*region set statements */ SET NOCOUNT ON; SET XACT_ABORT ON; SET QUOTED_IDENTIFIER ON; - /*#endregion*/ + /*endregion*/ + + /** + * These comments will produce a fold widget + */ SET @vint = CASE - WHEN @vdate IS NULL - THEN 1 - ELSE 2 - END + WHEN @vdate IS NULL + THEN 1 + ELSE 2 + END + + + IF @vint = 1 + BEGIN + SET @vvarchar='one' + SET @vint = DATEDIFFT(dd, @vdate, @vdatetime) + END + - SELECT Orders.OrderID, Customers.CompanyName, DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS FirstDayOfYear + SELECT Orders.OrderID + ,Customers.CompanyName + ,DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS FirstDayOfYear FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID diff --git a/lib/ace/mode/folding/cstyle.js b/lib/ace/mode/folding/cstyle.js index a98807ab..75926331 100644 --- a/lib/ace/mode/folding/cstyle.js +++ b/lib/ace/mode/folding/cstyle.js @@ -158,12 +158,16 @@ oop.inherits(FoldMode, BaseFoldMode); return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); }; + /** + * gets comment region block with end region assumed to be start of comment in any cstyle mode or SQL mode (--) which inherits from this. + * There may optionally be a pound symbol before the region/endregion statement + */ this.getCommentRegionBlock = function(session, line, row) { var startColumn = line.search(/\s*$/); var maxRow = session.getLength(); var startRow = row; - var re = /^\s*(?:\/\*|\/\/)#(end)?region\b/; + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; var depth = 1; while (++row < maxRow) { line = session.getLine(row); diff --git a/lib/ace/mode/folding/sqlserver.js b/lib/ace/mode/folding/sqlserver.js index 69b5851a..f91e9cf4 100644 --- a/lib/ace/mode/folding/sqlserver.js +++ b/lib/ace/mode/folding/sqlserver.js @@ -33,42 +33,28 @@ define(function(require, exports, module) { var oop = require("../../lib/oop"); var Range = require("../../range").Range; -var BaseFoldMode = require("./fold_mode").FoldMode; +var BaseFoldMode = require("./cstyle").FoldMode; var FoldMode = exports.FoldMode = function() {}; oop.inherits(FoldMode, BaseFoldMode); (function() { + /** + * Inheriting cstyle folding because it handles the region comment folding + * and special block comment folding appropriately. + * + * Cstyle's getCommentRegionBlock() contains the sql comment characters '--'. + */ - // Currently the only supported folding is #region comments - // TODO: add more folding (will require in depth testing because this has never existed before) for things like: - // CASE ... END https://msdn.microsoft.com/en-us/library/ms181765.aspx - // BEGIN ... END https://msdn.microsoft.com/en-us/library/ms182717.aspx - // -- LEFT OFF TRYING TO ADD ADVANCED FOLDING... UNCOMMENT TO CONTINUE + this.foldingStartMarker = /(\bCASE\b|\bBEGIN\b)|^\s*(\/\*)/i; + this.foldingStopMarker = /^(\bEND\b)|^[\s\*]*(\*\/)/i; + // this.foldingStopMarker = /^(?!\bCASE\b|\bBEGIN\b)(\bEND\b)|^[\s\*]*(\*\/)/i; + // this.foldingStopMarker = /^(?!\bCASE\b|\bBEGIN\b).*(\bEND\b)|^[\s\*]*(\*\/)/i; - //this.foldingStartMarker = /\bCASE\b|\bBEGIN\b/i; - this.foldingStartMarker = /(\bCASE\b|\bBEGIN\b)|^\s*(\/\*)/; - this.foldingStopMarker = /\bEND\b/i; + this.startRegionRe = /^\s*(\/\*|--)#?region\b/; - - this.startRegionRe = /^\s*(\/\*|--)#region\b/; - - this._getFoldWidgetBase = this.getFoldWidget; - - this.getFoldWidget = function(session, foldStyle, row) { - var line = session.getLine(row); - - var fw = this._getFoldWidgetBase(session, foldStyle, row); - - if (!fw && this.startRegionRe.test(line)) - return "start"; - - return fw; - }; - - //this is called when a fold widget is clicked this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { var line = session.getLine(row); @@ -77,17 +63,17 @@ oop.inherits(FoldMode, BaseFoldMode); var match = line.match(this.foldingStartMarker); if (match) { var i = match.index; - - //if first capturing group, then match is for bracket, either '{' or '[', which match[1] will contain - if (match[1]) return this.getEndBlock(session, row, i, match[1]); - //return this.openingBracketBlock(session, match[1], row, i); + //if first capturing group (CASE|BEGIN) + if (match[1]) return this.getBeginEndBlock(session, row, i, match[1]); //still going: match is for second capturing group, which is blockcomment var range = session.getCommentFoldRange(row, i + match[0].length, 1); + console.log('getCommentFoldRange',range); if (range && !range.isMultiLine()) { if (forceMultiline) { range = this.getSectionRange(session, row); + console.log('getSectionRange',range); } else if (foldStyle != "all") range = null; } @@ -95,85 +81,38 @@ oop.inherits(FoldMode, BaseFoldMode); return range; } + //no support for end folding markers yet if (foldStyle === "markbegin") return; - /* this is when end fold has marker, and user clicks it, in which case we want to find the opening braket - var match = line.match(this.foldingStopMarker); - if (match) { - var i = match.index + match[0].length; - - if (match[1]) return this.closingBracketBlock(session, match[1], row, i); - - return session.getCommentFoldRange(row, i, - 1); - }*/ - return; }; - /** - * finds the next 'END' for closing a fold range + * @returns {range} folding block for sequence that starts with 'CASE' or 'BEGIN' and ends with 'END' * @param {string} matchSequence - the sequence of charaters that started the fold widget, which should remain visible when the fold widget is folded */ - this.getEndBlock = function(session, row, column, matchSequence) { + this.getBeginEndBlock = function(session, row, column, matchSequence) { var start = { row: row, column: column + matchSequence.length }; var maxRow = session.getLength(); var line; - + var depth = 1; - var re = /\bEND\b/i; ///^\s*(?:\/\*|--)#(end)?region\b/; + var re = /(\bCASE\b|\bBEGIN\b)|(\bEND\b)/i; while (++row < maxRow) { line = session.getLine(row); var m = re.exec(line); if (!m) continue; - if (m[0]) depth--; - else depth++; - + if (m[1]) depth++; + else depth--; + if (!depth) break; } var endRow = row; if (endRow > start.row) { return new Range(start.row, start.column, endRow, line.length); } - - - /* var end = session.$findClosingBracket(bracket, start, typeRe); - if (!end) return; - - var fw = session.foldWidgets[end.row]; - if (fw == null) fw = session.getFoldWidget(end.row); - - if (fw == "start" && end.row > start.row) { - end.row--; - end.column = session.getLine(end.row).length; - } - return Range.fromPoints(start, end);*/ - }; - - - this.getCommentRegionBlock = function(session, line, row) { - var startColumn = line.search(/\s*$/); - var maxRow = session.getLength(); - var startRow = row; - - var re = /^\s*(?:\/\*|--)#(end)?region\b/; - var depth = 1; - while (++row < maxRow) { - line = session.getLine(row); - var m = re.exec(line); - if (!m) continue; - if (m[1]) depth--; - else depth++; - - if (!depth) break; - } - - var endRow = row; - if (endRow > startRow) { - return new Range(startRow, startColumn, endRow, line.length); - } }; }).call(FoldMode.prototype); From d38849ef9f2001c41a2cc93eeb0b0b7db70d2d68 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 08:24:59 -0400 Subject: [PATCH 14/26] added doc comment highlight to fix folding --- lib/ace/mode/folding/sqlserver.js | 12 ++++-------- lib/ace/mode/sqlserver_highlight_rules.js | 17 +++++++++++++++-- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/ace/mode/folding/sqlserver.js b/lib/ace/mode/folding/sqlserver.js index f91e9cf4..8ef3c71c 100644 --- a/lib/ace/mode/folding/sqlserver.js +++ b/lib/ace/mode/folding/sqlserver.js @@ -49,6 +49,7 @@ oop.inherits(FoldMode, BaseFoldMode); this.foldingStartMarker = /(\bCASE\b|\bBEGIN\b)|^\s*(\/\*)/i; this.foldingStopMarker = /^(\bEND\b)|^[\s\*]*(\*\/)/i; + // this.foldingStopMarker = /(\bEND\b)|^[\s\*]*(\*\/)/i;?need hat? // this.foldingStopMarker = /^(?!\bCASE\b|\bBEGIN\b)(\bEND\b)|^[\s\*]*(\*\/)/i; // this.foldingStopMarker = /^(?!\bCASE\b|\bBEGIN\b).*(\bEND\b)|^[\s\*]*(\*\/)/i; @@ -63,13 +64,9 @@ oop.inherits(FoldMode, BaseFoldMode); var match = line.match(this.foldingStartMarker); if (match) { var i = match.index; - //if first capturing group (CASE|BEGIN) if (match[1]) return this.getBeginEndBlock(session, row, i, match[1]); - - //still going: match is for second capturing group, which is blockcomment + var range = session.getCommentFoldRange(row, i + match[0].length, 1); - console.log('getCommentFoldRange',range); - if (range && !range.isMultiLine()) { if (forceMultiline) { range = this.getSectionRange(session, row); @@ -80,9 +77,8 @@ oop.inherits(FoldMode, BaseFoldMode); return range; } - - //no support for end folding markers yet - if (foldStyle === "markbegin") return; + + if (foldStyle === "markbegin") return; //no support for end folding markers yet return; }; diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index 70231a49..e2d26a32 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -32,6 +32,7 @@ define(function(require, exports, module) { "use strict"; var oop = require("../lib/oop"); +var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules; var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; var SqlServerHighlightRules = function() { @@ -167,7 +168,8 @@ var SqlServerHighlightRules = function() { }, { defaultToken: "string" }] - }, { + }, + DocCommentHighlightRules.getStartRule("doc-start"), { token: "comment", regex: "--.*$" }, { @@ -202,7 +204,16 @@ var SqlServerHighlightRules = function() { }, { token: "text", regex: "\\s+" - }] + }], + comment: [ + DocCommentHighlightRules.getTagRule(), { + token: "comment", + regex: "\\*\\/", + next: "no_regex" + }, { + defaultToken: "comment", + caseInsensitive: true + }], }; //add each set statment as regex at top of rules so that they are processed first because they require multiple words @@ -215,6 +226,8 @@ var SqlServerHighlightRules = function() { }); } + this.embedRules(DocCommentHighlightRules, "doc-", [DocCommentHighlightRules.getEndRule("start")]); + this.normalizeRules(); }; From 295ae4dc81c77dbd2f00d8d3d40491df341d202c Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 08:25:47 -0400 Subject: [PATCH 15/26] make pound optional for region --- lib/ace/mode/folding/cstyle.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/ace/mode/folding/cstyle.js b/lib/ace/mode/folding/cstyle.js index 75926331..6a6abca7 100644 --- a/lib/ace/mode/folding/cstyle.js +++ b/lib/ace/mode/folding/cstyle.js @@ -53,7 +53,7 @@ oop.inherits(FoldMode, BaseFoldMode); this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; - this.startRegionRe = /^\s*(\/\*|\/\/)#region\b/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; //prevent naming conflict with any modes that inherit from cstyle and override this (like csharp) this._getFoldWidgetBase = this.getFoldWidget; @@ -69,6 +69,8 @@ oop.inherits(FoldMode, BaseFoldMode); * * @example tripleStarFoldingSection * /*** this folds even though 1 line because it has 3 stars ***[/] + * + * @note the pound symbol for region tags is optional */ this.getFoldWidget = function(session, foldStyle, row) { var line = session.getLine(row); From a0a31e16a23006da8f14218b14ab556371a98c7a Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 08:27:22 -0400 Subject: [PATCH 16/26] cleanup --- lib/ace/mode/folding/sqlserver.js | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/ace/mode/folding/sqlserver.js b/lib/ace/mode/folding/sqlserver.js index 8ef3c71c..68b69907 100644 --- a/lib/ace/mode/folding/sqlserver.js +++ b/lib/ace/mode/folding/sqlserver.js @@ -44,16 +44,11 @@ oop.inherits(FoldMode, BaseFoldMode); * Inheriting cstyle folding because it handles the region comment folding * and special block comment folding appropriately. * - * Cstyle's getCommentRegionBlock() contains the sql comment characters '--'. + * Cstyle's getCommentRegionBlock() contains the sql comment characters '--' for end region block. */ this.foldingStartMarker = /(\bCASE\b|\bBEGIN\b)|^\s*(\/\*)/i; - this.foldingStopMarker = /^(\bEND\b)|^[\s\*]*(\*\/)/i; - // this.foldingStopMarker = /(\bEND\b)|^[\s\*]*(\*\/)/i;?need hat? - // this.foldingStopMarker = /^(?!\bCASE\b|\bBEGIN\b)(\bEND\b)|^[\s\*]*(\*\/)/i; - // this.foldingStopMarker = /^(?!\bCASE\b|\bBEGIN\b).*(\bEND\b)|^[\s\*]*(\*\/)/i; - - + this.foldingStopMarker = /(\bEND\b)|^[\s\*]*(\*\/)/i; this.startRegionRe = /^\s*(\/\*|--)#?region\b/; this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { @@ -65,19 +60,19 @@ oop.inherits(FoldMode, BaseFoldMode); if (match) { var i = match.index; if (match[1]) return this.getBeginEndBlock(session, row, i, match[1]); - + var range = session.getCommentFoldRange(row, i + match[0].length, 1); if (range && !range.isMultiLine()) { if (forceMultiline) { range = this.getSectionRange(session, row); - console.log('getSectionRange',range); + console.log('getSectionRange', range); } else if (foldStyle != "all") range = null; } return range; } - + if (foldStyle === "markbegin") return; //no support for end folding markers yet return; }; From 0d0b0b4356ee8413ef7e9bb859342e76f3bd428e Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 08:45:13 -0400 Subject: [PATCH 17/26] updated demo doc and snippets --- demo/kitchen-sink/docs/sqlserver.sqlserver | 16 ++++++++++++--- lib/ace/snippets/sqlserver.snippets | 24 +++++++++++++++++----- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/demo/kitchen-sink/docs/sqlserver.sqlserver b/demo/kitchen-sink/docs/sqlserver.sqlserver index cf747864..5898fada 100644 --- a/demo/kitchen-sink/docs/sqlserver.sqlserver +++ b/demo/kitchen-sink/docs/sqlserver.sqlserver @@ -4,6 +4,7 @@ -- 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) +-- This mode imitates SSMS and it designed to be used with SQL Server theme. -- ============================================= CREATE PROCEDURE dbo.TestProcedure @@ -27,20 +28,29 @@ BEGIN * These comments will produce a fold widget */ + -- folding demonstration SET @vint = CASE WHEN @vdate IS NULL THEN 1 ELSE 2 END - - + + -- another folding demonstration IF @vint = 1 BEGIN SET @vvarchar='one' SET @vint = DATEDIFFT(dd, @vdate, @vdatetime) END - + -- this mode handles strings properly + DECLARE @sql nvarchar(4000) = N'SELECT TOP(1) OrderID + FROM Orders + WHERE @OrderDate > GETDATE()' + + -- this mode is aware of build in stored procedures + sp_executesql @sql + + -- demonstrating some syntax highlighting SELECT Orders.OrderID ,Customers.CompanyName ,DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS FirstDayOfYear diff --git a/lib/ace/snippets/sqlserver.snippets b/lib/ace/snippets/sqlserver.snippets index 97c197dc..51c00ae4 100644 --- a/lib/ace/snippets/sqlserver.snippets +++ b/lib/ace/snippets/sqlserver.snippets @@ -15,7 +15,7 @@ snippet datepart DATEPART(${1:datepart}, ${2:date}) # DATEDIFF snippet datediff - DATEDIFFT(${1:datepart}, ${2:startdate}, ${3:enddate}) + DATEDIFF(${1:datepart}, ${2:startdate}, ${3:enddate}) # DATEADD snippet dateadd DATEADD(${1:datepart}, ${2:number}, ${3:date}) @@ -33,10 +33,24 @@ snippet createproc -- 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 added to prevent extra result sets from interfering with SELECT statements. SET NOCOUNT ON; - - -- Insert statements for procedure here + END GO +# Create Scalar Function +snippet createfn + -- ============================================= + -- Author: ${1:Author} + -- Create date: ${2:Date} + -- Description: ${3:Description} + -- ============================================= + CREATE FUNCTION ${4:Scalar_Function_Name} + -- Add the parameters for the function here + RETURNS ${5:Function_Data_Type} + AS + BEGIN + DECLARE @Result ${5:Function_Data_Type} + + END + GO \ No newline at end of file From 32847a6761d4dfe1fc7437fc6818d5216e5855e3 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 08:53:11 -0400 Subject: [PATCH 18/26] clean up --- lib/ace/mode/sqlserver_highlight_rules.js | 73 ++++++++++------------- 1 file changed, 30 insertions(+), 43 deletions(-) diff --git a/lib/ace/mode/sqlserver_highlight_rules.js b/lib/ace/mode/sqlserver_highlight_rules.js index e2d26a32..3a897ed4 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -38,22 +38,15 @@ var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; var SqlServerHighlightRules = function() { /** * Transact-SQL Syntax Conventions: https://msdn.microsoft.com/en-us/library/ms177563.aspx - * each section has a link and some javacript code. - * go to the link, open dev tools, run code to get the string. - * - * Right now this code is optimized to make it easy for a developer to modify. - * Once I'm certain that this is not missing anything it can be 'compiled' into a cleaner/faster format that is not executing stuff on the fly for no reason. + * Goal: make this imitate SSMS (SQL Server Managment Studio) */ - + // https://msdn.microsoft.com/en-us/library/ms189773.aspx var logicalOperators = "ALL|AND|ANY|BETWEEN|EXISTS|IN|LIKE|NOT|OR|SOME"; - logicalOperators+= "|NULL|IS|APPLY|INNER|OUTER|LEFT|RIGHT|JOIN|CROSS";//SSMS colors these gray too + logicalOperators += "|NULL|IS|APPLY|INNER|OUTER|LEFT|RIGHT|JOIN|CROSS"; //SSMS colors these gray too //note: manually removed LEFT and RIGHT from built in functions below to color it same way SSMS does - - - // multiple pages for built in functions, the following code works for all - // var r = []; $('.tableSection').find('td').find('a').each(function() { var t = $(this).text().trim().toUpperCase(); /*dont add things with spaces */ if (t.indexOf(' ') !== -1) return; r.push(t); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|') + '|'); + var builtinFunctions = ( /* https://msdn.microsoft.com/en-us/library/ms187957.aspx */ "OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML|" + @@ -63,19 +56,19 @@ var SqlServerHighlightRules = function() { "DENSE_RANK|NTILE|RANK|ROW_NUMBER" + /* https://msdn.microsoft.com/en-us/library/ms173823.aspx */ "@@DATEFIRST|@@DBTS|@@LANGID|@@LANGUAGE|@@LOCK_TIMEOUT|@@MAX_CONNECTIONS|@@MAX_PRECISION|@@NESTLEVEL|@@OPTIONS|@@REMSERVER|@@SERVERNAME|@@SERVICENAME|@@SPID|@@TEXTSIZE|@@VERSION|" + - /* https://msdn.microsoft.com/en-us/library/hh231076.aspx (MANUAL) */ + /* https://msdn.microsoft.com/en-us/library/hh231076.aspx */ "CAST|CONVERT|PARSE|TRY_CAST|TRY_CONVERT|TRY_PARSE" + /* https://msdn.microsoft.com/en-us/library/ms186285.aspx */ "@@CURSOR_ROWS|@@FETCH_STATUS|CURSOR_STATUS|" + - /* https://msdn.microsoft.com/en-us/library/ms186724.aspx (MANUAL) */ + /* https://msdn.microsoft.com/en-us/library/ms186724.aspx */ "@@DATEFIRST|@@LANGUAGE|CURRENT_TIMESTAMP|DATEADD|DATEDIFF|DATEFROMPARTS|DATENAME|DATEPART|DATETIME2FROMPARTS|DATETIMEFROMPARTS|DATETIMEOFFSETFROMPARTS|DAY|EOMONTH|GETDATE|GETUTCDATE|ISDATE|MONTH|SET DATEFIRST|SET DATEFORMAT|SET LANGUAGE|SMALLDATETIMEFROMPARTS|SP_HELPLANGUAGE|SWITCHOFFSET|SYSDATETIME|SYSDATETIMEOFFSET|SYSUTCDATETIME|TIMEFROMPARTS|TODATETIMEOFFSET|YEAR|" + - /* https://msdn.microsoft.com/en-us/library/hh213226.aspx (MANUAL) */ + /* https://msdn.microsoft.com/en-us/library/hh213226.aspx */ "CHOOSE|IIF|" + /* https://msdn.microsoft.com/en-us/library/ms177516.aspx */ "ABS|ACOS|ASIN|ATAN|ATN2|CEILING|COS|COT|DEGREES|EXP|FLOOR|LOG|LOG10|PI|POWER|RADIANS|RAND|ROUND|SIGN|SIN|SQRT|SQUARE|TAN|" + /* https://msdn.microsoft.com/en-us/library/ms187812.aspx */ "@@PROCID|APPLOCK_MODE|APPLOCK_TEST|APP_NAME|ASSEMBLYPROPERTY|COLUMNPROPERTY|COL_LENGTH|COL_NAME|DATABASEPROPERTYEX|DATABASE_PRINCIPAL_ID|DB_ID|DB_NAME|FILEGROUPPROPERTY|FILEGROUP_ID|FILEGROUP_NAME|FILEPROPERTY|FILE_ID|FILE_IDEX|FILE_NAME|FULLTEXTCATALOGPROPERTY|FULLTEXTSERVICEPROPERTY|INDEXKEY_PROPERTY|INDEXPROPERTY|INDEX_COL|OBJECTPROPERTY|OBJECTPROPERTYEX|OBJECT_DEFINITION|OBJECT_ID|OBJECT_NAME|OBJECT_SCHEMA_NAME|ORIGINAL_DB_NAME|PARSENAME|SCHEMA_ID|SCHEMA_NAME|SCOPE_IDENTITY|SERVERPROPERTY|STATS_DATE|TYPEPROPERTY|TYPE_ID|TYPE_NAME|" + - /* https://msdn.microsoft.com/en-us/library/ms186236.aspx (MANUAL) */ + /* https://msdn.microsoft.com/en-us/library/ms186236.aspx */ "CERTENCODED|CERTPRIVATEKEY|CURRENT_USER|DATABASE_PRINCIPAL_ID|HAS_PERMS_BY_NAME|IS_MEMBER|IS_ROLEMEMBER|IS_SRVROLEMEMBER|ORIGINAL_LOGIN|PERMISSIONS|PWDCOMPARE|PWDENCRYPT|SCHEMA_ID|SCHEMA_NAME|SESSION_USER|SUSER_ID|SUSER_NAME|SUSER_SID|SUSER_SNAME|SYS.FN_BUILTIN_PERMISSIONS|SYS.FN_GET_AUDIT_FILE|SYS.FN_MY_PERMISSIONS|SYSTEM_USER|USER_ID|USER_NAME|" + /* https://msdn.microsoft.com/en-us/library/ms181984.aspx */ "ASCII|CHAR|CHARINDEX|CONCAT|DIFFERENCE|FORMAT|LEN|LOWER|LTRIM|NCHAR|PATINDEX|QUOTENAME|REPLACE|REPLICATE|REVERSE|RTRIM|SOUNDEX|SPACE|STR|STUFF|SUBSTRING|UNICODE|UPPER|" + @@ -86,42 +79,37 @@ var SqlServerHighlightRules = function() { /* https://msdn.microsoft.com/en-us/library/ms188353.aspx */ "PATINDEX|TEXTPTR|TEXTVALID" ); - + // https://msdn.microsoft.com/en-us/library/ms187752.aspx - // var r = []; $('.tableSection').find('td').find('a').each(function() { var t = $(this).text().trim().toUpperCase(); /*dont add things with spaces */ if (t.indexOf(' ') !== -1) return; r.push($(this).text().trim().toUpperCase()); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|')); - var dataTypes = ( - "BIGINT|BINARY|BIT|CHAR|CURSOR|DATE|DATETIME|DATETIME2|DATETIMEOFFSET|DECIMAL|FLOAT|HIERARCHYID|IMAGE|INT|MONEY|NCHAR|NTEXT|NUMERIC|NVARCHAR|REAL|SMALLDATETIME|SMALLINT|SMALLMONEY|SQL_VARIANT|TABLE|TEXT|TIME|TIMESTAMP|TINYINT|UNIQUEIDENTIFIER|VARBINARY|VARCHAR|XML" - ); + var dataTypes = ("BIGINT|BINARY|BIT|CHAR|CURSOR|DATE|DATETIME|DATETIME2|DATETIMEOFFSET|DECIMAL|FLOAT|HIERARCHYID|IMAGE|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! + + //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 r = []; $('.tableSection').find('td').each(function() { r.push($(this).text().trim()); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|')); 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"; - //add table hints and query hints (many overlap): https://msdn.microsoft.com/en-us/library/ms187373.aspx - // https://msdn.microsoft.com/en-us/library/ms181714.aspx + + // 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"; - //add join hints: https://msdn.microsoft.com/en-us/library/ms173815.aspx + // https://msdn.microsoft.com/en-us/library/ms173815.aspx keywords += "|LOOP|HASH|MERGE|REMOTE"; - //https://msdn.microsoft.com/en-us/library/ms175976.aspx -seems messed up that microsofts offical reserved words does not contain these... + // https://msdn.microsoft.com/en-us/library/ms175976.aspx keywords += "|TRY|CATCH|THROW"; - //highlighted words in SSMS that I'm not even sure where they come from + // highlighted words in SSMS that I'm not even sure where they come from keywords += "|TYPE"; - + //remove any other built in things from key word 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, @@ -129,9 +117,9 @@ 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. + + + // 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 for (var i = 0; i < this.$keywordList.length; i++) { @@ -139,12 +127,10 @@ var SqlServerHighlightRules = function() { if (builtInStoredProcedures.indexOf(keyword) !== -1) continue; this.$keywordList[i] = keyword.toUpperCase(); } - - + + //https://msdn.microsoft.com/en-us/library/ms190356.aspx - // var r = []; $('.tableSection').find('td').find('a').each(function() { var t = $(this).text().trim().toUpperCase(); r.push($(this).text().trim().toUpperCase()); }); r = r.filter(function(value, index, self) { return self.indexOf(value) === index; }); r.sort(); console.log(r.join('|')); 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]); @@ -153,6 +139,7 @@ var SqlServerHighlightRules = function() { for (var i = 0; i < setStatements.length; i++) { this.$keywordList.push(setStatements[i]); } + this.$rules = { start: [{ @@ -215,19 +202,19 @@ 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 for (var i = 0; i < setStatements.length; i++) { var statement = setStatements[i]; this.$rules.start.unshift({ token: "set.statement", - regex: statement //"("+statement+")(| ON| OFF)"// new RegExp(statement, 'i') + regex: statement }); } - + this.embedRules(DocCommentHighlightRules, "doc-", [DocCommentHighlightRules.getEndRule("start")]); - + this.normalizeRules(); }; From 75f66697f62c86a2efcdcb99301df02476741271 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 08:55:29 -0400 Subject: [PATCH 19/26] more cleanup --- lib/ace/ext/themelist.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ace/ext/themelist.js b/lib/ace/ext/themelist.js index f96d88ad..bf743f9e 100644 --- a/lib/ace/ext/themelist.js +++ b/lib/ace/ext/themelist.js @@ -57,7 +57,6 @@ var themeData = [ ["XCode" ], ["Kuroir"], ["KatzenMilch"], - // ["SQL Server"], ["SQL Server" ,"sqlserver" , "light"], ["Ambiance" ,"ambiance" , "dark"], ["Chaos" ,"chaos" , "dark"], From 37a80b35dadeb39022eae5cf47f500e2c143ab6c Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 09:05:36 -0400 Subject: [PATCH 20/26] missing execute in demo doc --- demo/kitchen-sink/docs/sqlserver.sqlserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/kitchen-sink/docs/sqlserver.sqlserver b/demo/kitchen-sink/docs/sqlserver.sqlserver index 5898fada..14e3c1c5 100644 --- a/demo/kitchen-sink/docs/sqlserver.sqlserver +++ b/demo/kitchen-sink/docs/sqlserver.sqlserver @@ -48,7 +48,7 @@ BEGIN WHERE @OrderDate > GETDATE()' -- this mode is aware of build in stored procedures - sp_executesql @sql + EXECUTE sp_executesql @sql -- demonstrating some syntax highlighting SELECT Orders.OrderID From db0313f2ad6c2658ae47fe58d04ace4a28e7a5d8 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 09:09:05 -0400 Subject: [PATCH 21/26] fix case --- demo/kitchen-sink/docs/sqlserver.sqlserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/kitchen-sink/docs/sqlserver.sqlserver b/demo/kitchen-sink/docs/sqlserver.sqlserver index 14e3c1c5..151d3a5c 100644 --- a/demo/kitchen-sink/docs/sqlserver.sqlserver +++ b/demo/kitchen-sink/docs/sqlserver.sqlserver @@ -43,7 +43,7 @@ BEGIN END -- this mode handles strings properly - DECLARE @sql nvarchar(4000) = N'SELECT TOP(1) OrderID + DECLARE @sql NVARCHAR(4000) = N'SELECT TOP(1) OrderID FROM Orders WHERE @OrderDate > GETDATE()' From 282331b133b65fd78d0a272313ceeddd01bdcca0 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 09:12:11 -0400 Subject: [PATCH 22/26] use pound as its the typical method --- demo/kitchen-sink/docs/sqlserver.sqlserver | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/demo/kitchen-sink/docs/sqlserver.sqlserver b/demo/kitchen-sink/docs/sqlserver.sqlserver index 151d3a5c..329930af 100644 --- a/demo/kitchen-sink/docs/sqlserver.sqlserver +++ b/demo/kitchen-sink/docs/sqlserver.sqlserver @@ -8,21 +8,21 @@ -- ============================================= CREATE PROCEDURE dbo.TestProcedure ---region parameters +--#region parameters @vint INT = 1 ,@vdate DATE = NULL ,@vdatetime DATETIME = DATEADD (dd, 1, GETDATE()) ,@vvarchar VARCHAR(MAX) = '' ---endregion +--#endregion AS BEGIN - /*region set statements */ + /*#region set statements */ SET NOCOUNT ON; SET XACT_ABORT ON; SET QUOTED_IDENTIFIER ON; - /*endregion*/ + /*#endregion*/ /** * These comments will produce a fold widget From cd1c5a42c9d8a92e50d53f49146feb9ff85486aa Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 09:21:09 -0400 Subject: [PATCH 23/26] cleanup --- lib/ace/theme/sqlserver.css | 136 ++++++++++++++++-------------------- 1 file changed, 59 insertions(+), 77 deletions(-) diff --git a/lib/ace/theme/sqlserver.css b/lib/ace/theme/sqlserver.css index 95c6f36e..ff6d1e1c 100644 --- a/lib/ace/theme/sqlserver.css +++ b/lib/ace/theme/sqlserver.css @@ -1,189 +1,171 @@ - -.ace_line{ - font-family:Consolas +.ace_line { + font-family: Consolas; } + .ace-sqlserver .ace_gutter { - background: #ebebeb; - color: #333; - overflow : hidden; + background: #ebebeb; + color: #333; + overflow: hidden; } .ace-sqlserver .ace_print-margin { - width: 1px; - background: #e8e8e8; + width: 1px; + background: #e8e8e8; } .ace-sqlserver { - background-color: #FFFFFF; - color: black; -} - -.ace-sqlserver .ace_identifier{ - /*color: #008080;*/ - color:black; -} - - -.ace-sqlserver .ace_keyword{ - color: #0000FF; - /*text-transform: uppercase;*/ -} - - -.ace-sqlserver .ace_numeric{ + background-color: #FFFFFF; color: black; } -.ace-sqlserver .ace_storage{ - /*color: #979797;*/ +.ace-sqlserver .ace_identifier { + color: black; +} + +.ace-sqlserver .ace_keyword { + color: #0000FF; +} + +.ace-sqlserver .ace_numeric { + color: black; +} + +.ace-sqlserver .ace_storage { color: #11B7BE; - /*color: #00A2FF;*/ - /*font-style: italic;*/ - /*text-transform: uppercase;*/ } .ace-sqlserver .ace_keyword.ace_operator, .ace-sqlserver .ace_lparen, .ace-sqlserver .ace_rparen, -.ace-sqlserver .ace_punctuation{ +.ace-sqlserver .ace_punctuation { color: #808080; } - -.ace-sqlserver .ace_set.ace_statement{ - /*color: #11B7BE;*/ +.ace-sqlserver .ace_set.ace_statement { color: #0000FF; - /*font-style:italic;*/ - text-decoration:underline; + text-decoration: underline; } - .ace-sqlserver .ace_cursor { - color: black; + color: black; } .ace-sqlserver .ace_invisible { - color: rgb(191, 191, 191); + color: rgb(191, 191, 191); } .ace-sqlserver .ace_constant.ace_buildin { - color: rgb(88, 72, 246); + color: rgb(88, 72, 246); } .ace-sqlserver .ace_constant.ace_language { color: #979797; - /*font-style: italic;*/ } .ace-sqlserver .ace_constant.ace_library { - color: rgb(6, 150, 14); + color: rgb(6, 150, 14); } .ace-sqlserver .ace_invalid { - background-color: rgb(153, 0, 0); - color: white; + background-color: rgb(153, 0, 0); + color: white; } .ace-sqlserver .ace_support.ace_function { color: #FF00FF; - /*text-transform: uppercase;*/ } .ace-sqlserver .ace_support.ace_constant { - color: rgb(6, 150, 14); + color: rgb(6, 150, 14); } -/*.ace-sqlserver .ace_support.ace_type, -.ace-sqlserver .ace_support*/ - -.ace-sqlserver .ace_class{ - /*font-style:italic;*/ - color: #008080; +.ace-sqlserver .ace_class { + color: #008080; } + .ace-sqlserver .ace_support.ace_other { - color: #6D79DE; + color: #6D79DE; } .ace-sqlserver .ace_variable.ace_parameter { - font-style:italic; - color:#FD971F; + font-style: italic; + color: #FD971F; } .ace-sqlserver .ace_comment { - color:#008000; + color: #008000; } .ace-sqlserver .ace_constant.ace_numeric { - color: rgb(0, 0, 205); + color: black; } .ace-sqlserver .ace_variable { - color: rgb(49, 132, 149); + color: rgb(49, 132, 149); } .ace-sqlserver .ace_xml-pe { - color: rgb(104, 104, 91); + color: rgb(104, 104, 91); } .ace-sqlserver .ace_support.ace_storedprocedure { - color: #800000; + color: #800000; } - .ace-sqlserver .ace_heading { - color: rgb(12, 7, 255); + color: rgb(12, 7, 255); } .ace-sqlserver .ace_list { - color:rgb(185, 6, 144); + color: rgb(185, 6, 144); } .ace-sqlserver .ace_marker-layer .ace_selection { - background: rgb(181, 213, 255); + background: rgb(181, 213, 255); } .ace-sqlserver .ace_marker-layer .ace_step { - background: rgb(252, 255, 0); + background: rgb(252, 255, 0); } .ace-sqlserver .ace_marker-layer .ace_stack { - background: rgb(164, 229, 101); + background: rgb(164, 229, 101); } .ace-sqlserver .ace_marker-layer .ace_bracket { - margin: -1px 0 0 -1px; - border: 1px solid rgb(192, 192, 192); + margin: -1px 0 0 -1px; + border: 1px solid rgb(192, 192, 192); } .ace-sqlserver .ace_marker-layer .ace_active-line { - background: rgba(0, 0, 0, 0.07); + background: rgba(0, 0, 0, 0.07); } .ace-sqlserver .ace_gutter-active-line { - background-color : #dcdcdc; + background-color: #dcdcdc; } .ace-sqlserver .ace_marker-layer .ace_selected-word { - background: rgb(250, 250, 255); - border: 1px solid rgb(200, 200, 250); + background: rgb(250, 250, 255); + border: 1px solid rgb(200, 200, 250); } .ace-sqlserver .ace_meta.ace_tag { - color: #0000FF; + color: #0000FF; } .ace-sqlserver .ace_string.ace_regex { - color: #FF0000; + color: #FF0000; } .ace-sqlserver .ace_string { - color: #FF0000; + color: #FF0000; } .ace-sqlserver .ace_entity.ace_other.ace_attribute-name { - color: #994409; + color: #994409; } .ace-sqlserver .ace_indent-guide { - background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y; + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y; } From 846c2fb3d30e14943fae496ec77753561842f184 Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 09:35:39 -0400 Subject: [PATCH 24/26] fix space --- lib/ace/ext/themelist.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/ext/themelist.js b/lib/ace/ext/themelist.js index bf743f9e..4e3f0ad7 100644 --- a/lib/ace/ext/themelist.js +++ b/lib/ace/ext/themelist.js @@ -57,7 +57,7 @@ var themeData = [ ["XCode" ], ["Kuroir"], ["KatzenMilch"], - ["SQL Server" ,"sqlserver" , "light"], + ["SQL Server" ,"sqlserver" , "light"], ["Ambiance" ,"ambiance" , "dark"], ["Chaos" ,"chaos" , "dark"], ["Clouds Midnight" ,"clouds_midnight" , "dark"], From 121e0e51f4f807af7aafc573c2e8b9c5165cb61e Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 09:43:13 -0400 Subject: [PATCH 25/26] add integer --- 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 3a897ed4..42e193d7 100644 --- a/lib/ace/mode/sqlserver_highlight_rules.js +++ b/lib/ace/mode/sqlserver_highlight_rules.js @@ -82,7 +82,7 @@ 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|INT|MONEY|NCHAR|NTEXT|NUMERIC|NVARCHAR|REAL|SMALLDATETIME|SMALLINT|SMALLMONEY|SQL_VARIANT|TABLE|TEXT|TIME|TIMESTAMP|TINYINT|UNIQUEIDENTIFIER|VARBINARY|VARCHAR|XML"); + 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!) From 73808101cde01e62fdad91864fe33c2e290a197e Mon Sep 17 00:00:00 2001 From: sevin7676 Date: Sat, 18 Apr 2015 10:06:55 -0400 Subject: [PATCH 26/26] cleanup --- lib/ace/mode/folding/sqlserver.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ace/mode/folding/sqlserver.js b/lib/ace/mode/folding/sqlserver.js index 68b69907..b3fd4e93 100644 --- a/lib/ace/mode/folding/sqlserver.js +++ b/lib/ace/mode/folding/sqlserver.js @@ -48,7 +48,7 @@ oop.inherits(FoldMode, BaseFoldMode); */ this.foldingStartMarker = /(\bCASE\b|\bBEGIN\b)|^\s*(\/\*)/i; - this.foldingStopMarker = /(\bEND\b)|^[\s\*]*(\*\/)/i; + // this.foldingStopMarker = /(\bEND\b)|^[\s\*]*(\*\/)/i; this.startRegionRe = /^\s*(\/\*|--)#?region\b/; this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { @@ -65,7 +65,6 @@ oop.inherits(FoldMode, BaseFoldMode); if (range && !range.isMultiLine()) { if (forceMultiline) { range = this.getSectionRange(session, row); - console.log('getSectionRange', range); } else if (foldStyle != "all") range = null; } @@ -73,7 +72,8 @@ oop.inherits(FoldMode, BaseFoldMode); return range; } - if (foldStyle === "markbegin") return; //no support for end folding markers yet + if (foldStyle === "markbegin") return; + //TODO: add support for end folding markers return; };