Skip to content

Commit b2c7891

Browse files
RPangrlemarijnh
authored andcommitted
[clike mode] Add text/x-objectivec++ type (codemirror#6027)
Pull out some of the ObjC and C++ info into vars so they can easily be reused and add a text/x-obejctivec++ type that's effectively the union of the C++ and ObjC definitions.
1 parent 632bca3 commit b2c7891

File tree

1 file changed

+62
-16
lines changed

1 file changed

+62
-16
lines changed

mode/clike/clike.js

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,25 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
270270
"static else struct switch extern typedef union for goto while enum const " +
271271
"volatile inline restrict asm fortran";
272272

273+
// Keywords from https://en.cppreference.com/w/cpp/keyword includes C++20.
274+
var cppKeywords = "alignas alignof and and_eq audit axiom bitand bitor catch " +
275+
"class compl concept constexpr const_cast decltype delete dynamic_cast " +
276+
"explicit export final friend import module mutable namespace new noexcept " +
277+
"not not_eq operator or or_eq override private protected public " +
278+
"reinterpret_cast requires static_assert static_cast template this " +
279+
"thread_local throw try typeid typename using virtual xor xor_eq";
280+
281+
var objCKeywords = "bycopy byref in inout oneway out self super atomic nonatomic retain copy " +
282+
"readwrite readonly strong weak assign typeof nullable nonnull null_resettable _cmd " +
283+
"@interface @implementation @end @protocol @encode @property @synthesize @dynamic @class " +
284+
"@public @package @private @protected @required @optional @try @catch @finally @import " +
285+
"@selector @encode @defs @synchronized @autoreleasepool @compatibility_alias @available";
286+
287+
var objCBuiltins = "FOUNDATION_EXPORT FOUNDATION_EXTERN NS_INLINE NS_FORMAT_FUNCTION " +
288+
" NS_RETURNS_RETAINEDNS_ERROR_ENUM NS_RETURNS_NOT_RETAINED NS_RETURNS_INNER_POINTER " +
289+
"NS_DESIGNATED_INITIALIZER NS_ENUM NS_OPTIONS NS_REQUIRES_NIL_TERMINATION " +
290+
"NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_SWIFT_NAME NS_REFINED_FOR_SWIFT"
291+
273292
// Do not use this. Use the cTypes function below. This is global just to avoid
274293
// excessive calls when cTypes is being called multiple times during a parse.
275294
var basicCTypes = words("int long char short double float unsigned signed " +
@@ -420,13 +439,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
420439

421440
def(["text/x-c++src", "text/x-c++hdr"], {
422441
name: "clike",
423-
// Keywords from https://en.cppreference.com/w/cpp/keyword includes C++20.
424-
keywords: words(cKeywords + "alignas alignof and and_eq audit axiom bitand bitor catch " +
425-
"class compl concept constexpr const_cast decltype delete dynamic_cast " +
426-
"explicit export final friend import module mutable namespace new noexcept " +
427-
"not not_eq operator or or_eq override private protected public " +
428-
"reinterpret_cast requires static_assert static_cast template this " +
429-
"thread_local throw try typeid typename using virtual xor xor_eq"),
442+
keywords: words(cKeywords + " " + cppKeywords),
430443
types: cTypes,
431444
blockKeywords: words(cBlockKeywords + " class try catch"),
432445
defKeywords: words(cDefKeywords + " class namespace"),
@@ -769,16 +782,9 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
769782

770783
def("text/x-objectivec", {
771784
name: "clike",
772-
keywords: words(cKeywords + " bycopy byref in inout oneway out self super atomic nonatomic retain copy " +
773-
"readwrite readonly strong weak assign typeof nullable nonnull null_resettable _cmd " +
774-
"@interface @implementation @end @protocol @encode @property @synthesize @dynamic @class " +
775-
"@public @package @private @protected @required @optional @try @catch @finally @import " +
776-
"@selector @encode @defs @synchronized @autoreleasepool @compatibility_alias @available"),
785+
keywords: words(cKeywords + " " + objCKeywords),
777786
types: objCTypes,
778-
builtin: words("FOUNDATION_EXPORT FOUNDATION_EXTERN NS_INLINE NS_FORMAT_FUNCTION NS_RETURNS_RETAINED " +
779-
"NS_ERROR_ENUM NS_RETURNS_NOT_RETAINED NS_RETURNS_INNER_POINTER NS_DESIGNATED_INITIALIZER " +
780-
"NS_ENUM NS_OPTIONS NS_REQUIRES_NIL_TERMINATION NS_ASSUME_NONNULL_BEGIN " +
781-
"NS_ASSUME_NONNULL_END NS_SWIFT_NAME NS_REFINED_FOR_SWIFT"),
787+
builtin: words(objCBuiltins),
782788
blockKeywords: words(cBlockKeywords + " @synthesize @try @catch @finally @autoreleasepool @synchronized"),
783789
defKeywords: words(cDefKeywords + " @interface @implementation @protocol @class"),
784790
dontIndentStatements: /^@.*$/,
@@ -792,6 +798,46 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
792798
modeProps: {fold: ["brace", "include"]}
793799
});
794800

801+
def("text/x-objectivec++", {
802+
name: "clike",
803+
keywords: words(cKeywords + " " + objCKeywords + " " + cppKeywords),
804+
types: objCTypes,
805+
builtin: words(objCBuiltins),
806+
blockKeywords: words(cBlockKeywords + " @synthesize @try @catch @finally @autoreleasepool @synchronized class try catch"),
807+
defKeywords: words(cDefKeywords + " @interface @implementation @protocol @class class namespace"),
808+
dontIndentStatements: /^@.*$|^template$/,
809+
typeFirstDefinitions: true,
810+
atoms: words("YES NO NULL Nil nil true false nullptr"),
811+
isReservedIdentifier: cIsReservedIdentifier,
812+
hooks: {
813+
"#": cppHook,
814+
"*": pointerHook,
815+
"u": cpp11StringHook,
816+
"U": cpp11StringHook,
817+
"L": cpp11StringHook,
818+
"R": cpp11StringHook,
819+
"0": cpp14Literal,
820+
"1": cpp14Literal,
821+
"2": cpp14Literal,
822+
"3": cpp14Literal,
823+
"4": cpp14Literal,
824+
"5": cpp14Literal,
825+
"6": cpp14Literal,
826+
"7": cpp14Literal,
827+
"8": cpp14Literal,
828+
"9": cpp14Literal,
829+
token: function(stream, state, style) {
830+
if (style == "variable" && stream.peek() == "(" &&
831+
(state.prevToken == ";" || state.prevToken == null ||
832+
state.prevToken == "}") &&
833+
cppLooksLikeConstructor(stream.current()))
834+
return "def";
835+
}
836+
},
837+
namespaceSeparator: "::",
838+
modeProps: {fold: ["brace", "include"]}
839+
});
840+
795841
def("text/x-squirrel", {
796842
name: "clike",
797843
keywords: words("base break clone continue const default delete enum extends function in class" +

0 commit comments

Comments
 (0)