From 97d06f1084e89bfb67e4021960fc700585005217 Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Fri, 20 Dec 2019 14:22:03 +0800 Subject: [PATCH 01/17] change title as per vscode api reference --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 643ed7c..2a3eaee 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ ], "configuration": { "type": "object", - "title": "Maya port configuration", + "title": "MayaCode", "properties": { "mayacode.mel.port": { "type": "integer", @@ -150,4 +150,4 @@ ] } } -} +} \ No newline at end of file From 483a08254d15bac9490045f61b0b32f6d7fdbd62 Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Sat, 21 Dec 2019 00:26:32 +0800 Subject: [PATCH 02/17] add better error msg when cannot connect to maya --- src/extension.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 9bc9475..6ff46f7 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -103,9 +103,11 @@ export function activate(context: vscode.ExtensionContext) { updateStatusBarItem(type); }); socket.on('error', function(error) { - let errorMsg = `Unable to connect to port ${port} on Host ${mayahost} in Maya for ${type},\nError Code : ${ - error.code - }`; + let errorMsg = `Unable to connect using port ${port} on Host ${mayahost} \nPlease run the below mel command in Maya\`s script editor + + commandPort -n "${mayahost}:${port}" -stp "mel" -echoOutput; + + Error Code : ${error.code}`; Logger.error(errorMsg); }); From 698f53cf284bbc6ff1654e57d7568c96698d271a Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Sat, 21 Dec 2019 00:27:04 +0800 Subject: [PATCH 03/17] add help on hover with doc link --- src/extension.ts | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/extension.ts b/src/extension.ts index 6ff46f7..1115c0b 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -78,6 +78,7 @@ export function activate(context: vscode.ExtensionContext) { let outputPanel = vscode.window.createOutputChannel('Maya'); Logger.registerOutputPanel(outputPanel); + let cmds: Array = []; let words: Array = []; let seen_splits: Array = []; let completions: Array = []; @@ -238,6 +239,48 @@ export function activate(context: vscode.ExtensionContext) { Logger.info(`Completion execution time: ${time}`); } + function getHoverText(url: string, documentation:string): vscode.MarkdownString { + const text = `${documentation}\n\n[Read Online Help](${url})`; + return new vscode.MarkdownString(text); + } + + let hoverProviderMELdisposable = vscode.languages.registerHoverProvider("mel", { + provideHover(document: vscode.TextDocument, pos: vscode.Position, token: vscode.CancellationToken): vscode.ProviderResult { + + if (cmds.length == 0) { + Logger.info(`Building cmds`); + + data['completions'].forEach(this_item => { + cmds.push(this_item['trigger']); + }); + } + + const range = document.getWordRangeAtPosition(pos); + + if (range === undefined) { + return; + } + + const word = document.getText(range); + + if (cmds.indexOf(word) > -1){ + const helpUrl = `http://help.autodesk.com/cloudhelp/2017/ENU/Maya-Tech-Docs/Commands/${word}.html`; + let documentation = ''; + data['completions'].forEach(this_item => { + if (this_item['trigger'] == word) { + documentation = this_item['comment'].replace(/\n/g, " \n"); + } + }); + return new vscode.Hover(getHoverText(helpUrl, documentation)); + } + + return; + } + } + ); + + context.subscriptions.push(hoverProviderMELdisposable); + const provider_all = vscode.languages.registerCompletionItemProvider('mel', { provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token, context) { From e9ed5f326726ac68238db61dc8a226d59e83a828 Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Sat, 21 Dec 2019 00:28:38 +0800 Subject: [PATCH 04/17] bump to version 1.2.0 --- CHANGELOG.md | 5 +++++ README.md | 4 ++++ images/variables.gif | Bin 0 -> 72044 bytes package.json | 10 ++++++---- 4 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 images/variables.gif diff --git a/CHANGELOG.md b/CHANGELOG.md index e43c138..2acbc4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## Version 1.2.0 +* Add Help on hover, with link to read the documentation online. +* Changed settings title to MayaCode to be in line with api docs +* Added better error msg when cannot connect to maya via commandPort. + ## Version 1.1.0 * Add autocomplete for MEL variables. [issues/9](https://github.com/artbycrunk/vscode-maya/issues/9) * Speedup autocomplete processing. diff --git a/README.md b/README.md index 890029b..84b2b62 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,10 @@ A [Visual Studio Code](https://code.visualstudio.com/) [extension](https://marke > ![Autocomplete MEL commands as you type](./images/autocomplete.gif "Autocomplete MEL commands as you type") +* Autocomplete MEL variables as you type + + > ![Autocomplete MEL variables as you type](./images/variables.gif "Autocomplete MEL variables as you type") + * Send code to Maya via command port (MEL or Python). > ![Send code to Maya via command port](./images/send_to_maya.gif "Send code to Maya via command port") diff --git a/images/variables.gif b/images/variables.gif new file mode 100644 index 0000000000000000000000000000000000000000..178faa5a2fdadea0910b050d85e9935d527fae95 GIT binary patch literal 72044 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 Date: Mon, 27 Apr 2020 12:07:10 +0800 Subject: [PATCH 05/17] add telemetry --- package.json | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index aab077f..3fd5f13 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ }, "icon": "icon.png", "engines": { - "vscode": "^1.0.0" + "vscode": "^1.5.0" }, "keywords": [ "maya", @@ -45,11 +45,15 @@ "postinstall": "node ./node_modules/vscode/bin/install" }, "devDependencies": { - "@types/node": "^6.0.40", + "@types/node": "^6.0.42", + "@types/vscode": "^1.40.0", "tslint": "^5.11.0", - "typescript": "^2.1.4", + "typescript": "^2.1.6", "vscode": "^1.1.17" }, + "dependencies": { + "vscode-extension-telemetry": "^0.1.3" + }, "contributes": { "languages": [ { @@ -110,6 +114,10 @@ "type": "string", "default": "localhost", "description": "The hostname of the machine which has a maya instance running." + }, + "mayacode.telemetry": { + "type": "boolean", + "default": true } } }, From 1a00d662fcbdd4c1d9bc2697d5ea16da7574db04 Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Mon, 27 Apr 2020 12:10:56 +0800 Subject: [PATCH 06/17] add basic telemetry events --- package-lock.json | 671 ++++++++++++++++++++++++++++++++++++++++++++++ src/extension.ts | 60 ++++- 2 files changed, 729 insertions(+), 2 deletions(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..9a4c5a4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,671 @@ +{ + "name": "mayacode", + "version": "1.2.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/node": { + "version": "6.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.10.tgz", + "integrity": "sha512-pF4HjZGSog75kGq7B1InK/wt/N08BuPATo+7HRfv7gZUzccebwv/fmWVGs/j6LvSiLWpCuGGhql51M/wcQsNzA==", + "dev": true + }, + "@types/vscode": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.44.0.tgz", + "integrity": "sha512-WJZtZlinE3meRdH+I7wTsIhpz/GLhqEQwmPGeh4s1irWLwMzCeTV8WZ+pgPTwrDXoafVUWwo1LiZ9HJVHFlJSQ==", + "dev": true + }, + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "applicationinsights": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.7.4.tgz", + "integrity": "sha512-XFLsNlcanpjFhHNvVWEfcm6hr7lu9znnb6Le1Lk5RE03YUV9X2B2n2MfM4kJZRrUdV+C0hdHxvWyv+vWoLfY7A==", + "requires": { + "cls-hooked": "^4.2.2", + "continuation-local-storage": "^3.2.1", + "diagnostic-channel": "0.2.0", + "diagnostic-channel-publishers": "^0.3.3" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "async-hook-jl": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", + "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==", + "requires": { + "stack-chain": "^1.3.7" + } + }, + "async-listener": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", + "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", + "requires": { + "semver": "^5.3.0", + "shimmer": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cls-hooked": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", + "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==", + "requires": { + "async-hook-jl": "^1.7.6", + "emitter-listener": "^1.0.1", + "semver": "^5.4.1" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "requires": { + "async-listener": "^0.6.0", + "emitter-listener": "^1.1.1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "diagnostic-channel": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", + "integrity": "sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=", + "requires": { + "semver": "^5.3.0" + } + }, + "diagnostic-channel-publishers": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.3.3.tgz", + "integrity": "sha512-qIocRYU5TrGUkBlDDxaziAK1+squ8Yf2Ls4HldL3xxb/jzmWO2Enux7CvevNKYmF2kDXZ9HiRqwjPsjk8L+i2Q==" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "emitter-listener": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", + "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", + "requires": { + "shimmer": "^1.2.0" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "stack-chain": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", + "integrity": "sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + }, + "tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "dev": true + }, + "vscode": { + "version": "1.1.37", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.37.tgz", + "integrity": "sha512-vJNj6IlN7IJPdMavlQa1KoFB3Ihn06q1AiN3ZFI/HfzPNzbKZWPPuiU+XkpNOfGU5k15m4r80nxNPlM7wcc0wg==", + "dev": true, + "requires": { + "glob": "^7.1.2", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "mocha": "^5.2.0", + "semver": "^5.4.1", + "source-map-support": "^0.5.0", + "vscode-test": "^0.4.1" + } + }, + "vscode-extension-telemetry": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.3.tgz", + "integrity": "sha512-2P4/TrxwMRQJPpcsSpreI7JVftmy+kbatONGVY65x4fJfbaHTBTm6jNgkG0Xifv6Th1o25KvaVZUTjN7VWlxBA==", + "requires": { + "applicationinsights": "1.7.4" + } + }, + "vscode-test": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz", + "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==", + "dev": true, + "requires": { + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/src/extension.ts b/src/extension.ts index 1115c0b..e3cc628 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -9,10 +9,20 @@ import * as fs from 'fs'; import * as path from 'path'; var net = require('net'); +import TelemetryReporter from 'vscode-extension-telemetry'; let mayaportStatusBar: vscode.StatusBarItem; let socket_mel: Socket; let port_mel: string; +let reporter: TelemetryReporter; // telemetry reporter + +// all events will be prefixed with this event name +// extension version will be reported as a property with each event +const extensionId = 'saviof.mayacode'; +const extensionVersion = vscode.extensions.getExtension(extensionId).packageJSON.version; + +// the application insights key (also known as instrumentation key) +const key = '9f14526e-33c3-420b-a5ff-2bdab837dc10'; function updateStatusBarItem(langID?: string): void { let text: string; @@ -70,7 +80,7 @@ export class Logger { let util = require('util'); let time = TimeUtils.getTime(); if (!log || !log.split) return; - this._outputPanel.appendLine(util.format('MayaCode [%s][%s]\t %s', time, type, log)); + this._outputPanel.appendLine(util.format('MayaCode-%s [%s][%s]\t %s', extensionVersion, time, type, log)); } } @@ -84,9 +94,43 @@ export function activate(context: vscode.ExtensionContext) { let completions: Array = []; let word_completions: Array = []; let var_completions: Array = []; + let lastStackTrace: string; + const timeOpened = Date.now() var config = vscode.workspace.getConfiguration('mayacode'); + // create telemetry reporter on extension activation + // ensure it gets property disposed + reporter = new TelemetryReporter(extensionId, extensionVersion, key); + context.subscriptions.push(reporter); + reporter.sendTelemetryEvent('start', {}) + + function sendError(error: Error, code: number=0, category='typescript'){ + if(config.get('telemetry')){ + if(error.stack == lastStackTrace) return + Logger.info(`Sending error event`); + reporter.sendTelemetryException(error, { + code: code.toString(), + category, + }) + lastStackTrace = error.stack + } + } + + function sendEvent(event: string, execTime: number=0, fileType:string){ + if(config.get('telemetry')){ + const measurements: {[key: string]: number} = {} + measurements['timeSpent'] = (Date.now() - timeOpened)/1000 + measurements['execTime'] = execTime + + const properties: {[key: string]: string} = {} + properties['fileType'] = fileType + + Logger.info(`Sending event`); + reporter.sendTelemetryEvent(event, properties, measurements) + } + } + function ensureConnection(type: string) { let socket; let mayahost: string = config.get('hostname'); @@ -110,6 +154,7 @@ export function activate(context: vscode.ExtensionContext) { Error Code : ${error.code}`; Logger.error(errorMsg); + sendError(error, error.code, 'socket') }); socket.on('data', function(data) { @@ -126,6 +171,7 @@ export function activate(context: vscode.ExtensionContext) { function send_tmp_file(text: string, type: string) { let cmd:string, nativePath:string, posixPath:string; + var start = new Date().getTime(); if (type == 'python') { //add encoding http://python.org/dev/peps/pep-0263/ @@ -145,9 +191,13 @@ export function activate(context: vscode.ExtensionContext) { fs.writeFile(nativePath, text, function (err) { if (err) { Logger.error(`Failed to write ${type} to temp file ${posixPath}`); + sendError(err, 1, 'filewrite') } else { Logger.info(`Executing ${cmd}...`); send(cmd, type); + var end = new Date().getTime(); + var time = end - start; + sendEvent("send_tmp_file", time, type) } }); } @@ -209,6 +259,9 @@ export function activate(context: vscode.ExtensionContext) { item.documentation = this_item['comment']; completions.push(item); }); + var end = new Date().getTime(); + var time = end - start; + sendEvent("build-completions", time, "mel") } const _splitTexts = documentText.split(/[^A-Za-z\$1-9]+/); @@ -326,4 +379,7 @@ export function activate(context: vscode.ExtensionContext) { context.subscriptions.push(...registerDisposables()); } -export function deactivate(context: vscode.ExtensionContext) {} +export function deactivate(context: vscode.ExtensionContext) { + // This will ensure all pending events get flushed + reporter.dispose(); +} From ee309e5674c676d60070a9771de580872da5f1b4 Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Mon, 27 Apr 2020 12:20:05 +0800 Subject: [PATCH 07/17] fix output line numbers are off by 1 #14 --- src/extension.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index e3cc628..78efde0 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -131,6 +131,17 @@ export function activate(context: vscode.ExtensionContext) { } } + function cleanResponse(data: Buffer){ + var dataString = data.toString() + if(dataString.startsWith("Error")){ + dataString = dataString.replace(/MayaCode.py", line (?\d+)/, (...match) => { + let newLineno = match[0].replace(match[1], (+match[1]-1).toString()) + return newLineno; + }) + } + return dataString + } + function ensureConnection(type: string) { let socket; let mayahost: string = config.get('hostname'); @@ -157,8 +168,8 @@ export function activate(context: vscode.ExtensionContext) { sendError(error, error.code, 'socket') }); - socket.on('data', function(data) { - Logger.response(data.toString()); + socket.on('data', function(data: Buffer) { + Logger.response(cleanResponse(data)); }); socket.on('end', () => { From 99a1cb7071a8cfda5e5e9d4b967e97b303006be1 Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Mon, 27 Apr 2020 12:39:11 +0800 Subject: [PATCH 08/17] bump version to 1.3.0 --- CHANGELOG.md | 12 ++++++++---- package.json | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2acbc4b..cc51288 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,18 +1,22 @@ # Changelog -## Version 1.2.0 +## Version 1.3.0 (April 27, 2020) +* Fix: Output line numbers are off by 1 (@artbycrunk in [issues/14](https://github.com/artbycrunk/vscode-maya/issues/14)) +* Enhancement: Added telemetry for basic events + +## Version 1.2.0 (Dec 21, 2019) * Add Help on hover, with link to read the documentation online. * Changed settings title to MayaCode to be in line with api docs * Added better error msg when cannot connect to maya via commandPort. -## Version 1.1.0 +## Version 1.1.0 (Aug 18, 2019) * Add autocomplete for MEL variables. [issues/9](https://github.com/artbycrunk/vscode-maya/issues/9) * Speedup autocomplete processing. -## Version 1.0.1 +## Version 1.0.1 (Jul 06, 2019) * Fixed issue with non-ascii characters in python code [issues/5](https://github.com/artbycrunk/vscode-maya/issues/5) -## Version 1.0.0 +## Version 1.0.0 (May 15, 2019) * Rewrite the code to work over a single Maya socket. * Use temp files to send code between vscode and maya. * Add support for sending complete files to maya diff --git a/package.json b/package.json index 3fd5f13..9557504 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "mayacode", "displayName": "MayaCode", "description": "A Visual Studio Code extension with support for coding for Maya.", - "version": "1.2.0", + "version": "1.3.0", "publisher": "saviof", "author": { "name": "Savio Fernandes" From 5233ac1d61557be14344635c88deb5d2b97e84df Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Mon, 27 Apr 2020 13:03:25 +0800 Subject: [PATCH 09/17] update vscode engine --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9557504..8644271 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ }, "icon": "icon.png", "engines": { - "vscode": "^1.5.0" + "vscode": "^1.31.0" }, "keywords": [ "maya", @@ -46,7 +46,8 @@ }, "devDependencies": { "@types/node": "^6.0.42", - "@types/vscode": "^1.40.0", + "@types/vscode": "^1.31.0", + "ts-loader": "^7.0.1", "tslint": "^5.11.0", "typescript": "^2.1.6", "vscode": "^1.1.17" From f25d344e1fa55af513c889b223adff1dd6f77261 Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Mon, 27 Apr 2020 13:49:42 +0800 Subject: [PATCH 10/17] update dependencies --- package.json | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 8644271..ae31fbe 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ }, "icon": "icon.png", "engines": { - "vscode": "^1.31.0" + "vscode": "^1.20.0" }, "keywords": [ "maya", @@ -41,16 +41,14 @@ "scripts": { "vscode:prepublish": "npm run compile", "compile": "tsc -p ./", - "watch": "tsc -watch -p ./", - "postinstall": "node ./node_modules/vscode/bin/install" + "watch": "tsc -watch -p ./" }, "devDependencies": { - "@types/node": "^6.0.42", - "@types/vscode": "^1.31.0", - "ts-loader": "^7.0.1", - "tslint": "^5.11.0", - "typescript": "^2.1.6", - "vscode": "^1.1.17" + "@types/node": "^12.12.0", + "@types/vscode": "^1.20.0", + "tslint": "^5.19.0", + "typescript": "^3.8.3", + "vscode-test": "^1.3.0" }, "dependencies": { "vscode-extension-telemetry": "^0.1.3" From 5476d3b9c6b3ffe46f24b6af3567f2bc2b6d0e22 Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Fri, 1 May 2020 01:25:56 +0800 Subject: [PATCH 11/17] add basic symbol provider --- src/extension.ts | 106 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/src/extension.ts b/src/extension.ts index 78efde0..ca166ea 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -84,6 +84,106 @@ export class Logger { } } +class MelDocumentSymbolProvider implements vscode.DocumentSymbolProvider { + + private getProcRange(ln_start: number, ln_end: number): vscode.Range { + let pos1 = new vscode.Position(ln_start, 0); + let pos2 = new vscode.Position(ln_end, 0); + return new vscode.Range(pos1, pos2); + } + + private getRange(name:string, text:string, ln_num: number): vscode.Range { + let pos = text.indexOf(name) + let pos1 = new vscode.Position(ln_num, pos); + let pos2 = new vscode.Position(ln_num, pos+name.length); + return new vscode.Range(pos1, pos2); + } + + public provideDocumentSymbols( + document: vscode.TextDocument, + token: vscode.CancellationToken): Promise + { + return new Promise((resolve, reject) => + { + let symbols: vscode.DocumentSymbol[] = []; + let nodes = [symbols] + let inside_proc = false + let nested_levels = 0 + + let symbolkind_proc = vscode.SymbolKind.Function + let symbolkind_var = vscode.SymbolKind.Variable + + let procTypes = ["string", "string[]"] + + let proc_symbol; + let proc_start_line:number; + + for (var i = 0; i < document.lineCount; i++) { + var line = document.lineAt(i); + let tokens = line.text.split(" ") + + for (var x = 0; x < tokens.length; x++) { + + let cur_token = tokens[x].trim() + + if (cur_token == '{' || cur_token.includes("{")) + {//open + nested_levels += 1} + + // found a proc + if (cur_token == "proc"){ + let proc_name = tokens[x+1] + if(procTypes.includes(proc_name)){ + proc_name = tokens[x+2] + } + + let clean_proc_name = proc_name.split("(")[0] + let proc_range = this.getRange(clean_proc_name, line.text, i); + proc_start_line = i + + proc_symbol = new vscode.DocumentSymbol( + clean_proc_name, + '', + symbolkind_proc, + line.range, proc_range) + + nodes[nodes.length-1].push(proc_symbol) + if (!inside_proc) { + nodes.push(proc_symbol.children) + inside_proc = true + } + } + if (cur_token == "}" || cur_token.includes("}")){ + //closed + nested_levels -= 1 + if (inside_proc && nested_levels == 0) { + proc_symbol.range = this.getProcRange(proc_start_line, i) + nodes.pop() + inside_proc = false + } + } + + // found a variable + if (cur_token.startsWith("$")){ + if(tokens[x+1] == "=" || cur_token.includes("=")){ + let clean_var_name = cur_token.split("=")[0] + let var_range = this.getRange(clean_var_name, line.text, i); + let var_symbol = new vscode.DocumentSymbol( + clean_var_name, + '', + symbolkind_var, + var_range, var_range) + + nodes[nodes.length-1].push(var_symbol) + } + } + } + } + resolve(symbols); + }); + } +} + export function activate(context: vscode.ExtensionContext) { let outputPanel = vscode.window.createOutputChannel('Maya'); Logger.registerOutputPanel(outputPanel); @@ -361,6 +461,12 @@ export function activate(context: vscode.ExtensionContext) { } }, '$'); + const provider_symbols = vscode.languages.registerDocumentSymbolProvider( + {scheme: "file", language: "mel"}, + new MelDocumentSymbolProvider() + ) + + context.subscriptions.push(provider_symbols); context.subscriptions.push(provider_all); context.subscriptions.push(provider_vars); From 09ad034bcda2ff1c315e653105f62ebabf19400e Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Fri, 1 May 2020 01:26:34 +0800 Subject: [PATCH 12/17] update tsconfig --- tsconfig.json | 5 ++++- tslint.json | 27 ++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index a374c9a..76549cd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,10 @@ "outDir": "out", "lib": ["es6"], "sourceMap": true, - "rootDir": "src" + "strict": false, + "rootDir": "src", + "forceConsistentCasingInFileNames": true, + "experimentalDecorators": true }, "exclude": ["node_modules", ".vscode-test"] } diff --git a/tslint.json b/tslint.json index 772eda2..93610b6 100644 --- a/tslint.json +++ b/tslint.json @@ -1,6 +1,23 @@ { - "rules": { - "indent": [true, "tabs"], - "semicolon": [true, "always"] - } -} + "defaultSeverity": "warning", + "extends": [ + "tslint:recommended" + ], + "jsRules": {}, + "rules": { + "semicolon":false, + "no-trailing-whitespace":false, + "curly":false, + "no-console":false, + "one-line":false, + "member-access": false, + "triple-equals":false, + "arrow-parens": false, + "no-consecutive-blank-lines": false, + "only-arrow-functions": false, + "whitespace":false, + "prefer-const":false, + "quotemark":false + }, + "rulesDirectory": [] +} \ No newline at end of file From e04054a9a258120039db343cfe76f195ebfa4890 Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Fri, 1 May 2020 01:53:47 +0800 Subject: [PATCH 13/17] bump version to 1.4.0 --- package-lock.json | 224 +++++----------------------------------------- package.json | 2 +- 2 files changed, 22 insertions(+), 204 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a4c5a4..d3b4ce4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mayacode", - "version": "1.2.0", + "version": "1.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -30,16 +30,10 @@ "js-tokens": "^4.0.0" } }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, "@types/node": { - "version": "6.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.10.tgz", - "integrity": "sha512-pF4HjZGSog75kGq7B1InK/wt/N08BuPATo+7HRfv7gZUzccebwv/fmWVGs/j6LvSiLWpCuGGhql51M/wcQsNzA==", + "version": "12.12.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.37.tgz", + "integrity": "sha512-4mXKoDptrXAwZErQHrLzpe0FN/0Wmf5JRniSVIdwUrtDf9wnmEV1teCNLBo/TwuXhkK/bVegoEn/wmb+x0AuPg==", "dev": true }, "@types/vscode": { @@ -48,15 +42,6 @@ "integrity": "sha512-WJZtZlinE3meRdH+I7wTsIhpz/GLhqEQwmPGeh4s1irWLwMzCeTV8WZ+pgPTwrDXoafVUWwo1LiZ9HJVHFlJSQ==", "dev": true }, - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - } - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -119,18 +104,6 @@ "concat-map": "0.0.1" } }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -194,15 +167,6 @@ "emitter-listener": "^1.1.1" } }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "diagnostic-channel": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", @@ -277,45 +241,12 @@ "path-is-absolute": "^1.0.0" } }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -372,98 +303,6 @@ "minimist": "^1.2.5" } }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -494,6 +333,15 @@ "path-parse": "^1.0.6" } }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -504,22 +352,6 @@ "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -577,26 +409,11 @@ } }, "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true }, - "vscode": { - "version": "1.1.37", - "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.37.tgz", - "integrity": "sha512-vJNj6IlN7IJPdMavlQa1KoFB3Ihn06q1AiN3ZFI/HfzPNzbKZWPPuiU+XkpNOfGU5k15m4r80nxNPlM7wcc0wg==", - "dev": true, - "requires": { - "glob": "^7.1.2", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "mocha": "^5.2.0", - "semver": "^5.4.1", - "source-map-support": "^0.5.0", - "vscode-test": "^0.4.1" - } - }, "vscode-extension-telemetry": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.3.tgz", @@ -606,13 +423,14 @@ } }, "vscode-test": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz", - "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.3.0.tgz", + "integrity": "sha512-LddukcBiSU2FVTDr3c1D8lwkiOvwlJdDL2hqVbn6gIz+rpTqUCkMZSKYm94Y1v0WXlHSDQBsXyY+tchWQgGVsw==", "dev": true, "requires": { "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1" + "https-proxy-agent": "^2.2.4", + "rimraf": "^2.6.3" }, "dependencies": { "agent-base": { diff --git a/package.json b/package.json index ae31fbe..981115e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "mayacode", "displayName": "MayaCode", "description": "A Visual Studio Code extension with support for coding for Maya.", - "version": "1.3.0", + "version": "1.4.0", "publisher": "saviof", "author": { "name": "Savio Fernandes" From 02c4ddaad32f945467b88d1fd11049eab8b864ef Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Fri, 1 May 2020 02:01:04 +0800 Subject: [PATCH 14/17] update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc51288..81ce321 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Version 1.4.0 (May 01, 2020) +* Enhancement: ctrl+shift+o go to symbol support. (@artbycrunk in [issues/11](https://github.com/artbycrunk/vscode-maya/issues/11)) +* Enhancement: Outline support for functions and variables (@artbycrunk in [issues/11](https://github.com/artbycrunk/vscode-maya/issues/12)) + ## Version 1.3.0 (April 27, 2020) * Fix: Output line numbers are off by 1 (@artbycrunk in [issues/14](https://github.com/artbycrunk/vscode-maya/issues/14)) * Enhancement: Added telemetry for basic events From 2e5e3c446872d3e915b524ba6478ff8fffd8ef73 Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Fri, 1 May 2020 02:06:16 +0800 Subject: [PATCH 15/17] update readme with new features --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 84b2b62..ec92408 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,10 @@ A [Visual Studio Code](https://code.visualstudio.com/) [extension](https://marke ## Features +* Syntax Highlight MEL scripts. +* Hierarchical document tree in the [outline view](https://code.visualstudio.com/docs/getstarted/userinterface#_outline-view). +* [Breadcrumbs](https://code.visualstudio.com/updates/v1_26#_breadcrumbs) support. + * Autocomplete MEL commands as you type ( along with flag info ) > ![Autocomplete MEL commands as you type](./images/autocomplete.gif "Autocomplete MEL commands as you type") @@ -28,11 +32,11 @@ A [Visual Studio Code](https://code.visualstudio.com/) [extension](https://marke > ![Send code to Maya via command port](./images/send_to_maya.gif "Send code to Maya via command port") -* Syntax Highlight MEL scripts. * Support auto closing brackets, quotes and ticks > ![Syntax Highlight MEL scripts](./images/syntax_highlight.gif "Syntax Highlight MEL scripts.") + ## Useful commands Open the Command Palette (Command+Shift+P on macOS and Ctrl+Shift+P on Windows/Linux) and type in one of the following commands: From 5da780739656ebf1ef6ce696cbe31afe86a7062a Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Fri, 1 May 2020 02:06:38 +0800 Subject: [PATCH 16/17] ignore .vsix files --- .vscodeignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.vscodeignore b/.vscodeignore index e4e98e7..edf2439 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -10,3 +10,4 @@ vsc-extension-quickstart.md scrap python python/maya/.mypy_cache +*.vsix \ No newline at end of file From d20441ea891857c81ad43c3f6dc76ba7edad8808 Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Sat, 30 Oct 2021 01:15:31 +0800 Subject: [PATCH 17/17] add support for maya 2022 --- CHANGELOG.md | 3 +++ LICENSE | 2 +- README.md | 3 +++ images/runner_option.png | Bin 0 -> 4754 bytes package-lock.json | 14 +++++++------- package.json | 11 ++++++++--- src/extension.ts | 7 ++++++- 7 files changed, 28 insertions(+), 12 deletions(-) create mode 100644 images/runner_option.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 81ce321..2c44a4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## Version 1.5.0 (October 30, 2021) +* Enhancement: Add support for Maya 2022 with Python 3.7. (@artbycrunk in [issues/25](https://github.com/artbycrunk/vscode-maya/issues/25)) + ## Version 1.4.0 (May 01, 2020) * Enhancement: ctrl+shift+o go to symbol support. (@artbycrunk in [issues/11](https://github.com/artbycrunk/vscode-maya/issues/11)) * Enhancement: Outline support for functions and variables (@artbycrunk in [issues/11](https://github.com/artbycrunk/vscode-maya/issues/12)) diff --git a/LICENSE b/LICENSE index d24b112..ed41e15 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 Savio Fernandes +Copyright (c) 2018-2021 Savio Fernandes Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index ec92408..208f651 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,9 @@ Command | Description You can also select a block of code in the editor and ```Right-click -> Send Code to Maya```, this is based on the current working language (Mel or Python). +## Update for Maya 2022 and above. + + > ![Option for Maya 2022 and above](./images/runner_option.png "Option for Maya 2022 and above") ## Opening the correct ports for Send to Maya Commands. diff --git a/images/runner_option.png b/images/runner_option.png new file mode 100644 index 0000000000000000000000000000000000000000..a29b57689fb7648d2de5012d1be8ab8b2f86cebc GIT binary patch literal 4754 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 literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index d3b4ce4..b19072a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mayacode", - "version": "1.3.0", + "version": "1.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -176,9 +176,9 @@ } }, "diagnostic-channel-publishers": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.3.3.tgz", - "integrity": "sha512-qIocRYU5TrGUkBlDDxaziAK1+squ8Yf2Ls4HldL3xxb/jzmWO2Enux7CvevNKYmF2kDXZ9HiRqwjPsjk8L+i2Q==" + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.3.5.tgz", + "integrity": "sha512-AOIjw4T7Nxl0G2BoBPhkQ6i7T4bUd9+xvdYizwvG7vVAM1dvr+SDrcUudlmzwH0kbEwdR2V1EcnKT0wAeYLQNQ==" }, "diff": { "version": "4.0.2", @@ -415,9 +415,9 @@ "dev": true }, "vscode-extension-telemetry": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.3.tgz", - "integrity": "sha512-2P4/TrxwMRQJPpcsSpreI7JVftmy+kbatONGVY65x4fJfbaHTBTm6jNgkG0Xifv6Th1o25KvaVZUTjN7VWlxBA==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.7.tgz", + "integrity": "sha512-pZuZTHO9OpsrwlerOKotWBRLRYJ53DobYb7aWiRAXjlqkuqE+YJJaP+2WEy8GrLIF1EnitXTDMaTAKsmLQ5ORQ==", "requires": { "applicationinsights": "1.7.4" } diff --git a/package.json b/package.json index 981115e..f9dcded 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "mayacode", "displayName": "MayaCode", "description": "A Visual Studio Code extension with support for coding for Maya.", - "version": "1.4.0", + "version": "1.5.0", "publisher": "saviof", "author": { "name": "Savio Fernandes" @@ -51,7 +51,7 @@ "vscode-test": "^1.3.0" }, "dependencies": { - "vscode-extension-telemetry": "^0.1.3" + "vscode-extension-telemetry": "^0.1.7" }, "contributes": { "languages": [ @@ -114,6 +114,11 @@ "default": "localhost", "description": "The hostname of the machine which has a maya instance running." }, + "mayacode.runner.latest": { + "type": "boolean", + "default": true, + "description": "Run for Maya 2022 and above" + }, "mayacode.telemetry": { "type": "boolean", "default": true @@ -159,4 +164,4 @@ ] } } -} \ No newline at end of file +} diff --git a/src/extension.ts b/src/extension.ts index ca166ea..5b5f6e0 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -289,7 +289,11 @@ export function activate(context: vscode.ExtensionContext) { text = "# -*- coding: utf-8 -*-\n" + text; nativePath = path.join(os.tmpdir(), "MayaCode.py"); posixPath = nativePath.replace(/\\/g, "/"); - cmd = `python("execfile('${posixPath}')")`; + if(config.get('runner.latest')){ + cmd = `python("exec(open('${posixPath}').read())")`; + }else{ + cmd = `python("execfile('${posixPath}')")`; + } } if (type == 'mel') { @@ -315,6 +319,7 @@ export function activate(context: vscode.ExtensionContext) { function send(text: string, type: string) { let success: boolean = socket_mel.write(text + '\n'); + // let success: boolean = socket_mel.write(text + '\n', "utf8"); Logger.info(text); if (success){ let successMsg = `Sent ${type} code to Maya...`;