From 111e4a0b6ba67df37024078d7b9a5d458302d5ec Mon Sep 17 00:00:00 2001 From: deathaxe Date: Thu, 20 Nov 2025 21:03:28 +0100 Subject: [PATCH] JSON: Add support for merge conflict markers --- .../Sublime JSON/Sublime JSON.sublime-syntax | 23 ++++ .../syntax_test_sublime_json.json | 108 +++++++++++++++++ .../syntax_test_commands.json | 72 ++++++++++++ .../syntax_test_settings.json | 111 ++++++++++++++++++ 4 files changed, 314 insertions(+) diff --git a/Package/Sublime JSON/Sublime JSON.sublime-syntax b/Package/Sublime JSON/Sublime JSON.sublime-syntax index f0b6aeed..114de729 100644 --- a/Package/Sublime JSON/Sublime JSON.sublime-syntax +++ b/Package/Sublime JSON/Sublime JSON.sublime-syntax @@ -52,16 +52,39 @@ contexts: - match: \*/ scope: punctuation.definition.comment.end.json pop: true + - include: merge-conflict-markers - match: (//).*$\n? scope: comment.line.double-slash.js captures: 1: punctuation.definition.comment.json + - include: merge-conflict-markers only-comments: - include: comments - match: '[^/\s]+' scope: invalid.illegal.expected-comment-or-eof.sublime +################################################# +# Merge Conflict Markers +################################################# + + merge-conflict-markers: + # see also: Diff.sublime-syntax#conflict-markers + - match: ^(<{7})(?:\s+(\S.*?))?$\n? + scope: meta.block.conflict.begin.diff + captures: + 1: punctuation.section.block.begin.diff + 2: entity.name.section.diff + - match: ^(>{7})(?:\s+(\S.*?))?$\n? + scope: meta.block.conflict.end.diff + captures: + 1: punctuation.section.block.end.diff + 2: entity.name.section.diff + - match: ^(\|{7}|={7})(?:\s+(\S.*?))?$\n? + scope: meta.block.conflict.separator.diff + captures: + 1: punctuation.section.block.diff + 2: entity.name.section.diff ################################################# # Any diff --git a/Package/Sublime JSON/syntax_test_sublime_json.json b/Package/Sublime JSON/syntax_test_sublime_json.json index 450c29af..e3739877 100644 --- a/Package/Sublime JSON/syntax_test_sublime_json.json +++ b/Package/Sublime JSON/syntax_test_sublime_json.json @@ -88,3 +88,111 @@ // ^^^^^^^^^^^^ meta.mapping.value.json meta.mapping - meta.mapping meta.mapping meta.mapping // ^^^^ meta.mapping.value.json meta.mapping.key.json string.quoted.double.json // + +/* + * Merge Conflict Marker Tests + */ + +<<<<<<< HEAD +// <- meta.block.conflict.begin.diff punctuation.section.block.begin.diff +//^^^^^ meta.block.conflict.begin.diff punctuation.section.block.begin.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation +// ^^^^ meta.block.conflict.begin.diff entity.name.section.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation + +======= +// <- meta.block.conflict.separator.diff punctuation.section.block.diff +//^^^^^ meta.block.conflict.separator.diff punctuation.section.block.diff +// ^ meta.block.conflict.separator.diff - punctuation + +>>>>>>> master +// <- meta.block.conflict.end.diff punctuation.section.block.end.diff +//^^^^^ meta.block.conflict.end.diff punctuation.section.block.end.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +// ^^^^^^ meta.block.conflict.end.diff entity.name.section.diff +// ^ meta.block.conflict.end.diff - entity - punctuation + +{ /* Merge conflictes in objects */ +<<<<<<< HEAD +// <- meta.block.conflict.begin.diff punctuation.section.block.begin.diff +//^^^^^ meta.block.conflict.begin.diff punctuation.section.block.begin.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation +// ^^^^ meta.block.conflict.begin.diff entity.name.section.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation + +======= +// <- meta.block.conflict.separator.diff punctuation.section.block.diff +//^^^^^ meta.block.conflict.separator.diff punctuation.section.block.diff +// ^ meta.block.conflict.separator.diff - punctuation + +>>>>>>> master +// <- meta.block.conflict.end.diff punctuation.section.block.end.diff +//^^^^^ meta.block.conflict.end.diff punctuation.section.block.end.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +// ^^^^^^ meta.block.conflict.end.diff entity.name.section.diff +// ^ meta.block.conflict.end.diff - entity - punctuation + + "key": +// ^^^^^ meta.mapping.key.json string.quoted.double.json +<<<<<<< HEAD +// <- meta.block.conflict.begin.diff punctuation.section.block.begin.diff +//^^^^^ meta.block.conflict.begin.diff punctuation.section.block.begin.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation +// ^^^^ meta.block.conflict.begin.diff entity.name.section.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation + "value" +// ^^^^^^^ meta.mapping.value.json string.quoted.double.json +======= +// <- meta.block.conflict.separator.diff punctuation.section.block.diff +//^^^^^ meta.block.conflict.separator.diff punctuation.section.block.diff +// ^ meta.block.conflict.separator.diff - punctuation + +>>>>>>> master +// <- meta.block.conflict.end.diff punctuation.section.block.end.diff +//^^^^^ meta.block.conflict.end.diff punctuation.section.block.end.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +// ^^^^^^ meta.block.conflict.end.diff entity.name.section.diff +} + +[ /* Merge conflictes in lists */ +<<<<<<< HEAD +// <- meta.block.conflict.begin.diff punctuation.section.block.begin.diff +//^^^^^ meta.block.conflict.begin.diff punctuation.section.block.begin.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation +// ^^^^ meta.block.conflict.begin.diff entity.name.section.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation + +======= +// <- meta.block.conflict.separator.diff punctuation.section.block.diff +//^^^^^ meta.block.conflict.separator.diff punctuation.section.block.diff +// ^ meta.block.conflict.separator.diff - punctuation + +>>>>>>> master +// <- meta.block.conflict.end.diff punctuation.section.block.end.diff +//^^^^^ meta.block.conflict.end.diff punctuation.section.block.end.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +// ^^^^^^ meta.block.conflict.end.diff entity.name.section.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +] + +/* Merge conflicts in comments + +<<<<<<< HEAD +// <- meta.block.conflict.begin.diff punctuation.section.block.begin.diff +//^^^^^ meta.block.conflict.begin.diff punctuation.section.block.begin.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation +// ^^^^ meta.block.conflict.begin.diff entity.name.section.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation + +======= +// <- meta.block.conflict.separator.diff punctuation.section.block.diff +//^^^^^ meta.block.conflict.separator.diff punctuation.section.block.diff +// ^ meta.block.conflict.separator.diff - punctuation + +>>>>>>> master +// <- meta.block.conflict.end.diff punctuation.section.block.end.diff +//^^^^^ meta.block.conflict.end.diff punctuation.section.block.end.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +// ^^^^^^ meta.block.conflict.end.diff entity.name.section.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +*/ diff --git a/Package/Sublime Text Commands/syntax_test_commands.json b/Package/Sublime Text Commands/syntax_test_commands.json index 53b6afb4..ad542e95 100644 --- a/Package/Sublime Text Commands/syntax_test_commands.json +++ b/Package/Sublime Text Commands/syntax_test_commands.json @@ -51,6 +51,78 @@ abc // ^^^ invalid.illegal.expected-mapping.sublime-commands +/* + * Merge Conflict Marker Tests + */ + +<<<<<<< HEAD +// <- meta.block.conflict.begin.diff punctuation.section.block.begin.diff +//^^^^^ meta.block.conflict.begin.diff punctuation.section.block.begin.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation +// ^^^^ meta.block.conflict.begin.diff entity.name.section.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation + +======= +// <- meta.block.conflict.separator.diff punctuation.section.block.diff +//^^^^^ meta.block.conflict.separator.diff punctuation.section.block.diff +// ^ meta.block.conflict.separator.diff - punctuation + +>>>>>>> master +// <- meta.block.conflict.end.diff punctuation.section.block.end.diff +//^^^^^ meta.block.conflict.end.diff punctuation.section.block.end.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +// ^^^^^^ meta.block.conflict.end.diff entity.name.section.diff +// ^ meta.block.conflict.end.diff - entity - punctuation + + { /* Merge conflictes in objects */ +<<<<<<< HEAD +// <- meta.block.conflict.begin.diff punctuation.section.block.begin.diff +//^^^^^ meta.block.conflict.begin.diff punctuation.section.block.begin.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation +// ^^^^ meta.block.conflict.begin.diff entity.name.section.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation + +======= +// <- meta.block.conflict.separator.diff punctuation.section.block.diff +//^^^^^ meta.block.conflict.separator.diff punctuation.section.block.diff +// ^ meta.block.conflict.separator.diff - punctuation + +>>>>>>> master +// <- meta.block.conflict.end.diff punctuation.section.block.end.diff +//^^^^^ meta.block.conflict.end.diff punctuation.section.block.end.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +// ^^^^^^ meta.block.conflict.end.diff entity.name.section.diff +// ^ meta.block.conflict.end.diff - entity - punctuation + + "args": { + "list": [ +<<<<<<< HEAD +// <- meta.block.conflict.begin.diff punctuation.section.block.begin.diff +//^^^^^ meta.block.conflict.begin.diff punctuation.section.block.begin.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation +// ^^^^ meta.block.conflict.begin.diff entity.name.section.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation + "ours", +// ^^^^^^ string.quoted.double.json +// ^ punctuation.definition.string.begin.json +// ^ punctuation.definition.string.end.json +======= +// <- meta.block.conflict.separator.diff punctuation.section.block.diff +//^^^^^ meta.block.conflict.separator.diff punctuation.section.block.diff +// ^ meta.block.conflict.separator.diff - punctuation + "theirs", +// ^^^^^^^^ string.quoted.double.json +// ^ punctuation.definition.string.begin.json +// ^ punctuation.definition.string.end.json +>>>>>>> master +// <- meta.block.conflict.end.diff punctuation.section.block.end.diff +//^^^^^ meta.block.conflict.end.diff punctuation.section.block.end.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +// ^^^^^^ meta.block.conflict.end.diff entity.name.section.diff +// ^ meta.block.conflict.end.diff - entity - punctuation + ] + } + } ] ,[]//fgfg // <- - invalid.illegal diff --git a/Package/Sublime Text Settings/syntax_test_settings.json b/Package/Sublime Text Settings/syntax_test_settings.json index d0152a01..9c114f4c 100644 --- a/Package/Sublime Text Settings/syntax_test_settings.json +++ b/Package/Sublime Text Settings/syntax_test_settings.json @@ -83,7 +83,118 @@ s , // but not two consecutive commas // ^ invalid.illegal.expected-key.json + + +/* + * Merge Conflict Marker Tests + */ + +<<<<<<< HEAD +// <- meta.block.conflict.begin.diff punctuation.section.block.begin.diff +//^^^^^ meta.block.conflict.begin.diff punctuation.section.block.begin.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation +// ^^^^ meta.block.conflict.begin.diff entity.name.section.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation + +======= +// <- meta.block.conflict.separator.diff punctuation.section.block.diff +//^^^^^ meta.block.conflict.separator.diff punctuation.section.block.diff +// ^ meta.block.conflict.separator.diff - punctuation + +>>>>>>> master +// <- meta.block.conflict.end.diff punctuation.section.block.end.diff +//^^^^^ meta.block.conflict.end.diff punctuation.section.block.end.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +// ^^^^^^ meta.block.conflict.end.diff entity.name.section.diff +// ^ meta.block.conflict.end.diff - entity - punctuation + + "dict": { /* Merge conflictes in objects */ +<<<<<<< HEAD +// <- meta.block.conflict.begin.diff punctuation.section.block.begin.diff +//^^^^^ meta.block.conflict.begin.diff punctuation.section.block.begin.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation +// ^^^^ meta.block.conflict.begin.diff entity.name.section.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation + +======= +// <- meta.block.conflict.separator.diff punctuation.section.block.diff +//^^^^^ meta.block.conflict.separator.diff punctuation.section.block.diff +// ^ meta.block.conflict.separator.diff - punctuation + +>>>>>>> master +// <- meta.block.conflict.end.diff punctuation.section.block.end.diff +//^^^^^ meta.block.conflict.end.diff punctuation.section.block.end.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +// ^^^^^^ meta.block.conflict.end.diff entity.name.section.diff +// ^ meta.block.conflict.end.diff - entity - punctuation + } + + "list": [ /* Merge conflictes in lists */ +<<<<<<< HEAD +// <- meta.block.conflict.begin.diff punctuation.section.block.begin.diff +//^^^^^ meta.block.conflict.begin.diff punctuation.section.block.begin.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation +// ^^^^ meta.block.conflict.begin.diff entity.name.section.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation + +======= +// <- meta.block.conflict.separator.diff punctuation.section.block.diff +//^^^^^ meta.block.conflict.separator.diff punctuation.section.block.diff +// ^ meta.block.conflict.separator.diff - punctuation + +>>>>>>> master +// <- meta.block.conflict.end.diff punctuation.section.block.end.diff +//^^^^^ meta.block.conflict.end.diff punctuation.section.block.end.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +// ^^^^^^ meta.block.conflict.end.diff entity.name.section.diff +// ^ meta.block.conflict.end.diff - entity - punctuation + ] + + "scalar": +// ^^^^^^^^ meta.mapping.key.json string.quoted.double.json +<<<<<<< HEAD +// <- meta.block.conflict.begin.diff punctuation.section.block.begin.diff +//^^^^^ meta.block.conflict.begin.diff punctuation.section.block.begin.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation +// ^^^^ meta.block.conflict.begin.diff entity.name.section.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation + "value", +// ^^^^^^^ meta.mapping.value.json string.quoted.double.json +======= +// <- meta.block.conflict.separator.diff punctuation.section.block.diff +//^^^^^ meta.block.conflict.separator.diff punctuation.section.block.diff +// ^ meta.block.conflict.separator.diff - punctuation + +>>>>>>> master +// <- meta.block.conflict.end.diff punctuation.section.block.end.diff +//^^^^^ meta.block.conflict.end.diff punctuation.section.block.end.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +// ^^^^^^ meta.block.conflict.end.diff entity.name.section.diff + +/* Merge conflicts in comments + +<<<<<<< HEAD +// <- meta.block.conflict.begin.diff punctuation.section.block.begin.diff +//^^^^^ meta.block.conflict.begin.diff punctuation.section.block.begin.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation +// ^^^^ meta.block.conflict.begin.diff entity.name.section.diff +// ^ meta.block.conflict.begin.diff - entity - punctuation + +======= +// <- meta.block.conflict.separator.diff punctuation.section.block.diff +//^^^^^ meta.block.conflict.separator.diff punctuation.section.block.diff +// ^ meta.block.conflict.separator.diff - punctuation + +>>>>>>> master +// <- meta.block.conflict.end.diff punctuation.section.block.end.diff +//^^^^^ meta.block.conflict.end.diff punctuation.section.block.end.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +// ^^^^^^ meta.block.conflict.end.diff entity.name.section.diff +// ^ meta.block.conflict.end.diff - entity - punctuation +*/ + } +// <- meta.settings-mapping.sublime-settings meta.mapping.json punctuation.section.mapping.end.json not-a-comment // but this is // <- invalid.illegal.expected-comment-or-eof.sublime