[TableGen] Add a new json textmate description for syntax highlighting
authorRiver Riddle <riddleriver@gmail.com>
Wed, 11 May 2022 22:49:24 +0000 (15:49 -0700)
committerRiver Riddle <riddleriver@gmail.com>
Fri, 13 May 2022 20:04:09 +0000 (13:04 -0700)
There isn't really a good pre-existing syntax highlighter for tablegen, so this
commit adds a textmate version that covers nearly everything in the current
spec.

Differential Revision: https://reviews.llvm.org/D125427

llvm/utils/textmate/tablegen.json [new file with mode: 0644]

diff --git a/llvm/utils/textmate/tablegen.json b/llvm/utils/textmate/tablegen.json
new file mode 100644 (file)
index 0000000..8da8aae
--- /dev/null
@@ -0,0 +1,452 @@
+{
+  "name": "TableGen",
+  "fileTypes": [
+    "td"
+  ],
+  "patterns": [
+    {
+      "include": "#comments"
+    },
+    {
+      "include": "#preprocessor"
+    },
+    {
+      "include": "#strings"
+    },
+    {
+      "include": "#integer"
+    },
+    {
+      "include": "#builtin_types"
+    },
+    {
+      "include": "#keywords"
+    },
+    {
+      "include": "#classes"
+    },
+    {
+      "include": "#defs"
+    },
+    {
+      "include": "#values"
+    }
+  ],
+  "repository": {
+    "comments": {
+      "patterns": [
+        {
+          "match": "\/\/.*$",
+          "name": "comment.line.double-slash.tablegen"
+        },
+        {
+          "begin": "/\\*",
+          "end": "\\*/",
+          "captures": {
+            "0": {
+              "name": "comment.block.tablegen"
+            }
+          },
+          "patterns": [
+            {
+              "include": "#comments"
+            }
+          ],
+          "name": "comment.block.tablegen"
+        }
+      ]
+    },
+    "preprocessor": {
+      "patterns": [
+        {
+          "match": "^#ifdef\\s+(\\w+)",
+          "name": "keyword.control.ifdef.tablegen",
+          "captures": {
+            "1": {
+              "name": "entity.name.function.preprocessor.tablegen"
+            }
+          }
+        },
+        {
+          "match": "^#ifndef\\s+(\\w+)",
+          "name": "keyword.control.ifndef.tablegen",
+          "captures": {
+            "1": {
+              "name": "entity.name.function.preprocessor.tablegen"
+            }
+          }
+        },
+        {
+          "match": "^#else",
+          "name": "keyword.control.else.tablegen"
+        },
+        {
+          "match": "#endif",
+          "name": "keyword.control.endif.tablegen"
+        },
+        {
+          "match": "#define\\s+(\\w+)",
+          "name": "keyword.control.ifndef.tablegen",
+          "captures": {
+            "1": {
+              "name": "entity.name.function.preprocessor.tablegen"
+            }
+          }
+        },
+        {
+          "match": "^include\\s+",
+          "name": "keyword.control.include.tablegen"
+        }
+      ]
+    },
+    "strings": {
+      "patterns": [
+        {
+          "name": "string.quoted.double.tablegen",
+          "begin": "\"",
+          "end": "\"",
+          "beginCaptures": {
+            "0": {
+              "name": "punctuation.definition.string.begin.tablegen"
+            }
+          },
+          "patterns": [
+            {
+              "match": "\\\\['nt\"]",
+              "name": "constant.character.escape.tablegen"
+            }
+          ],
+          "endCaptures": {
+            "0": {
+              "name": "punctuation.definition.string.end.tablegen"
+            }
+          }
+        },
+        {
+          "name": "string.quoted.triple.tablegen",
+          "begin": "\\[{",
+          "end": "}]",
+          "beginCaptures": {
+            "0": {
+              "name": "punctuation.definition.string.begin.tablegen"
+            }
+          },
+          "patterns": [
+            {
+              "match": "\\\\[nt\"]",
+              "name": "constant.character.escape.tablegen"
+            }
+          ],
+          "endCaptures": {
+            "0": {
+              "name": "punctuation.definition.string.end.tablegen"
+            }
+          }
+        }
+      ]
+    },
+    "integer": {
+      "patterns": [
+        {
+          "match": "\\b\\d+\\b",
+          "name": "constant.numeric.tablegen"
+        },
+        {
+          "match": "\\b0[xX][a-fA-F0-9]+\\b",
+          "name": "constant.numeric.hex.tablegen"
+        },
+        {
+          "match": "\\b0b[01]+\\b",
+          "name": "constant.numeric.binary.tablegen"
+        }
+      ]
+    },
+    "builtin_types": {
+      "patterns": [
+        {
+          "match": "\\b(?:bit|code|dag|int|string)\\b",
+          "name": "entity.name.type.tablegen"
+        },
+        {
+          "begin": "\\b(bits)\\<",
+          "beginCaptures": {
+            "1": {
+              "name": "entity.name.type.tablegen"
+            }
+          },
+          "patterns": [
+            {
+              "include": "#integer"
+            }
+          ],
+          "end": "\\>"
+        },
+        {
+          "begin": "\\b(list)\\<",
+          "beginCaptures": {
+            "1": {
+              "name": "entity.name.type.tablegen"
+            }
+          },
+          "patterns": [
+            {
+              "include": "#types"
+            }
+          ],
+          "end": "\\>"
+        }
+      ]
+    },
+    "types": {
+      "patterns": [
+        {
+          "include": "#builtin_types"
+        },
+        {
+          "match": "\\b(\\w+)\\b",
+          "name": "entity.name.type.tablegen"
+        }
+      ]
+    },
+    "bang_operators": {
+      "patterns": [
+        {
+          "begin": "(\\!cast|\\!getdagop|\\!isa)\\<",
+          "beginCaptures": {
+            "1": {
+              "name": "entity.name.function"
+            }
+          },
+          "patterns": [
+            {
+              "include": "#types"
+            }
+          ],
+          "end": "\\>"
+        },
+        {
+          "match": "(\\!\\w+)\\b",
+          "name": "entity.name.function"
+        }
+      ]
+    },
+    "keywords": {
+      "patterns": [
+        {
+          "match": "\\b(assert|else|foreach|defset|defvar|field|if|in|let|then)\\b",
+          "name": "keyword.other.tablegen"
+        }
+      ]
+    },
+    "record_body": {
+      "patterns": [
+        {
+          "begin": "\\:",
+          "patterns": [
+            {
+              "match": "\\b(\\w+)\\b",
+              "name": "entity.name.type.tablegen"
+            },
+            {
+              "begin": "\\<",
+              "patterns": [
+                {
+                  "include": "#values"
+                }
+              ],
+              "end": "\\>"
+            }
+          ],
+          "end": "(?=\\;|\\{)"
+        },
+        {
+          "begin": "\\{",
+          "patterns": [
+            {
+              "include": "#keywords"
+            },
+            {
+              "include": "#builtin_types"
+            },
+            {
+              "match": "\\b(\\w+\\s+)?\\b(\\w+)\\b\\s+\\=",
+              "captures": {
+                "1": {
+                  "name": "entity.name.type.tablegen"
+                },
+                "2": {
+                  "name": "variable.other.tablegen"
+                }
+              }
+            },
+            {
+              "include": "#values"
+            }
+          ],
+          "end": "(?=\\})"
+        }
+      ]
+    },
+    "classes": {
+      "begin": "\\b(multiclass|class)\\b\\s+(\\w+)\\b",
+      "beginCaptures": {
+        "1": {
+          "name": "keyword.other.class.tablegen"
+        },
+        "2": {
+          "name": "entity.name.type.tablegen"
+        }
+      },
+      "patterns": [
+        {
+          "begin": "\\<",
+          "patterns": [
+            {
+              "include": "#builtin_types"
+            },
+            {
+              "match": "\\b(\\w+\\s+)?\\b(\\w+)\\b",
+              "captures": {
+                "1": {
+                  "name": "entity.name.type.tablegen"
+                },
+                "2": {
+                  "name": "variable.other.tablegen"
+                }
+              }
+            },
+            {
+              "begin": "=",
+              "patterns": [
+                {
+                  "include": "#values"
+                }
+              ],
+              "end": "(?=\\>|\\,)"
+            }
+          ],
+          "end": "\\>"
+        },
+        {
+          "include": "#record_body"
+        }
+      ],
+      "end": "(\\;|\\})"
+    },
+    "defs": {
+      "begin": "\\b(defm|def)\\b",
+      "beginCaptures": {
+        "1": {
+          "name": "keyword.other.def.tablegen"
+        }
+      },
+      "patterns": [
+        {
+          "include": "#record_body"
+        },
+        {
+          "include": "#values"
+        }
+      ],
+      "end": "(\\;|\\})"
+    },
+    "values": {
+      "patterns": [
+        {
+          "include": "#builtin_types"
+        },
+        {
+          "include": "#bang_operators"
+        },
+        {
+          "include": "#classes"
+        },
+        {
+          "include": "#defs"
+        },
+        {
+          "include": "#comments"
+        },
+        {
+          "include": "#integer"
+        },
+        {
+          "include": "#strings"
+        },
+        {
+          "match": "\\b(?:false|true)\\b",
+          "name": "keyword.other.tablegen"
+        },
+        {
+          "match": "(\\?)",
+          "name": "keyword.other.tablegen"
+        },
+        {
+          "begin": "\\{",
+          "patterns": [
+            {
+              "include": "#values"
+            }
+          ],
+          "end": "\\}"
+        },
+        {
+          "begin": "\\[",
+          "patterns": [
+            {
+              "include": "#values"
+            }
+          ],
+          "end": "(?=\\])"
+        },
+        {
+          "begin": "\\]\\s*\\<",
+          "patterns": [
+            {
+              "include": "#types"
+            }
+          ],
+          "end": "\\>"
+        },
+        {
+          "begin": "\\(",
+          "patterns": [
+            {
+              "include": "#values"
+            }
+          ],
+          "end": "\\)"
+        },
+        {
+          "include": "#keywords"
+        },
+        {
+          "begin": "\\b(\\w+)\\<",
+          "beginCaptures": {
+            "1": {
+              "name": "entity.name.type.tablegen"
+            }
+          },
+          "patterns": [
+            {
+              "include": "#values"
+            }
+          ],
+          "end": "\\>"
+        },
+        {
+          "match": "(\\$\\w+)\\b",
+          "name": "variable.other.enummember.tablegen"
+        },
+        {
+          "match": "\\b(\\w+)\\b",
+          "name": "variable.other.tablegen"
+        },
+        {
+          "include": "#preprocessor"
+        }
+      ]
+    }
+  },
+  "scopeName": "source.tablegen"
+}
\ No newline at end of file