diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 0000000..3f2e309 --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,17 @@ +name: Node.js CI +on: + push: + branches: [ master, work ] + pull_request: + branches: [ master, work ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v4 + with: + node-version: '18' + - run: npm ci + - run: npm run test diff --git a/.gitignore b/.gitignore index f6d4229..f1c512e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .vs/ bin/ obj/ +node_modules/ diff --git a/.vscodeignore b/.vscodeignore index ff82d4c..d02257d 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -1,5 +1,6 @@ Pluto.tmbundle/info.plist Pluto.tmbundle/Snippets/**.tmSnippet +node_modules/ .gitignore *.sublime-build visual-check.* diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3831572 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,33 @@ +{ + "name": "pluto-syntax-highlighting", + "version": "0.7.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pluto-syntax-highlighting", + "version": "0.7.0", + "devDependencies": { + "vscode-oniguruma": "^2.0.1", + "vscode-textmate": "^9.2.0" + }, + "engines": { + "vscode": "^1.65.0" + } + }, + "node_modules/vscode-oniguruma": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-2.0.1.tgz", + "integrity": "sha512-poJU8iHIWnC3vgphJnrLZyI3YdqRlR27xzqDmpPXYzA93R4Gk8z7T6oqDzDoHjoikA2aS82crdXFkjELCdJsjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-textmate": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-9.2.0.tgz", + "integrity": "sha512-rkvG4SraZQaPSN/5XjwKswdU0OP9MF28QjrYzUBbhb8QyG3ljB1Ky996m++jiI7KdiAP2CkBiQZd9pqEDTClqA==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json index ef75aaa..c9b479e 100644 --- a/package.json +++ b/package.json @@ -2,11 +2,17 @@ "name": "pluto-syntax-highlighting", "displayName": "Pluto Syntax Highlighting", "description": "Provides syntax highlighting and snippets for Pluto, a Lua dialect.", - "keywords": ["Pluto language"], + "keywords": [ + "Pluto language" + ], "version": "0.7.0", "publisher": "calamity-inc", "icon": "icon.png", - "repository": "https://github.com/PlutoLang/Syntax-Highlighting", + "repository": "https://github.com/PlutoLang/Syntax-Highlighting", + "scripts": { + "generate-baseline": "node scripts/generate-baseline.js", + "test": "node scripts/test-tokenization.js" + }, "engines": { "vscode": "^1.65.0" }, @@ -17,8 +23,12 @@ "languages": [ { "id": "pluto", - "aliases": ["Pluto"], - "extensions": [".pluto"], + "aliases": [ + "Pluto" + ], + "extensions": [ + ".pluto" + ], "configuration": "./language-config.json", "icon": { "light": "icon.png", @@ -54,5 +64,9 @@ "activationEvents": [ "onCommand:pluto-syntax-highlighting.run", "onCommand:pluto-syntax-highlighting.lint" - ] + ], + "devDependencies": { + "vscode-oniguruma": "^2.0.1", + "vscode-textmate": "^9.2.0" + } } diff --git a/scripts/generate-baseline.js b/scripts/generate-baseline.js new file mode 100644 index 0000000..4216812 --- /dev/null +++ b/scripts/generate-baseline.js @@ -0,0 +1,59 @@ +const fs = require('fs'); +const path = require('path'); +const vsctm = require('vscode-textmate'); +const onig = require('vscode-oniguruma'); + +async function loadGrammar() { + const wasmPath = require.resolve('vscode-oniguruma/release/onig.wasm'); + const wasm = fs.readFileSync(wasmPath).buffer; + await onig.loadWASM(wasm); + const onigLib = { + createOnigScanner: (sources) => new onig.OnigScanner(sources), + createOnigString: (str) => new onig.OnigString(str) + }; + + const registry = new vsctm.Registry({ + onigLib, + loadGrammar: (scopeName) => { + if (scopeName === 'source.pluto') { + const tmLanguage = fs.readFileSync(path.join(__dirname, '..', 'Pluto.tmbundle', 'Syntaxes', 'Pluto.tmLanguage'), 'utf8'); + return vsctm.parseRawGrammar(tmLanguage); + } + return null; + } + }); + + return registry.loadGrammar('source.pluto'); +} + +async function tokenizeFile(grammar, filePath) { + const lines = fs.readFileSync(filePath, 'utf8').split(/\r?\n/); + const result = []; + let ruleStack = null; + for (const line of lines) { + const res = grammar.tokenizeLine(line, ruleStack); + result.push(res.tokens.map(t => ({ + startIndex: t.startIndex, + endIndex: t.endIndex, + scopes: t.scopes + }))); + ruleStack = res.ruleStack; + } + return result; +} + +async function main() { + const grammar = await loadGrammar(); + const files = fs.readdirSync('.').filter(f => /^visual-.*\.pluto$/.test(f)); + for (const file of files) { + const tokens = await tokenizeFile(grammar, file); + const outPath = path.join('tests', 'baseline', file + '.json'); + fs.writeFileSync(outPath, JSON.stringify(tokens, null, 2)); + console.log(`Wrote ${outPath}`); + } +} + +main().catch(err => { + console.error(err); + process.exit(1); +}); diff --git a/scripts/test-tokenization.js b/scripts/test-tokenization.js new file mode 100644 index 0000000..2c0ce33 --- /dev/null +++ b/scripts/test-tokenization.js @@ -0,0 +1,67 @@ +const fs = require('fs'); +const path = require('path'); +const vsctm = require('vscode-textmate'); +const onig = require('vscode-oniguruma'); + +async function loadGrammar() { + const wasmPath = require.resolve('vscode-oniguruma/release/onig.wasm'); + const wasm = fs.readFileSync(wasmPath).buffer; + await onig.loadWASM(wasm); + const onigLib = { + createOnigScanner: (sources) => new onig.OnigScanner(sources), + createOnigString: (str) => new onig.OnigString(str) + }; + + const registry = new vsctm.Registry({ + onigLib, + loadGrammar: (scopeName) => { + if (scopeName === 'source.pluto') { + const tmLanguage = fs.readFileSync(path.join(__dirname, '..', 'Pluto.tmbundle', 'Syntaxes', 'Pluto.tmLanguage'), 'utf8'); + return vsctm.parseRawGrammar(tmLanguage); + } + return null; + } + }); + + return registry.loadGrammar('source.pluto'); +} + +async function tokenizeFile(grammar, filePath) { + const lines = fs.readFileSync(filePath, 'utf8').split(/\r?\n/); + const result = []; + let ruleStack = null; + for (const line of lines) { + const res = grammar.tokenizeLine(line, ruleStack); + result.push(res.tokens.map(t => ({ + startIndex: t.startIndex, + endIndex: t.endIndex, + scopes: t.scopes + }))); + ruleStack = res.ruleStack; + } + return result; +} + +async function main() { + const grammar = await loadGrammar(); + const files = fs.readdirSync('.').filter(f => /^visual-.*\.pluto$/.test(f)); + let ok = true; + for (const file of files) { + const tokens = await tokenizeFile(grammar, file); + const baseline = JSON.parse(fs.readFileSync(path.join('tests', 'baseline', file + '.json'), 'utf8')); + if (JSON.stringify(tokens) !== JSON.stringify(baseline)) { + console.error(`Tokenization mismatch for ${file}`); + ok = false; + } else { + console.log(`${file}: ok`); + } + } + if (!ok) { + process.exit(1); + } +} + +main().catch(err => { + console.error(err); + process.exit(1); +}); diff --git a/tests/baseline/visual-candy.pluto.json b/tests/baseline/visual-candy.pluto.json new file mode 100644 index 0000000..9f7508e --- /dev/null +++ b/tests/baseline/visual-candy.pluto.json @@ -0,0 +1,1349 @@ +[ + [ + { + "startIndex": 0, + "endIndex": 9, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 9, + "endIndex": 10, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 10, + "endIndex": 11, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.begin.pluto" + ] + }, + { + "startIndex": 11, + "endIndex": 16, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 16, + "endIndex": 17, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.end.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 4, + "scopes": [ + "source.pluto", + "meta.enum.pluto", + "storage.type.enum.pluto" + ] + }, + { + "startIndex": 4, + "endIndex": 5, + "scopes": [ + "source.pluto", + "meta.enum.pluto" + ] + }, + { + "startIndex": 5, + "endIndex": 15, + "scopes": [ + "source.pluto", + "meta.enum.pluto", + "entity.name.type.enum.pluto" + ] + }, + { + "startIndex": 15, + "endIndex": 16, + "scopes": [ + "source.pluto", + "meta.enum.pluto" + ] + }, + { + "startIndex": 16, + "endIndex": 21, + "scopes": [ + "source.pluto", + "meta.enum.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 18, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 18, + "endIndex": 19, + "scopes": [ + "source.pluto", + "punctuation.separator.comma.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 17, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 17, + "endIndex": 18, + "scopes": [ + "source.pluto", + "punctuation.separator.comma.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 3, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 5, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "storage.type.class.pluto" + ] + }, + { + "startIndex": 5, + "endIndex": 6, + "scopes": [ + "source.pluto", + "meta.class.pluto" + ] + }, + { + "startIndex": 6, + "endIndex": 12, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "entity.name.type.class.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto", + "meta.class.pluto" + ] + }, + { + "startIndex": 1, + "endIndex": 9, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "storage.type.function.pluto" + ] + }, + { + "startIndex": 9, + "endIndex": 10, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto" + ] + }, + { + "startIndex": 10, + "endIndex": 21, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "entity.name.function.pluto" + ] + }, + { + "startIndex": 21, + "endIndex": 22, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 22, + "endIndex": 29, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "storage.modifier.access.pluto" + ] + }, + { + "startIndex": 29, + "endIndex": 33, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "variable.parameter.function.pluto" + ] + }, + { + "startIndex": 33, + "endIndex": 34, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "punctuation.separator.comma.pluto" + ] + }, + { + "startIndex": 34, + "endIndex": 35, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto" + ] + }, + { + "startIndex": 35, + "endIndex": 42, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "storage.modifier.access.pluto" + ] + }, + { + "startIndex": 42, + "endIndex": 46, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "variable.parameter.function.pluto" + ] + }, + { + "startIndex": 46, + "endIndex": 47, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "meta.typehint.pluto", + "punctuation.separator.colon.pluto" + ] + }, + { + "startIndex": 47, + "endIndex": 48, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "meta.typehint.pluto" + ] + }, + { + "startIndex": 48, + "endIndex": 54, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "meta.typehint.pluto", + "storage.type.primitive.pluto" + ] + }, + { + "startIndex": 54, + "endIndex": 55, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "punctuation.section.group.end.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 2, + "scopes": [ + "source.pluto", + "meta.class.pluto" + ] + }, + { + "startIndex": 2, + "endIndex": 8, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "support.function.pluto" + ] + }, + { + "startIndex": 8, + "endIndex": 9, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 9, + "endIndex": 14, + "scopes": [ + "source.pluto", + "meta.class.pluto" + ] + }, + { + "startIndex": 14, + "endIndex": 16, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 16, + "endIndex": 27, + "scopes": [ + "source.pluto", + "meta.class.pluto" + ] + }, + { + "startIndex": 27, + "endIndex": 28, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.method-call.pluto", + "punctuation.accessor.pluto" + ] + }, + { + "startIndex": 28, + "endIndex": 33, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.method-call.pluto", + "support.function.pluto" + ] + }, + { + "startIndex": 33, + "endIndex": 34, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 34, + "endIndex": 35, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "punctuation.section.group.end.pluto" + ] + }, + { + "startIndex": 35, + "endIndex": 36, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "punctuation.section.group.end.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto", + "meta.class.pluto" + ] + }, + { + "startIndex": 1, + "endIndex": 4, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 1, + "endIndex": 9, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "storage.type.function.pluto" + ] + }, + { + "startIndex": 9, + "endIndex": 10, + "scopes": [ + "source.pluto", + "meta.function.pluto" + ] + }, + { + "startIndex": 10, + "endIndex": 21, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "entity.name.function.pluto" + ] + }, + { + "startIndex": 21, + "endIndex": 22, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 22, + "endIndex": 23, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "punctuation.section.group.end.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 2, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 2, + "endIndex": 8, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 8, + "endIndex": 9, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 9, + "endIndex": 15, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 15, + "endIndex": 16, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 16, + "endIndex": 20, + "scopes": [ + "source.pluto", + "variable.language.self.pluto" + ] + }, + { + "startIndex": 20, + "endIndex": 21, + "scopes": [ + "source.pluto", + "punctuation.accessor.pluto" + ] + }, + { + "startIndex": 21, + "endIndex": 25, + "scopes": [ + "source.pluto", + "variable.other.pluto" + ] + }, + { + "startIndex": 25, + "endIndex": 26, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 26, + "endIndex": 28, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 3, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 3, + "endIndex": 7, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 7, + "endIndex": 25, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 25, + "endIndex": 26, + "scopes": [ + "source.pluto", + "keyword.operator.logical.pluto" + ] + }, + { + "startIndex": 26, + "endIndex": 27, + "scopes": [ + "source.pluto", + "keyword.operator.logical.pluto" + ] + }, + { + "startIndex": 27, + "endIndex": 28, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 28, + "endIndex": 29, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.begin.pluto" + ] + }, + { + "startIndex": 29, + "endIndex": 46, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 46, + "endIndex": 47, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.end.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 3, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 3, + "endIndex": 10, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 10, + "endIndex": 11, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 11, + "endIndex": 12, + "scopes": [ + "source.pluto", + "keyword.operator.logical.pluto" + ] + }, + { + "startIndex": 12, + "endIndex": 13, + "scopes": [ + "source.pluto", + "keyword.operator.logical.pluto" + ] + }, + { + "startIndex": 13, + "endIndex": 14, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 14, + "endIndex": 15, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "keyword.operator.pluto" + ] + }, + { + "startIndex": 15, + "endIndex": 16, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.begin.pluto" + ] + }, + { + "startIndex": 16, + "endIndex": 17, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 17, + "endIndex": 18, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 18, + "endIndex": 19, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 19, + "endIndex": 20, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 20, + "endIndex": 21, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 21, + "endIndex": 22, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 22, + "endIndex": 23, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 23, + "endIndex": 24, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 24, + "endIndex": 25, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 25, + "endIndex": 26, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 26, + "endIndex": 27, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 27, + "endIndex": 28, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 28, + "endIndex": 29, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "meta.interpolation.pluto", + "punctuation.section.interpolation.begin.pluto" + ] + }, + { + "startIndex": 29, + "endIndex": 33, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "meta.interpolation.pluto", + "variable.language.self.pluto" + ] + }, + { + "startIndex": 33, + "endIndex": 34, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "meta.interpolation.pluto", + "punctuation.accessor.pluto" + ] + }, + { + "startIndex": 34, + "endIndex": 38, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "meta.interpolation.pluto", + "variable.other.pluto" + ] + }, + { + "startIndex": 38, + "endIndex": 39, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "meta.interpolation.pluto", + "punctuation.section.interpolation.end.pluto" + ] + }, + { + "startIndex": 39, + "endIndex": 40, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 40, + "endIndex": 41, + "scopes": [ + "source.pluto", + "meta.string.quoted.double.interpolation.pluto", + "string.pluto", + "punctuation.definition.string.end.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 2, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 2, + "endIndex": 5, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 1, + "endIndex": 4, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 3, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 5, + "scopes": [ + "source.pluto", + "storage.modifier.pluto" + ] + }, + { + "startIndex": 5, + "endIndex": 11, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 11, + "endIndex": 12, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 12, + "endIndex": 13, + "scopes": [ + "source.pluto", + "keyword.operator.assignment.pluto" + ] + }, + { + "startIndex": 13, + "endIndex": 14, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 14, + "endIndex": 17, + "scopes": [ + "source.pluto", + "meta.classoperator.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 17, + "endIndex": 18, + "scopes": [ + "source.pluto", + "meta.classoperator.pluto" + ] + }, + { + "startIndex": 18, + "endIndex": 24, + "scopes": [ + "source.pluto", + "meta.classoperator.pluto", + "support.class.pluto" + ] + }, + { + "startIndex": 24, + "endIndex": 25, + "scopes": [ + "source.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 25, + "endIndex": 42, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 42, + "endIndex": 43, + "scopes": [ + "source.pluto", + "punctuation.separator.comma.pluto" + ] + }, + { + "startIndex": 43, + "endIndex": 44, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 44, + "endIndex": 45, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.begin.pluto" + ] + }, + { + "startIndex": 45, + "endIndex": 49, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 49, + "endIndex": 50, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.end.pluto" + ] + }, + { + "startIndex": 50, + "endIndex": 51, + "scopes": [ + "source.pluto", + "punctuation.section.group.end.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 5, + "scopes": [ + "source.pluto", + "support.function.pluto" + ] + }, + { + "startIndex": 5, + "endIndex": 6, + "scopes": [ + "source.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 6, + "endIndex": 11, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 11, + "endIndex": 12, + "scopes": [ + "source.pluto", + "meta.method-call.pluto", + "punctuation.accessor.pluto" + ] + }, + { + "startIndex": 12, + "endIndex": 23, + "scopes": [ + "source.pluto", + "meta.method-call.pluto", + "support.function.pluto" + ] + }, + { + "startIndex": 23, + "endIndex": 24, + "scopes": [ + "source.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 24, + "endIndex": 25, + "scopes": [ + "source.pluto", + "punctuation.section.group.end.pluto" + ] + }, + { + "startIndex": 25, + "endIndex": 26, + "scopes": [ + "source.pluto", + "punctuation.section.group.end.pluto" + ] + }, + { + "startIndex": 26, + "endIndex": 27, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 27, + "endIndex": 29, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto", + "punctuation.definition.comment.pluto" + ] + }, + { + "startIndex": 29, + "endIndex": 49, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 5, + "scopes": [ + "source.pluto", + "support.function.pluto" + ] + }, + { + "startIndex": 5, + "endIndex": 6, + "scopes": [ + "source.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 6, + "endIndex": 9, + "scopes": [ + "source.pluto", + "meta.classoperator.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 9, + "endIndex": 10, + "scopes": [ + "source.pluto", + "meta.classoperator.pluto" + ] + }, + { + "startIndex": 10, + "endIndex": 16, + "scopes": [ + "source.pluto", + "meta.classoperator.pluto", + "support.class.pluto" + ] + }, + { + "startIndex": 16, + "endIndex": 17, + "scopes": [ + "source.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 17, + "endIndex": 33, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 33, + "endIndex": 34, + "scopes": [ + "source.pluto", + "punctuation.separator.comma.pluto" + ] + }, + { + "startIndex": 34, + "endIndex": 35, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 35, + "endIndex": 36, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.begin.pluto" + ] + }, + { + "startIndex": 36, + "endIndex": 43, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 43, + "endIndex": 44, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.end.pluto" + ] + }, + { + "startIndex": 44, + "endIndex": 45, + "scopes": [ + "source.pluto", + "punctuation.section.group.end.pluto" + ] + }, + { + "startIndex": 45, + "endIndex": 46, + "scopes": [ + "source.pluto", + "punctuation.separator.colon.pluto" + ] + }, + { + "startIndex": 46, + "endIndex": 57, + "scopes": [ + "source.pluto", + "support.function.any-method.pluto" + ] + }, + { + "startIndex": 57, + "endIndex": 58, + "scopes": [ + "source.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 58, + "endIndex": 59, + "scopes": [ + "source.pluto", + "punctuation.section.group.end.pluto" + ] + }, + { + "startIndex": 59, + "endIndex": 60, + "scopes": [ + "source.pluto", + "punctuation.section.group.end.pluto" + ] + }, + { + "startIndex": 60, + "endIndex": 61, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 61, + "endIndex": 63, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto", + "punctuation.definition.comment.pluto" + ] + }, + { + "startIndex": 63, + "endIndex": 83, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + } + ] +] diff --git a/tests/baseline/visual-check-not-invalid.pluto.json b/tests/baseline/visual-check-not-invalid.pluto.json new file mode 100644 index 0000000..8067b8a --- /dev/null +++ b/tests/baseline/visual-check-not-invalid.pluto.json @@ -0,0 +1,79 @@ +[ + [ + { + "startIndex": 0, + "endIndex": 2, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto", + "punctuation.definition.comment.pluto" + ] + }, + { + "startIndex": 2, + "endIndex": 49, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.begin.pluto" + ] + }, + { + "startIndex": 1, + "endIndex": 6, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 6, + "endIndex": 8, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "constant.character.escape.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 5, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 5, + "endIndex": 6, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.end.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + } + ] +] diff --git a/tests/baseline/visual-check.pluto.json b/tests/baseline/visual-check.pluto.json new file mode 100644 index 0000000..295c05a --- /dev/null +++ b/tests/baseline/visual-check.pluto.json @@ -0,0 +1,1347 @@ +[ + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 5, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "storage.type.class.pluto" + ] + }, + { + "startIndex": 5, + "endIndex": 6, + "scopes": [ + "source.pluto", + "meta.class.pluto" + ] + }, + { + "startIndex": 6, + "endIndex": 11, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "entity.name.type.class.pluto" + ] + }, + { + "startIndex": 11, + "endIndex": 12, + "scopes": [ + "source.pluto", + "meta.class.pluto" + ] + }, + { + "startIndex": 12, + "endIndex": 19, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.extends.pluto", + "storage.modifier.extends.pluto" + ] + }, + { + "startIndex": 19, + "endIndex": 20, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.extends.pluto" + ] + }, + { + "startIndex": 20, + "endIndex": 26, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.extends.pluto", + "entity.other.inherited-class.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto", + "meta.class.pluto" + ] + }, + { + "startIndex": 1, + "endIndex": 7, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "storage.modifier.pluto" + ] + }, + { + "startIndex": 7, + "endIndex": 8, + "scopes": [ + "source.pluto", + "meta.class.pluto" + ] + }, + { + "startIndex": 8, + "endIndex": 16, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "storage.type.function.pluto" + ] + }, + { + "startIndex": 16, + "endIndex": 17, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto" + ] + }, + { + "startIndex": 17, + "endIndex": 25, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "entity.name.function.pluto" + ] + }, + { + "startIndex": 25, + "endIndex": 26, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 26, + "endIndex": 27, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "meta.function.pluto", + "punctuation.section.group.end.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto", + "meta.class.pluto" + ] + }, + { + "startIndex": 1, + "endIndex": 4, + "scopes": [ + "source.pluto", + "meta.class.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 3, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 5, + "scopes": [ + "source.pluto", + "storage.modifier.pluto" + ] + }, + { + "startIndex": 5, + "endIndex": 7, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 7, + "endIndex": 8, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 8, + "endIndex": 9, + "scopes": [ + "source.pluto", + "keyword.operator.assignment.pluto" + ] + }, + { + "startIndex": 9, + "endIndex": 10, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 10, + "endIndex": 13, + "scopes": [ + "source.pluto", + "meta.classoperator.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 13, + "endIndex": 14, + "scopes": [ + "source.pluto", + "meta.classoperator.pluto" + ] + }, + { + "startIndex": 14, + "endIndex": 19, + "scopes": [ + "source.pluto", + "meta.classoperator.pluto", + "support.class.pluto" + ] + }, + { + "startIndex": 19, + "endIndex": 20, + "scopes": [ + "source.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 20, + "endIndex": 21, + "scopes": [ + "source.pluto", + "constant.numeric.integer.pluto" + ] + }, + { + "startIndex": 21, + "endIndex": 22, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 22, + "endIndex": 23, + "scopes": [ + "source.pluto", + "keyword.operator.logical.pluto" + ] + }, + { + "startIndex": 23, + "endIndex": 24, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 24, + "endIndex": 25, + "scopes": [ + "source.pluto", + "constant.numeric.integer.pluto" + ] + }, + { + "startIndex": 25, + "endIndex": 26, + "scopes": [ + "source.pluto", + "punctuation.section.group.end.pluto" + ] + }, + { + "startIndex": 26, + "endIndex": 27, + "scopes": [ + "source.pluto", + "punctuation.terminator.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 5, + "scopes": [ + "source.pluto", + "support.function.pluto" + ] + }, + { + "startIndex": 5, + "endIndex": 6, + "scopes": [ + "source.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 6, + "endIndex": 7, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 7, + "endIndex": 8, + "scopes": [ + "source.pluto", + "punctuation.accessor.pluto" + ] + }, + { + "startIndex": 8, + "endIndex": 12, + "scopes": [ + "source.pluto", + "variable.other.pluto" + ] + }, + { + "startIndex": 12, + "endIndex": 13, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 13, + "endIndex": 15, + "scopes": [ + "source.pluto", + "keyword.operator.logical.pluto" + ] + }, + { + "startIndex": 15, + "endIndex": 16, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 16, + "endIndex": 17, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.begin.pluto" + ] + }, + { + "startIndex": 17, + "endIndex": 19, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "constant.character.escape.pluto" + ] + }, + { + "startIndex": 19, + "endIndex": 20, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.end.pluto" + ] + }, + { + "startIndex": 20, + "endIndex": 21, + "scopes": [ + "source.pluto", + "punctuation.section.group.end.pluto" + ] + }, + { + "startIndex": 21, + "endIndex": 22, + "scopes": [ + "source.pluto", + "punctuation.terminator.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 1, + "endIndex": 2, + "scopes": [ + "source.pluto", + "meta.method-call.pluto", + "punctuation.accessor.pluto" + ] + }, + { + "startIndex": 2, + "endIndex": 10, + "scopes": [ + "source.pluto", + "meta.method-call.pluto", + "support.function.pluto" + ] + }, + { + "startIndex": 10, + "endIndex": 11, + "scopes": [ + "source.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 11, + "endIndex": 12, + "scopes": [ + "source.pluto", + "punctuation.section.group.end.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 4, + "scopes": [ + "source.pluto", + "meta.enum.pluto", + "storage.type.enum.pluto" + ] + }, + { + "startIndex": 4, + "endIndex": 5, + "scopes": [ + "source.pluto", + "meta.enum.pluto" + ] + }, + { + "startIndex": 5, + "endIndex": 10, + "scopes": [ + "source.pluto", + "meta.enum.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 10, + "endIndex": 11, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 11, + "endIndex": 14, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 4, + "scopes": [ + "source.pluto", + "meta.enum.pluto", + "storage.type.enum.pluto" + ] + }, + { + "startIndex": 4, + "endIndex": 5, + "scopes": [ + "source.pluto", + "meta.enum.pluto" + ] + }, + { + "startIndex": 5, + "endIndex": 9, + "scopes": [ + "source.pluto", + "meta.enum.pluto", + "entity.name.type.enum.pluto" + ] + }, + { + "startIndex": 9, + "endIndex": 10, + "scopes": [ + "source.pluto", + "meta.enum.pluto" + ] + }, + { + "startIndex": 10, + "endIndex": 15, + "scopes": [ + "source.pluto", + "meta.enum.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 15, + "endIndex": 16, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 16, + "endIndex": 19, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 10, + "scopes": [ + "source.pluto", + "meta.enum.pluto", + "storage.type.enum.pluto" + ] + }, + { + "startIndex": 10, + "endIndex": 11, + "scopes": [ + "source.pluto", + "meta.enum.pluto" + ] + }, + { + "startIndex": 11, + "endIndex": 18, + "scopes": [ + "source.pluto", + "meta.enum.pluto", + "entity.name.type.enum.pluto" + ] + }, + { + "startIndex": 18, + "endIndex": 19, + "scopes": [ + "source.pluto", + "meta.enum.pluto" + ] + }, + { + "startIndex": 19, + "endIndex": 24, + "scopes": [ + "source.pluto", + "meta.enum.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 24, + "endIndex": 25, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 25, + "endIndex": 28, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 6, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 6, + "endIndex": 7, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 7, + "endIndex": 8, + "scopes": [ + "source.pluto", + "constant.numeric.integer.pluto" + ] + }, + { + "startIndex": 8, + "endIndex": 9, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 9, + "endIndex": 11, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 1, + "endIndex": 8, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 8, + "endIndex": 9, + "scopes": [ + "source.pluto", + "punctuation.separator.colon.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 1, + "endIndex": 5, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + }, + { + "startIndex": 5, + "endIndex": 6, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 6, + "endIndex": 7, + "scopes": [ + "source.pluto", + "constant.numeric.integer.pluto" + ] + }, + { + "startIndex": 7, + "endIndex": 8, + "scopes": [ + "source.pluto", + "punctuation.separator.colon.pluto" + ] + }, + { + "startIndex": 8, + "endIndex": 9, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 9, + "endIndex": 14, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 3, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 8, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "storage.type.function.pluto" + ] + }, + { + "startIndex": 8, + "endIndex": 9, + "scopes": [ + "source.pluto", + "meta.function.pluto" + ] + }, + { + "startIndex": 9, + "endIndex": 10, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "entity.name.function.pluto" + ] + }, + { + "startIndex": 10, + "endIndex": 11, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "punctuation.section.group.begin.pluto" + ] + }, + { + "startIndex": 11, + "endIndex": 12, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "variable.parameter.function.pluto" + ] + }, + { + "startIndex": 12, + "endIndex": 13, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "meta.typehint.pluto", + "punctuation.separator.colon.pluto" + ] + }, + { + "startIndex": 13, + "endIndex": 14, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "meta.typehint.pluto" + ] + }, + { + "startIndex": 14, + "endIndex": 21, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "meta.typehint.pluto", + "storage.type.primitive.pluto" + ] + }, + { + "startIndex": 21, + "endIndex": 22, + "scopes": [ + "source.pluto", + "meta.function.pluto" + ] + }, + { + "startIndex": 22, + "endIndex": 23, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "meta.default-arguments.pluto", + "keyword.operator.assignment.pluto" + ] + }, + { + "startIndex": 23, + "endIndex": 24, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "meta.default-arguments.pluto" + ] + }, + { + "startIndex": 24, + "endIndex": 25, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "meta.default-arguments.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.begin.pluto" + ] + }, + { + "startIndex": 25, + "endIndex": 38, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "meta.default-arguments.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 38, + "endIndex": 39, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "meta.default-arguments.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.end.pluto" + ] + }, + { + "startIndex": 39, + "endIndex": 40, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "punctuation.section.group.end.pluto" + ] + }, + { + "startIndex": 40, + "endIndex": 41, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "punctuation.separator.colon.pluto" + ] + }, + { + "startIndex": 41, + "endIndex": 42, + "scopes": [ + "source.pluto", + "meta.function.pluto" + ] + }, + { + "startIndex": 42, + "endIndex": 46, + "scopes": [ + "source.pluto", + "meta.function.pluto", + "storage.type.primitive.pluto" + ] + }, + { + "startIndex": 46, + "endIndex": 47, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 47, + "endIndex": 50, + "scopes": [ + "source.pluto", + "keyword.control.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 1, + "endIndex": 3, + "scopes": [ + "source.pluto", + "punctuation.accessor.pluto" + ] + }, + { + "startIndex": 3, + "endIndex": 7, + "scopes": [ + "source.pluto", + "variable.other.pluto" + ] + }, + { + "startIndex": 7, + "endIndex": 8, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 8, + "endIndex": 10, + "scopes": [ + "source.pluto", + "keyword.operator.nullcoal.pluto" + ] + }, + { + "startIndex": 10, + "endIndex": 11, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 11, + "endIndex": 12, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.begin.pluto" + ] + }, + { + "startIndex": 12, + "endIndex": 16, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto" + ] + }, + { + "startIndex": 16, + "endIndex": 17, + "scopes": [ + "source.pluto", + "string.quoted.double.pluto", + "string.quoted.double.pluto", + "punctuation.definition.string.end.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 2, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 2, + "endIndex": 3, + "scopes": [ + "source.pluto", + "keyword.operator.ternary.pluto" + ] + }, + { + "startIndex": 3, + "endIndex": 6, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 6, + "endIndex": 7, + "scopes": [ + "source.pluto", + "keyword.operator.ternary.pluto" + ] + }, + { + "startIndex": 7, + "endIndex": 10, + "scopes": [ + "source.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + }, + { + "startIndex": 1, + "endIndex": 2, + "scopes": [ + "source.pluto", + "meta.safe-navigation-array.pluto", + "punctuation.accessor.pluto" + ] + }, + { + "startIndex": 2, + "endIndex": 3, + "scopes": [ + "source.pluto", + "meta.safe-navigation-array.pluto" + ] + }, + { + "startIndex": 3, + "endIndex": 5, + "scopes": [ + "source.pluto", + "constant.numeric.integer.pluto" + ] + }, + { + "startIndex": 5, + "endIndex": 7, + "scopes": [ + "source.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 4, + "scopes": [ + "source.pluto", + "meta.goto.pluto", + "keyword.control.goto.pluto" + ] + }, + { + "startIndex": 4, + "endIndex": 10, + "scopes": [ + "source.pluto", + "meta.goto.pluto" + ] + }, + { + "startIndex": 10, + "endIndex": 11, + "scopes": [ + "source.pluto", + "punctuation.terminator.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 2, + "scopes": [ + "source.pluto", + "meta.goto-label.pluto", + "punctuation.definition.label.begin.pluto" + ] + }, + { + "startIndex": 2, + "endIndex": 7, + "scopes": [ + "source.pluto", + "meta.goto-label.pluto" + ] + }, + { + "startIndex": 7, + "endIndex": 9, + "scopes": [ + "source.pluto", + "meta.goto-label.pluto", + "punctuation.definition.label.end.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 2, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto", + "punctuation.definition.comment.pluto" + ] + }, + { + "startIndex": 2, + "endIndex": 14, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 2, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto", + "punctuation.definition.comment.pluto" + ] + }, + { + "startIndex": 2, + "endIndex": 3, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto" + ] + }, + { + "startIndex": 3, + "endIndex": 9, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto", + "entity.name.tag.documentation.pluto" + ] + }, + { + "startIndex": 9, + "endIndex": 28, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 2, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto", + "punctuation.definition.comment.pluto" + ] + }, + { + "startIndex": 2, + "endIndex": 3, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto" + ] + }, + { + "startIndex": 3, + "endIndex": 10, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto", + "entity.name.tag.documentation.pluto" + ] + }, + { + "startIndex": 10, + "endIndex": 20, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 2, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto", + "punctuation.definition.comment.pluto" + ] + }, + { + "startIndex": 2, + "endIndex": 3, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto" + ] + }, + { + "startIndex": 3, + "endIndex": 7, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto", + "entity.name.tag.documentation.pluto" + ] + }, + { + "startIndex": 7, + "endIndex": 22, + "scopes": [ + "source.pluto", + "comment.line.double-dash.pluto" + ] + } + ], + [ + { + "startIndex": 0, + "endIndex": 1, + "scopes": [ + "source.pluto" + ] + } + ] +]