Переглянути джерело

Syntax highlighter in VScode for carbon programming language (#3953)

I have made the necessary changes to
https://github.com/carbon-language/carbon-lang/tree/trunk/utils/vscode
for the VScode syntax highlighter to work:

- [x] Changes have been tested and found to be working.

---------

Co-authored-by: Richard Smith <richard@metafoo.co.uk>
Co-authored-by: Carbon Infra Bot <carbon-external-infra@google.com>
Rohan Vashisht 1 рік тому
батько
коміт
5c5a687534

+ 0 - 157
utils/textmate/Syntaxes/Carbon.plist

@@ -1,157 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<!--
-Part of the Carbon Language project, under the Apache License v2.0 with LLVM
-Exceptions. See /LICENSE for license information.
-SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
--->
-
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
-        "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-    <dict>
-        <!-- Section metadata -->
-        <key>name</key>
-        <string>carbon</string>
-        <key>uuid</key>
-        <string>04F7F7E3-D5EE-40A4-9899-53CD34D28276</string>
-        <key>scopeName</key>
-        <string>source.carbon</string>
-        <key>fileTypes</key>
-        <array>
-            <string>carbon</string>
-        </array>
-
-        <!-- Folding markers -->
-        <key>foldingStartMarker</key>
-        <string>\{\s*$</string>
-        <key>foldingStopMarker</key>
-        <string>^\s*\}</string>
-
-        <!-- Active patterns from repository -->
-        <key>patterns</key>
-        <array>
-            <!-- Rule: comments -->
-            <dict>
-                <key>begin</key>
-                <string>(^[ \t]+)?(?=//)</string>
-                <key>end</key>
-                <string>(?!\G)</string>
-                <key>patterns</key>
-                <array>
-                    <dict>
-                        <key>name</key>
-                        <string>comment.line.carbon</string>
-                        <key>begin</key>
-                        <string>//</string>
-                        <key>end</key>
-                        <string>$</string>
-                    </dict>
-                </array>
-            </dict>
-            <!-- Rule: control flow keywords -->
-            <dict>
-                <key>name</key>
-                <string>keyword.control.carbon</string>
-                <key>match</key>
-                <string>\b(break|case|continue|default|else|if|for|match|return|returned|then|while)\b</string>
-            </dict>
-            <!-- Rule: other keywords -->
-            <dict>
-                <key>name</key>
-                <string>keyword.other.carbon</string>
-                <key>match</key>
-                <string>\b(abstract|adapt|addr|alias|and|api|as|auto|base|choice|class|constraint|destructor|extend|final|fn|forall|friend|impl|impls|import|in|interface|let|library|like|namespace|not|observe|or|override|package|partial|private|protected|require|Self|template|type|var|virtual|where|_)\b</string>
-            </dict>
-            <!-- Rule: builtin types -->
-            <dict>
-                <key>name</key>
-                <string>storage.type.carbon</string>
-                <key>match</key>
-                <string>\b(As|bool|Carbon\.Int|Carbon\.UInt|f16|f32|f64|f128|i8|i16|i32|i64|i128|i256|Slice|String|StringView|type|u8|u16|u32|u64|u128|u256)\b</string>
-            </dict>
-            <!-- Rule: boolean literals - has keyword coloring -->
-            <dict>
-                <key>name</key>
-                <string>keyword.other.carbon</string>
-                <key>match</key>
-                <string>\b(true|false)\b</string>
-            </dict>
-            <!-- Rule: block string literals -->
-            <dict>
-                <key>name</key>
-                <string>string.quoted.triple.carbon</string>
-                <key>begin</key>
-                <string>'''([^\s'#]*\n)?</string>
-                <key>end</key>
-                <string>'''</string>
-                <key>beginCaptures</key>
-                <dict>
-                    <key>1</key>
-                    <dict>
-                        <key>name</key>
-                        <string>constant.character.escape.carbon</string>
-                    </dict>
-                </dict>
-                <key>patterns</key>
-                <array>
-                    <dict>
-                        <key>include</key>
-                        <string>#string_escapes</string>
-                    </dict>
-                </array>
-            </dict>
-            <!-- Rule: basic string literals -->
-            <dict>
-                <key>name</key>
-                <string>string.quoted.double.carbon</string>
-                <key>begin</key>
-                <string>"</string>
-                <key>end</key>
-                <string>"</string>
-
-                <key>patterns</key>
-                <array>
-                    <dict>
-                        <key>include</key>
-                        <string>#string_escapes</string>
-                    </dict>
-                </array>
-            </dict>
-            <!-- Rule: hexadecimal number literals -->
-            <dict>
-                <key>name</key>
-                <string>constant.numeric.carbon</string>
-                <key>match</key>
-                <string>0x[_0-9A-F]+(\.[_0-9A-F]+(p[-+]?[1-9][0-9]*)?)?</string>
-            </dict>
-            <!-- Rule: binary number literals -->
-            <dict>
-                <key>name</key>
-                <string>constant.numeric.carbon</string>
-                <key>match</key>
-                <string>0b[_01]+</string>
-            </dict>
-            <!-- Rule: decimal number literals -->
-            <dict>
-                <key>name</key>
-                <string>constant.numeric.carbon</string>
-                <key>match</key>
-                <string>[1-9][_0-9]*(\.[_0-9]+(e[-+]?[1-9][0-9]*)?)?</string>
-            </dict>
-        </array>
-
-        <!-- Rule repository -->
-        <key>repository</key>
-        <dict>
-            <!-- Rule: string escape sequences -->
-            <key>string_escapes</key>
-            <dict>
-                <key>name</key>
-                <string>constant.character.escape.carbon</string>
-                <key>match</key>
-                <string>\\([tnr'"0\0]|x[0-9A-F]{2}|u\{[0-9A-F]{4,}\})</string>
-            </dict>
-        </dict>
-    </dict>
-</plist>

+ 201 - 0
utils/textmate/Syntaxes/carbon.tmLanguage.json

@@ -0,0 +1,201 @@
+// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
+// Exceptions. See /LICENSE for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+{
+  "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
+  "name": "carbon",
+  "foldingStartMarker": "\\{\\s*$",
+  "foldingStopMarker": "^\\s*\\}",
+  "fileTypes": ["carbon"],
+  "patterns": [
+    {
+      "include": "#comments"
+    },
+    {
+      "include": "#operators"
+    },
+    {
+      "include": "#special-keywords"
+    },
+    {
+      "include": "#numbers"
+    },
+    {
+      "include": "#reserved-words"
+    },
+    {
+      "include": "#operator-dedicated-keywords-statements"
+    },
+    {
+      "include": "#ctrl-statements"
+    },
+    {
+      "include": "#true-false"
+    },
+    {
+      "include": "#functions"
+    },
+    {
+      "name": "string.quoted.triple.carbon",
+      "begin": "'''([^\\s'#]*\\n)?",
+      "end": "'''",
+      "beginCaptures": {
+        "1": {
+          "name": "constant.character.escape.carbon"
+        }
+      },
+      "patterns": [
+        {
+          "include": "#string_escapes"
+        }
+      ]
+    },
+    {
+      "name": "string.quoted.double.carbon",
+      "begin": "\"",
+      "end": "\"",
+      "patterns": [
+        {
+          "include": "#string_escapes"
+        }
+      ]
+    },
+    {
+      "include": "#customs"
+    }
+  ],
+  "repository": {
+    "operators": {
+      "patterns": [
+        {
+          "name": "keyword.operator.carbon",
+          "match": "\\b(\\+|-|\\*|/|!)\\b"
+        }
+      ]
+    },
+    "comments": {
+      "patterns": [
+        {
+          "begin": "(^[ \\t]+)?(?=//)",
+          "end": "(?!\\G)",
+          "patterns": [
+            {
+              "name": "comment.line.carbon",
+              "begin": "//",
+              "end": "$"
+            }
+          ]
+        }
+      ]
+    },
+    "string_escapes": {
+      "patterns": [
+        {
+          "name": "constant.character.escape.carbon",
+          "match": "\\\\([tnr'\"0\\0]|x[0-9A-F]{2}|u\\{[0-9A-F]{4,}\\})"
+        }
+      ]
+    },
+    "special-keywords": {
+      "patterns": [
+        {
+          "name": "keyword.control.carbon",
+          "match": "\\b(break|case|continue|default|else|if|for|match|return|returned|then|while)\\b"
+        }
+      ]
+    },
+    "operator-dedicated-keywords-statements": {
+      "patterns": [
+        {
+          "name": "keyword.other.carbon",
+          "match": "\\b(abstract|adapt|addr|alias|and|api|as|auto|base|choice|class|constraint|destructor|extend|final|fn|forall|friend|impl|impls|import|in|interface|let|library|like|namespace|not|observe|or|override|package|partial|private|protected|require|Self|template|type|var|virtual|where|_)\\b"
+        }
+      ]
+    },
+    "reserved-words": {
+      "patterns": [
+        {
+          "name": "support.type.carbon",
+          "match": "\\b(As|bool|Carbon\\.Int|Carbon\\.UInt|f16|f32|f64|f128|i8|i16|i32|i64|i128|i256|Slice|String|StringView|type|u8|u16|u32|u64|u128|u256)\\b"
+        }
+      ]
+    },
+    "true-false": {
+      "patterns": [
+        {
+          "name": "constant.language.carbon",
+          "match": "\\b(true|false)\\b"
+        }
+      ]
+    },
+    "functions": {
+      "patterns": [
+        {
+          "name": "support.function.carbon",
+          "match": "\\b[a-zA-Z]+\\s*\\("
+        }
+      ]
+    },
+    "customs": {
+      "patterns": [
+        {
+          "name": "support.class.carbon",
+          "match": "(?<=\\bpackage\\s)\\w+"
+        },
+        {
+          "name": "support.variable.carbon",
+          "match": "(?<=\\s*\\.)\\w+"
+        },
+        {
+          "name": "support.variable.carbon",
+          "match": "(?<=\\bas\\s)\\w+"
+        },
+        {
+          "name": "support.variable.carbon",
+          "match": "\\w+(?=\\s*:)"
+        },
+        {
+          "name": "support.variable.carbon",
+          "match": "(?<=\\blet\\s)\\w+"
+        },
+        {
+          "name": "support.variable.carbon",
+          "match": "(?<=\\bvar\\s)\\w+"
+        },
+        {
+          "name": "support.function.carbon",
+          "match": "(?<=\\bfn\\s)\\w+"
+        },
+        {
+          "name": "support.other.carbon",
+          "match": "(?<=\\bimpl\\s)\\w+"
+        },
+        {
+          "name": "support.type.property-name.carbon",
+          "match": "(?<=\\bimport\\s)\\w+"
+        },
+        {
+          "name": "support.class.carbon",
+          "match": "(?<=\\bclass\\s)\\w+"
+        }
+      ]
+    },
+    "numbers": {
+      "patterns": [
+        {
+          "name": "constant.numeric.carbon",
+          "match": "0x[_0-9A-F]+(\\.[_0-9A-F]+(p[-+]?[1-9][0-9]*)?)?"
+        },
+        {
+          "name": "constant.numeric.carbon",
+          "match": "0b[_01]+"
+        },
+        {
+          "name": "constant.numeric.carbon",
+          "match": "[1-9][_0-9]*(\\.[_0-9]+(e[-+]?[1-9][0-9]*)?)?"
+        }
+      ]
+    }
+  },
+  "scopeName": "source.carbon"
+}

+ 0 - 1
utils/vscode/Carbon.plist

@@ -1 +0,0 @@
-../textmate/Syntaxes/Carbon.plist

+ 1 - 0
utils/vscode/carbon.tmLanguage.json

@@ -0,0 +1 @@
+../textmate/Syntaxes/carbon.tmLanguage.json

+ 14 - 6
utils/vscode/language-configuration.json

@@ -6,19 +6,27 @@
   "comments": {
     "lineComment": "//"
   },
+  // Symbols used as brackets.
   "brackets": [
-    ["(", ")"],
+    ["{", "}"],
     ["[", "]"],
-    ["{", "}"]
+    ["(", ")"]
   ],
+  // Symbols that are auto closed when typing.
   "autoClosingPairs": [
-    ["(", ")"],
+    ["{", "}"],
     ["[", "]"],
-    ["{", "}"]
+    ["(", ")"],
+    ["\"", "\""],
+    ["'", "'"]
   ],
+  // Symbols that can be used to surround a selection.
   "surroundingPairs": [
-    ["(", ")"],
+    ["{", "}"],
     ["[", "]"],
-    ["{", "}"]
+    ["(", ")"],
+    ["\"", "\""],
+    ["'", "'"],
+    ["'''", "'''"]
   ]
 }

+ 5 - 3
utils/vscode/package.json

@@ -2,7 +2,7 @@
   "name": "carbon-lang",
   "displayName": "carbon-lang",
   "description": "Carbon Language support",
-  "version": "0.0.1",
+  "version": "0.0.2",
   "repository": {
     "url": "https://github.com/carbon-language/carbon-lang"
   },
@@ -18,7 +18,9 @@
     "languages": [
       {
         "id": "carbon",
-        "aliases": [],
+        "aliases": [
+          "Carbon"
+        ],
         "extensions": [
           ".carbon"
         ],
@@ -29,7 +31,7 @@
       {
         "language": "carbon",
         "scopeName": "source.carbon",
-        "path": "Carbon.plist"
+        "path": "./carbon.tmLanguage.json"
       }
     ]
   },