Index: Source/devtools/front_end/cm/clike.js |
diff --git a/Source/devtools/front_end/cm/clike.js b/Source/devtools/front_end/cm/clike.js |
index f6626cd0ea210aec1f27525257d0680a800a3100..3e253624b48236cc9927401f5d9f6ac0b5b2b1b5 100644 |
--- a/Source/devtools/front_end/cm/clike.js |
+++ b/Source/devtools/front_end/cm/clike.js |
@@ -1,3 +1,16 @@ |
+// CodeMirror, copyright (c) by Marijn Haverbeke and others |
+// Distributed under an MIT license: http://codemirror.net/LICENSE |
+ |
+(function(mod) { |
+ if (typeof exports == "object" && typeof module == "object") // CommonJS |
+ mod(require("../../lib/codemirror")); |
+ else if (typeof define == "function" && define.amd) // AMD |
+ define(["../../lib/codemirror"], mod); |
+ else // Plain browser env |
+ mod(CodeMirror); |
+})(function(CodeMirror) { |
+"use strict"; |
+ |
CodeMirror.defineMode("clike", function(config, parserConfig) { |
var indentUnit = config.indentUnit, |
statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, |
@@ -163,7 +176,6 @@ CodeMirror.defineMode("clike", function(config, parserConfig) { |
}; |
}); |
-(function() { |
function words(str) { |
var obj = {}, words = str.split(" "); |
for (var i = 0; i < words.length; ++i) obj[words[i]] = true; |
@@ -191,6 +203,30 @@ CodeMirror.defineMode("clike", function(config, parserConfig) { |
return "meta"; |
} |
+ function cpp11StringHook(stream, state) { |
+ stream.backUp(1); |
+ // Raw strings. |
+ if (stream.match(/(R|u8R|uR|UR|LR)/)) { |
+ var match = stream.match(/"([^\s\\()]{0,16})\(/); |
+ if (!match) { |
+ return false; |
+ } |
+ state.cpp11RawStringDelim = match[1]; |
+ state.tokenize = tokenRawString; |
+ return tokenRawString(stream, state); |
+ } |
+ // Unicode strings/chars. |
+ if (stream.match(/(u8|u|U|L)/)) { |
+ if (stream.match(/["']/, /* eat */ false)) { |
+ return "string"; |
+ } |
+ return false; |
+ } |
+ // Ignore this hook. |
+ stream.next(); |
+ return false; |
+ } |
+ |
// C#-style strings where "" escapes a quote. |
function tokenAtString(stream, state) { |
var next; |
@@ -203,28 +239,66 @@ CodeMirror.defineMode("clike", function(config, parserConfig) { |
return "string"; |
} |
- function mimes(ms, mode) { |
- for (var i = 0; i < ms.length; ++i) CodeMirror.defineMIME(ms[i], mode); |
+ // C++11 raw string literal is <prefix>"<delim>( anything )<delim>", where |
+ // <delim> can be a string up to 16 characters long. |
+ function tokenRawString(stream, state) { |
+ // Escape characters that have special regex meanings. |
+ var delim = state.cpp11RawStringDelim.replace(/[^\w\s]/g, '\\$&'); |
+ var match = stream.match(new RegExp(".*?\\)" + delim + '"')); |
+ if (match) |
+ state.tokenize = null; |
+ else |
+ stream.skipToEnd(); |
+ return "string"; |
} |
- mimes(["text/x-csrc", "text/x-c", "text/x-chdr"], { |
+ function def(mimes, mode) { |
+ if (typeof mimes == "string") mimes = [mimes]; |
+ var words = []; |
+ function add(obj) { |
+ if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop)) |
+ words.push(prop); |
+ } |
+ add(mode.keywords); |
+ add(mode.builtin); |
+ add(mode.atoms); |
+ if (words.length) { |
+ mode.helperType = mimes[0]; |
+ CodeMirror.registerHelper("hintWords", mimes[0], words); |
+ } |
+ |
+ for (var i = 0; i < mimes.length; ++i) |
+ CodeMirror.defineMIME(mimes[i], mode); |
+ } |
+ |
+ def(["text/x-csrc", "text/x-c", "text/x-chdr"], { |
name: "clike", |
keywords: words(cKeywords), |
blockKeywords: words("case do else for if switch while struct"), |
atoms: words("null"), |
- hooks: {"#": cppHook} |
+ hooks: {"#": cppHook}, |
+ modeProps: {fold: ["brace", "include"]} |
}); |
- mimes(["text/x-c++src", "text/x-c++hdr"], { |
+ |
+ def(["text/x-c++src", "text/x-c++hdr"], { |
name: "clike", |
keywords: words(cKeywords + " asm dynamic_cast namespace reinterpret_cast try bool explicit new " + |
"static_cast typeid catch operator template typename class friend private " + |
"this using const_cast inline public throw virtual delete mutable protected " + |
- "wchar_t"), |
+ "wchar_t alignas alignof constexpr decltype nullptr noexcept thread_local final " + |
+ "static_assert override"), |
blockKeywords: words("catch class do else finally for if struct switch try while"), |
atoms: words("true false null"), |
- hooks: {"#": cppHook} |
+ hooks: { |
+ "#": cppHook, |
+ "u": cpp11StringHook, |
+ "U": cpp11StringHook, |
+ "L": cpp11StringHook, |
+ "R": cpp11StringHook |
+ }, |
+ modeProps: {fold: ["brace", "include"]} |
}); |
- CodeMirror.defineMIME("text/x-java", { |
+ def("text/x-java", { |
name: "clike", |
keywords: words("abstract assert boolean break byte case catch char class const continue default " + |
"do double else enum extends final finally float for goto if implements import " + |
@@ -238,9 +312,10 @@ CodeMirror.defineMode("clike", function(config, parserConfig) { |
stream.eatWhile(/[\w\$_]/); |
return "meta"; |
} |
- } |
+ }, |
+ modeProps: {fold: ["brace", "import"]} |
}); |
- CodeMirror.defineMIME("text/x-csharp", { |
+ def("text/x-csharp", { |
name: "clike", |
keywords: words("abstract as base break case catch checked class const continue" + |
" default delegate do else enum event explicit extern finally fixed for" + |
@@ -266,7 +341,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) { |
} |
} |
}); |
- CodeMirror.defineMIME("text/x-scala", { |
+ def("text/x-scala", { |
name: "clike", |
keywords: words( |
@@ -303,7 +378,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) { |
} |
} |
}); |
- mimes(["x-shader/x-vertex", "x-shader/x-fragment"], { |
+ def(["x-shader/x-vertex", "x-shader/x-fragment"], { |
name: "clike", |
keywords: words("float int bool void " + |
"vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 " + |
@@ -357,6 +432,8 @@ CodeMirror.defineMode("clike", function(config, parserConfig) { |
"gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits " + |
"gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits " + |
"gl_MaxDrawBuffers"), |
- hooks: {"#": cppHook} |
+ hooks: {"#": cppHook}, |
+ modeProps: {fold: ["brace", "include"]} |
}); |
-}()); |
+ |
+}); |