From 02ca487e8ca4d56f2cbd1b738eae8f814688b5eb Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 27 Nov 2020 14:03:48 -0500 Subject: [PATCH] fix(kotlin) fix poly backtracking issue - Use same numeric mode rules as for Java --- src/languages/java.js | 38 +++----------------------------------- src/languages/kotlin.js | 22 +++------------------- src/languages/lib/java.js | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 54 deletions(-) create mode 100644 src/languages/lib/java.js diff --git a/src/languages/java.js b/src/languages/java.js index 9b7c83fb7a..8cf86c43cc 100644 --- a/src/languages/java.js +++ b/src/languages/java.js @@ -5,6 +5,8 @@ Category: common, enterprise Website: https://www.java.com/ */ +import { NUMERIC } from "./lib/java.js"; + export default function(hljs) { var JAVA_IDENT_RE = '[\u00C0-\u02B8a-zA-Z_$][\u00C0-\u02B8a-zA-Z_$0-9]*'; var GENERIC_IDENT_RE = JAVA_IDENT_RE + '(<' + JAVA_IDENT_RE + '(\\s*,\\s*' + JAVA_IDENT_RE + ')*>)?'; @@ -25,41 +27,7 @@ export default function(hljs) { }, ] }; - - // https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10 - var decimalDigits = '[0-9](_*[0-9])*'; - var frac = `\\.(${decimalDigits})`; - var hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*'; - var NUMBER = { - className: 'number', - variants: [ - // DecimalFloatingPointLiteral - // including ExponentPart - { begin: `(\\b(${decimalDigits})((${frac})|\\.)?|(${frac}))` + - `[eE][+-]?(${decimalDigits})[fFdD]?\\b` }, - // excluding ExponentPart - { begin: `\\b(${decimalDigits})((${frac})[fFdD]?\\b|\\.([fFdD]\\b)?)` }, - { begin: `(${frac})[fFdD]?\\b` }, - { begin: `\\b(${decimalDigits})[fFdD]\\b` }, - - // HexadecimalFloatingPointLiteral - { begin: `\\b0[xX]((${hexDigits})\\.?|(${hexDigits})?\\.(${hexDigits}))` + - `[pP][+-]?(${decimalDigits})[fFdD]?\\b` }, - - // DecimalIntegerLiteral - { begin: '\\b(0|[1-9](_*[0-9])*)[lL]?\\b' }, - - // HexIntegerLiteral - { begin: `\\b0[xX](${hexDigits})[lL]?\\b` }, - - // OctalIntegerLiteral - { begin: '\\b0(_*[0-7])*[lL]?\\b' }, - - // BinaryIntegerLiteral - { begin: '\\b0[bB][01](_*[01])*[lL]?\\b' }, - ], - relevance: 0 - }; + const NUMBER = NUMERIC; return { name: 'Java', diff --git a/src/languages/kotlin.js b/src/languages/kotlin.js index aec81c6325..16b8ef785e 100644 --- a/src/languages/kotlin.js +++ b/src/languages/kotlin.js @@ -6,6 +6,8 @@ Category: common */ +import { NUMERIC } from "./lib/java.js"; + export default function(hljs) { const KEYWORDS = { keyword: @@ -104,25 +106,7 @@ export default function(hljs) { // https://kotlinlang.org/docs/reference/whatsnew11.html#underscores-in-numeric-literals // According to the doc above, the number mode of kotlin is the same as java 8, // so the code below is copied from java.js - const KOTLIN_NUMBER_RE = '\\b' + - '(' + - '0[bB]([01]+[01_]+[01]+|[01]+)' + // 0b... - '|' + - '0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)' + // 0x... - '|' + - '(' + - '([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?' + - '|' + - '\\.([\\d]+[\\d_]+[\\d]+|[\\d]+)' + - ')' + - '([eE][-+]?\\d+)?' + // octal, decimal, float - ')' + - '[lLfF]?'; - const KOTLIN_NUMBER_MODE = { - className: 'number', - begin: KOTLIN_NUMBER_RE, - relevance: 0 - }; + const KOTLIN_NUMBER_MODE = NUMERIC; const KOTLIN_NESTED_COMMENT = hljs.COMMENT( '/\\*', '\\*/', { diff --git a/src/languages/lib/java.js b/src/languages/lib/java.js new file mode 100644 index 0000000000..f855643461 --- /dev/null +++ b/src/languages/lib/java.js @@ -0,0 +1,35 @@ + +// https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10 +var decimalDigits = '[0-9](_*[0-9])*'; +var frac = `\\.(${decimalDigits})`; +var hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*'; +export var NUMERIC = { + className: 'number', + variants: [ + // DecimalFloatingPointLiteral + // including ExponentPart + { begin: `(\\b(${decimalDigits})((${frac})|\\.)?|(${frac}))` + + `[eE][+-]?(${decimalDigits})[fFdD]?\\b` }, + // excluding ExponentPart + { begin: `\\b(${decimalDigits})((${frac})[fFdD]?\\b|\\.([fFdD]\\b)?)` }, + { begin: `(${frac})[fFdD]?\\b` }, + { begin: `\\b(${decimalDigits})[fFdD]\\b` }, + + // HexadecimalFloatingPointLiteral + { begin: `\\b0[xX]((${hexDigits})\\.?|(${hexDigits})?\\.(${hexDigits}))` + + `[pP][+-]?(${decimalDigits})[fFdD]?\\b` }, + + // DecimalIntegerLiteral + { begin: '\\b(0|[1-9](_*[0-9])*)[lL]?\\b' }, + + // HexIntegerLiteral + { begin: `\\b0[xX](${hexDigits})[lL]?\\b` }, + + // OctalIntegerLiteral + { begin: '\\b0(_*[0-7])*[lL]?\\b' }, + + // BinaryIntegerLiteral + { begin: '\\b0[bB][01](_*[01])*[lL]?\\b' }, + ], + relevance: 0 +};