From 302406c75b1929a2c1669940a684bde19bc60f7b Mon Sep 17 00:00:00 2001 From: Gustavo Date: Thu, 6 Feb 2020 17:11:37 +0000 Subject: [PATCH 01/41] Let vsce detect the version from the package.json --- .github/workflows/publish.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 397d40a..e33d957 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -20,5 +20,4 @@ jobs: with: node-version: ${{ matrix.node-version }} - run: npm install - - run: echo ::set-env name=VERSION::$(npx -c 'echo "$npm_package_version"') - - run: npx vsce publish $VERSION -p ${{ secrets.VSCE_TOKEN}} + - run: npx vsce publish -p ${{ secrets.VSCE_TOKEN}} From 6a2d3ca66e32f9d47045bb4eeec0379d825bcef2 Mon Sep 17 00:00:00 2001 From: Gustavo Real Date: Fri, 7 Feb 2020 17:27:36 +0000 Subject: [PATCH 02/41] [Feature] Support multiple classes (#19) * Insert property in first class if file constains multiple * Insert property in the class where the cursor is placed * Make indentations relative * Allow to insert property into anonymous classes --- src/AddProperty.js | 93 +++++++++++++++---- test/fixtures/new/inputs/AnonymousClass.php | 14 +++ test/fixtures/new/inputs/MultipleClasses.php | 14 +++ .../inputs/MultipleClassesCursorInFirst.php | 14 +++ .../inputs/MultipleClassesCursorInLast.php | 14 +++ test/fixtures/new/outputs/AnonymousClass.php | 19 ++++ test/fixtures/new/outputs/MultipleClasses.php | 19 ++++ .../outputs/MultipleClassesCursorInFirst.php | 19 ++++ .../outputs/MultipleClassesCursorInLast.php | 19 ++++ test/suite/addProperty.test.js | 22 ++++- 10 files changed, 229 insertions(+), 18 deletions(-) create mode 100644 test/fixtures/new/inputs/AnonymousClass.php create mode 100644 test/fixtures/new/inputs/MultipleClasses.php create mode 100644 test/fixtures/new/inputs/MultipleClassesCursorInFirst.php create mode 100644 test/fixtures/new/inputs/MultipleClassesCursorInLast.php create mode 100644 test/fixtures/new/outputs/AnonymousClass.php create mode 100644 test/fixtures/new/outputs/MultipleClasses.php create mode 100644 test/fixtures/new/outputs/MultipleClassesCursorInFirst.php create mode 100644 test/fixtures/new/outputs/MultipleClassesCursorInLast.php diff --git a/src/AddProperty.js b/src/AddProperty.js index 59de52e..e948375 100644 --- a/src/AddProperty.js +++ b/src/AddProperty.js @@ -109,30 +109,57 @@ class AddProperty { snippet += "\n"; } + let insertLineIndentation = this.calculateIndentationLevel( + this.getLineFirstNonIndentationCharacterIndex(insertLine) + ); + + if (/{\s*$/.test(insertLine.text)) { + insertLineIndentation++; + } + if (shouldInsertPropertyStatement === true && !this.classProperties.includes(this.name)) { - snippet += this.indentText(this.getPropertyStatementText()); + snippet += this.indentText( + this.getPropertyStatementText(), + insertLineIndentation + ); } if (this.config('phpAddProperty.constructor.docblock.enable') === true) { - snippet += this.indentText("/**\n") - + this.indentText(" * Constructor.\n") - + this.indentText(`${this.getConstructorParamDocblockText()}\n`) - + this.indentText(" */\n") + snippet += this.indentText( + "/**\n", + insertLineIndentation + ); + snippet += this.indentText( + " * Constructor.\n", + insertLineIndentation + ); + snippet += this.indentText( + `${this.getConstructorParamDocblockText()}\n`, + insertLineIndentation + ); + snippet += this.indentText( + " */\n", + insertLineIndentation + ); } const visibility = this.config('phpAddProperty.constructor.visibility.default'); let constructorText = this.indentText( this.config('phpAddProperty.constructor.visibility.choose') === true ? `\${${this.tabStops.constructorVisibility}${this.getVisibilityChoice(visibility)}} ` - : `${visibility} ` - ); + : `${visibility} `, + insertLineIndentation + ); const parameterText = this.getParameterText(); - constructorText += `function __construct(${parameterText})\n` - + this.indentText('{\n') - + this.indentText(`\\$this->${this.name} = \\$${this.name};\$0\n`, 2) - + this.indentText('}'); + constructorText += `function __construct(${parameterText})\n`; + constructorText += this.indentText('{\n', insertLineIndentation); + constructorText += this.indentText( + `\\$this->${this.name} = \\$${this.name};\$0\n`, + insertLineIndentation + 1 + ); + constructorText += this.indentText('}', insertLineIndentation); snippet += constructorText; @@ -141,7 +168,7 @@ class AddProperty { for (let nextLineNumber = insertLine.range.end.line + 1; nextLineNumber < this.activeEditor().document.lineCount; nextLineNumber++) { const nextLine = this.activeEditor().document.lineAt(nextLineNumber); - if (!nextLine.isEmptyOrWhitespace) { + if (!this.isEmptyOrWhiteSpaceLine(nextLine)) { if (!/}/.test(nextLine.text)) { snippet += "\n"; } @@ -310,6 +337,10 @@ class AddProperty { } indentText(text, level = 1) { + if (level < 1) { + level = 1; + } + /** * Good to have * Listen for view options changes and use these values @@ -430,6 +461,10 @@ class AddProperty { return /(public|protected|private|static)\s+\$\w+.*;/.test(textLine); } + isClassLine(textLine) { + return /(?:^(?:(?:final|abstract)\s+)?class\s+\w+)|(new\s+class)/.test(textLine); + } + replaceWithSnippet(text, range) { const rangeLines = range.end.line - range.start.line; @@ -483,6 +518,10 @@ class AddProperty { return line.text.substr(i); } + isEmptyOrWhiteSpaceLine(line) { + return /^[\s\t]*$/.test(line.text); + } + calculateIndentationLevel(index) { return Math.floor(index / this.configUsingResource('editor.tabSize')); } @@ -556,11 +595,19 @@ class AddProperty { } parseDocument(document) { - for (let lineNumber = 0; lineNumber < document.lineCount; lineNumber++) { + let startingLine = 0; + + const selection = this.activeEditor().selection.active; + + if (selection) { + startingLine = this.getClassLineNumberFromCursorLineNumber(document, selection.line); + } + + for (let lineNumber = startingLine; lineNumber < document.lineCount; lineNumber++) { const line = document.lineAt(lineNumber); const textLine = line.text; - if (/^(?:(?:final|abstract)\s+)?class\s+\w+/.test(this.getLineTextFromFirstNonIndentationCharacter(line))) { + if (this.isClassLine(this.getLineTextFromFirstNonIndentationCharacter(line))) { this.classLine = line; if (! /^{/.test(this.getLineTextFromFirstNonIndentationCharacter(line))) { for (let nextLineNumber = lineNumber + 1; nextLineNumber < document.lineCount; nextLineNumber++) { @@ -590,11 +637,11 @@ class AddProperty { this.lastPropertyLine = line; } - const lineIsOpenBracketAfterClass = this.classLine + const lineIsBracketAfterClass = this.classLine && this.classLine.lineNumber != line.lineNumber - && /^{/.test(this.getLineTextFromFirstNonIndentationCharacter(line)); + && /^{|}/.test(this.getLineTextFromFirstNonIndentationCharacter(line)); - if (lineIsOpenBracketAfterClass) { + if (lineIsBracketAfterClass) { break; } @@ -655,6 +702,18 @@ class AddProperty { } } } + + getClassLineNumberFromCursorLineNumber(document, cursorLineNumber) { + for (let lineNumber = cursorLineNumber; lineNumber >= 0; lineNumber--) { + const line = document.lineAt(lineNumber); + + if (this.isClassLine(this.getLineTextFromFirstNonIndentationCharacter(line))) { + return lineNumber; + } + } + + return 0; + } } module.exports = AddProperty; \ No newline at end of file diff --git a/test/fixtures/new/inputs/AnonymousClass.php b/test/fixtures/new/inputs/AnonymousClass.php new file mode 100644 index 0000000..7a877bd --- /dev/null +++ b/test/fixtures/new/inputs/AnonymousClass.php @@ -0,0 +1,14 @@ +name = $name; + } + }; + } +} diff --git a/test/fixtures/new/outputs/MultipleClasses.php b/test/fixtures/new/outputs/MultipleClasses.php new file mode 100644 index 0000000..c12cc11 --- /dev/null +++ b/test/fixtures/new/outputs/MultipleClasses.php @@ -0,0 +1,19 @@ +name = $name; + } +} + +class Sith +{ + +} diff --git a/test/fixtures/new/outputs/MultipleClassesCursorInFirst.php b/test/fixtures/new/outputs/MultipleClassesCursorInFirst.php new file mode 100644 index 0000000..c12cc11 --- /dev/null +++ b/test/fixtures/new/outputs/MultipleClassesCursorInFirst.php @@ -0,0 +1,19 @@ +name = $name; + } +} + +class Sith +{ + +} diff --git a/test/fixtures/new/outputs/MultipleClassesCursorInLast.php b/test/fixtures/new/outputs/MultipleClassesCursorInLast.php new file mode 100644 index 0000000..27a37e2 --- /dev/null +++ b/test/fixtures/new/outputs/MultipleClassesCursorInLast.php @@ -0,0 +1,19 @@ +name = $name; + } +} diff --git a/test/suite/addProperty.test.js b/test/suite/addProperty.test.js index 8e5611b..5d91e57 100644 --- a/test/suite/addProperty.test.js +++ b/test/suite/addProperty.test.js @@ -51,6 +51,22 @@ suite('Add Property', function () { await runFixture('ClassKeyword.php'); }); + test('Should insert property in the first class if the file contains multiple', async () => { + await runFixture('MultipleClasses.php'); + }); + + test('Should insert property in the first class if the cursor is placed there', async () => { + await runFixture('MultipleClassesCursorInFirst.php', new vscode.Position(8, 0)); + }); + + test('Should insert property in the last class if the cursor is placed there', async () => { + await runFixture('MultipleClassesCursorInLast.php', new vscode.Position(13, 0)); + }); + + test('Should insert property in an anonymous class', async () => { + await runFixture('AnonymousClass.php', new vscode.Position(11, 0)); + }); + test('Should add a docblock with @param along with the constructor', async () => { await vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.enable', true, true); await runFixture('AddConstructorDocblock.php'); @@ -62,7 +78,7 @@ suite('Add Property', function () { }); }); -async function runFixture(fileName) { +async function runFixture(fileName, cursorPosition) { vscode.window.showInputBox = function () { return 'name'; }; @@ -73,6 +89,10 @@ async function runFixture(fileName) { const document = await vscode.workspace.openTextDocument(uri); await vscode.window.showTextDocument(document); + if (cursorPosition) { + vscode.window.activeTextEditor.selections = [new vscode.Selection(cursorPosition, cursorPosition)]; + } + await vscode.commands.executeCommand('phpAddProperty.add'); const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); From d63bcaf847fceaf222db749c881824f671393a65 Mon Sep 17 00:00:00 2001 From: Gustavo Real Date: Fri, 7 Feb 2020 18:32:07 +0000 Subject: [PATCH 03/41] Release 0.5.0 --- CHANGELOG.md | 8 ++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76ca18b..3bab7f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## 0.5.0 (2020-02-07) + +### Added +- Support to insert properties in different classes on the same file + +### Fixed +- The file indentation was not respected sometimes + ## 0.4.1 (2020-02-06) ### Fixed diff --git a/package-lock.json b/package-lock.json index 40789d4..d141c22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "php-add-property", - "version": "0.4.1", + "version": "0.5.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2c29329..dbf7174 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Quick way to add PHP class properties", "publisher": "kotfire", "license": "SEE LICENSE IN LICENSE", - "version": "0.4.1", + "version": "0.5.0", "engines": { "vscode": "^1.38.0" }, From 7eed14aea134acdfc6f2c2599361d33ac87f1d7c Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 14 Jun 2020 14:44:56 +0200 Subject: [PATCH 04/41] Rewrite using type script and a php parser --- .gitignore | 2 +- README.md | 2 +- jsconfig.json | 13 - out/class.js | 23 + out/class.js.map | 1 + out/constructor.js | 9 + out/constructor.js.map | 1 + out/extension.js | 479 +++++ out/extension.js.map | 1 + out/factory.js | 17 + out/factory.js.map | 1 + out/locator.js | 58 + out/locator.js.map | 1 + out/property.js | 16 + out/property.js.map | 1 + .../inputs/ConstructorBreakIntoMultiline.php | 0 .../ConstructorBreakIntoMultilineLength.php | 0 .../inputs/ConstructorDefaultVisibility.php | 0 .../inputs/PropertyAddDocblock.php | 0 .../inputs/PropertyDefaultVisibility.php | 0 .../inputs/PropertyMultilineDocblock.php | 0 .../outputs/ConstructorBreakIntoMultiline.php | 0 .../ConstructorBreakIntoMultilineLength.php | 0 .../outputs/ConstructorDefaultVisibility.php | 0 .../outputs/PropertyAddDocblock.php | 0 .../outputs/PropertyDefaultVisibility.php | 0 .../outputs/PropertyMultilineDocblock.php | 0 .../ConstructorDocblockUsingDocblock.php | 0 .../fixtures/existing/inputs/EmptyClass.php | 0 .../existing/inputs/EmptyConstructor.php | 0 .../existing/inputs/ExistingConstructor.php | 0 .../fixtures/existing/inputs/UseDocblock.php | 0 out/test/fixtures/existing/inputs/UseType.php | 10 + .../ConstructorDocblockUsingDocblock.php | 0 .../fixtures/existing/outputs/EmptyClass.php | 0 .../existing/outputs/EmptyConstructor.php | 0 .../existing/outputs/ExistingConstructor.php | 0 .../fixtures/existing/outputs/UseDocblock.php | 0 .../fixtures/existing/outputs/UseType.php | 15 + .../new/inputs/AddConstructorDocblock.php | 0 .../fixtures/new/inputs/ClassKeyword.php | 0 .../test}/fixtures/new/inputs/EmptyClass.php | 0 .../fixtures/new/inputs/EmptyConstructor.php | 0 .../new/inputs/ExistingConstructor.php | 0 .../fixtures/new/inputs/ExistingProperty.php | 0 .../inputs/ExistingPropertyAssignation.php | 0 .../inputs/ExistingPropertyInConstructor.php | 1 - .../new/inputs/MultilineConstructor.php | 0 .../fixtures/new/inputs/MultipleClasses.php | 0 .../inputs/MultipleClassesCursorInFirst.php | 0 .../inputs/MultipleClassesCursorInLast.php | 0 .../fixtures/new/inputs/TabIndentation.php | 0 .../new/inputs/UpdateConstructorDocblock.php | 0 .../new/outputs/AddConstructorDocblock.php | 0 .../fixtures/new/outputs/ClassKeyword.php | 0 .../test}/fixtures/new/outputs/EmptyClass.php | 0 .../fixtures/new/outputs/EmptyConstructor.php | 0 .../new/outputs/ExistingConstructor.php | 0 .../fixtures/new/outputs/ExistingProperty.php | 0 .../outputs/ExistingPropertyAssignation.php | 0 .../outputs/ExistingPropertyInConstructor.php | 2 + .../new/outputs/MultilineConstructor.php | 0 .../fixtures/new/outputs/MultipleClasses.php | 0 .../outputs/MultipleClassesCursorInFirst.php | 0 .../outputs/MultipleClassesCursorInLast.php | 0 .../fixtures/new/outputs/TabIndentation.php | 2 +- .../new/outputs/UpdateConstructorDocblock.php | 0 out/test/runTest.js | 40 + out/test/runTest.js.map | 1 + out/test/suite/addExistingProperty.test.js | 68 + .../suite/addExistingProperty.test.js.map | 1 + out/test/suite/addProperty.test.js | 100 + out/test/suite/addProperty.test.js.map | 1 + out/test/suite/customizations.test.js | 74 + out/test/suite/customizations.test.js.map | 1 + out/test/suite/index.js | 39 + out/test/suite/index.js.map | 1 + out/test/suite/utils.js | 56 + out/test/suite/utils.js.map | 1 + package-lock.json | 1629 ++++++++--------- package.json | 31 +- src/AddProperty.js | 719 -------- src/class.ts | 27 + src/constructor.ts | 7 + src/extension.js | 23 - src/extension.ts | 671 +++++++ src/locator.ts | 62 + src/property.ts | 17 + test/runTest.js => src/test/runTest.ts | 9 +- .../test/suite/addExistingProperty.test.ts | 26 +- .../test/suite/addProperty.test.ts | 39 +- .../test/suite/customizations.test.ts | 26 +- .../suite/index.js => src/test/suite/index.ts | 19 +- .../suite/utils.js => src/test/suite/utils.ts | 15 +- test/fixtures/new/inputs/AnonymousClass.php | 14 - test/fixtures/new/outputs/AnonymousClass.php | 19 - tsconfig.json | 21 + 97 files changed, 2675 insertions(+), 1737 deletions(-) delete mode 100644 jsconfig.json create mode 100644 out/class.js create mode 100644 out/class.js.map create mode 100644 out/constructor.js create mode 100644 out/constructor.js.map create mode 100644 out/extension.js create mode 100644 out/extension.js.map create mode 100644 out/factory.js create mode 100644 out/factory.js.map create mode 100644 out/locator.js create mode 100644 out/locator.js.map create mode 100644 out/property.js create mode 100644 out/property.js.map rename {test => out/test}/fixtures/customizations/inputs/ConstructorBreakIntoMultiline.php (100%) rename {test => out/test}/fixtures/customizations/inputs/ConstructorBreakIntoMultilineLength.php (100%) rename {test => out/test}/fixtures/customizations/inputs/ConstructorDefaultVisibility.php (100%) rename {test => out/test}/fixtures/customizations/inputs/PropertyAddDocblock.php (100%) rename {test => out/test}/fixtures/customizations/inputs/PropertyDefaultVisibility.php (100%) rename {test => out/test}/fixtures/customizations/inputs/PropertyMultilineDocblock.php (100%) rename {test => out/test}/fixtures/customizations/outputs/ConstructorBreakIntoMultiline.php (100%) rename {test => out/test}/fixtures/customizations/outputs/ConstructorBreakIntoMultilineLength.php (100%) rename {test => out/test}/fixtures/customizations/outputs/ConstructorDefaultVisibility.php (100%) rename {test => out/test}/fixtures/customizations/outputs/PropertyAddDocblock.php (100%) rename {test => out/test}/fixtures/customizations/outputs/PropertyDefaultVisibility.php (100%) rename {test => out/test}/fixtures/customizations/outputs/PropertyMultilineDocblock.php (100%) rename {test => out/test}/fixtures/existing/inputs/ConstructorDocblockUsingDocblock.php (100%) rename {test => out/test}/fixtures/existing/inputs/EmptyClass.php (100%) rename {test => out/test}/fixtures/existing/inputs/EmptyConstructor.php (100%) rename {test => out/test}/fixtures/existing/inputs/ExistingConstructor.php (100%) rename {test => out/test}/fixtures/existing/inputs/UseDocblock.php (100%) create mode 100644 out/test/fixtures/existing/inputs/UseType.php rename {test => out/test}/fixtures/existing/outputs/ConstructorDocblockUsingDocblock.php (100%) rename {test => out/test}/fixtures/existing/outputs/EmptyClass.php (100%) rename {test => out/test}/fixtures/existing/outputs/EmptyConstructor.php (100%) rename {test => out/test}/fixtures/existing/outputs/ExistingConstructor.php (100%) rename {test => out/test}/fixtures/existing/outputs/UseDocblock.php (100%) create mode 100644 out/test/fixtures/existing/outputs/UseType.php rename {test => out/test}/fixtures/new/inputs/AddConstructorDocblock.php (100%) rename {test => out/test}/fixtures/new/inputs/ClassKeyword.php (100%) rename {test => out/test}/fixtures/new/inputs/EmptyClass.php (100%) rename {test => out/test}/fixtures/new/inputs/EmptyConstructor.php (100%) rename {test => out/test}/fixtures/new/inputs/ExistingConstructor.php (100%) rename {test => out/test}/fixtures/new/inputs/ExistingProperty.php (100%) rename {test => out/test}/fixtures/new/inputs/ExistingPropertyAssignation.php (100%) rename {test => out/test}/fixtures/new/inputs/ExistingPropertyInConstructor.php (80%) rename {test => out/test}/fixtures/new/inputs/MultilineConstructor.php (100%) rename {test => out/test}/fixtures/new/inputs/MultipleClasses.php (100%) rename {test => out/test}/fixtures/new/inputs/MultipleClassesCursorInFirst.php (100%) rename {test => out/test}/fixtures/new/inputs/MultipleClassesCursorInLast.php (100%) rename {test => out/test}/fixtures/new/inputs/TabIndentation.php (100%) rename {test => out/test}/fixtures/new/inputs/UpdateConstructorDocblock.php (100%) rename {test => out/test}/fixtures/new/outputs/AddConstructorDocblock.php (100%) rename {test => out/test}/fixtures/new/outputs/ClassKeyword.php (100%) rename {test => out/test}/fixtures/new/outputs/EmptyClass.php (100%) rename {test => out/test}/fixtures/new/outputs/EmptyConstructor.php (100%) rename {test => out/test}/fixtures/new/outputs/ExistingConstructor.php (100%) rename {test => out/test}/fixtures/new/outputs/ExistingProperty.php (100%) rename {test => out/test}/fixtures/new/outputs/ExistingPropertyAssignation.php (100%) rename {test => out/test}/fixtures/new/outputs/ExistingPropertyInConstructor.php (88%) rename {test => out/test}/fixtures/new/outputs/MultilineConstructor.php (100%) rename {test => out/test}/fixtures/new/outputs/MultipleClasses.php (100%) rename {test => out/test}/fixtures/new/outputs/MultipleClassesCursorInFirst.php (100%) rename {test => out/test}/fixtures/new/outputs/MultipleClassesCursorInLast.php (100%) rename {test => out/test}/fixtures/new/outputs/TabIndentation.php (90%) rename {test => out/test}/fixtures/new/outputs/UpdateConstructorDocblock.php (100%) create mode 100644 out/test/runTest.js create mode 100644 out/test/runTest.js.map create mode 100644 out/test/suite/addExistingProperty.test.js create mode 100644 out/test/suite/addExistingProperty.test.js.map create mode 100644 out/test/suite/addProperty.test.js create mode 100644 out/test/suite/addProperty.test.js.map create mode 100644 out/test/suite/customizations.test.js create mode 100644 out/test/suite/customizations.test.js.map create mode 100644 out/test/suite/index.js create mode 100644 out/test/suite/index.js.map create mode 100644 out/test/suite/utils.js create mode 100644 out/test/suite/utils.js.map delete mode 100644 src/AddProperty.js create mode 100644 src/class.ts create mode 100644 src/constructor.ts delete mode 100644 src/extension.js create mode 100644 src/extension.ts create mode 100644 src/locator.ts create mode 100644 src/property.ts rename test/runTest.js => src/test/runTest.ts (70%) rename test/suite/addExistingProperty.test.js => src/test/suite/addExistingProperty.test.ts (73%) rename test/suite/addProperty.test.js => src/test/suite/addProperty.test.ts (79%) rename test/suite/customization.test.js => src/test/suite/customizations.test.ts (80%) rename test/suite/index.js => src/test/suite/index.ts (72%) rename test/suite/utils.js => src/test/suite/utils.ts (78%) delete mode 100644 test/fixtures/new/inputs/AnonymousClass.php delete mode 100644 test/fixtures/new/outputs/AnonymousClass.php create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index 2588b3b..e3ceaf6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ node_modules .vscode-test/ *.vsix -test/user/ +out/test/user/ diff --git a/README.md b/README.md index 654f2ba..c6fe9a2 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # PHP Add Property -Visual Code Studio extension to quickly add PHP class properties +Visual Code Studio extension to manage PHP class properties ## Features diff --git a/jsconfig.json b/jsconfig.json deleted file mode 100644 index e01e188..0000000 --- a/jsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "es6", - "checkJs": false, /* Typecheck .js files. */ - "lib": [ - "es6" - ] - }, - "exclude": [ - "node_modules" - ] -} diff --git a/out/class.js b/out/class.js new file mode 100644 index 0000000..fc91385 --- /dev/null +++ b/out/class.js @@ -0,0 +1,23 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const constructor_1 = require("./constructor"); +class Class { + constructor(ast) { + this.ast = ast; + this.findConstructor(); + } + getConstructor() { + return this.construct; + } + findConstructor() { + var _a; + for (let i = 0; i < this.ast.body.length; i++) { + const node = this.ast.body[i]; + if (node.kind === 'method' && ((_a = node.name) === null || _a === void 0 ? void 0 : _a.name) === '__construct') { + this.construct = new constructor_1.default(node); + } + } + } +} +exports.default = Class; +//# sourceMappingURL=class.js.map \ No newline at end of file diff --git a/out/class.js.map b/out/class.js.map new file mode 100644 index 0000000..8bd8b86 --- /dev/null +++ b/out/class.js.map @@ -0,0 +1 @@ +{"version":3,"file":"class.js","sourceRoot":"","sources":["../src/class.ts"],"names":[],"mappings":";;AAAA,+CAAwC;AAExC,MAAqB,KAAK;IAKtB,YAAY,GAAQ;QAChB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAEM,cAAc;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAEO,eAAe;;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE9B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAA,IAAI,CAAC,IAAI,0CAAE,IAAI,MAAK,aAAa,EAAE;gBAC7D,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAW,CAAC,IAAI,CAAC,CAAC;aAC1C;SACJ;IACL,CAAC;CACJ;AAxBD,wBAwBC"} \ No newline at end of file diff --git a/out/constructor.js b/out/constructor.js new file mode 100644 index 0000000..c6547a7 --- /dev/null +++ b/out/constructor.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class Constructor { + constructor(ast) { + this.ast = ast; + } +} +exports.default = Constructor; +//# sourceMappingURL=constructor.js.map \ No newline at end of file diff --git a/out/constructor.js.map b/out/constructor.js.map new file mode 100644 index 0000000..abded34 --- /dev/null +++ b/out/constructor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"constructor.js","sourceRoot":"","sources":["../src/constructor.ts"],"names":[],"mappings":";;AAAA,MAAqB,WAAW;IAG5B,YAAY,GAAQ;QAChB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACnB,CAAC;CACJ;AAND,8BAMC"} \ No newline at end of file diff --git a/out/extension.js b/out/extension.js new file mode 100644 index 0000000..c9a1b41 --- /dev/null +++ b/out/extension.js @@ -0,0 +1,479 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const vscode = require("vscode"); +const php_parser_1 = require("php-parser"); +const locator_1 = require("./locator"); +const property_1 = require("./property"); +function activate(context) { + context.subscriptions.push(vscode.commands.registerCommand('phpAddProperty.add', () => __awaiter(this, void 0, void 0, function* () { + if (vscode.window.activeTextEditor === undefined) { + return; + } + const document = vscode.window.activeTextEditor.document; + const phpEngine = new php_parser_1.default({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + const ast = phpEngine.parseCode(document.getText()); + const locator = new locator_1.default(ast); + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + const phpClass = locator.findClass(selectionLineNumber + 1); + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + return; + } + const name = yield vscode.window.showInputBox({ + placeHolder: 'Enter the property name' + }); + if (name === undefined || name.trim() === "") { + return; + } + const property = new property_1.default(name); + insertProperty(vscode.window.activeTextEditor, property, phpClass, `${property.getName()};`); + })), vscode.commands.registerCommand('phpAddProperty.append', () => __awaiter(this, void 0, void 0, function* () { + var _a, _b, _c, _d, _e, _f, _g; + if (vscode.window.activeTextEditor === undefined) { + return; + } + const document = vscode.window.activeTextEditor.document; + const phpEngine = new php_parser_1.default({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + const ast = phpEngine.parseCode(document.getText()); + const locator = new locator_1.default(ast); + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + const phpClass = locator.findClass(selectionLineNumber + 1); + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + return; + } + const line = document.lineAt(selectionLineNumber); + const lineAst = phpEngine.parseEval(`class A { ${line.text} }`); + if (((_b = (_a = lineAst.children[0]) === null || _a === void 0 ? void 0 : _a.body[0]) === null || _b === void 0 ? void 0 : _b.kind) !== 'propertystatement') { + return; + } + const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); + const properties = lineAst.children[0].body[0].properties; + const propertyAst = (_c = properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _c !== void 0 ? _c : properties[0]; + const propertyName = (_d = propertyAst.name) === null || _d === void 0 ? void 0 : _d.name; + const propertyStatementAst = phpClass.ast.body.find((node) => { + if (node.kind !== 'propertystatement') { + return false; + } + return node.properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === propertyName; }); + }); + if (!propertyStatementAst) { + return; + } + let docblockType; + for (let i = 0; i < ((_e = propertyStatementAst.leadingComments) === null || _e === void 0 ? void 0 : _e.length); i++) { + const node = propertyStatementAst.leadingComments[i]; + if (node.kind !== 'commentblock') { + continue; + } + const typeMatch = /@var\s(\S*)/g.exec(node.value); + if (typeMatch) { + docblockType = typeMatch[1]; + } + } + const property = new property_1.default(propertyName, (_g = (_f = propertyAst.type) === null || _f === void 0 ? void 0 : _f.name) !== null && _g !== void 0 ? _g : docblockType); + insertProperty(vscode.window.activeTextEditor, property, phpClass, line.text); + }))); +} +exports.activate = activate; +// this method is called when your extension is deactivated +function deactivate() { } +exports.deactivate = deactivate; +function calculateIndentationLevel(index) { + return Math.floor(index / configUsingResource('editor.tabSize')); +} +function getLineFirstNonIndentationCharacterIndex(lineText) { + const tabSize = configUsingResource('editor.tabSize'); + let index = 0; + for (let i = 0; i < lineText.length; i++) { + const char = lineText[i]; + if (/[^\s\t]/.test(char)) { + index++; + break; + } + index += char === "\t" ? tabSize : 1; + } + return index; +} +function indentText(text, level = 1) { + /** + * Good to have + * Listen for view options changes and use these values + * https://github.com/jedmao/tabsanity-vs/blob/faa41a99ccb47c8e7717edfcbdfba4c093e670fe/TabSanity/TabOptionsListener.cs + */ + let tab = "\t"; + if (configUsingResource('editor.insertSpaces')) { + const tabSize = configUsingResource('editor.tabSize'); + tab = ' '.repeat(tabSize); + } + return tab.repeat(level) + text; +} +function configUsingResource(key) { + var _a; + const parts = key.split(/\.(.+)/, 2); + const configuration = vscode.workspace.getConfiguration(parts[0], (_a = vscode.window.activeTextEditor) === null || _a === void 0 ? void 0 : _a.document.uri); + return parts[1] ? configuration.get(parts[1]) : configuration; +} +function config(key) { + return vscode.workspace.getConfiguration().get(key); +} +function escapeForRegExp(text) { + return text.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); +} +function escapeForSnippet(text) { + return text.replace(/(? { + editBuilder.replace(range, "\n".repeat(rangeLines)); + }, { + undoStopBefore: true, + undoStopAfter: false + }).then(() => { + const editor = vscode.window.activeTextEditor; + if (editor) { + editor.insertSnippet(new vscode.SnippetString(snippet), range, { + undoStopBefore: false, + undoStopAfter: false, + }); + } + }); +} +function addPropertyStatement(document, phpClass, property, tabStops) { + var _a; + const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); + let newDocumentText = escapeForSnippet(document.getText(phpClassRange)); + let lastProperty; + let firstMethod; + let lastNode; + const astClassBody = phpClass.ast.body; + for (let i = 0; i < astClassBody.length; i++) { + const node = astClassBody[i]; + lastNode = node; + if (node.kind === 'propertystatement') { + lastProperty = node; + // Check that property does not already exist + for (let j = 0; j < node.properties.length; j++) { + const propertyNode = node.properties[j]; + if (((_a = propertyNode.name) === null || _a === void 0 ? void 0 : _a.name) === property.getName()) { + return newDocumentText; + } + } + } + else if (!firstMethod && node.kind === 'method' && node.name !== '__construct') { + firstMethod = node; + } + } + const propertyStatementText = getPropertyStatementText(property, tabStops); + if (lastProperty) { + const lastPropertyLine = document.lineAt(lastProperty.loc.start.line - 1); + const newPropertyText = escapeForSnippet(`${lastPropertyLine.text}`) + "\n\n" + indentText(propertyStatementText, calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(lastPropertyLine.text))); + newDocumentText = newDocumentText.replace(escapeForSnippet(lastPropertyLine.text), newPropertyText); + } + else if (firstMethod) { + const firstMethodLine = document.lineAt(firstMethod.loc.start.line - 1); + const newPropertyText = indentText(propertyStatementText, calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(firstMethodLine.text))) + "\n\n" + escapeForSnippet(firstMethodLine.text); + newDocumentText = newDocumentText.replace(escapeForSnippet(firstMethodLine.text), newPropertyText); + } + else if (lastNode) { + const lastNodeLine = document.lineAt(lastNode.loc.start.line - 1); + const newPropertyText = escapeForSnippet(lastNodeLine.text) + "\n\n" + indentText(propertyStatementText, calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(lastNodeLine.text))); + newDocumentText = newDocumentText.replace(escapeForSnippet(lastNodeLine.text), newPropertyText); + } + else { + const isOneLineClass = phpClass.ast.loc.start.line === phpClass.ast.loc.end.line; + if (isOneLineClass) { + const match = phpClass.ast.loc.source.match(/(.*)\}/); + const newPropertyText = escapeForSnippet(match[1]) + "\n" + indentText(propertyStatementText, 1) + "\n" + '}'; + newDocumentText = newDocumentText.replace(escapeForSnippet(phpClass.ast.loc.source), newPropertyText); + } + else { + const classBodyLine = document.lineAt(phpClass.ast.loc.start.line - 1); + const classText = escapeForSnippet(phpClass.ast.loc.source); + const newPropertyText = classText.replace(/{(?:\s|[\r\n]|\s)*}/, "{\n" + indentText(propertyStatementText, calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(classBodyLine.text)) + 1)) + "\n}"; + newDocumentText = newDocumentText.replace(classText, newPropertyText); + } + } + return newDocumentText; +} +function getPropertyStatementText(property, tabStops) { + let docblockTypeStop = tabStops.propertyDocblockType; + let dockblockImportStop = tabStops.propertyDocblockImport; + if (config('phpAddProperty.property.docblock.withParameter') === true) { + docblockTypeStop = tabStops.constructorParameterType; + dockblockImportStop = tabStops.constructorParameterStop; + tabStops.constructorParameterStop++; + } + let propertyStatementText = ''; + if (config('phpAddProperty.property.docblock.add') === true) { + let stopText = ''; + if (config('phpAddProperty.property.docblock.stopToImport') === true) { + stopText += `$${dockblockImportStop}`; + } + stopText += `$${docblockTypeStop}`; + if (config('phpAddProperty.property.docblock.multiline') === true) { + propertyStatementText += `/**\n${indentText(' * @var ')}${stopText}\n${indentText(' */')}\n${indentText('')}`; + } + else { + if (config('phpAddProperty.property.docblock.withParameter') === false) { + stopText += ' '; + } + propertyStatementText += `/** @var ${stopText}*/\n${indentText('')}`; + } + } + const visibility = config('phpAddProperty.property.visibility.default'); + propertyStatementText += config('phpAddProperty.property.visibility.choose') === true + ? `\${${tabStops.propertyVisibility}${getVisibilityChoice(visibility)}} ` + : `${visibility} `; + if (config('phpAddProperty.property.types') === true) { + propertyStatementText += `$${tabStops.constructorParameterType}`; + } + propertyStatementText += `\\$${property.getName()};`; + return propertyStatementText; +} +function getVisibilityChoice(defaultValue) { + let visibilityChoices = ['public', 'protected', 'private']; + if (visibilityChoices.indexOf(defaultValue) !== -1) { + visibilityChoices.splice(visibilityChoices.indexOf(defaultValue), 1); + } + return `|${[defaultValue, ...visibilityChoices].join(',')}|`; +} +function getParameterText(property, tabStops) { + let tabStopsText = `$${tabStops.constructorParameterType}`; + if (property.getType()) { + tabStopsText = `\${${tabStops.constructorParameterType}:${property.getType()}}`; + } + if (config('phpAddProperty.property.stopToImport') === true) { + tabStopsText += `$${tabStops.constructorParameterStop}`; + } + let parameterText = `${tabStopsText}`; + if (property.getType()) { + parameterText += ' '; + } + parameterText += `\\$${property.getName()}`; + return parameterText; +} +function getConstructorParamDocblockText(property, tabStops) { + let docblockTypeStop = tabStops.constructorDocblockType; + let dockblockImportStop = tabStops.constructorDocblockImport; + if (config('phpAddProperty.constructor.docblock.withParameter') === true) { + docblockTypeStop = tabStops.constructorParameterType; + dockblockImportStop = tabStops.constructorParameterStop; + tabStops.constructorParameterStop++; + } + let constructorParamDocblockText = `\${${docblockTypeStop}}`; + if (property.getType()) { + constructorParamDocblockText = `\${${docblockTypeStop}:${property.getType()} }`; + } + if (config('phpAddProperty.constructor.docblock.stopToImport') === true) { + constructorParamDocblockText += `\$${dockblockImportStop}`; + } + constructorParamDocblockText += `\\$${property.getName()}`; + if (config('phpAddProperty.constructor.docblock.stopForDescription') === true) { + constructorParamDocblockText += `\$${tabStops.constructorDocblockDescription}`; + } + return ` * @param ${constructorParamDocblockText}`; +} +function breakConstructorIntoMultiline(text) { + if (config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.enabled') !== true) { + return text; + } + const regex = /(.*__construct\s*)\(((?:\s|\S)*?)(?=\))\s*\)\s*{/; + const match = regex.exec(text); + if (match) { + const constructorLineText = match[0]; + const maxLineLength = config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.maxLineLength'); + if (constructorLineText.length > maxLineLength) { + const parametersText = match[2]; + const parameters = parametersText.split(',').map(parameter => indentText(parameter.trim(), 2)); + const multilineConstructorText = match[1] + + '(\n' + + `${parameters.join(',\n')}\n` + + indentText(') {'); + text = text.replace(match[0], multilineConstructorText); + } + } + return text; +} +function insertProperty(editor, property, phpClass, anchorText) { + var _a, _b, _c, _d; + let tabStops = { + propertyDocblockType: 1, + propertyDocblockImport: 2, + propertyVisibility: 3, + constructorDocblockType: 4, + constructorDocblockImport: 5, + constructorDocblockDescription: 6, + constructorVisibility: 7, + constructorParameterType: 8, + constructorParameterStop: 9 + }; + const document = editor.document; + const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); + let newDocumentText = addPropertyStatement(document, phpClass, property, tabStops); + if (!phpClass.getConstructor()) { + let snippet = "\n\n"; + if (config('phpAddProperty.constructor.docblock.enable') === true) { + snippet += indentText("/**\n") + + indentText(" * Constructor.\n") + + indentText(`${getConstructorParamDocblockText(property, tabStops)}\n`) + + indentText(" */\n"); + } + const visibility = config('phpAddProperty.constructor.visibility.default'); + let constructorText = indentText(config('phpAddProperty.constructor.visibility.choose') === true + ? `\${${tabStops.constructorVisibility}${getVisibilityChoice(visibility)}} ` + : `${visibility} `); + const parameterText = getParameterText(property, tabStops); + constructorText += `function __construct(${parameterText})\n` + + indentText('{\n') + + indentText(`\\$this->${property.getName()} = \\$${property.getName()};\$0\n`, 2) + + indentText('}'); + snippet += constructorText; + const searchText = escapeForSnippet(anchorText); + newDocumentText = newDocumentText.replace(searchText, `${searchText}${snippet}`); + } + else { + const constructor = (_a = phpClass.getConstructor()) === null || _a === void 0 ? void 0 : _a.ast; + let docblock; + for (let i = 0; i < ((_b = constructor.leadingComments) === null || _b === void 0 ? void 0 : _b.length); i++) { + const node = constructor.leadingComments[i]; + if (node.kind === 'commentblock') { + docblock = node; + break; + } + } + if (docblock) { + const paramRegex = /@param(?:\s+\S+)?\s+\$(\S+).*/g; + let paramExists = false; + let lastParamText; + let paramMatch; + while (paramMatch = paramRegex.exec(docblock.value)) { + lastParamText = paramMatch[0]; + if (paramMatch[1] === property.getName()) { + paramExists = true; + break; + } + } + if (!paramExists) { + if (lastParamText) { + const docblockClosingLine = editor.document.lineAt(docblock.loc.start.line - 1); + newDocumentText = newDocumentText.replace(escapeForSnippet(lastParamText), escapeForSnippet(lastParamText) + "\n" + indentText(getConstructorParamDocblockText(property, tabStops), calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(docblockClosingLine.text)))); + } + } + } + let argumentExists = false; + for (let i = 0; i < constructor.arguments.length; i++) { + const node = constructor.arguments[i]; + if (((_c = node.name) === null || _c === void 0 ? void 0 : _c.name) == property.getName()) { + argumentExists = true; + break; + } + } + if (!argumentExists) { + const constructorMethodText = constructor.loc.source; + const constructorHasArgs = constructor.arguments.length > 0; + let newConstructorMethodText = ''; + const isMultiLineConstructor = (/\(\r\n|\r|\n/.test(constructorMethodText)); //constructor.loc.start.line !== constructor.loc.end.line; + const argumentText = getParameterText(property, tabStops); + if (constructorHasArgs) { + const lastArg = constructor.arguments[constructor.arguments.length - 1]; + const lastArgLine = document.lineAt(lastArg.loc.end.line - 1); + let newArg = escapeForSnippet(`${lastArg.loc.source}`); + if (isMultiLineConstructor) { + newArg += ",\n" + indentText(argumentText, calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(lastArgLine.text))); + } + else { + newArg += `, ${argumentText}`; + } + newConstructorMethodText = escapeForSnippet(constructorMethodText).replace(escapeForSnippet(lastArg.loc.source), newArg); + } + else { + const argsParenthesis = /\(\)/; + newConstructorMethodText = constructorMethodText.replace(argsParenthesis, `(${argumentText})`); + } + newDocumentText = newDocumentText.replace(escapeForSnippet(constructorMethodText), newConstructorMethodText); + } + let assignationExists = false; + for (let i = 0; i < ((_d = constructor.body) === null || _d === void 0 ? void 0 : _d.children.length); i++) { + const node = constructor.body.children[i]; + if (node.kind === 'expressionstatement' + && node.expression.kind === 'assign' + && node.expression.left.kind === 'propertylookup' + && node.expression.left.offset.name === property.getName()) { + assignationExists = true; + break; + } + } + if (!assignationExists) { + const constructorBodyText = constructor.body.loc.source; + const constructorBodyLine = document.lineAt(constructor.body.loc.start.line - 1); + const constructorBodyIsEmpty = constructor.body.children.length === 0; + let newConstructorBodyText = ''; + if (constructorBodyIsEmpty) { + const indentationLevel = calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(constructorBodyLine.text)); + newConstructorBodyText = "{\n" + indentText(`\\$this->${property.getName()} = \\$${property.getName()};\$0\n`, indentationLevel + 1) + indentText("}", indentationLevel); + } + else { + const lastChildren = constructor.body.children[constructor.body.children.length - 1]; + const lastChildrenText = lastChildren.loc.source; + const lastChildrenLine = document.lineAt(lastChildren.loc.end.line - 1); + const indentationLevel = calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(lastChildrenLine.text)); + newConstructorBodyText = escapeForSnippet(constructorBodyText).replace(escapeForSnippet(lastChildrenText), escapeForSnippet(lastChildrenText) + "\n" + indentText(`\\$this->${property.getName()} = \\$${property.getName()};\$0`, indentationLevel)); + } + newDocumentText = newDocumentText.replace(escapeForSnippet(constructorBodyText), newConstructorBodyText); + } + } + newDocumentText = breakConstructorIntoMultiline(newDocumentText); + if (newDocumentText === escapeForSnippet(document.getText(phpClassRange))) { + return; + } + replaceWithSnippet(newDocumentText, phpClassRange); +} +//# sourceMappingURL=extension.js.map \ No newline at end of file diff --git a/out/extension.js.map b/out/extension.js.map new file mode 100644 index 0000000..d1c712e --- /dev/null +++ b/out/extension.js.map @@ -0,0 +1 @@ +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/factory.js b/out/factory.js new file mode 100644 index 0000000..9d1907d --- /dev/null +++ b/out/factory.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const php_parser_1 = require("php-parser"); +function createProperty(name, value) { + let statement = `\$${name}`; + if (value) { + statement += ` = ${value}`; + } + const ast = php_parser_1.default.parseEval(` + class a { + ${statement}; + } + `); + return ast.children[0].body[0]; +} +exports.createProperty = createProperty; +//# sourceMappingURL=factory.js.map \ No newline at end of file diff --git a/out/factory.js.map b/out/factory.js.map new file mode 100644 index 0000000..0dc8fe3 --- /dev/null +++ b/out/factory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":";;AAAA,2CAAgC;AAEhC,SAAgB,cAAc,CAAC,IAAY,EAAE,KAAc;IACvD,IAAI,SAAS,GAAG,KAAK,IAAI,EAAE,CAAC;IAE5B,IAAI,KAAK,EAAE;QACP,SAAS,IAAI,MAAM,KAAK,EAAE,CAAC;KAC9B;IAED,MAAM,GAAG,GAAG,oBAAM,CAAC,SAAS,CAAC;;cAEnB,SAAS;;KAElB,CAAC,CAAC;IAEH,OAAQ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAdD,wCAcC"} \ No newline at end of file diff --git a/out/locator.js b/out/locator.js new file mode 100644 index 0000000..3bdc91d --- /dev/null +++ b/out/locator.js @@ -0,0 +1,58 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const class_1 = require("./class"); +const constructor_1 = require("./constructor"); +class Locator { + constructor(ast) { + this.ast = ast; + } + findClass(cursorAtLine) { + let firstClass; + const cursorClass = filter(this.ast, 'class', function (node) { + if (!firstClass) { + firstClass = new class_1.default(node); + } + if (!cursorAtLine || (cursorAtLine >= node.loc.start.line && cursorAtLine <= node.loc.end.line)) { + return new class_1.default(node); + } + }); + return cursorClass || firstClass; + } + findConstructor() { + return filter(this.ast, 'method', function (node) { + var _a; + if (((_a = node.name) === null || _a === void 0 ? void 0 : _a.name) === '__construct') { + return new constructor_1.default(node); + } + }); + } +} +exports.default = Locator; +function filter(ast, kind, matcher) { + let result; + if (Array.isArray(ast)) { + for (var i = 0; i < ast.length; i++) { + result = filter(ast[i], kind, matcher); + if (result) { + return result; + } + } + } + else { + if ((ast === null || ast === void 0 ? void 0 : ast.kind) === kind) { + result = matcher(ast); + if (result) { + return result; + } + } + for (const node in ast) { + if (ast.hasOwnProperty(node) && ast[node] !== ast) { + result = filter(ast[node], kind, matcher); + if (result) { + return result; + } + } + } + } +} +//# sourceMappingURL=locator.js.map \ No newline at end of file diff --git a/out/locator.js.map b/out/locator.js.map new file mode 100644 index 0000000..593ad47 --- /dev/null +++ b/out/locator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"locator.js","sourceRoot":"","sources":["../src/locator.ts"],"names":[],"mappings":";;AAAA,mCAA4B;AAC5B,+CAAwC;AAExC,MAAqB,OAAO;IAGxB,YAAY,GAAQ;QAChB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACnB,CAAC;IAED,SAAS,CAAC,YAAqB;QAC3B,IAAI,UAA6B,CAAC;QAClC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,IAAS;YAC7D,IAAI,CAAC,UAAU,EAAE;gBACb,UAAU,GAAG,IAAI,eAAK,CAAC,IAAI,CAAC,CAAC;aAChC;YACD,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBAC7F,OAAO,IAAI,eAAK,CAAC,IAAI,CAAC,CAAC;aAC1B;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,WAAW,IAAI,UAAU,CAAC;IACrC,CAAC;IAED,eAAe;QACX,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,IAAS;;YACjD,IAAI,OAAA,IAAI,CAAC,IAAI,0CAAE,IAAI,MAAK,aAAa,EAAE;gBACnC,OAAO,IAAI,qBAAW,CAAC,IAAI,CAAC,CAAC;aAChC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AA5BD,0BA4BC;AAED,SAAS,MAAM,CAAC,GAAQ,EAAE,IAAY,EAAE,OAAiB;IACrD,IAAI,MAAM,CAAC;IAEX,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACjC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YACvC,IAAI,MAAM,EAAE;gBACR,OAAO,MAAM,CAAC;aACjB;SACJ;KACJ;SAAM;QACH,IAAI,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,MAAK,IAAI,EAAE;YACpB,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAEtB,IAAI,MAAM,EAAE;gBACR,OAAO,MAAM,CAAC;aACjB;SACJ;QAED,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE;YACpB,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE;gBAC/C,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC1C,IAAI,MAAM,EAAE;oBACR,OAAO,MAAM,CAAC;iBACjB;aACJ;SACJ;KACJ;AACL,CAAC"} \ No newline at end of file diff --git a/out/property.js b/out/property.js new file mode 100644 index 0000000..abe6c73 --- /dev/null +++ b/out/property.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class Property { + constructor(name, type) { + this.name = name; + this.type = type; + } + getName() { + return this.name; + } + getType() { + return this.type; + } +} +exports.default = Property; +//# sourceMappingURL=property.js.map \ No newline at end of file diff --git a/out/property.js.map b/out/property.js.map new file mode 100644 index 0000000..2b2447b --- /dev/null +++ b/out/property.js.map @@ -0,0 +1 @@ +{"version":3,"file":"property.js","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":";;AAAA,MAAqB,QAAQ;IAIzB,YAAY,IAAY,EAAE,IAAa;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAEM,OAAO;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAEM,OAAO;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;CACJ;AAhBD,2BAgBC"} \ No newline at end of file diff --git a/test/fixtures/customizations/inputs/ConstructorBreakIntoMultiline.php b/out/test/fixtures/customizations/inputs/ConstructorBreakIntoMultiline.php similarity index 100% rename from test/fixtures/customizations/inputs/ConstructorBreakIntoMultiline.php rename to out/test/fixtures/customizations/inputs/ConstructorBreakIntoMultiline.php diff --git a/test/fixtures/customizations/inputs/ConstructorBreakIntoMultilineLength.php b/out/test/fixtures/customizations/inputs/ConstructorBreakIntoMultilineLength.php similarity index 100% rename from test/fixtures/customizations/inputs/ConstructorBreakIntoMultilineLength.php rename to out/test/fixtures/customizations/inputs/ConstructorBreakIntoMultilineLength.php diff --git a/test/fixtures/customizations/inputs/ConstructorDefaultVisibility.php b/out/test/fixtures/customizations/inputs/ConstructorDefaultVisibility.php similarity index 100% rename from test/fixtures/customizations/inputs/ConstructorDefaultVisibility.php rename to out/test/fixtures/customizations/inputs/ConstructorDefaultVisibility.php diff --git a/test/fixtures/customizations/inputs/PropertyAddDocblock.php b/out/test/fixtures/customizations/inputs/PropertyAddDocblock.php similarity index 100% rename from test/fixtures/customizations/inputs/PropertyAddDocblock.php rename to out/test/fixtures/customizations/inputs/PropertyAddDocblock.php diff --git a/test/fixtures/customizations/inputs/PropertyDefaultVisibility.php b/out/test/fixtures/customizations/inputs/PropertyDefaultVisibility.php similarity index 100% rename from test/fixtures/customizations/inputs/PropertyDefaultVisibility.php rename to out/test/fixtures/customizations/inputs/PropertyDefaultVisibility.php diff --git a/test/fixtures/customizations/inputs/PropertyMultilineDocblock.php b/out/test/fixtures/customizations/inputs/PropertyMultilineDocblock.php similarity index 100% rename from test/fixtures/customizations/inputs/PropertyMultilineDocblock.php rename to out/test/fixtures/customizations/inputs/PropertyMultilineDocblock.php diff --git a/test/fixtures/customizations/outputs/ConstructorBreakIntoMultiline.php b/out/test/fixtures/customizations/outputs/ConstructorBreakIntoMultiline.php similarity index 100% rename from test/fixtures/customizations/outputs/ConstructorBreakIntoMultiline.php rename to out/test/fixtures/customizations/outputs/ConstructorBreakIntoMultiline.php diff --git a/test/fixtures/customizations/outputs/ConstructorBreakIntoMultilineLength.php b/out/test/fixtures/customizations/outputs/ConstructorBreakIntoMultilineLength.php similarity index 100% rename from test/fixtures/customizations/outputs/ConstructorBreakIntoMultilineLength.php rename to out/test/fixtures/customizations/outputs/ConstructorBreakIntoMultilineLength.php diff --git a/test/fixtures/customizations/outputs/ConstructorDefaultVisibility.php b/out/test/fixtures/customizations/outputs/ConstructorDefaultVisibility.php similarity index 100% rename from test/fixtures/customizations/outputs/ConstructorDefaultVisibility.php rename to out/test/fixtures/customizations/outputs/ConstructorDefaultVisibility.php diff --git a/test/fixtures/customizations/outputs/PropertyAddDocblock.php b/out/test/fixtures/customizations/outputs/PropertyAddDocblock.php similarity index 100% rename from test/fixtures/customizations/outputs/PropertyAddDocblock.php rename to out/test/fixtures/customizations/outputs/PropertyAddDocblock.php diff --git a/test/fixtures/customizations/outputs/PropertyDefaultVisibility.php b/out/test/fixtures/customizations/outputs/PropertyDefaultVisibility.php similarity index 100% rename from test/fixtures/customizations/outputs/PropertyDefaultVisibility.php rename to out/test/fixtures/customizations/outputs/PropertyDefaultVisibility.php diff --git a/test/fixtures/customizations/outputs/PropertyMultilineDocblock.php b/out/test/fixtures/customizations/outputs/PropertyMultilineDocblock.php similarity index 100% rename from test/fixtures/customizations/outputs/PropertyMultilineDocblock.php rename to out/test/fixtures/customizations/outputs/PropertyMultilineDocblock.php diff --git a/test/fixtures/existing/inputs/ConstructorDocblockUsingDocblock.php b/out/test/fixtures/existing/inputs/ConstructorDocblockUsingDocblock.php similarity index 100% rename from test/fixtures/existing/inputs/ConstructorDocblockUsingDocblock.php rename to out/test/fixtures/existing/inputs/ConstructorDocblockUsingDocblock.php diff --git a/test/fixtures/existing/inputs/EmptyClass.php b/out/test/fixtures/existing/inputs/EmptyClass.php similarity index 100% rename from test/fixtures/existing/inputs/EmptyClass.php rename to out/test/fixtures/existing/inputs/EmptyClass.php diff --git a/test/fixtures/existing/inputs/EmptyConstructor.php b/out/test/fixtures/existing/inputs/EmptyConstructor.php similarity index 100% rename from test/fixtures/existing/inputs/EmptyConstructor.php rename to out/test/fixtures/existing/inputs/EmptyConstructor.php diff --git a/test/fixtures/existing/inputs/ExistingConstructor.php b/out/test/fixtures/existing/inputs/ExistingConstructor.php similarity index 100% rename from test/fixtures/existing/inputs/ExistingConstructor.php rename to out/test/fixtures/existing/inputs/ExistingConstructor.php diff --git a/test/fixtures/existing/inputs/UseDocblock.php b/out/test/fixtures/existing/inputs/UseDocblock.php similarity index 100% rename from test/fixtures/existing/inputs/UseDocblock.php rename to out/test/fixtures/existing/inputs/UseDocblock.php diff --git a/out/test/fixtures/existing/inputs/UseType.php b/out/test/fixtures/existing/inputs/UseType.php new file mode 100644 index 0000000..47a1c5b --- /dev/null +++ b/out/test/fixtures/existing/inputs/UseType.php @@ -0,0 +1,10 @@ +name = $name; + } +} diff --git a/test/fixtures/new/inputs/AddConstructorDocblock.php b/out/test/fixtures/new/inputs/AddConstructorDocblock.php similarity index 100% rename from test/fixtures/new/inputs/AddConstructorDocblock.php rename to out/test/fixtures/new/inputs/AddConstructorDocblock.php diff --git a/test/fixtures/new/inputs/ClassKeyword.php b/out/test/fixtures/new/inputs/ClassKeyword.php similarity index 100% rename from test/fixtures/new/inputs/ClassKeyword.php rename to out/test/fixtures/new/inputs/ClassKeyword.php diff --git a/test/fixtures/new/inputs/EmptyClass.php b/out/test/fixtures/new/inputs/EmptyClass.php similarity index 100% rename from test/fixtures/new/inputs/EmptyClass.php rename to out/test/fixtures/new/inputs/EmptyClass.php diff --git a/test/fixtures/new/inputs/EmptyConstructor.php b/out/test/fixtures/new/inputs/EmptyConstructor.php similarity index 100% rename from test/fixtures/new/inputs/EmptyConstructor.php rename to out/test/fixtures/new/inputs/EmptyConstructor.php diff --git a/test/fixtures/new/inputs/ExistingConstructor.php b/out/test/fixtures/new/inputs/ExistingConstructor.php similarity index 100% rename from test/fixtures/new/inputs/ExistingConstructor.php rename to out/test/fixtures/new/inputs/ExistingConstructor.php diff --git a/test/fixtures/new/inputs/ExistingProperty.php b/out/test/fixtures/new/inputs/ExistingProperty.php similarity index 100% rename from test/fixtures/new/inputs/ExistingProperty.php rename to out/test/fixtures/new/inputs/ExistingProperty.php diff --git a/test/fixtures/new/inputs/ExistingPropertyAssignation.php b/out/test/fixtures/new/inputs/ExistingPropertyAssignation.php similarity index 100% rename from test/fixtures/new/inputs/ExistingPropertyAssignation.php rename to out/test/fixtures/new/inputs/ExistingPropertyAssignation.php diff --git a/test/fixtures/new/inputs/ExistingPropertyInConstructor.php b/out/test/fixtures/new/inputs/ExistingPropertyInConstructor.php similarity index 80% rename from test/fixtures/new/inputs/ExistingPropertyInConstructor.php rename to out/test/fixtures/new/inputs/ExistingPropertyInConstructor.php index f1e96b9..b66fc22 100644 --- a/test/fixtures/new/inputs/ExistingPropertyInConstructor.php +++ b/out/test/fixtures/new/inputs/ExistingPropertyInConstructor.php @@ -7,6 +7,5 @@ class Jedi { public function __construct($name) { - $this->name = $name; } } diff --git a/test/fixtures/new/inputs/MultilineConstructor.php b/out/test/fixtures/new/inputs/MultilineConstructor.php similarity index 100% rename from test/fixtures/new/inputs/MultilineConstructor.php rename to out/test/fixtures/new/inputs/MultilineConstructor.php diff --git a/test/fixtures/new/inputs/MultipleClasses.php b/out/test/fixtures/new/inputs/MultipleClasses.php similarity index 100% rename from test/fixtures/new/inputs/MultipleClasses.php rename to out/test/fixtures/new/inputs/MultipleClasses.php diff --git a/test/fixtures/new/inputs/MultipleClassesCursorInFirst.php b/out/test/fixtures/new/inputs/MultipleClassesCursorInFirst.php similarity index 100% rename from test/fixtures/new/inputs/MultipleClassesCursorInFirst.php rename to out/test/fixtures/new/inputs/MultipleClassesCursorInFirst.php diff --git a/test/fixtures/new/inputs/MultipleClassesCursorInLast.php b/out/test/fixtures/new/inputs/MultipleClassesCursorInLast.php similarity index 100% rename from test/fixtures/new/inputs/MultipleClassesCursorInLast.php rename to out/test/fixtures/new/inputs/MultipleClassesCursorInLast.php diff --git a/test/fixtures/new/inputs/TabIndentation.php b/out/test/fixtures/new/inputs/TabIndentation.php similarity index 100% rename from test/fixtures/new/inputs/TabIndentation.php rename to out/test/fixtures/new/inputs/TabIndentation.php diff --git a/test/fixtures/new/inputs/UpdateConstructorDocblock.php b/out/test/fixtures/new/inputs/UpdateConstructorDocblock.php similarity index 100% rename from test/fixtures/new/inputs/UpdateConstructorDocblock.php rename to out/test/fixtures/new/inputs/UpdateConstructorDocblock.php diff --git a/test/fixtures/new/outputs/AddConstructorDocblock.php b/out/test/fixtures/new/outputs/AddConstructorDocblock.php similarity index 100% rename from test/fixtures/new/outputs/AddConstructorDocblock.php rename to out/test/fixtures/new/outputs/AddConstructorDocblock.php diff --git a/test/fixtures/new/outputs/ClassKeyword.php b/out/test/fixtures/new/outputs/ClassKeyword.php similarity index 100% rename from test/fixtures/new/outputs/ClassKeyword.php rename to out/test/fixtures/new/outputs/ClassKeyword.php diff --git a/test/fixtures/new/outputs/EmptyClass.php b/out/test/fixtures/new/outputs/EmptyClass.php similarity index 100% rename from test/fixtures/new/outputs/EmptyClass.php rename to out/test/fixtures/new/outputs/EmptyClass.php diff --git a/test/fixtures/new/outputs/EmptyConstructor.php b/out/test/fixtures/new/outputs/EmptyConstructor.php similarity index 100% rename from test/fixtures/new/outputs/EmptyConstructor.php rename to out/test/fixtures/new/outputs/EmptyConstructor.php diff --git a/test/fixtures/new/outputs/ExistingConstructor.php b/out/test/fixtures/new/outputs/ExistingConstructor.php similarity index 100% rename from test/fixtures/new/outputs/ExistingConstructor.php rename to out/test/fixtures/new/outputs/ExistingConstructor.php diff --git a/test/fixtures/new/outputs/ExistingProperty.php b/out/test/fixtures/new/outputs/ExistingProperty.php similarity index 100% rename from test/fixtures/new/outputs/ExistingProperty.php rename to out/test/fixtures/new/outputs/ExistingProperty.php diff --git a/test/fixtures/new/outputs/ExistingPropertyAssignation.php b/out/test/fixtures/new/outputs/ExistingPropertyAssignation.php similarity index 100% rename from test/fixtures/new/outputs/ExistingPropertyAssignation.php rename to out/test/fixtures/new/outputs/ExistingPropertyAssignation.php diff --git a/test/fixtures/new/outputs/ExistingPropertyInConstructor.php b/out/test/fixtures/new/outputs/ExistingPropertyInConstructor.php similarity index 88% rename from test/fixtures/new/outputs/ExistingPropertyInConstructor.php rename to out/test/fixtures/new/outputs/ExistingPropertyInConstructor.php index f1e96b9..685bdba 100644 --- a/test/fixtures/new/outputs/ExistingPropertyInConstructor.php +++ b/out/test/fixtures/new/outputs/ExistingPropertyInConstructor.php @@ -5,6 +5,8 @@ class Jedi { + private $name; + public function __construct($name) { $this->name = $name; diff --git a/test/fixtures/new/outputs/MultilineConstructor.php b/out/test/fixtures/new/outputs/MultilineConstructor.php similarity index 100% rename from test/fixtures/new/outputs/MultilineConstructor.php rename to out/test/fixtures/new/outputs/MultilineConstructor.php diff --git a/test/fixtures/new/outputs/MultipleClasses.php b/out/test/fixtures/new/outputs/MultipleClasses.php similarity index 100% rename from test/fixtures/new/outputs/MultipleClasses.php rename to out/test/fixtures/new/outputs/MultipleClasses.php diff --git a/test/fixtures/new/outputs/MultipleClassesCursorInFirst.php b/out/test/fixtures/new/outputs/MultipleClassesCursorInFirst.php similarity index 100% rename from test/fixtures/new/outputs/MultipleClassesCursorInFirst.php rename to out/test/fixtures/new/outputs/MultipleClassesCursorInFirst.php diff --git a/test/fixtures/new/outputs/MultipleClassesCursorInLast.php b/out/test/fixtures/new/outputs/MultipleClassesCursorInLast.php similarity index 100% rename from test/fixtures/new/outputs/MultipleClassesCursorInLast.php rename to out/test/fixtures/new/outputs/MultipleClassesCursorInLast.php diff --git a/test/fixtures/new/outputs/TabIndentation.php b/out/test/fixtures/new/outputs/TabIndentation.php similarity index 90% rename from test/fixtures/new/outputs/TabIndentation.php rename to out/test/fixtures/new/outputs/TabIndentation.php index 6aad427..13f8238 100644 --- a/test/fixtures/new/outputs/TabIndentation.php +++ b/out/test/fixtures/new/outputs/TabIndentation.php @@ -7,7 +7,7 @@ class Jedi { private $rank; - private $name; + private $name; public function __construct($rank, $name) { diff --git a/test/fixtures/new/outputs/UpdateConstructorDocblock.php b/out/test/fixtures/new/outputs/UpdateConstructorDocblock.php similarity index 100% rename from test/fixtures/new/outputs/UpdateConstructorDocblock.php rename to out/test/fixtures/new/outputs/UpdateConstructorDocblock.php diff --git a/out/test/runTest.js b/out/test/runTest.js new file mode 100644 index 0000000..784a5ac --- /dev/null +++ b/out/test/runTest.js @@ -0,0 +1,40 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const path = require("path"); +const vscode_test_1 = require("vscode-test"); +function main() { + return __awaiter(this, void 0, void 0, function* () { + try { + // The folder containing the Extension Manifest package.json + // Passed to `--extensionDevelopmentPath` + const extensionDevelopmentPath = path.resolve(__dirname, '../../'); + // The path to test runner + // Passed to --extensionTestsPath + const extensionTestsPath = path.resolve(__dirname, './suite/index'); + const testUserDir = path.resolve(__dirname, './user'); + yield vscode_test_1.runTests({ + extensionDevelopmentPath, + extensionTestsPath, + launchArgs: [ + `--user-data-dir=${testUserDir}`, + '--disable-extensions' + ] + }); + } + catch (err) { + console.error('Failed to run tests'); + process.exit(1); + } + }); +} +main(); +//# sourceMappingURL=runTest.js.map \ No newline at end of file diff --git a/out/test/runTest.js.map b/out/test/runTest.js.map new file mode 100644 index 0000000..9a1adc7 --- /dev/null +++ b/out/test/runTest.js.map @@ -0,0 +1 @@ +{"version":3,"file":"runTest.js","sourceRoot":"","sources":["../../src/test/runTest.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,6BAA6B;AAE7B,6CAAuC;AAEvC,SAAe,IAAI;;QAClB,IAAI;YACH,4DAA4D;YAC5D,yCAAyC;YACzC,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEnE,0BAA0B;YAC1B,iCAAiC;YACjC,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YAEpE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEtD,MAAM,sBAAQ,CACb;gBACC,wBAAwB;gBACxB,kBAAkB;gBAClB,UAAU,EAAE;oBACX,mBAAmB,WAAW,EAAE;oBAChC,sBAAsB;iBACtB;aACD,CACD,CAAC;SACF;QAAC,OAAO,GAAG,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAChB;IACF,CAAC;CAAA;AAED,IAAI,EAAE,CAAC"} \ No newline at end of file diff --git a/out/test/suite/addExistingProperty.test.js b/out/test/suite/addExistingProperty.test.js new file mode 100644 index 0000000..db8a3be --- /dev/null +++ b/out/test/suite/addExistingProperty.test.js @@ -0,0 +1,68 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const vscode = require("vscode"); +const path = require("path"); +const assert = require("assert"); +const fs = require("fs"); +const utils_1 = require("./utils"); +const testFolderRelativeLocation = '/../fixtures/existing/'; +suite('Add Existing Property', function () { + setup(() => __awaiter(this, void 0, void 0, function* () { + yield utils_1.resetDefaultSettings(); + })); + teardown(() => __awaiter(this, void 0, void 0, function* () { + yield utils_1.resetDefaultSettings(); + })); + test('Should add an existing property and constructor in an empty class', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('EmptyClass.php', new vscode.Position(7, 0)); + })); + test('Should add an existing property to an empty constructor', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('EmptyConstructor.php', new vscode.Position(7, 0)); + })); + test('Should add an existing property to an existing constructor', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ExistingConstructor.php', new vscode.Position(9, 0)); + })); + test('Should add an existing property using type from docblock', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('UseDocblock.php', new vscode.Position(8, 0)); + })); + test('Should add an existing property using its PHP7.4+ type', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('UseType.php', new vscode.Position(8, 0)); + })); + test('Should add a docblock with @param using type from property docblock', () => __awaiter(this, void 0, void 0, function* () { + yield vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.enable', true, true); + yield runFixture('ConstructorDocblockUsingDocblock.php', new vscode.Position(8, 0)); + })); +}); +function runFixture(fileName, cursorPosition) { + return __awaiter(this, void 0, void 0, function* () { + const uri = vscode.Uri.file(getInputFilePath(fileName)); + const document = yield vscode.workspace.openTextDocument(uri); + yield vscode.window.showTextDocument(document); + if (!vscode.window.activeTextEditor) { + return; + } + vscode.window.activeTextEditor.selections = [new vscode.Selection(cursorPosition, cursorPosition)]; + yield vscode.commands.executeCommand('phpAddProperty.append'); + const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); + yield utils_1.delay(utils_1.waitToAssertInSeconds, () => { + var _a; + assert.strictEqual((_a = vscode.window.activeTextEditor) === null || _a === void 0 ? void 0 : _a.document.getText(), expectedText); + }); + }); +} +function getInputFilePath(name) { + return path.join(__dirname + testFolderRelativeLocation + `inputs/${name}`); +} +function getOutputFilePath(name) { + return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); +} +//# sourceMappingURL=addExistingProperty.test.js.map \ No newline at end of file diff --git a/out/test/suite/addExistingProperty.test.js.map b/out/test/suite/addExistingProperty.test.js.map new file mode 100644 index 0000000..8386337 --- /dev/null +++ b/out/test/suite/addExistingProperty.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"addExistingProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/addExistingProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/suite/addProperty.test.js b/out/test/suite/addProperty.test.js new file mode 100644 index 0000000..66e4c24 --- /dev/null +++ b/out/test/suite/addProperty.test.js @@ -0,0 +1,100 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const vscode = require("vscode"); +const path = require("path"); +const assert = require("assert"); +const fs = require("fs"); +const utils_1 = require("./utils"); +const testFolderRelativeLocation = '/../fixtures/new/'; +suite('Add Property', function () { + setup(() => __awaiter(this, void 0, void 0, function* () { + yield utils_1.resetDefaultSettings(); + })); + teardown(() => __awaiter(this, void 0, void 0, function* () { + yield utils_1.resetDefaultSettings(); + })); + test('Should insert property and constructor in an empty class', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('EmptyClass.php'); + })); + test('Should insert a new property and add it to an empty constructor', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('EmptyConstructor.php'); + })); + test('Should insert a new property and add it to an existing constructor', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ExistingConstructor.php'); + })); + test('Should insert a new property in a multiline constructor', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('MultilineConstructor.php'); + })); + test('Should add a property to the constructor even if the property already exists', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ExistingProperty.php'); + })); + test('Should NOT add a property to the constructor if it is already there', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ExistingPropertyInConstructor.php'); + })); + test('Should NOT add the property assignation if it is already there', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ExistingPropertyAssignation.php'); + })); + test('Should work with tab indentation', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('TabIndentation.php'); + })); + test('Should work when the class contains extra "class" keywords', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ClassKeyword.php'); + })); + test('Should insert property in the first class if the file contains multiple', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('MultipleClasses.php'); + })); + test('Should insert property in the first class if the cursor is placed there', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('MultipleClassesCursorInFirst.php', new vscode.Position(8, 0)); + })); + test('Should insert property in the last class if the cursor is placed there', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('MultipleClassesCursorInLast.php', new vscode.Position(13, 0)); + })); + test('Should add a docblock with @param along with the constructor', () => __awaiter(this, void 0, void 0, function* () { + yield vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.enable', true, true); + yield runFixture('AddConstructorDocblock.php'); + })); + test('Should update the docblock adding the new @param', () => __awaiter(this, void 0, void 0, function* () { + yield vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.enable', true, true); + yield runFixture('UpdateConstructorDocblock.php'); + })); +}); +function runFixture(fileName, cursorPosition) { + return __awaiter(this, void 0, void 0, function* () { + const uri = vscode.Uri.file(getInputFilePath(fileName)); + const document = yield vscode.workspace.openTextDocument(uri); + yield vscode.window.showTextDocument(document); + if (!vscode.window.activeTextEditor) { + return; + } + if (cursorPosition === undefined) { + vscode.window.showInputBox = function (options, token) { + return Promise.resolve('name'); + }; + } + else { + vscode.window.activeTextEditor.selections = [new vscode.Selection(cursorPosition, cursorPosition)]; + } + yield vscode.commands.executeCommand('phpAddProperty.add'); + const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); + yield utils_1.delay(utils_1.waitToAssertInSeconds, () => { + var _a; + assert.strictEqual((_a = vscode.window.activeTextEditor) === null || _a === void 0 ? void 0 : _a.document.getText(), expectedText); + }); + }); +} +function getInputFilePath(name) { + return path.join(__dirname + testFolderRelativeLocation + `inputs/${name}`); +} +function getOutputFilePath(name) { + return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); +} +//# sourceMappingURL=addProperty.test.js.map \ No newline at end of file diff --git a/out/test/suite/addProperty.test.js.map b/out/test/suite/addProperty.test.js.map new file mode 100644 index 0000000..1452e26 --- /dev/null +++ b/out/test/suite/addProperty.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"addProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/addProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/suite/customizations.test.js b/out/test/suite/customizations.test.js new file mode 100644 index 0000000..1574d93 --- /dev/null +++ b/out/test/suite/customizations.test.js @@ -0,0 +1,74 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const vscode = require("vscode"); +const path = require("path"); +const assert = require("assert"); +const fs = require("fs"); +const utils_1 = require("./utils"); +const testFolderRelativeLocation = '/../fixtures/customizations/'; +suite('Customizations', function () { + setup(() => __awaiter(this, void 0, void 0, function* () { + yield utils_1.resetDefaultSettings(); + })); + teardown(() => __awaiter(this, void 0, void 0, function* () { + yield utils_1.resetDefaultSettings(); + })); + test('Should use the specified property default visibility', () => __awaiter(this, void 0, void 0, function* () { + yield vscode.workspace.getConfiguration('phpAddProperty').update('property.visibility.default', 'public', true); + yield runFixture('PropertyDefaultVisibility.php'); + })); + test('Should add the docblock', () => __awaiter(this, void 0, void 0, function* () { + yield vscode.workspace.getConfiguration('phpAddProperty').update('property.docblock.add', true, true); + yield runFixture('PropertyAddDocblock.php'); + })); + test('Should add a multiline docblock', () => __awaiter(this, void 0, void 0, function* () { + yield vscode.workspace.getConfiguration('phpAddProperty').update('property.docblock.add', true, true); + yield vscode.workspace.getConfiguration('phpAddProperty').update('property.docblock.multiline', true, true); + yield runFixture('PropertyMultilineDocblock.php'); + })); + test('Should use the specified constructor default visibility', () => __awaiter(this, void 0, void 0, function* () { + yield vscode.workspace.getConfiguration('phpAddProperty').update('constructor.visibility.default', 'private', true); + yield runFixture('ConstructorDefaultVisibility.php'); + })); + test('Should break constructor into multiple lines', () => __awaiter(this, void 0, void 0, function* () { + yield vscode.workspace.getConfiguration('phpAddProperty').update('constructor.breakIntoMultilineIfLengthExceeded.enabled', true, true); + yield runFixture('ConstructorBreakIntoMultiline.php'); + })); + test('Should break constructor into multiple lines at a specified length', () => __awaiter(this, void 0, void 0, function* () { + yield vscode.workspace.getConfiguration('phpAddProperty').update('constructor.breakIntoMultilineIfLengthExceeded.enabled', true, true); + yield vscode.workspace.getConfiguration('phpAddProperty').update('constructor.breakIntoMultilineIfLengthExceeded.maxLineLength', 40, true); + yield runFixture('ConstructorBreakIntoMultilineLength.php'); + })); +}); +function runFixture(fileName) { + return __awaiter(this, void 0, void 0, function* () { + vscode.window.showInputBox = function (options, token) { + return Promise.resolve('name'); + }; + const uri = vscode.Uri.file(getInputFilePath(fileName)); + const document = yield vscode.workspace.openTextDocument(uri); + yield vscode.window.showTextDocument(document); + yield vscode.commands.executeCommand('phpAddProperty.add'); + const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); + yield utils_1.delay(utils_1.waitToAssertInSeconds, () => { + var _a; + assert.strictEqual((_a = vscode.window.activeTextEditor) === null || _a === void 0 ? void 0 : _a.document.getText(), expectedText); + }); + }); +} +function getInputFilePath(name) { + return path.join(__dirname + testFolderRelativeLocation + `inputs/${name}`); +} +function getOutputFilePath(name) { + return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); +} +//# sourceMappingURL=customizations.test.js.map \ No newline at end of file diff --git a/out/test/suite/customizations.test.js.map b/out/test/suite/customizations.test.js.map new file mode 100644 index 0000000..da880f4 --- /dev/null +++ b/out/test/suite/customizations.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"customizations.test.js","sourceRoot":"","sources":["../../../src/test/suite/customizations.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/suite/index.js b/out/test/suite/index.js new file mode 100644 index 0000000..e8e1d1f --- /dev/null +++ b/out/test/suite/index.js @@ -0,0 +1,39 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const path = require("path"); +const Mocha = require("mocha"); +const glob = require("glob"); +function run() { + // Create the mocha test + const mocha = new Mocha({ + ui: 'tdd', + color: true + }); + const testsRoot = path.resolve(__dirname, '..'); + return new Promise((c, e) => { + glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { + if (err) { + return e(err); + } + // Add files to the test suite + files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); + try { + // Run the mocha test + mocha.run(failures => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } + else { + c(); + } + }); + } + catch (err) { + console.error(err); + e(err); + } + }); + }); +} +exports.run = run; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/out/test/suite/index.js.map b/out/test/suite/index.js.map new file mode 100644 index 0000000..1ebdc6c --- /dev/null +++ b/out/test/suite/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/test/suite/index.ts"],"names":[],"mappings":";;AAAA,6BAA6B;AAC7B,+BAA+B;AAC/B,6BAA6B;AAE7B,SAAgB,GAAG;IAClB,wBAAwB;IACxB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACvB,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,IAAI;KACX,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAEhD,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACxD,IAAI,GAAG,EAAE;gBACR,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;aACd;YAED,8BAA8B;YAC9B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAE9D,IAAI;gBACH,qBAAqB;gBACrB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;oBACpB,IAAI,QAAQ,GAAG,CAAC,EAAE;wBACjB,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,QAAQ,gBAAgB,CAAC,CAAC,CAAC;qBAC1C;yBAAM;wBACN,CAAC,EAAE,CAAC;qBACJ;gBACF,CAAC,CAAC,CAAC;aACH;YAAC,OAAO,GAAG,EAAE;gBACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC,CAAC,GAAG,CAAC,CAAC;aACP;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAjCD,kBAiCC"} \ No newline at end of file diff --git a/out/test/suite/utils.js b/out/test/suite/utils.js new file mode 100644 index 0000000..f4a6ada --- /dev/null +++ b/out/test/suite/utils.js @@ -0,0 +1,56 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const vscode = require("vscode"); +exports.waitToAssertInSeconds = 15; +function delay(seconds, callback) { + return new Promise(resolve => { + setTimeout(() => { + callback(); + resolve(); + }, seconds * exports.waitToAssertInSeconds); + }); +} +exports.delay = delay; +function resetDefaultSettings() { + return __awaiter(this, void 0, void 0, function* () { + const config = vscode.workspace.getConfiguration('phpAddProperty'); + for (const key in config) { + if (config.hasOwnProperty(key)) { + yield setDefaultSetting(config, config[key], key); + } + } + const constructorConfig = vscode.workspace.getConfiguration('phpAddProperty.constructor'); + for (const setting in constructorConfig) { + if (constructorConfig.hasOwnProperty(setting)) { + yield setDefaultSetting(constructorConfig, constructorConfig[setting], setting); + } + } + }); +} +exports.resetDefaultSettings = resetDefaultSettings; +function setDefaultSetting(config, value, parentKey) { + return __awaiter(this, void 0, void 0, function* () { + if (typeof value === 'function') { + return; + } + if (typeof value !== 'object') { + yield config.update(parentKey, undefined, true); + return; + } + for (const key in value) { + if (value.hasOwnProperty(key)) { + setDefaultSetting(config, value[key], [parentKey, key].join('.')); + } + } + }); +} +//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/out/test/suite/utils.js.map b/out/test/suite/utils.js.map new file mode 100644 index 0000000..2665423 --- /dev/null +++ b/out/test/suite/utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/test/suite/utils.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAiC;AAEpB,QAAA,qBAAqB,GAAG,EAAE,CAAC;AAExC,SAAgB,KAAK,CAAC,OAAe,EAAE,QAAkB;IACrD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QACzB,UAAU,CAAC,GAAG,EAAE;YACZ,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;QACd,CAAC,EAAE,OAAO,GAAG,6BAAqB,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACP,CAAC;AAPD,sBAOC;AAED,SAAsB,oBAAoB;;QACtC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QAEnE,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;YACtB,IAAI,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;gBAC5B,MAAM,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;aACrD;SACJ;QAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,CAAC;QAC1F,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE;YACrC,IAAI,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;gBAC3C,MAAM,iBAAiB,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;aACnF;SACJ;IACL,CAAC;CAAA;AAfD,oDAeC;AAED,SAAe,iBAAiB,CAAC,MAAqC,EAAE,KAAU,EAAE,SAAiB;;QACjG,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;YAC7B,OAAO;SACV;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC3B,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAChD,OAAO;SACV;QAED,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;YACrB,IAAI,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;gBAC3B,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;aACrE;SACJ;IACL,CAAC;CAAA"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d141c22..eb78d32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,29 +1,47 @@ { "name": "php-add-property", - "version": "0.5.0", + "version": "0.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "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.0.0" + "@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.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "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", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", @@ -41,6 +59,12 @@ "@types/node": "*" } }, + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -48,33 +72,84 @@ "dev": true }, "@types/mocha": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.6.tgz", - "integrity": "sha512-1axi39YdtBI7z957vdqXI4Ac25e7YihYQtJa+Clnxg1zTJEaIRbndt71O3sP4GAMgiAm0pY26/b9BrY4MR/PMw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", + "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", "dev": true }, "@types/node": { - "version": "10.14.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.19.tgz", - "integrity": "sha512-j6Sqt38ssdMKutXBUuAcmWF8QtHW1Fwz/mz4Y+Wd9mzpBiVFirjpNQf363hG5itkG+yGaD+oiLyb50HxJ36l9Q==", + "version": "13.13.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.5.tgz", + "integrity": "sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==", "dev": true }, "@types/vscode": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.38.0.tgz", - "integrity": "sha512-aGo8LQ4J1YF0T9ORuCO+bhQ5sGR1MXa7VOyOdEP685se3wyQWYUExcdiDi6rvaK61KUwfzzA19JRLDrUbDl7BQ==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.44.0.tgz", + "integrity": "sha512-WJZtZlinE3meRdH+I7wTsIhpz/GLhqEQwmPGeh4s1irWLwMzCeTV8WZ+pgPTwrDXoafVUWwo1LiZ9HJVHFlJSQ==", "dev": true }, + "@typescript-eslint/eslint-plugin": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.31.0.tgz", + "integrity": "sha512-iIC0Pb8qDaoit+m80Ln/aaeu9zKQdOLF4SHcGLarSeY1gurW6aU4JsOPMjKQwXlw70MvWKZQc6S2NamA8SJ/gg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.31.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.31.0.tgz", + "integrity": "sha512-MI6IWkutLYQYTQgZ48IVnRXmLR/0Q6oAyJgiOror74arUMh7EWjJkADfirZhRsUMHeLJ85U2iySDwHTSnNi9vA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.31.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.31.0.tgz", + "integrity": "sha512-uph+w6xUOlyV2DLSC6o+fBDzZ5i7+3/TxAsH4h3eC64tlga57oMb96vVlXoMwjR/nN+xyWlsnxtbDkB46M2EPQ==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.31.0", + "@typescript-eslint/typescript-estree": "2.31.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.31.0.tgz", + "integrity": "sha512-vxW149bXFXXuBrAak0eKHOzbcu9cvi6iNcJDzEtOkRwGHxJG15chiAQAwhLOsk+86p9GTr/TziYvw+H9kMaIgA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + } + }, "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, "acorn-jsx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", - "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, "agent-base": { @@ -87,12 +162,12 @@ } }, "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" @@ -105,15 +180,26 @@ "dev": true }, "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { @@ -125,6 +211,16 @@ "color-convert": "^1.9.0" } }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -140,28 +236,16 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, - "azure-devops-node-api": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-7.2.0.tgz", - "integrity": "sha512-pMfGJ6gAQ7LRKTHgiRF+8iaUUeGAI0c8puLaqHLc7B8AR7W6GJLozK9RFeUHFjEGybC9/EB3r67WPd7e46zQ8w==", - "dev": true, - "requires": { - "os": "0.1.1", - "tunnel": "0.0.4", - "typed-rest-client": "1.2.0", - "underscore": "1.8.3" - } - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", "dev": true }, "brace-expansion": { @@ -174,18 +258,21 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.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-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -215,52 +302,73 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", "dev": true, "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" } }, "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "^3.1.0" } }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -276,12 +384,6 @@ "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", @@ -299,26 +401,16 @@ "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "dev": true - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -349,18 +441,6 @@ "object-keys": "^1.0.12" } }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true - }, - "didyoumean": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", - "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=", - "dev": true - }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -376,80 +456,35 @@ "esutils": "^2.0.2" } }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", "dev": true, "requires": { - "es-to-primitive": "^1.2.0", + "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" } }, "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -479,53 +514,71 @@ "dev": true }, "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", + "ajv": "^6.10.0", "chalk": "^2.1.0", "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.11", + "lodash": "^4.17.14", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", + "optionator": "^0.8.3", "progress": "^2.0.0", "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", "table": "^5.2.3", - "text-table": "^0.2.0" + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + } } }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -533,12 +586,12 @@ } }, "eslint-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", - "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.0.0" + "eslint-visitor-keys": "^1.1.0" } }, "eslint-visitor-keys": { @@ -548,14 +601,14 @@ "dev": true }, "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" } }, "esprima": { @@ -565,12 +618,20 @@ "dev": true }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } } }, "esrecurse": { @@ -594,21 +655,6 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -621,15 +667,15 @@ } }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", "dev": true }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { @@ -638,19 +684,10 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" @@ -665,6 +702,15 @@ "flat-cache": "^2.0.1" } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -695,9 +741,9 @@ } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "fs.realpath": { @@ -706,6 +752,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -724,19 +777,10 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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", @@ -747,11 +791,23 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } }, "growl": { "version": "1.10.5", @@ -775,9 +831,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, "he": { @@ -786,20 +842,6 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, "http-proxy-agent": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", @@ -828,9 +870,9 @@ } }, "https-proxy-agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", - "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "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", @@ -864,9 +906,9 @@ "dev": true }, "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -896,101 +938,157 @@ "dev": true }, "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "dev": true, "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } }, "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", "dev": true }, "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", "dev": true }, "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "has": "^1.0.1" + "is-extglob": "^2.1.1" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { - "has-symbols": "^1.0.0" + "has-symbols": "^1.0.1" } }, "isexe": { @@ -1027,15 +1125,6 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -1046,15 +1135,6 @@ "type-check": "~0.3.2" } }, - "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -1072,71 +1152,18 @@ "dev": true }, "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - } + "chalk": "^2.4.2" } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimatch": { @@ -1149,28 +1176,29 @@ } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "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.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "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": "0.0.8" + "minimist": "^1.2.5" } }, "mocha": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.0.tgz", - "integrity": "sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", + "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", "dev": true, "requires": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", + "chokidar": "3.3.0", "debug": "3.2.6", "diff": "3.5.0", "escape-string-regexp": "1.0.5", @@ -1179,19 +1207,19 @@ "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", - "log-symbols": "2.2.0", + "log-symbols": "3.0.0", "minimatch": "3.0.4", - "mkdirp": "0.5.1", + "mkdirp": "0.5.5", "ms": "2.1.1", - "node-environment-flags": "1.0.5", + "node-environment-flags": "1.0.6", "object.assign": "4.1.0", "strip-json-comments": "2.0.1", "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" }, "dependencies": { "debug": { @@ -1223,6 +1251,12 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, "supports-color": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", @@ -1241,9 +1275,9 @@ "dev": true }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, "natural-compare": { @@ -1259,37 +1293,33 @@ "dev": true }, "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", "dev": true }, "object-keys": { @@ -1311,13 +1341,13 @@ } }, "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, "once": { @@ -1330,49 +1360,26 @@ } }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" } }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "os": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", - "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "word-wrap": "~1.2.3" } }, "os-tmpdir": { @@ -1381,38 +1388,10 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -1442,24 +1421,6 @@ "callsites": "^3.0.0" } }, - "parse-semver": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", - "dev": true, - "requires": { - "semver": "^5.1.0" - } - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -1472,22 +1433,22 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "php-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.0.1.tgz", + "integrity": "sha512-m6CBPHOoMkzEHoXG0rhEg/VegSNemUNQepHnYtrRgTAh8rsqoO65KqQ32KJ5xe2iplhO0jdwd1UJ9Ea0yHsgYQ==", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, "prelude-ls": { @@ -1502,46 +1463,25 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "readable-stream": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", - "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "picomatch": "^2.0.4" } }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, "require-directory": { @@ -1563,12 +1503,12 @@ "dev": true }, "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { - "onetime": "^2.0.0", + "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, @@ -1582,29 +1522,20 @@ } }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true }, "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "dev": true, "requires": { "tslib": "^1.9.0" } }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -1612,9 +1543,9 @@ "dev": true }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "set-blocking": { @@ -1639,9 +1570,9 @@ "dev": true }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "slice-ansi": { @@ -1653,6 +1584,14 @@ "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } } }, "sprintf-js": { @@ -1662,43 +1601,90 @@ "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", "dev": true, "requires": { - "safe-buffer": "~5.2.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } }, "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", "dev": true }, "supports-color": { @@ -1722,10 +1708,16 @@ "string-width": "^3.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "string-width": { @@ -1738,15 +1730,6 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } } } }, @@ -1771,17 +1754,29 @@ "os-tmpdir": "~1.0.2" } }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", + "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==", "dev": true }, - "tunnel": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", - "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=", - "dev": true + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } }, "type-check": { "version": "0.3.2", @@ -1792,32 +1787,16 @@ "prelude-ls": "~1.1.2" } }, - "typed-rest-client": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.2.0.tgz", - "integrity": "sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw==", - "dev": true, - "requires": { - "tunnel": "0.0.4", - "underscore": "1.8.3" - } - }, - "typescript": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.3.tgz", - "integrity": "sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw==", + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true }, "uri-js": { @@ -1829,65 +1808,20 @@ "punycode": "^2.1.0" } }, - "url-join": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", - "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", "dev": true }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "vsce": { - "version": "1.73.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.73.0.tgz", - "integrity": "sha512-6W37Ebbkj3uF3WhT+SCfRtsneRQEFcGvf/XYz+b6OAgDCj4gPurWyDVrqw/HLsbP1WflGIyUfVZ8t5M7kQp6Uw==", - "dev": true, - "requires": { - "azure-devops-node-api": "^7.2.0", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.1", - "commander": "^2.8.1", - "denodeify": "^1.2.1", - "didyoumean": "^1.2.1", - "glob": "^7.0.6", - "lodash": "^4.17.10", - "markdown-it": "^8.3.1", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "osenv": "^0.1.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "0.0.29", - "typed-rest-client": "1.2.0", - "url-join": "^1.1.0", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "dependencies": { - "tmp": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", - "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, "vscode-test": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.2.0.tgz", - "integrity": "sha512-aowqgc8gZe0eflzVUXsBjBrlsJ8eC35kfgfSEeHu9PKA1vQKm/3rVK43TlbxGue8hKtZBElNAJ5QuYklR/vLJA==", + "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" } }, @@ -1913,57 +1847,79 @@ "dev": true, "requires": { "string-width": "^1.0.2 || 2" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "ansi-regex": "^3.0.0" } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } } } @@ -1990,28 +1946,33 @@ "dev": true }, "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { - "cliui": "^4.0.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" + "yargs-parser": "^13.1.2" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "string-width": { @@ -2024,22 +1985,13 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } } } }, "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -2047,77 +1999,14 @@ } }, "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, "requires": { "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - }, - "dependencies": { - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3" + "lodash": "^4.17.15", + "yargs": "^13.3.0" } } } diff --git a/package.json b/package.json index dbf7174..45ce802 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "php-add-property", "displayName": "PHP Add Property", - "description": "Quick way to add PHP class properties", + "description": "Quick way to manage PHP class properties", "publisher": "kotfire", "license": "SEE LICENSE IN LICENSE", "version": "0.5.0", @@ -25,7 +25,7 @@ "onCommand:phpAddProperty.add", "onCommand:phpAddProperty.append" ], - "main": "./src/extension.js", + "main": "./out/extension.js", "contributes": { "commands": [ { @@ -167,19 +167,26 @@ } }, "scripts": { - "test": "node ./test/runTest.js" + "vscode:prepublish": "npm run compile", + "compile": "tsc -p ./", + "lint": "eslint src --ext ts", + "watch": "tsc -watch -p ./", + "pretest": "npm run compile && npm run lint", + "test": "node ./out/test/runTest.js" }, "devDependencies": { "@types/glob": "^7.1.1", - "@types/mocha": "^5.2.6", - "@types/node": "^10.12.21", - "@types/vscode": "^1.38.0", - "eslint": "^5.13.0", - "glob": "^7.1.4", - "mocha": "^6.1.4", - "typescript": "^3.3.1", - "vsce": "^1.73.0", - "vscode-test": "^1.2.0" + "@types/mocha": "^7.0.2", + "@types/node": "^13.11.0", + "@types/vscode": "^1.44.0", + "@typescript-eslint/eslint-plugin": "^2.30.0", + "@typescript-eslint/parser": "^2.30.0", + "eslint": "^6.8.0", + "glob": "^7.1.6", + "mocha": "^7.1.2", + "php-parser": "^3.0.1", + "typescript": "^3.8.3", + "vscode-test": "^1.3.0" }, "repository": { "type": "git", diff --git a/src/AddProperty.js b/src/AddProperty.js deleted file mode 100644 index e948375..0000000 --- a/src/AddProperty.js +++ /dev/null @@ -1,719 +0,0 @@ -const vscode = require('vscode'); - -class AddProperty { - async add() { - this.reset(); - const document = this.activeEditor().document; - - if (document.uri === undefined) { - return; - } - - this.parseDocument(document); - - if (!this.classLine) { - return; - } - - this.name = await vscode.window.showInputBox({ - placeHolder: 'Enter the property name' - }); - - if (this.name === undefined || this.name.trim() === "") { - return; - } - - if (!this.constructorStartLine) { - this.insertConstructor(); - } else { - this.insertProperty(); - } - } - - async append() { - this.reset(); - const document = this.activeEditor().document; - - if (document.uri === undefined) { - return; - } - - this.parseDocument(document); - - if (!this.classLine) { - return; - } - - const editor = this.activeEditor(); - const selectionLineNumber = editor.selection.active.line; - const line = document.lineAt(selectionLineNumber); - - if (!this.isPropertyLine(line.text)) { - return; - } - - const match = /\$([^\s;]*)/.exec(line.text); - - if (!match[1]) { - return; - } - - this.name = match[1]; - - if (this.name === undefined || this.name.trim() === "") { - return; - } - - let previousLineNumber = selectionLineNumber - 1; - - if (previousLineNumber > 0) { - let previousLine = editor.document.lineAt(previousLineNumber); - - if (/\*\//.test(previousLine.text)) { - for (previousLineNumber; previousLineNumber > 0; previousLineNumber--) { - previousLine = document.lineAt(previousLineNumber); - const typeMatch = /@var\s(\S*)/.exec(previousLine.text); - - if (typeMatch) { - this.type = typeMatch[1]; - } - - if (/\/\*\*/.test(previousLine.text)) { - break; - } - } - } - } - - if (! /function __construct/gm.test(this.activeEditor().document.getText())) { - this.insertConstructor(false); - } else { - this.insertProperty(false); - } - } - - insertConstructor(shouldInsertPropertyStatement = true) { - let insertLine = this.classLine; - - if (this.lastTraitLine) { - insertLine = this.lastTraitLine; - } - - if (this.lastPropertyLine) { - insertLine = this.lastPropertyLine; - } - - let snippet = this.escapeForSnippet(this.activeEditor().document.getText(insertLine.range)) + "\n"; - - if (this.lastTraitLine || this.lastPropertyLine) { - snippet += "\n"; - } - - let insertLineIndentation = this.calculateIndentationLevel( - this.getLineFirstNonIndentationCharacterIndex(insertLine) - ); - - if (/{\s*$/.test(insertLine.text)) { - insertLineIndentation++; - } - - if (shouldInsertPropertyStatement === true && !this.classProperties.includes(this.name)) { - snippet += this.indentText( - this.getPropertyStatementText(), - insertLineIndentation - ); - } - - if (this.config('phpAddProperty.constructor.docblock.enable') === true) { - snippet += this.indentText( - "/**\n", - insertLineIndentation - ); - snippet += this.indentText( - " * Constructor.\n", - insertLineIndentation - ); - snippet += this.indentText( - `${this.getConstructorParamDocblockText()}\n`, - insertLineIndentation - ); - snippet += this.indentText( - " */\n", - insertLineIndentation - ); - } - - const visibility = this.config('phpAddProperty.constructor.visibility.default'); - let constructorText = this.indentText( - this.config('phpAddProperty.constructor.visibility.choose') === true - ? `\${${this.tabStops.constructorVisibility}${this.getVisibilityChoice(visibility)}} ` - : `${visibility} `, - insertLineIndentation - ); - - const parameterText = this.getParameterText(); - - constructorText += `function __construct(${parameterText})\n`; - constructorText += this.indentText('{\n', insertLineIndentation); - constructorText += this.indentText( - `\\$this->${this.name} = \\$${this.name};\$0\n`, - insertLineIndentation + 1 - ); - constructorText += this.indentText('}', insertLineIndentation); - - snippet += constructorText; - - let range = insertLine.range; - - for (let nextLineNumber = insertLine.range.end.line + 1; nextLineNumber < this.activeEditor().document.lineCount; nextLineNumber++) { - const nextLine = this.activeEditor().document.lineAt(nextLineNumber); - - if (!this.isEmptyOrWhiteSpaceLine(nextLine)) { - if (!/}/.test(nextLine.text)) { - snippet += "\n"; - } - break; - } - - range = new vscode.Range( - range.start, - nextLine.range.end - ); - } - - this.replaceWithSnippet(snippet, range); - } - - insertProperty(shouldInsertPropertyStatement = true) { - let text = shouldInsertPropertyStatement === true && !this.classProperties.includes(this.name) - ? this.indentText(this.getPropertyStatementText()) - : ''; - - let constructorText = this.escapeForSnippet( - this.activeEditor().document.getText( - new vscode.Range( - this.constructorStartLine.range.start, - this.constructorEndLine.rangeIncludingLineBreak.start - ) - ) - ); - - // Update docblock parameters - const shouldUpdateDocblockParameters = this.config('phpAddProperty.constructor.docblock.enable') === true - && this.constructorDocblockStartLine - && !this.docblockParams.includes(this.name); - - if (shouldUpdateDocblockParameters) { - let docblockText = this.escapeForSnippet( - this.activeEditor().document.getText( - new vscode.Range( - this.constructorDocblockStartLine.range.start, - this.constructorDocblockEndLine.rangeIncludingLineBreak.start - ) - ) - ); - - const newDocblockText = docblockText - + this.indentText( - this.getConstructorParamDocblockText(), - this.calculateIndentationLevel( - this.getLineFirstNonIndentationCharacterIndex(this.constructorDocblockStartLine) - ) - ) - + "\n"; - - constructorText = constructorText.replace(docblockText, newDocblockText); - } - - // Check if property already exists as argument - const constructorMatch = /function\s+__construct\s*\(((?:\s|\S)*)(?=\))\s*\)/.exec(constructorText); - if (constructorMatch) { - const parametersText = constructorMatch[1]; - const parameters = parametersText.split(',').flatMap(parameter => { - const match = parameter.trim().match(/\$(\S+)/); - return match ? [match[1]] : []; - }); - - if (parameters.includes(this.name)) { - this.showErrorMessage('Property already exists as constructor argument'); - - return; - } - } - - // Check if property has been already assignated - let propertyAssignationExists = false; - const assignationRegex = /\$this->(\S+)\s*=[^;]*;/g; - let assignationMatch; - while (assignationMatch = assignationRegex.exec(constructorText)) { - if (assignationMatch[1] === this.name) { - propertyAssignationExists = true; - break; - } - } - - // Add property to constructor parameters - const constructorParameterLastLine = this.constructorLastParameterLine || this.constructorParametersCloseLine; - const constructorLastParameterText = this.escapeForSnippet( - this.activeEditor().document.getText(constructorParameterLastLine.range) - ); - - let position = constructorParameterLastLine.range.end.character; - if (constructorParameterLastLine.lineNumber === this.constructorParametersCloseLine.lineNumber) { - const match = /\)(?!\))/.exec(constructorLastParameterText); - if (match) { - position = match.index - 1; - } - } - - // Zero-based to one-based - position++; - - const newParameterText = this.getParameterText(); - let newParameterWrapper = this.constructorLastParameterLine ? ',' : ''; - if (this.isMultiLineConstructor) { - newParameterWrapper += "\n" + this.indentText( - newParameterText, - this.calculateIndentationLevel( - this.getLineFirstNonIndentationCharacterIndex(constructorParameterLastLine) - ) - ); - } else { - newParameterWrapper += (this.constructorLastParameterLine ? ' ' : '') + newParameterText; - } - - const output = [ - constructorLastParameterText.slice(0, position), - newParameterWrapper, - constructorLastParameterText.slice(position) - ].join(''); - - constructorText = constructorText.replace(constructorLastParameterText, output); - - if (!this.isMultiLineConstructor) { - constructorText = this.breakIntoMultiline(constructorText); - } - - text += constructorText; - - if (!propertyAssignationExists) { - // Initialize property to parameter - text += this.indentText(`\\$this->${this.name} = \\$${this.name};\$0\n`, 2); - } - - // Close constructor - text += this.constructorEndLine.text; - - const range = new vscode.Range( - this.constructorStartLine.range.start, - this.constructorEndLine.range.end - ); - - this.replaceWithSnippet(text, range); - } - - breakIntoMultiline(constructorText) { - if (this.config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.enabled') === true) { - const regex = /((public|protected|private)\s+function\s+__construct\s*\(((?:\s|\S)*)(?=\))\s*\))\s*{/; - const match = regex.exec(constructorText); - if (match) { - const constructorLineText = match[1]; - - if (constructorLineText.length > this.config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.maxLineLength')) { - const visibilityText = match[2]; - const parametersText = match[3]; - const parameters = parametersText.split(',').map(parameter => this.indentText(parameter.trim(), 2)); - - const multilineConstructorText = `${visibilityText} function __construct(\n` - + `${parameters.join(',\n')}\n` - + this.indentText(') {'); - - constructorText = constructorText.replace(match[0], multilineConstructorText); - } - } - } - - return constructorText; - } - - indentText(text, level = 1) { - if (level < 1) { - level = 1; - } - - /** - * Good to have - * Listen for view options changes and use these values - * https://github.com/jedmao/tabsanity-vs/blob/faa41a99ccb47c8e7717edfcbdfba4c093e670fe/TabSanity/TabOptionsListener.cs - */ - let tab = "\t"; - if (this.configUsingResource('editor.insertSpaces')) { - const tabSize = this.configUsingResource('editor.tabSize'); - tab = ' '.repeat(tabSize); - } - return tab.repeat(level) + text; - } - - getVisibilityChoice(defaultValue) { - let visibilityChoices = ['public', 'protected', 'private']; - if (visibilityChoices.indexOf(defaultValue) !== -1) { - visibilityChoices.splice(visibilityChoices.indexOf(defaultValue), 1); - } - return `|${[defaultValue, ...visibilityChoices].join(',')}|`; - } - - getPropertyStatementText() { - let docblockTypeStop = this.tabStops.propertyDocblockType; - let dockblockImportStop = this.tabStops.propertyDocblockImport; - - if (this.config('phpAddProperty.property.docblock.withParameter') === true) { - docblockTypeStop = this.tabStops.constructorParameterType; - dockblockImportStop = this.tabStops.constructorParameterStop; - this.tabStops.constructorParameterStop++; - } - - let propertyStatementText = ''; - if (this.config('phpAddProperty.property.docblock.add') === true) { - let stopText = ''; - - if (this.config('phpAddProperty.property.docblock.stopToImport') === true) { - stopText += `$${dockblockImportStop}`; - } - - stopText += `$${docblockTypeStop}`; - - if (this.config('phpAddProperty.property.docblock.multiline') === true) { - propertyStatementText += `/**\n${this.indentText(' * @var ')}${stopText}\n${this.indentText(' */')}\n${this.indentText('')}`; - } else { - if (this.config('phpAddProperty.property.docblock.withParameter') === false) { - stopText += ' '; - } - - propertyStatementText += `/** @var ${stopText}*/\n${this.indentText('')}`; - } - } - - const visibility = this.config('phpAddProperty.property.visibility.default'); - propertyStatementText += this.config('phpAddProperty.property.visibility.choose') === true - ? `\${${this.tabStops.propertyVisibility}${this.getVisibilityChoice(visibility)}} ` - : `${visibility} `; - - if (this.config('phpAddProperty.property.types') === true) { - propertyStatementText += `$${this.tabStops.constructorParameterType}`; - } - propertyStatementText += `\\$${this.name};\n\n`; - - return propertyStatementText; - } - - getConstructorParamDocblockText() { - let docblockTypeStop = this.tabStops.constructorDocblockType; - let dockblockImportStop = this.tabStops.constructorDocblockImport; - - if (this.config('phpAddProperty.constructor.docblock.withParameter') === true) { - docblockTypeStop = this.tabStops.constructorParameterType; - dockblockImportStop = this.tabStops.constructorParameterStop; - this.tabStops.constructorParameterStop++; - } - - let constructorParamDocblockText = `\${${docblockTypeStop}}`; - - if (this.type) { - constructorParamDocblockText = `\${${docblockTypeStop}:${this.type} }`; - } - - if (this.config('phpAddProperty.constructor.docblock.stopToImport') === true) { - constructorParamDocblockText += `\$${dockblockImportStop}`; - } - - constructorParamDocblockText += `\\$${this.name}`; - - if (this.config('phpAddProperty.constructor.docblock.stopForDescription') === true) { - constructorParamDocblockText += `\$${this.tabStops.constructorDocblockDescription}`; - } - - return ` * @param ${constructorParamDocblockText}`; - } - - getParameterText() { - let tabStopsText = `$${this.tabStops.constructorParameterType}`; - - if (this.type) { - tabStopsText = `\${${this.tabStops.constructorParameterType}:${this.type}}`; - } - - if (this.config('phpAddProperty.property.stopToImport') === true) { - tabStopsText += `$${this.tabStops.constructorParameterStop}`; - } - - let parameterText = `${tabStopsText}`; - - if (this.type) { - parameterText += ' '; - } - - parameterText += `\\$${this.name}`; - - return parameterText; - } - - isPropertyLine(textLine) { - return /(public|protected|private|static)\s+\$\w+.*;/.test(textLine); - } - - isClassLine(textLine) { - return /(?:^(?:(?:final|abstract)\s+)?class\s+\w+)|(new\s+class)/.test(textLine); - } - - replaceWithSnippet(text, range) { - const rangeLines = range.end.line - range.start.line; - - this.activeEditor().edit( - editBuilder => { - editBuilder.replace(range, "\n".repeat(rangeLines)) - }, - { - undoStopBefore: false, - undoStopAfter: false - } - ); - - this.activeEditor().insertSnippet( - new vscode.SnippetString(text), - range, - { - undoStopBefore: false, - undoStopAfter: false - } - ); - } - - getLineFirstNonIndentationCharacterIndex(line) { - const tabSize = this.configUsingResource('editor.tabSize'); - - let index = 0; - for (let i = 0; i < line.text.length; i++) { - const char = line.text[i]; - - if (/[^\s\t]/.test(char)) { - index++; - break; - } - - index += char === "\t" ? tabSize : 1; - } - - return index; - } - - getLineTextFromFirstNonIndentationCharacter(line) { - let i = 0; - - for (i; i < line.text.length; i++) { - if (/[^\s\t]/.test(line.text[i])) { - break; - } - } - - return line.text.substr(i); - } - - isEmptyOrWhiteSpaceLine(line) { - return /^[\s\t]*$/.test(line.text); - } - - calculateIndentationLevel(index) { - return Math.floor(index / this.configUsingResource('editor.tabSize')); - } - - escapeForSnippet(text) { - return text.replace(/(? 0) { - let previousLine = document.lineAt(previousLineNumber); - - if (/^\*\//.test(this.getLineTextFromFirstNonIndentationCharacter(previousLine))) { - this.constructorDocblockEndLine = previousLine; - let paramLine; - - for (previousLineNumber--; previousLineNumber > 0; previousLineNumber--) { - previousLine = document.lineAt(previousLineNumber); - paramLine = /@param(?:\s+\S+)\s+\$(\S+)/.exec(previousLine.text); - - if (paramLine) { - this.docblockParams.push(paramLine[1]); - this.lastDocBlockParamLine = previousLine; - } - - if (/^\/\*\*/.test(this.getLineTextFromFirstNonIndentationCharacter(previousLine))) { - this.constructorDocblockStartLine = previousLine; - this.constructorStartLine = previousLine; - break; - } - } - } - } - - for (let ln = lineNumber; ln < document.lineCount; ln++) { - const l = document.lineAt(ln); - const tl = l.text; - - if (/\$\w+/.test(tl)) { - this.constructorLastParameterLine = l; - } - - if (/\)(?!\))/.test(tl)) { - this.constructorParametersCloseLine = l; - } - - if (/{/.test(tl)) { - this.isMultiLineConstructor = this.constructorParametersCloseLine.lineNumber !== lineNumber; - break; - } - } - - - for (let nextLineNumber = lineNumber + 1; nextLineNumber < document.lineCount; nextLineNumber++) { - const nextLine = document.lineAt(nextLineNumber); - if (/^}/.test(this.getLineTextFromFirstNonIndentationCharacter(nextLine))) { - this.constructorEndLine = nextLine; - break; - } - } - } - } - } - - getClassLineNumberFromCursorLineNumber(document, cursorLineNumber) { - for (let lineNumber = cursorLineNumber; lineNumber >= 0; lineNumber--) { - const line = document.lineAt(lineNumber); - - if (this.isClassLine(this.getLineTextFromFirstNonIndentationCharacter(line))) { - return lineNumber; - } - } - - return 0; - } -} - -module.exports = AddProperty; \ No newline at end of file diff --git a/src/class.ts b/src/class.ts new file mode 100644 index 0000000..dc3ddef --- /dev/null +++ b/src/class.ts @@ -0,0 +1,27 @@ +import Constructor from './constructor'; + +export default class Class { + public ast: any; + + private construct?: Constructor; + + constructor(ast: any) { + this.ast = ast; + + this.findConstructor(); + } + + public getConstructor() { + return this.construct; + } + + private findConstructor() { + for (let i = 0; i < this.ast.body.length; i++) { + const node = this.ast.body[i]; + + if (node.kind === 'method' && node.name?.name === '__construct') { + this.construct = new Constructor(node); + } + } + } +} diff --git a/src/constructor.ts b/src/constructor.ts new file mode 100644 index 0000000..0ea68ee --- /dev/null +++ b/src/constructor.ts @@ -0,0 +1,7 @@ +export default class Constructor { + public ast: any; + + constructor(ast: any) { + this.ast = ast; + } +} diff --git a/src/extension.js b/src/extension.js deleted file mode 100644 index f8f0614..0000000 --- a/src/extension.js +++ /dev/null @@ -1,23 +0,0 @@ -const vscode = require('vscode'); -const AddProperty = require('./AddProperty'); - -function activate(context) { - let addProperty = new AddProperty(); - - context.subscriptions.push( - vscode.commands.registerCommand('phpAddProperty.add', () => { - if (vscode.window.activeTextEditor !== undefined) { - addProperty.add(); - } - }), - vscode.commands.registerCommand('phpAddProperty.append', () => { - if (vscode.window.activeTextEditor !== undefined) { - addProperty.append(); - } - }) - ); - - context.subscriptions.push(addProperty); -} - -exports.activate = activate; \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts new file mode 100644 index 0000000..8bfe693 --- /dev/null +++ b/src/extension.ts @@ -0,0 +1,671 @@ +import * as vscode from 'vscode'; +import PhpEngine from 'php-parser'; +import Locator from './locator'; +import PhpClass from './class'; +import Property from './property'; + +export function activate(context: vscode.ExtensionContext) { + context.subscriptions.push( + vscode.commands.registerCommand('phpAddProperty.add', async () => { + if (vscode.window.activeTextEditor === undefined) { + return; + } + + const document = vscode.window.activeTextEditor.document; + + const phpEngine = new PhpEngine({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + + const ast = phpEngine.parseCode(document.getText()); + + const locator = new Locator(ast); + + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + + const phpClass = locator.findClass(selectionLineNumber + 1); + + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + + return; + } + + const name = await vscode.window.showInputBox({ + placeHolder: 'Enter the property name' + }); + + if (name === undefined || name.trim() === "") { + return; + } + + const property = new Property(name); + + insertProperty(vscode.window.activeTextEditor, property, phpClass, `${property.getName()};`); + }), + vscode.commands.registerCommand('phpAddProperty.append', async () => { + if (vscode.window.activeTextEditor === undefined) { + return; + } + + const document = vscode.window.activeTextEditor.document; + + const phpEngine = new PhpEngine({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + + const ast = phpEngine.parseCode(document.getText()); + + const locator = new Locator(ast); + + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + + const phpClass = locator.findClass(selectionLineNumber + 1); + + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + + return; + } + + const line = document.lineAt(selectionLineNumber); + + const lineAst = (phpEngine.parseEval(`class A { ${line.text} }`) as any); + + if (lineAst.children[0]?.body[0]?.kind !== 'propertystatement') { + return; + } + + const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); + + const properties = (lineAst.children[0].body[0].properties as any[]); + + const propertyAst = properties.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? properties[0]; + + const propertyName = propertyAst.name?.name; + + const propertyStatementAst = phpClass.ast.body.find((node: any) => { + if (node.kind !== 'propertystatement') { + return false + } + + return node.properties.find((propertyAst: any) => propertyAst.name?.name === propertyName); + }); + + if (!propertyStatementAst) { + return; + } + + let docblockType; + for (let i = 0; i < propertyStatementAst.leadingComments?.length; i++) { + const node = propertyStatementAst.leadingComments[i]; + + if (node.kind !== 'commentblock') { + continue; + } + + const typeMatch = /@var\s(\S*)/g.exec(node.value); + + if (typeMatch) { + docblockType = typeMatch[1]; + } + } + + const property = new Property(propertyName, propertyAst.type?.name ?? docblockType); + + insertProperty(vscode.window.activeTextEditor, property, phpClass, line.text); + }) + ); +} + +// this method is called when your extension is deactivated +export function deactivate() { } + +function calculateIndentationLevel(index: number): number { + return Math.floor(index / configUsingResource('editor.tabSize')); +} + +function getLineFirstNonIndentationCharacterIndex(lineText: string): number { + const tabSize = configUsingResource('editor.tabSize'); + + let index = 0; + for (let i = 0; i < lineText.length; i++) { + const char = lineText[i]; + + if (/[^\s\t]/.test(char)) { + index++; + break; + } + + index += char === "\t" ? tabSize : 1; + } + + return index; +} + +function indentText(text: string, level: number = 1) { + /** + * Good to have + * Listen for view options changes and use these values + * https://github.com/jedmao/tabsanity-vs/blob/faa41a99ccb47c8e7717edfcbdfba4c093e670fe/TabSanity/TabOptionsListener.cs + */ + let tab = "\t"; + if (configUsingResource('editor.insertSpaces')) { + const tabSize = configUsingResource('editor.tabSize'); + tab = ' '.repeat(tabSize); + } + return tab.repeat(level) + text; +} + +function configUsingResource(key: string): any { + const parts = key.split(/\.(.+)/, 2); + const configuration = vscode.workspace.getConfiguration( + parts[0], + vscode.window.activeTextEditor?.document.uri + ); + + return parts[1] ? configuration.get(parts[1]) : configuration; +} + +function config(key: string) { + return vscode.workspace.getConfiguration().get(key); +} + +function escapeForRegExp(text: string): string { + return text.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); +} + +function escapeForSnippet(text: string): string { + return text.replace(/(? { + editBuilder.replace(range, "\n".repeat(rangeLines)); + }, + { + undoStopBefore: true, + undoStopAfter: false + } + ).then(() => { + const editor = vscode.window.activeTextEditor; + + if (editor) { + editor.insertSnippet( + new vscode.SnippetString(snippet), + range, + { + undoStopBefore: false, + undoStopAfter: false, + } + ); + } + }); +} + +function addPropertyStatement(document: vscode.TextDocument, phpClass: PhpClass, property: Property, tabStops: any): string { + const phpClassRange = new vscode.Range( + new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), + new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column) + ); + + let newDocumentText = escapeForSnippet(document.getText(phpClassRange)); + + let lastProperty; + let firstMethod; + let lastNode; + + const astClassBody = phpClass.ast.body; + for (let i = 0; i < astClassBody.length; i++) { + const node = astClassBody[i]; + + lastNode = node; + + if (node.kind === 'propertystatement') { + lastProperty = node; + + // Check that property does not already exist + for (let j = 0; j < node.properties.length; j++) { + const propertyNode = node.properties[j]; + + if (propertyNode.name?.name === property.getName()) { + return newDocumentText; + } + } + } else if (!firstMethod && node.kind === 'method' && node.name !== '__construct') { + firstMethod = node; + } + } + + const propertyStatementText = getPropertyStatementText(property, tabStops); + + if (lastProperty) { + const lastPropertyLine = document.lineAt(lastProperty.loc.start.line - 1); + + const newPropertyText = escapeForSnippet(`${lastPropertyLine.text}`) + "\n\n" + indentText( + propertyStatementText, + calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(lastPropertyLine.text) + ) + ); + + newDocumentText = newDocumentText.replace(escapeForSnippet(lastPropertyLine.text), newPropertyText); + } else if (firstMethod) { + const firstMethodLine = document.lineAt(firstMethod.loc.start.line - 1); + + const newPropertyText = indentText( + propertyStatementText, + calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(firstMethodLine.text) + ) + ) + "\n\n" + escapeForSnippet(firstMethodLine.text); + + newDocumentText = newDocumentText.replace(escapeForSnippet(firstMethodLine.text), newPropertyText); + } else if (lastNode) { + const lastNodeLine = document.lineAt(lastNode.loc.start.line - 1); + + const newPropertyText = escapeForSnippet(lastNodeLine.text) + "\n\n" + indentText( + propertyStatementText, + calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(lastNodeLine.text) + ) + ); + + newDocumentText = newDocumentText.replace(escapeForSnippet(lastNodeLine.text), newPropertyText); + } else { + const isOneLineClass = phpClass.ast.loc.start.line === phpClass.ast.loc.end.line; + + if (isOneLineClass) { + const match = phpClass.ast.loc.source.match(/(.*)\}/); + + const newPropertyText = escapeForSnippet(match[1]) + "\n" + indentText( + propertyStatementText, + 1 + ) + "\n" + '}'; + + newDocumentText = newDocumentText.replace(escapeForSnippet(phpClass.ast.loc.source), newPropertyText); + } else { + const classBodyLine = document.lineAt(phpClass.ast.loc.start.line - 1); + const classText = escapeForSnippet(phpClass.ast.loc.source); + + const newPropertyText = classText.replace(/{(?:\s|[\r\n]|\s)*}/, "{\n" + indentText( + propertyStatementText, + calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(classBodyLine.text) + ) + 1 + )) + "\n}"; + + newDocumentText = newDocumentText.replace(classText, newPropertyText); + } + } + + return newDocumentText; +} + +function getPropertyStatementText(property: Property, tabStops: any): string { + let docblockTypeStop = tabStops.propertyDocblockType; + let dockblockImportStop = tabStops.propertyDocblockImport; + + if (config('phpAddProperty.property.docblock.withParameter') === true) { + docblockTypeStop = tabStops.constructorParameterType; + dockblockImportStop = tabStops.constructorParameterStop; + tabStops.constructorParameterStop++; + } + + let propertyStatementText = ''; + if (config('phpAddProperty.property.docblock.add') === true) { + let stopText = ''; + + if (config('phpAddProperty.property.docblock.stopToImport') === true) { + stopText += `$${dockblockImportStop}`; + } + + stopText += `$${docblockTypeStop}`; + + if (config('phpAddProperty.property.docblock.multiline') === true) { + propertyStatementText += `/**\n${indentText(' * @var ')}${stopText}\n${indentText(' */')}\n${indentText('')}`; + } else { + if (config('phpAddProperty.property.docblock.withParameter') === false) { + stopText += ' '; + } + + propertyStatementText += `/** @var ${stopText}*/\n${indentText('')}`; + } + } + + const visibility = (config('phpAddProperty.property.visibility.default') as string); + propertyStatementText += config('phpAddProperty.property.visibility.choose') === true + ? `\${${tabStops.propertyVisibility}${getVisibilityChoice(visibility)}} ` + : `${visibility} `; + + if (config('phpAddProperty.property.types') === true) { + propertyStatementText += `$${tabStops.constructorParameterType}`; + } + propertyStatementText += `\\$${property.getName()};`; + + return propertyStatementText; +} + +function getVisibilityChoice(defaultValue: string): string { + let visibilityChoices = ['public', 'protected', 'private']; + if (visibilityChoices.indexOf(defaultValue) !== -1) { + visibilityChoices.splice(visibilityChoices.indexOf(defaultValue), 1); + } + return `|${[defaultValue, ...visibilityChoices].join(',')}|`; +} + +function getParameterText(property: Property, tabStops: any): string { + let tabStopsText = `$${tabStops.constructorParameterType}`; + + if (property.getType()) { + tabStopsText = `\${${tabStops.constructorParameterType}:${property.getType()}}`; + } + + if (config('phpAddProperty.property.stopToImport') === true) { + tabStopsText += `$${tabStops.constructorParameterStop}`; + } + + let parameterText = `${tabStopsText}`; + + if (property.getType()) { + parameterText += ' '; + } + + parameterText += `\\$${property.getName()}`; + + return parameterText; +} + +function getConstructorParamDocblockText(property: Property, tabStops: any): string { + let docblockTypeStop = tabStops.constructorDocblockType; + let dockblockImportStop = tabStops.constructorDocblockImport; + + if (config('phpAddProperty.constructor.docblock.withParameter') === true) { + docblockTypeStop = tabStops.constructorParameterType; + dockblockImportStop = tabStops.constructorParameterStop; + tabStops.constructorParameterStop++; + } + + let constructorParamDocblockText = `\${${docblockTypeStop}}`; + + if (property.getType()) { + constructorParamDocblockText = `\${${docblockTypeStop}:${property.getType()} }`; + } + + if (config('phpAddProperty.constructor.docblock.stopToImport') === true) { + constructorParamDocblockText += `\$${dockblockImportStop}`; + } + + constructorParamDocblockText += `\\$${property.getName()}`; + + if (config('phpAddProperty.constructor.docblock.stopForDescription') === true) { + constructorParamDocblockText += `\$${tabStops.constructorDocblockDescription}`; + } + + return ` * @param ${constructorParamDocblockText}`; +} + +function breakConstructorIntoMultiline(text: string): string { + if (config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.enabled') !== true) { + return text; + } + + const regex = /(.*__construct\s*)\(((?:\s|\S)*?)(?=\))\s*\)\s*{/; + const match = regex.exec(text); + + if (match) { + const constructorLineText = match[0]; + const maxLineLength = config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.maxLineLength') as Number; + + if (constructorLineText.length > maxLineLength) { + const parametersText = match[2]; + const parameters = parametersText.split(',').map(parameter => indentText(parameter.trim(), 2)); + + const multilineConstructorText = match[1] + + '(\n' + + `${parameters.join(',\n')}\n` + + indentText(') {'); + + text = text.replace(match[0], multilineConstructorText); + } + } + + return text; +} + +function insertProperty(editor: vscode.TextEditor, property: Property, phpClass: PhpClass, anchorText: string) { + let tabStops = { + propertyDocblockType: 1, + propertyDocblockImport: 2, + propertyVisibility: 3, + constructorDocblockType: 4, + constructorDocblockImport: 5, + constructorDocblockDescription: 6, + constructorVisibility: 7, + constructorParameterType: 8, + constructorParameterStop: 9 + }; + + const document = editor.document; + const phpClassRange = new vscode.Range( + new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), + new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column) + ); + + let newDocumentText = addPropertyStatement(document, phpClass, property, tabStops); + + if (!phpClass.getConstructor()) { + let snippet = "\n\n"; + + if (config('phpAddProperty.constructor.docblock.enable') === true) { + snippet += indentText("/**\n") + + indentText(" * Constructor.\n") + + indentText(`${getConstructorParamDocblockText(property, tabStops)}\n`) + + indentText(" */\n") + } + + const visibility = (config('phpAddProperty.constructor.visibility.default') as string); + let constructorText = indentText( + config('phpAddProperty.constructor.visibility.choose') === true + ? `\${${tabStops.constructorVisibility}${getVisibilityChoice(visibility)}} ` + : `${visibility} ` + ); + + const parameterText = getParameterText(property, tabStops); + + constructorText += `function __construct(${parameterText})\n` + + indentText('{\n') + + indentText(`\\$this->${property.getName()} = \\$${property.getName()};\$0\n`, 2) + + indentText('}'); + + snippet += constructorText; + + const searchText = escapeForSnippet(anchorText); + + newDocumentText = newDocumentText.replace(searchText, `${searchText}${snippet}`); + } else { + const constructor = phpClass.getConstructor()?.ast; + + let docblock; + for (let i = 0; i < constructor.leadingComments?.length; i++) { + const node = constructor.leadingComments[i]; + + if (node.kind === 'commentblock') { + docblock = node; + break; + } + } + + if (docblock) { + const paramRegex = /@param(?:\s+\S+)?\s+\$(\S+).*/g; + + let paramExists = false; + let lastParamText; + let paramMatch; + while (paramMatch = paramRegex.exec(docblock.value)) { + lastParamText = paramMatch[0]; + if (paramMatch[1] === property.getName()) { + paramExists = true; + break; + } + } + + if (!paramExists) { + if (lastParamText) { + const docblockClosingLine = editor.document.lineAt(docblock.loc.start.line - 1); + + newDocumentText = newDocumentText.replace( + escapeForSnippet(lastParamText), + escapeForSnippet(lastParamText) + "\n" + indentText( + getConstructorParamDocblockText(property, tabStops), + calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(docblockClosingLine.text) + ) + ) + ); + } + } + } + + let argumentExists = false; + for (let i = 0; i < constructor.arguments.length; i++) { + const node = constructor.arguments[i]; + + if (node.name?.name == property.getName()) { + argumentExists = true; + break; + } + } + + if (!argumentExists) { + const constructorMethodText = (constructor.loc.source as string); + const constructorHasArgs = constructor.arguments.length > 0; + + let newConstructorMethodText = ''; + + const isMultiLineConstructor = (/\(\r\n|\r|\n/.test(constructorMethodText)); //constructor.loc.start.line !== constructor.loc.end.line; + + const argumentText = getParameterText(property, tabStops); + if (constructorHasArgs) { + const lastArg = constructor.arguments[constructor.arguments.length - 1]; + + const lastArgLine = document.lineAt(lastArg.loc.end.line - 1); + + let newArg = escapeForSnippet(`${lastArg.loc.source}`); + + if (isMultiLineConstructor) { + newArg += ",\n" + indentText( + argumentText, + calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(lastArgLine.text) + ) + ); + } else { + newArg += `, ${argumentText}`; + } + + newConstructorMethodText = escapeForSnippet(constructorMethodText).replace(escapeForSnippet(lastArg.loc.source), newArg); + } else { + const argsParenthesis = /\(\)/; + + newConstructorMethodText = constructorMethodText.replace(argsParenthesis, `(${argumentText})`); + } + + newDocumentText = newDocumentText.replace(escapeForSnippet(constructorMethodText), newConstructorMethodText); + } + + let assignationExists = false; + for (let i = 0; i < constructor.body?.children.length; i++) { + const node = constructor.body.children[i]; + + if (node.kind === 'expressionstatement' + && node.expression.kind === 'assign' + && node.expression.left.kind === 'propertylookup' + && node.expression.left.offset.name === property.getName() + ) { + assignationExists = true; + break; + } + } + + if (!assignationExists) { + const constructorBodyText = constructor.body.loc.source; + const constructorBodyLine = document.lineAt(constructor.body.loc.start.line - 1); + + const constructorBodyIsEmpty = constructor.body.children.length === 0; + + let newConstructorBodyText = ''; + if (constructorBodyIsEmpty) { + const indentationLevel = calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(constructorBodyLine.text) + ); + + newConstructorBodyText = "{\n" + indentText( + `\\$this->${property.getName()} = \\$${property.getName()};\$0\n`, + indentationLevel + 1 + ) + indentText("}", indentationLevel); + } else { + const lastChildren = constructor.body.children[constructor.body.children.length - 1]; + const lastChildrenText = lastChildren.loc.source; + const lastChildrenLine = document.lineAt(lastChildren.loc.end.line - 1); + + const indentationLevel = calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(lastChildrenLine.text) + ); + + newConstructorBodyText = escapeForSnippet(constructorBodyText).replace( + escapeForSnippet(lastChildrenText), + escapeForSnippet(lastChildrenText) + "\n" + indentText( + `\\$this->${property.getName()} = \\$${property.getName()};\$0`, + indentationLevel + ) + ); + } + + newDocumentText = newDocumentText.replace(escapeForSnippet(constructorBodyText), newConstructorBodyText); + } + } + + newDocumentText = breakConstructorIntoMultiline(newDocumentText); + + if (newDocumentText === escapeForSnippet(document.getText(phpClassRange))) { + return; + } + + replaceWithSnippet(newDocumentText, phpClassRange); +} diff --git a/src/locator.ts b/src/locator.ts new file mode 100644 index 0000000..aaeb45b --- /dev/null +++ b/src/locator.ts @@ -0,0 +1,62 @@ +import Class from "./class"; +import Constructor from "./constructor"; + +export default class Locator { + private ast: any; + + constructor(ast: any) { + this.ast = ast; + } + + findClass(cursorAtLine?: number): Class | undefined { + let firstClass: Class | undefined; + const cursorClass = filter(this.ast, 'class', function (node: any) { + if (!firstClass) { + firstClass = new Class(node); + } + if (!cursorAtLine || (cursorAtLine >= node.loc.start.line && cursorAtLine <= node.loc.end.line)) { + return new Class(node); + } + }); + + return cursorClass || firstClass; + } + + findConstructor(): Constructor | undefined { + return filter(this.ast, 'method', function (node: any) { + if (node.name?.name === '__construct') { + return new Constructor(node); + } + }); + } +} + +function filter(ast: any, kind: string, matcher: Function): any { + let result; + + if (Array.isArray(ast)) { + for (var i = 0; i < ast.length; i++) { + result = filter(ast[i], kind, matcher); + if (result) { + return result; + } + } + } else { + if (ast?.kind === kind) { + result = matcher(ast); + + if (result) { + return result; + } + } + + for (const node in ast) { + if (ast.hasOwnProperty(node) && ast[node] !== ast) { + result = filter(ast[node], kind, matcher); + if (result) { + return result; + } + } + } + } +} diff --git a/src/property.ts b/src/property.ts new file mode 100644 index 0000000..e51990f --- /dev/null +++ b/src/property.ts @@ -0,0 +1,17 @@ +export default class Property { + private name: string; + private type?: string; + + constructor(name: string, type?: string) { + this.name = name; + this.type = type; + } + + public getName() { + return this.name; + } + + public getType() { + return this.type; + } +} diff --git a/test/runTest.js b/src/test/runTest.ts similarity index 70% rename from test/runTest.js rename to src/test/runTest.ts index e355d77..c381656 100644 --- a/test/runTest.js +++ b/src/test/runTest.ts @@ -1,20 +1,19 @@ -const path = require('path'); +import * as path from 'path'; -const { runTests } = require('vscode-test'); +import { runTests } from 'vscode-test'; async function main() { try { // The folder containing the Extension Manifest package.json // Passed to `--extensionDevelopmentPath` - const extensionDevelopmentPath = path.resolve(__dirname, '../'); + const extensionDevelopmentPath = path.resolve(__dirname, '../../'); - // The path to the extension test script + // The path to test runner // Passed to --extensionTestsPath const extensionTestsPath = path.resolve(__dirname, './suite/index'); const testUserDir = path.resolve(__dirname, './user'); - // Download VS Code, unzip it and run the integration test await runTests( { extensionDevelopmentPath, diff --git a/test/suite/addExistingProperty.test.js b/src/test/suite/addExistingProperty.test.ts similarity index 73% rename from test/suite/addExistingProperty.test.js rename to src/test/suite/addExistingProperty.test.ts index 04f589d..a92bdb9 100644 --- a/test/suite/addExistingProperty.test.js +++ b/src/test/suite/addExistingProperty.test.ts @@ -1,8 +1,8 @@ -const vscode = require('vscode'); -const path = require('path'); -const assert = require('assert'); -const fs = require('fs'); -const {waitToAssertInSeconds, delay, resetDefaultSettings} = require('./utils'); +import * as vscode from 'vscode'; +import * as path from 'path'; +import * as assert from 'assert'; +import * as fs from 'fs'; +import { waitToAssertInSeconds, delay, resetDefaultSettings } from './utils'; const testFolderRelativeLocation = '/../fixtures/existing/'; @@ -31,19 +31,27 @@ suite('Add Existing Property', function () { await runFixture('UseDocblock.php', new vscode.Position(8, 0)); }); + test('Should add an existing property using its PHP7.4+ type', async () => { + await runFixture('UseType.php', new vscode.Position(8, 0)); + }); + test('Should add a docblock with @param using type from property docblock', async () => { await vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.enable', true, true); await runFixture('ConstructorDocblockUsingDocblock.php', new vscode.Position(8, 0)); }); }); -async function runFixture(fileName, cursorPosition) { +async function runFixture(fileName: string, cursorPosition: vscode.Position) { const uri = vscode.Uri.file( getInputFilePath(fileName) ); const document = await vscode.workspace.openTextDocument(uri); await vscode.window.showTextDocument(document); + if (!vscode.window.activeTextEditor) { + return; + } + vscode.window.activeTextEditor.selections = [new vscode.Selection(cursorPosition, cursorPosition)]; await vscode.commands.executeCommand('phpAddProperty.append'); @@ -51,14 +59,14 @@ async function runFixture(fileName, cursorPosition) { const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); await delay(waitToAssertInSeconds, () => { - assert.strictEqual(vscode.window.activeTextEditor.document.getText(), expectedText); + assert.strictEqual(vscode.window.activeTextEditor?.document.getText(), expectedText); }); } -function getInputFilePath(name) { +function getInputFilePath(name: string) { return path.join(__dirname + testFolderRelativeLocation + `inputs/${name}`); } -function getOutputFilePath(name) { +function getOutputFilePath(name: string) { return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); } diff --git a/test/suite/addProperty.test.js b/src/test/suite/addProperty.test.ts similarity index 79% rename from test/suite/addProperty.test.js rename to src/test/suite/addProperty.test.ts index 5d91e57..8523b29 100644 --- a/test/suite/addProperty.test.js +++ b/src/test/suite/addProperty.test.ts @@ -1,8 +1,8 @@ -const vscode = require('vscode'); -const path = require('path'); -const assert = require('assert'); -const fs = require('fs'); -const {waitToAssertInSeconds, delay, resetDefaultSettings} = require('./utils'); +import * as vscode from 'vscode'; +import * as path from 'path'; +import * as assert from 'assert'; +import * as fs from 'fs'; +import { waitToAssertInSeconds, delay, resetDefaultSettings } from './utils'; const testFolderRelativeLocation = '/../fixtures/new/'; @@ -63,10 +63,6 @@ suite('Add Property', function () { await runFixture('MultipleClassesCursorInLast.php', new vscode.Position(13, 0)); }); - test('Should insert property in an anonymous class', async () => { - await runFixture('AnonymousClass.php', new vscode.Position(11, 0)); - }); - test('Should add a docblock with @param along with the constructor', async () => { await vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.enable', true, true); await runFixture('AddConstructorDocblock.php'); @@ -78,18 +74,25 @@ suite('Add Property', function () { }); }); -async function runFixture(fileName, cursorPosition) { - vscode.window.showInputBox = function () { - return 'name'; - }; - +async function runFixture(fileName: string, cursorPosition?: vscode.Position) { const uri = vscode.Uri.file( getInputFilePath(fileName) ); const document = await vscode.workspace.openTextDocument(uri); await vscode.window.showTextDocument(document); - if (cursorPosition) { + if (!vscode.window.activeTextEditor) { + return; + } + + if (cursorPosition === undefined) { + vscode.window.showInputBox = function ( + options?: vscode.InputBoxOptions | undefined, + token?: vscode.CancellationToken | undefined + ): Thenable { + return Promise.resolve('name'); + }; + } else { vscode.window.activeTextEditor.selections = [new vscode.Selection(cursorPosition, cursorPosition)]; } @@ -98,14 +101,14 @@ async function runFixture(fileName, cursorPosition) { const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); await delay(waitToAssertInSeconds, () => { - assert.strictEqual(vscode.window.activeTextEditor.document.getText(), expectedText); + assert.strictEqual(vscode.window.activeTextEditor?.document.getText(), expectedText); }); } -function getInputFilePath(name) { +function getInputFilePath(name: string) { return path.join(__dirname + testFolderRelativeLocation + `inputs/${name}`); } -function getOutputFilePath(name) { +function getOutputFilePath(name: string) { return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); } diff --git a/test/suite/customization.test.js b/src/test/suite/customizations.test.ts similarity index 80% rename from test/suite/customization.test.js rename to src/test/suite/customizations.test.ts index 76975af..f7445cf 100644 --- a/test/suite/customization.test.js +++ b/src/test/suite/customizations.test.ts @@ -1,8 +1,8 @@ -const vscode = require('vscode'); -const path = require('path'); -const assert = require('assert'); -const fs = require('fs'); -const {waitToAssertInSeconds, delay, resetDefaultSettings} = require('./utils'); +import * as vscode from 'vscode'; +import * as path from 'path'; +import * as assert from 'assert'; +import * as fs from 'fs'; +import { waitToAssertInSeconds, delay, resetDefaultSettings } from './utils'; const testFolderRelativeLocation = '/../fixtures/customizations/'; @@ -48,9 +48,12 @@ suite('Customizations', function () { }); }); -async function runFixture(fileName) { - vscode.window.showInputBox = function () { - return 'name'; +async function runFixture(fileName: string) { + vscode.window.showInputBox = function ( + options?: vscode.InputBoxOptions | undefined, + token?: vscode.CancellationToken | undefined + ): Thenable { + return Promise.resolve('name'); }; const uri = vscode.Uri.file( @@ -64,14 +67,15 @@ async function runFixture(fileName) { const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); await delay(waitToAssertInSeconds, () => { - assert.strictEqual(vscode.window.activeTextEditor.document.getText(), expectedText); + assert.strictEqual(vscode.window.activeTextEditor?.document.getText(), expectedText); }); } -function getInputFilePath(name) { +function getInputFilePath(name: string) { return path.join(__dirname + testFolderRelativeLocation + `inputs/${name}`); } -function getOutputFilePath(name) { +function getOutputFilePath(name: string) { return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); } + diff --git a/test/suite/index.js b/src/test/suite/index.ts similarity index 72% rename from test/suite/index.js rename to src/test/suite/index.ts index edb89be..7029e38 100644 --- a/test/suite/index.js +++ b/src/test/suite/index.ts @@ -1,15 +1,13 @@ -const path = require('path'); -const Mocha = require('mocha'); -const glob = require('glob'); +import * as path from 'path'; +import * as Mocha from 'mocha'; +import * as glob from 'glob'; -function run() { +export function run(): Promise { // Create the mocha test const mocha = new Mocha({ - ui: 'tdd' + ui: 'tdd', + color: true }); - // Use any mocha API - mocha.useColors(true); - mocha.timeout(5000); const testsRoot = path.resolve(__dirname, '..'); @@ -32,12 +30,9 @@ function run() { } }); } catch (err) { + console.error(err); e(err); } }); }); } - -module.exports = { - run -}; diff --git a/test/suite/utils.js b/src/test/suite/utils.ts similarity index 78% rename from test/suite/utils.js rename to src/test/suite/utils.ts index 72b4f43..19b7825 100644 --- a/test/suite/utils.js +++ b/src/test/suite/utils.ts @@ -1,10 +1,8 @@ -const vscode = require('vscode'); +import * as vscode from 'vscode'; -const waitToAssertInSeconds = 15; +export const waitToAssertInSeconds = 15; -exports.waitToAssertInSeconds = waitToAssertInSeconds; - -exports.delay = (seconds, callback) => { +export function delay(seconds: number, callback: Function) { return new Promise(resolve => { setTimeout(() => { callback(); @@ -13,8 +11,9 @@ exports.delay = (seconds, callback) => { }); } -exports.resetDefaultSettings = async () => { +export async function resetDefaultSettings() { const config = vscode.workspace.getConfiguration('phpAddProperty'); + for (const key in config) { if (config.hasOwnProperty(key)) { await setDefaultSetting(config, config[key], key); @@ -29,7 +28,7 @@ exports.resetDefaultSettings = async () => { } } -async function setDefaultSetting(config, value, parentKey) { +async function setDefaultSetting(config: vscode.WorkspaceConfiguration, value: any, parentKey: string) { if (typeof value === 'function') { return; } @@ -44,4 +43,4 @@ async function setDefaultSetting(config, value, parentKey) { setDefaultSetting(config, value[key], [parentKey, key].join('.')); } } -} \ No newline at end of file +} diff --git a/test/fixtures/new/inputs/AnonymousClass.php b/test/fixtures/new/inputs/AnonymousClass.php deleted file mode 100644 index 7a877bd..0000000 --- a/test/fixtures/new/inputs/AnonymousClass.php +++ /dev/null @@ -1,14 +0,0 @@ -name = $name; - } - }; - } -} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..b65c745 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "out", + "lib": [ + "es6" + ], + "sourceMap": true, + "rootDir": "src", + "strict": true /* enable all strict type-checking options */ + /* Additional Checks */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + }, + "exclude": [ + "node_modules", + ".vscode-test" + ] +} From 7136d811e6c770c778afab76f1415d7752ccc37a Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 14 Jun 2020 16:41:42 +0200 Subject: [PATCH 05/41] Add a command to remove properties --- out/extension.js | 140 ++++++++++++ out/extension.js.map | 2 +- .../ConstructorWithMultipleProperties.php | 20 ++ ...WithMultiplePropertiesCursorInArgument.php | 20 ++ ...thMultiplePropertiesCursorInAssignment.php | 20 ++ ...plePropertiesCursorInPropertyStatement.php | 20 ++ .../inputs/ConstructorWithOneProperty.php | 17 ++ .../inputs/ConstructorWithSingleProperty.php | 14 ++ .../remove/inputs/PropertyWithDocblock.php | 15 ++ .../fixtures/remove/inputs/TypedProperty.php | 14 ++ .../ConstructorWithMultipleProperties.php | 17 ++ ...WithMultiplePropertiesCursorInArgument.php | 17 ++ ...thMultiplePropertiesCursorInAssignment.php | 17 ++ ...plePropertiesCursorInPropertyStatement.php | 17 ++ .../outputs/ConstructorWithOneProperty.php | 14 ++ .../outputs/ConstructorWithSingleProperty.php | 8 + .../remove/outputs/PropertyWithDocblock.php | 8 + .../fixtures/remove/outputs/TypedProperty.php | 8 + out/test/suite/RemoveProperty.test.js | 80 +++++++ out/test/suite/RemoveProperty.test.js.map | 1 + package.json | 13 +- src/extension.ts | 199 ++++++++++++++++++ src/test/suite/RemoveProperty.test.ts | 88 ++++++++ 23 files changed, 767 insertions(+), 2 deletions(-) create mode 100644 out/test/fixtures/remove/inputs/ConstructorWithMultipleProperties.php create mode 100644 out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInArgument.php create mode 100644 out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInAssignment.php create mode 100644 out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php create mode 100644 out/test/fixtures/remove/inputs/ConstructorWithOneProperty.php create mode 100644 out/test/fixtures/remove/inputs/ConstructorWithSingleProperty.php create mode 100644 out/test/fixtures/remove/inputs/PropertyWithDocblock.php create mode 100644 out/test/fixtures/remove/inputs/TypedProperty.php create mode 100644 out/test/fixtures/remove/outputs/ConstructorWithMultipleProperties.php create mode 100644 out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInArgument.php create mode 100644 out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInAssignment.php create mode 100644 out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php create mode 100644 out/test/fixtures/remove/outputs/ConstructorWithOneProperty.php create mode 100644 out/test/fixtures/remove/outputs/ConstructorWithSingleProperty.php create mode 100644 out/test/fixtures/remove/outputs/PropertyWithDocblock.php create mode 100644 out/test/fixtures/remove/outputs/TypedProperty.php create mode 100644 out/test/suite/RemoveProperty.test.js create mode 100644 out/test/suite/RemoveProperty.test.js.map create mode 100644 src/test/suite/RemoveProperty.test.ts diff --git a/out/extension.js b/out/extension.js index c9a1b41..fff0259 100644 --- a/out/extension.js +++ b/out/extension.js @@ -118,6 +118,69 @@ function activate(context) { } const property = new property_1.default(propertyName, (_g = (_f = propertyAst.type) === null || _f === void 0 ? void 0 : _f.name) !== null && _g !== void 0 ? _g : docblockType); insertProperty(vscode.window.activeTextEditor, property, phpClass, line.text); + })), vscode.commands.registerCommand('phpAddProperty.remove', () => __awaiter(this, void 0, void 0, function* () { + var _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v; + if (vscode.window.activeTextEditor === undefined) { + return; + } + const document = vscode.window.activeTextEditor.document; + const phpEngine = new php_parser_1.default({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + const ast = phpEngine.parseCode(document.getText()); + const locator = new locator_1.default(ast); + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + const phpClass = locator.findClass(selectionLineNumber); + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + return; + } + const line = document.lineAt(selectionLineNumber); + const lineAst = phpEngine.parseEval(`class A { ${line.text} }`); + const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); + let propertyName; + if (((_j = (_h = lineAst.children[0]) === null || _h === void 0 ? void 0 : _h.body[0]) === null || _j === void 0 ? void 0 : _j.kind) === 'propertystatement') { + const properties = lineAst.children[0].body[0].properties; + const propertyAst = (_k = properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _k !== void 0 ? _k : properties[0]; + propertyName = (_l = propertyAst.name) === null || _l === void 0 ? void 0 : _l.name; + if (propertyName === 'this') { + const assignmentAst = phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`); + if (((_q = (_p = (_o = (_m = assignmentAst.children[0]) === null || _m === void 0 ? void 0 : _m.body[0]) === null || _o === void 0 ? void 0 : _o.body) === null || _p === void 0 ? void 0 : _p.children[0]) === null || _q === void 0 ? void 0 : _q.kind) === 'expressionstatement') { + propertyName = (_r = assignmentAst.children[0].body[0].body.children[0].expression.right) === null || _r === void 0 ? void 0 : _r.name; + } + } + } + else if (((_t = (_s = lineAst.children[0]) === null || _s === void 0 ? void 0 : _s.body[0]) === null || _t === void 0 ? void 0 : _t.kind) === 'method') { + const constructorArgs = lineAst.children[0].body[0].arguments; + const argumentAst = (_u = constructorArgs.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _u !== void 0 ? _u : constructorArgs[0]; + propertyName = (_v = argumentAst.name) === null || _v === void 0 ? void 0 : _v.name; + } + if (!propertyName) { + propertyName = yield vscode.window.showInputBox({ + placeHolder: 'Enter the property name you want to remove' + }); + } + if (propertyName === undefined || propertyName.trim() === "") { + return; + } + const property = new property_1.default(propertyName); + removeProperty(vscode.window.activeTextEditor, property, phpClass); }))); } exports.activate = activate; @@ -476,4 +539,81 @@ function insertProperty(editor, property, phpClass, anchorText) { } replaceWithSnippet(newDocumentText, phpClassRange); } +function removeProperty(editor, property, phpClass) { + var _a, _b, _c, _d, _e, _f; + const document = editor.document; + const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); + let newDocumentText = document.getText(phpClassRange); + const astClassBody = phpClass.ast.body; + for (let i = 0; i < astClassBody.length; i++) { + const node = astClassBody[i]; + if (node.kind === 'propertystatement') { + for (let j = 0; j < node.properties.length; j++) { + const propertyNode = node.properties[j]; + if (((_a = propertyNode.name) === null || _a === void 0 ? void 0 : _a.name) === property.getName()) { + if (node.properties.length === 1) { + const nextNotEmptyLine = i + 1 < astClassBody.length + ? astClassBody[i + 1].loc.start.line - 1 + : node.loc.end.line; + const propertyStatementRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(nextNotEmptyLine, 0)); + const propertyStatementText = document.getText(propertyStatementRange); + newDocumentText = newDocumentText.replace(propertyStatementText, ''); + } + else { + const regexp = new RegExp(`(,\\s*(?!.*,))?${escapeForRegExp(propertyNode.loc.source)}(\\s*,\\s*)?`); + newDocumentText = newDocumentText.replace(regexp, ''); + } + for (let i = 0; i < ((_b = node.leadingComments) === null || _b === void 0 ? void 0 : _b.length); i++) { + const commentNode = node.leadingComments[i]; + const commentRange = new vscode.Range(new vscode.Position(commentNode.loc.start.line - 1, 0), new vscode.Position(commentNode.loc.end.line, 0)); + const commentText = document.getText(commentRange); + newDocumentText = newDocumentText.replace(commentText, ''); + } + break; + } + } + } + } + const constructor = phpClass.getConstructor(); + if (constructor) { + if (((_c = constructor.ast.body) === null || _c === void 0 ? void 0 : _c.children.length) <= 1) { + const constructorRange = new vscode.Range(new vscode.Position(constructor.ast.loc.start.line - 1, 0), new vscode.Position(constructor.ast.loc.end.line, 0)); + const constructorText = document.getText(constructorRange); + newDocumentText = newDocumentText.replace(constructorText, ''); + } + else { + for (let i = 0; i < constructor.ast.arguments.length; i++) { + const node = constructor.ast.arguments[i]; + if (((_d = node.name) === null || _d === void 0 ? void 0 : _d.name) == property.getName()) { + const constructorText = constructor.ast.loc.source; + const regexp = new RegExp(`(,\\s*(?!.*,))?${escapeForRegExp(node.loc.source)}(\\s*,\\s*)?`); + const newConstructorText = constructorText.replace(regexp, ''); + newDocumentText = newDocumentText.replace(constructorText, newConstructorText); + break; + } + } + for (let i = 0; i < ((_e = constructor.ast.body) === null || _e === void 0 ? void 0 : _e.children.length); i++) { + const node = constructor.ast.body.children[i]; + if (node.kind === 'expressionstatement' + && node.expression.kind === 'assign' + && node.expression.left.kind === 'propertylookup' + && node.expression.left.offset.name === property.getName()) { + const propertyAssignmentRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0)); + const propertyAssignmentText = document.getText(propertyAssignmentRange); + newDocumentText = newDocumentText.replace(propertyAssignmentText, ''); + break; + } + } + } + } + if (newDocumentText === document.getText()) { + return; + } + (_f = vscode.window.activeTextEditor) === null || _f === void 0 ? void 0 : _f.edit(editBuilder => { + editBuilder.replace(phpClassRange, newDocumentText); + }, { + undoStopBefore: true, + undoStopAfter: false + }); +} //# sourceMappingURL=extension.js.map \ No newline at end of file diff --git a/out/extension.js.map b/out/extension.js.map index d1c712e..fdb4186 100644 --- a/out/extension.js.map +++ b/out/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAiC;AACjC,2CAAmC;AACnC,uCAAgC;AAEhC,yCAAkC;AAElC,SAAgB,QAAQ,CAAC,OAAgC;IACxD,OAAO,CAAC,aAAa,CAAC,IAAI,CACzB,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,oBAAoB,EAAE,GAAS,EAAE;QAChE,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACjD,OAAO;SACP;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAEzD,MAAM,SAAS,GAAG,IAAI,oBAAS,CAAC;YAC/B,GAAG,EAAE;gBACJ,aAAa,EAAE,KAAK;gBACpB,UAAU,EAAE,IAAI;aAChB;YACD,KAAK,EAAE;gBACN,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;gBACpB,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,IAAI;aAChB;YACD,MAAM,EAAE;gBACP,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;aACpB;SACD,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,GAAG,CAAC,CAAC;QAEjC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;QAEjF,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,EAAE;YACd,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;YAEvD,OAAO;SACP;QAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;YAC7C,WAAW,EAAE,yBAAyB;SACtC,CAAC,CAAC;QAEH,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC7C,OAAO;SACP;QAED,MAAM,QAAQ,GAAG,IAAI,kBAAQ,CAAC,IAAI,CAAC,CAAC;QAEpC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC9F,CAAC,CAAA,CAAC,EACF,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE,GAAS,EAAE;;QACnE,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACjD,OAAO;SACP;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAEzD,MAAM,SAAS,GAAG,IAAI,oBAAS,CAAC;YAC/B,GAAG,EAAE;gBACJ,aAAa,EAAE,KAAK;gBACpB,UAAU,EAAE,IAAI;aAChB;YACD,KAAK,EAAE;gBACN,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;gBACpB,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,IAAI;aAChB;YACD,MAAM,EAAE;gBACP,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;aACpB;SACD,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,GAAG,CAAC,CAAC;QAEjC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;QAEjF,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,EAAE;YACd,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;YAEvD,OAAO;SACP;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAElD,MAAM,OAAO,GAAI,SAAS,CAAC,SAAS,CAAC,aAAa,IAAI,CAAC,IAAI,IAAI,CAAS,CAAC;QAEzE,IAAI,aAAA,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,0CAAE,IAAI,CAAC,CAAC,2CAAG,IAAI,MAAK,mBAAmB,EAAE;YAC/D,OAAO;SACP;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAE3I,MAAM,UAAU,GAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAoB,CAAC;QAErE,MAAM,WAAW,SAAG,UAAU,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,WAAC,OAAA,OAAA,WAAW,CAAC,IAAI,0CAAE,IAAI,MAAK,YAAY,CAAA,EAAA,CAAC,mCAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAE/G,MAAM,YAAY,SAAG,WAAW,CAAC,IAAI,0CAAE,IAAI,CAAC;QAE5C,MAAM,oBAAoB,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE;YACjE,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE;gBACtC,OAAO,KAAK,CAAA;aACZ;YAED,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,WAAgB,EAAE,EAAE,WAAC,OAAA,OAAA,WAAW,CAAC,IAAI,0CAAE,IAAI,MAAK,YAAY,CAAA,EAAA,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,oBAAoB,EAAE;YAC1B,OAAO;SACP;QAED,IAAI,YAAY,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAG,oBAAoB,CAAC,eAAe,0CAAE,MAAM,CAAA,EAAE,CAAC,EAAE,EAAE;YACtE,MAAM,IAAI,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAErD,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE;gBACjC,SAAS;aACT;YAED,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAElD,IAAI,SAAS,EAAE;gBACd,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;aAC5B;SACD;QAED,MAAM,QAAQ,GAAG,IAAI,kBAAQ,CAAC,YAAY,cAAE,WAAW,CAAC,IAAI,0CAAE,IAAI,mCAAI,YAAY,CAAC,CAAC;QAEpF,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC,CAAA,CAAC,CACF,CAAC;AACH,CAAC;AAhJD,4BAgJC;AAED,2DAA2D;AAC3D,SAAgB,UAAU,KAAK,CAAC;AAAhC,gCAAgC;AAEhC,SAAS,yBAAyB,CAAC,KAAa;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,wCAAwC,CAAC,QAAgB;IACjE,MAAM,OAAO,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAEtD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEzB,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACzB,KAAK,EAAE,CAAC;YACR,MAAM;SACN;QAED,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;KACrC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,QAAgB,CAAC;IAClD;;;;OAIG;IACH,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,IAAI,mBAAmB,CAAC,qBAAqB,CAAC,EAAE;QAC/C,MAAM,OAAO,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACtD,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC1B;IACD,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CACtD,KAAK,CAAC,CAAC,CAAC,QACR,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,GAAG,CAC5C,CAAC;IAEF,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AAC/D,CAAC;AAED,SAAS,MAAM,CAAC,GAAW;IAC1B,OAAO,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe,EAAE,KAAmB;;IAC/D,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;IAErD,MAAA,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,IAAI,CACnC,WAAW,CAAC,EAAE;QACb,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACrD,CAAC,EACD;QACC,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,KAAK;KACpB,EACA,IAAI,CAAC,GAAG,EAAE;QACX,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAE9C,IAAI,MAAM,EAAE;YACX,MAAM,CAAC,aAAa,CACnB,IAAI,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EACjC,KAAK,EACL;gBACC,cAAc,EAAE,KAAK;gBACrB,aAAa,EAAE,KAAK;aACpB,CACD,CAAC;SACF;IACF,CAAC,EAAE;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,QAA6B,EAAE,QAAkB,EAAE,QAAkB,EAAE,QAAa;;IACjH,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,KAAK,CACrC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EACnF,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAC/E,CAAC;IAEF,IAAI,eAAe,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IAExE,IAAI,YAAY,CAAC;IACjB,IAAI,WAAW,CAAC;IAChB,IAAI,QAAQ,CAAC;IAEb,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAE7B,QAAQ,GAAG,IAAI,CAAC;QAEhB,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE;YACtC,YAAY,GAAG,IAAI,CAAC;YAEpB,6CAA6C;YAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAChD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAExC,IAAI,OAAA,YAAY,CAAC,IAAI,0CAAE,IAAI,MAAK,QAAQ,CAAC,OAAO,EAAE,EAAE;oBACnD,OAAO,eAAe,CAAC;iBACvB;aACD;SACD;aAAM,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE;YACjF,WAAW,GAAG,IAAI,CAAC;SACnB;KACD;IAED,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE3E,IAAI,YAAY,EAAE;QACjB,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAE1E,MAAM,eAAe,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,GAAG,UAAU,CACzF,qBAAqB,EACrB,yBAAyB,CACxB,wCAAwC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAC/D,CACD,CAAC;QAEF,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,CAAC;KACpG;SAAM,IAAI,WAAW,EAAE;QACvB,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAExE,MAAM,eAAe,GAAG,UAAU,CACjC,qBAAqB,EACrB,yBAAyB,CACxB,wCAAwC,CAAC,eAAe,CAAC,IAAI,CAAC,CAC9D,CACD,GAAG,MAAM,GAAG,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEpD,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,CAAC;KACnG;SAAM,IAAI,QAAQ,EAAE;QACpB,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAElE,MAAM,eAAe,GAAG,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,UAAU,CAChF,qBAAqB,EACrB,yBAAyB,CACxB,wCAAwC,CAAC,YAAY,CAAC,IAAI,CAAC,CAC3D,CACD,CAAC;QAEF,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,CAAC;KAChG;SAAM;QACN,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;QAEjF,IAAI,cAAc,EAAE;YACnB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAEtD,MAAM,eAAe,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,UAAU,CACrE,qBAAqB,EACrB,CAAC,CACD,GAAG,IAAI,GAAG,GAAG,CAAC;YAEf,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,CAAC;SACtG;aAAM;YACN,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YACvE,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAE5D,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,qBAAqB,EAAE,KAAK,GAAG,UAAU,CAClF,qBAAqB,EACrB,yBAAyB,CACxB,wCAAwC,CAAC,aAAa,CAAC,IAAI,CAAC,CAC5D,GAAG,CAAC,CACL,CAAC,GAAG,KAAK,CAAC;YAEX,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;SACtE;KACD;IAED,OAAO,eAAe,CAAC;AACxB,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAkB,EAAE,QAAa;IAClE,IAAI,gBAAgB,GAAG,QAAQ,CAAC,oBAAoB,CAAC;IACrD,IAAI,mBAAmB,GAAG,QAAQ,CAAC,sBAAsB,CAAC;IAE1D,IAAI,MAAM,CAAC,gDAAgD,CAAC,KAAK,IAAI,EAAE;QACtE,gBAAgB,GAAG,QAAQ,CAAC,wBAAwB,CAAC;QACrD,mBAAmB,GAAG,QAAQ,CAAC,wBAAwB,CAAC;QACxD,QAAQ,CAAC,wBAAwB,EAAE,CAAC;KACpC;IAED,IAAI,qBAAqB,GAAG,EAAE,CAAC;IAC/B,IAAI,MAAM,CAAC,sCAAsC,CAAC,KAAK,IAAI,EAAE;QAC5D,IAAI,QAAQ,GAAG,EAAE,CAAC;QAElB,IAAI,MAAM,CAAC,+CAA+C,CAAC,KAAK,IAAI,EAAE;YACrE,QAAQ,IAAI,IAAI,mBAAmB,EAAE,CAAC;SACtC;QAED,QAAQ,IAAI,IAAI,gBAAgB,EAAE,CAAC;QAEnC,IAAI,MAAM,CAAC,4CAA4C,CAAC,KAAK,IAAI,EAAE;YAClE,qBAAqB,IAAI,QAAQ,UAAU,CAAC,UAAU,CAAC,GAAG,QAAQ,KAAK,UAAU,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;SAC9G;aAAM;YACN,IAAI,MAAM,CAAC,gDAAgD,CAAC,KAAK,KAAK,EAAE;gBACvE,QAAQ,IAAI,GAAG,CAAC;aAChB;YAED,qBAAqB,IAAI,YAAY,QAAQ,OAAO,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;SACrE;KACD;IAED,MAAM,UAAU,GAAI,MAAM,CAAC,4CAA4C,CAAY,CAAC;IACpF,qBAAqB,IAAI,MAAM,CAAC,2CAA2C,CAAC,KAAK,IAAI;QACpF,CAAC,CAAC,MAAM,QAAQ,CAAC,kBAAkB,GAAG,mBAAmB,CAAC,UAAU,CAAC,IAAI;QACzE,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC;IAEpB,IAAI,MAAM,CAAC,+BAA+B,CAAC,KAAK,IAAI,EAAE;QACrD,qBAAqB,IAAI,IAAI,QAAQ,CAAC,wBAAwB,EAAE,CAAC;KACjE;IACD,qBAAqB,IAAI,MAAM,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;IAErD,OAAO,qBAAqB,CAAC;AAC9B,CAAC;AAED,SAAS,mBAAmB,CAAC,YAAoB;IAChD,IAAI,iBAAiB,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC3D,IAAI,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE;QACnD,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;KACrE;IACD,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC9D,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAkB,EAAE,QAAa;IAC1D,IAAI,YAAY,GAAG,IAAI,QAAQ,CAAC,wBAAwB,EAAE,CAAC;IAE3D,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;QACvB,YAAY,GAAG,MAAM,QAAQ,CAAC,wBAAwB,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;KAChF;IAED,IAAI,MAAM,CAAC,sCAAsC,CAAC,KAAK,IAAI,EAAE;QAC5D,YAAY,IAAI,IAAI,QAAQ,CAAC,wBAAwB,EAAE,CAAC;KACxD;IAED,IAAI,aAAa,GAAG,GAAG,YAAY,EAAE,CAAC;IAEtC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;QACvB,aAAa,IAAI,GAAG,CAAC;KACrB;IAED,aAAa,IAAI,MAAM,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;IAE5C,OAAO,aAAa,CAAC;AACtB,CAAC;AAED,SAAS,+BAA+B,CAAC,QAAkB,EAAE,QAAa;IACzE,IAAI,gBAAgB,GAAG,QAAQ,CAAC,uBAAuB,CAAC;IACxD,IAAI,mBAAmB,GAAG,QAAQ,CAAC,yBAAyB,CAAC;IAE7D,IAAI,MAAM,CAAC,mDAAmD,CAAC,KAAK,IAAI,EAAE;QACzE,gBAAgB,GAAG,QAAQ,CAAC,wBAAwB,CAAC;QACrD,mBAAmB,GAAG,QAAQ,CAAC,wBAAwB,CAAC;QACxD,QAAQ,CAAC,wBAAwB,EAAE,CAAC;KACpC;IAED,IAAI,4BAA4B,GAAG,MAAM,gBAAgB,GAAG,CAAC;IAE7D,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;QACvB,4BAA4B,GAAG,MAAM,gBAAgB,IAAI,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;KAChF;IAED,IAAI,MAAM,CAAC,kDAAkD,CAAC,KAAK,IAAI,EAAE;QACxE,4BAA4B,IAAI,KAAK,mBAAmB,EAAE,CAAC;KAC3D;IAED,4BAA4B,IAAI,MAAM,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;IAE3D,IAAI,MAAM,CAAC,wDAAwD,CAAC,KAAK,IAAI,EAAE;QAC9E,4BAA4B,IAAI,KAAK,QAAQ,CAAC,8BAA8B,EAAE,CAAC;KAC/E;IAED,OAAO,aAAa,4BAA4B,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,6BAA6B,CAAC,IAAY;IAClD,IAAI,MAAM,CAAC,uEAAuE,CAAC,KAAK,IAAI,EAAE;QAC7F,OAAO,IAAI,CAAC;KACZ;IAED,MAAM,KAAK,GAAG,kDAAkD,CAAC;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,KAAK,EAAE;QACV,MAAM,mBAAmB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,MAAM,CAAC,6EAA6E,CAAW,CAAC;QAEtH,IAAI,mBAAmB,CAAC,MAAM,GAAG,aAAa,EAAE;YAC/C,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAE/F,MAAM,wBAAwB,GAAG,KAAK,CAAC,CAAC,CAAC;kBACtC,KAAK;kBACL,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;kBAC7B,UAAU,CAAC,KAAK,CAAC,CAAC;YAErB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;SACxD;KACD;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,MAAyB,EAAE,QAAkB,EAAE,QAAkB,EAAE,UAAkB;;IAC5G,IAAI,QAAQ,GAAG;QACd,oBAAoB,EAAE,CAAC;QACvB,sBAAsB,EAAE,CAAC;QACzB,kBAAkB,EAAE,CAAC;QACrB,uBAAuB,EAAE,CAAC;QAC1B,yBAAyB,EAAE,CAAC;QAC5B,8BAA8B,EAAE,CAAC;QACjC,qBAAqB,EAAE,CAAC;QACxB,wBAAwB,EAAE,CAAC;QAC3B,wBAAwB,EAAE,CAAC;KAC3B,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,KAAK,CACrC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EACnF,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAC/E,CAAC;IAEF,IAAI,eAAe,GAAG,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEnF,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE;QAC/B,IAAI,OAAO,GAAG,MAAM,CAAC;QAErB,IAAI,MAAM,CAAC,4CAA4C,CAAC,KAAK,IAAI,EAAE;YAClE,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC;kBAC3B,UAAU,CAAC,mBAAmB,CAAC;kBAC/B,UAAU,CAAC,GAAG,+BAA+B,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC;kBACtE,UAAU,CAAC,OAAO,CAAC,CAAA;SACtB;QAED,MAAM,UAAU,GAAI,MAAM,CAAC,+CAA+C,CAAY,CAAC;QACvF,IAAI,eAAe,GAAG,UAAU,CAC/B,MAAM,CAAC,8CAA8C,CAAC,KAAK,IAAI;YAC9D,CAAC,CAAC,MAAM,QAAQ,CAAC,qBAAqB,GAAG,mBAAmB,CAAC,UAAU,CAAC,IAAI;YAC5E,CAAC,CAAC,GAAG,UAAU,GAAG,CACnB,CAAC;QAEF,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE3D,eAAe,IAAI,wBAAwB,aAAa,KAAK;cAC1D,UAAU,CAAC,KAAK,CAAC;cACjB,UAAU,CAAC,YAAY,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;cAChF,UAAU,CAAC,GAAG,CAAC,CAAC;QAEnB,OAAO,IAAI,eAAe,CAAC;QAE3B,MAAM,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAEhD,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,UAAU,GAAG,OAAO,EAAE,CAAC,CAAC;KACjF;SAAM;QACN,MAAM,WAAW,SAAG,QAAQ,CAAC,cAAc,EAAE,0CAAE,GAAG,CAAC;QAEnD,IAAI,QAAQ,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAG,WAAW,CAAC,eAAe,0CAAE,MAAM,CAAA,EAAE,CAAC,EAAE,EAAE;YAC7D,MAAM,IAAI,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAE5C,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE;gBACjC,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM;aACN;SACD;QAED,IAAI,QAAQ,EAAE;YACb,MAAM,UAAU,GAAG,gCAAgC,CAAC;YAEpD,IAAI,WAAW,GAAG,KAAK,CAAC;YACxB,IAAI,aAAa,CAAC;YAClB,IAAI,UAAU,CAAC;YACf,OAAO,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACpD,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,OAAO,EAAE,EAAE;oBACzC,WAAW,GAAG,IAAI,CAAC;oBACnB,MAAM;iBACN;aACD;YAED,IAAI,CAAC,WAAW,EAAE;gBACjB,IAAI,aAAa,EAAE;oBAClB,MAAM,mBAAmB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;oBAEhF,eAAe,GAAG,eAAe,CAAC,OAAO,CACxC,gBAAgB,CAAC,aAAa,CAAC,EAC/B,gBAAgB,CAAC,aAAa,CAAC,GAAG,IAAI,GAAG,UAAU,CAClD,+BAA+B,CAAC,QAAQ,EAAE,QAAQ,CAAC,EACnD,yBAAyB,CACxB,wCAAwC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAClE,CACD,CACD,CAAC;iBACF;aACD;SACD;QAED,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtD,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAEtC,IAAI,OAAA,IAAI,CAAC,IAAI,0CAAE,IAAI,KAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;gBAC1C,cAAc,GAAG,IAAI,CAAC;gBACtB,MAAM;aACN;SACD;QAED,IAAI,CAAC,cAAc,EAAE;YACpB,MAAM,qBAAqB,GAAI,WAAW,CAAC,GAAG,CAAC,MAAiB,CAAC;YACjE,MAAM,kBAAkB,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YAE5D,IAAI,wBAAwB,GAAG,EAAE,CAAC;YAElC,MAAM,sBAAsB,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,0DAA0D;YAEvI,MAAM,YAAY,GAAG,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC1D,IAAI,kBAAkB,EAAE;gBACvB,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAExE,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;gBAE9D,IAAI,MAAM,GAAG,gBAAgB,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;gBAEvD,IAAI,sBAAsB,EAAE;oBAC3B,MAAM,IAAI,KAAK,GAAG,UAAU,CAC3B,YAAY,EACZ,yBAAyB,CACxB,wCAAwC,CAAC,WAAW,CAAC,IAAI,CAAC,CAC1D,CACD,CAAC;iBACF;qBAAM;oBACN,MAAM,IAAI,KAAK,YAAY,EAAE,CAAC;iBAC9B;gBAED,wBAAwB,GAAG,gBAAgB,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;aACzH;iBAAM;gBACN,MAAM,eAAe,GAAG,MAAM,CAAC;gBAE/B,wBAAwB,GAAG,qBAAqB,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,YAAY,GAAG,CAAC,CAAC;aAC/F;YAED,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,EAAE,wBAAwB,CAAC,CAAC;SAC7G;QAED,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAG,WAAW,CAAC,IAAI,0CAAE,QAAQ,CAAC,MAAM,CAAA,EAAE,CAAC,EAAE,EAAE;YAC3D,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAE1C,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB;mBACnC,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ;mBACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB;mBAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,EAAE,EACzD;gBACD,iBAAiB,GAAG,IAAI,CAAC;gBACzB,MAAM;aACN;SACD;QAED,IAAI,CAAC,iBAAiB,EAAE;YACvB,MAAM,mBAAmB,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YACxD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAEjF,MAAM,sBAAsB,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;YAEtE,IAAI,sBAAsB,GAAG,EAAE,CAAC;YAChC,IAAI,sBAAsB,EAAE;gBAC3B,MAAM,gBAAgB,GAAG,yBAAyB,CACjD,wCAAwC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAClE,CAAC;gBAEF,sBAAsB,GAAG,KAAK,GAAG,UAAU,CAC1C,YAAY,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,CAAC,OAAO,EAAE,QAAQ,EACjE,gBAAgB,GAAG,CAAC,CACpB,GAAG,UAAU,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;aACtC;iBAAM;gBACN,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACrF,MAAM,gBAAgB,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;gBACjD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;gBAExE,MAAM,gBAAgB,GAAG,yBAAyB,CACjD,wCAAwC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAC/D,CAAC;gBAEF,sBAAsB,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,OAAO,CACrE,gBAAgB,CAAC,gBAAgB,CAAC,EAClC,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,IAAI,GAAG,UAAU,CACrD,YAAY,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,CAAC,OAAO,EAAE,MAAM,EAC/D,gBAAgB,CAChB,CACD,CAAC;aACF;YAED,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,EAAE,sBAAsB,CAAC,CAAC;SACzG;KACD;IAED,eAAe,GAAG,6BAA6B,CAAC,eAAe,CAAC,CAAC;IAEjE,IAAI,eAAe,KAAK,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE;QAC1E,OAAO;KACP;IAED,kBAAkB,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AACpD,CAAC"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/remove/inputs/ConstructorWithMultipleProperties.php b/out/test/fixtures/remove/inputs/ConstructorWithMultipleProperties.php new file mode 100644 index 0000000..74d99da --- /dev/null +++ b/out/test/fixtures/remove/inputs/ConstructorWithMultipleProperties.php @@ -0,0 +1,20 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInArgument.php b/out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInArgument.php new file mode 100644 index 0000000..74d99da --- /dev/null +++ b/out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInArgument.php @@ -0,0 +1,20 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInAssignment.php b/out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInAssignment.php new file mode 100644 index 0000000..74d99da --- /dev/null +++ b/out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInAssignment.php @@ -0,0 +1,20 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php b/out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php new file mode 100644 index 0000000..74d99da --- /dev/null +++ b/out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php @@ -0,0 +1,20 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/remove/inputs/ConstructorWithOneProperty.php b/out/test/fixtures/remove/inputs/ConstructorWithOneProperty.php new file mode 100644 index 0000000..6c281c0 --- /dev/null +++ b/out/test/fixtures/remove/inputs/ConstructorWithOneProperty.php @@ -0,0 +1,17 @@ +name = $name; + $this->initialized = true; + } +} diff --git a/out/test/fixtures/remove/inputs/ConstructorWithSingleProperty.php b/out/test/fixtures/remove/inputs/ConstructorWithSingleProperty.php new file mode 100644 index 0000000..685bdba --- /dev/null +++ b/out/test/fixtures/remove/inputs/ConstructorWithSingleProperty.php @@ -0,0 +1,14 @@ +name = $name; + } +} diff --git a/out/test/fixtures/remove/inputs/PropertyWithDocblock.php b/out/test/fixtures/remove/inputs/PropertyWithDocblock.php new file mode 100644 index 0000000..ca96a71 --- /dev/null +++ b/out/test/fixtures/remove/inputs/PropertyWithDocblock.php @@ -0,0 +1,15 @@ +name = $name; + } +} diff --git a/out/test/fixtures/remove/inputs/TypedProperty.php b/out/test/fixtures/remove/inputs/TypedProperty.php new file mode 100644 index 0000000..ffff80a --- /dev/null +++ b/out/test/fixtures/remove/inputs/TypedProperty.php @@ -0,0 +1,14 @@ +name = $name; + } +} diff --git a/out/test/fixtures/remove/outputs/ConstructorWithMultipleProperties.php b/out/test/fixtures/remove/outputs/ConstructorWithMultipleProperties.php new file mode 100644 index 0000000..6c3946b --- /dev/null +++ b/out/test/fixtures/remove/outputs/ConstructorWithMultipleProperties.php @@ -0,0 +1,17 @@ +class = $class; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInArgument.php b/out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInArgument.php new file mode 100644 index 0000000..eaa01a5 --- /dev/null +++ b/out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInArgument.php @@ -0,0 +1,17 @@ +name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInAssignment.php b/out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInAssignment.php new file mode 100644 index 0000000..eaa01a5 --- /dev/null +++ b/out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInAssignment.php @@ -0,0 +1,17 @@ +name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php b/out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php new file mode 100644 index 0000000..e361aa5 --- /dev/null +++ b/out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php @@ -0,0 +1,17 @@ +class = $class; + $this->name = $name; + } +} diff --git a/out/test/fixtures/remove/outputs/ConstructorWithOneProperty.php b/out/test/fixtures/remove/outputs/ConstructorWithOneProperty.php new file mode 100644 index 0000000..c5081c9 --- /dev/null +++ b/out/test/fixtures/remove/outputs/ConstructorWithOneProperty.php @@ -0,0 +1,14 @@ +initialized = true; + } +} diff --git a/out/test/fixtures/remove/outputs/ConstructorWithSingleProperty.php b/out/test/fixtures/remove/outputs/ConstructorWithSingleProperty.php new file mode 100644 index 0000000..7bdd7bf --- /dev/null +++ b/out/test/fixtures/remove/outputs/ConstructorWithSingleProperty.php @@ -0,0 +1,8 @@ + __awaiter(this, void 0, void 0, function* () { + yield utils_1.resetDefaultSettings(); + })); + teardown(() => __awaiter(this, void 0, void 0, function* () { + yield utils_1.resetDefaultSettings(); + })); + test('Should remove an existing property by name', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithMultipleProperties.php'); + })); + test('Should remove the constructor method when the body is empty after removing the last property', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithSingleProperty.php'); + })); + test('Should NOT remove the constructor method when the body is NOT empty after removing the last property', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithOneProperty.php'); + })); + test('Should remove typed properties', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('TypedProperty.php'); + })); + test('Should remove the property docblock', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('PropertyWithDocblock.php'); + })); + test('Should remove a property when the cursor is placed in its statement', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithMultiplePropertiesCursorInPropertyStatement.php', new vscode.Position(11, 13)); + })); + test('Should remove a property when the cursor is placed in its constructor argument', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithMultiplePropertiesCursorInArgument.php', new vscode.Position(13, 35)); + })); + test('Should remove a property when the cursor is placed in its assignment', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithMultiplePropertiesCursorInAssignment.php', new vscode.Position(15, 18)); + })); +}); +function runFixture(fileName, cursorPosition) { + return __awaiter(this, void 0, void 0, function* () { + const uri = vscode.Uri.file(getInputFilePath(fileName)); + const document = yield vscode.workspace.openTextDocument(uri); + yield vscode.window.showTextDocument(document); + if (!vscode.window.activeTextEditor) { + return; + } + if (cursorPosition === undefined) { + vscode.window.showInputBox = function (options, token) { + return Promise.resolve('name'); + }; + } + else { + vscode.window.activeTextEditor.selections = [new vscode.Selection(cursorPosition, cursorPosition)]; + } + yield vscode.commands.executeCommand('phpAddProperty.remove'); + const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); + yield utils_1.delay(utils_1.waitToAssertInSeconds, () => { + var _a; + assert.strictEqual((_a = vscode.window.activeTextEditor) === null || _a === void 0 ? void 0 : _a.document.getText(), expectedText); + }); + }); +} +function getInputFilePath(name) { + return path.join(__dirname + testFolderRelativeLocation + `inputs/${name}`); +} +function getOutputFilePath(name) { + return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); +} +//# sourceMappingURL=RemoveProperty.test.js.map \ No newline at end of file diff --git a/out/test/suite/RemoveProperty.test.js.map b/out/test/suite/RemoveProperty.test.js.map new file mode 100644 index 0000000..be1c8bc --- /dev/null +++ b/out/test/suite/RemoveProperty.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"RemoveProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/RemoveProperty.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAiC;AACjC,6BAA6B;AAC7B,iCAAiC;AACjC,yBAAyB;AACzB,mCAA6E;AAE7E,MAAM,0BAA0B,GAAG,sBAAsB,CAAC;AAE1D,KAAK,CAAC,iBAAiB,EAAE;IACrB,KAAK,CAAC,GAAS,EAAE;QACb,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAS,EAAE;QAChB,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,GAAS,EAAE;QAC1D,MAAM,UAAU,CAAC,uCAAuC,CAAC,CAAC;IAC9D,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,8FAA8F,EAAE,GAAS,EAAE;QAC5G,MAAM,UAAU,CAAC,mCAAmC,CAAC,CAAC;IAC1D,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,sGAAsG,EAAE,GAAS,EAAE;QACpH,MAAM,UAAU,CAAC,gCAAgC,CAAC,CAAC;IACvD,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAS,EAAE;QAC9C,MAAM,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAC1C,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,qCAAqC,EAAE,GAAS,EAAE;QACnD,MAAM,UAAU,CAAC,0BAA0B,CAAC,CAAC;IACjD,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,qEAAqE,EAAE,GAAS,EAAE;QACnF,MAAM,UAAU,CAAC,gEAAgE,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACpH,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,gFAAgF,EAAE,GAAS,EAAE;QAC9F,MAAM,UAAU,CAAC,uDAAuD,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3G,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,sEAAsE,EAAE,GAAS,EAAE;QACpF,MAAM,UAAU,CAAC,yDAAyD,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7G,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,SAAe,UAAU,CAAC,QAAgB,EAAE,cAAgC;;QACxE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CACvB,gBAAgB,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;YACjC,OAAO;SACV;QAED,IAAI,cAAc,KAAK,SAAS,EAAE;YAC9B,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,UACzB,OAA4C,EAC5C,KAA4C;gBAE5C,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC,CAAC;SACL;aAAM;YACH,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;SACtG;QAED,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;QAE9D,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE7E,MAAM,aAAK,CAAC,6BAAqB,EAAE,GAAG,EAAE;;YACpC,MAAM,CAAC,WAAW,OAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;IACP,CAAC;CAAA;AAED,SAAS,gBAAgB,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC"} \ No newline at end of file diff --git a/package.json b/package.json index 45ce802..629e4c1 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "activationEvents": [ "onLanguage:php", "onCommand:phpAddProperty.add", - "onCommand:phpAddProperty.append" + "onCommand:phpAddProperty.append", + "onCommand:phpAddProperty.remove" ], "main": "./out/extension.js", "contributes": { @@ -35,6 +36,10 @@ { "command": "phpAddProperty.append", "title": "Add Existing PHP Property" + }, + { + "command": "phpAddProperty.remove", + "title": "Remove Existing PHP Property" } ], "menus": { @@ -56,6 +61,12 @@ "command": "phpAddProperty.append", "alt": "phpAddProperty.append", "group": "0_phpAddProperty@2" + }, + { + "when": "resourceLangId == php && config.phpAddProperty.showContextMenuOptions", + "command": "phpAddProperty.remove", + "alt": "phpAddProperty.remove", + "group": "0_phpAddProperty@3" } ] }, diff --git a/src/extension.ts b/src/extension.ts index 8bfe693..da19aa2 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -146,6 +146,88 @@ export function activate(context: vscode.ExtensionContext) { const property = new Property(propertyName, propertyAst.type?.name ?? docblockType); insertProperty(vscode.window.activeTextEditor, property, phpClass, line.text); + }), + vscode.commands.registerCommand('phpAddProperty.remove', async () => { + if (vscode.window.activeTextEditor === undefined) { + return; + } + + const document = vscode.window.activeTextEditor.document; + + const phpEngine = new PhpEngine({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + + const ast = phpEngine.parseCode(document.getText()); + + const locator = new Locator(ast); + + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + + const phpClass = locator.findClass(selectionLineNumber); + + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + + return; + } + + const line = document.lineAt(selectionLineNumber); + + const lineAst = (phpEngine.parseEval(`class A { ${line.text} }`) as any); + + const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); + + let propertyName; + if (lineAst.children[0]?.body[0]?.kind === 'propertystatement') { + const properties = (lineAst.children[0].body[0].properties as any[]); + + const propertyAst = properties.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? properties[0]; + propertyName = propertyAst.name?.name; + + if (propertyName === 'this') { + const assignmentAst = (phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`) as any); + + if (assignmentAst.children[0]?.body[0]?.body?.children[0]?.kind === 'expressionstatement') { + propertyName = assignmentAst.children[0].body[0].body.children[0].expression.right?.name; + } + } + } else if (lineAst.children[0]?.body[0]?.kind === 'method') { + const constructorArgs = (lineAst.children[0].body[0].arguments as any[]); + + const argumentAst = constructorArgs.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? constructorArgs[0]; + propertyName = argumentAst.name?.name; + } + + if (!propertyName) { + propertyName = await vscode.window.showInputBox({ + placeHolder: 'Enter the property name you want to remove' + }); + } + + if (propertyName === undefined || propertyName.trim() === "") { + return; + } + + const property = new Property(propertyName); + + removeProperty(vscode.window.activeTextEditor, property, phpClass); }) ); } @@ -669,3 +751,120 @@ function insertProperty(editor: vscode.TextEditor, property: Property, phpClass: replaceWithSnippet(newDocumentText, phpClassRange); } + +function removeProperty(editor: vscode.TextEditor, property: Property, phpClass: PhpClass) { + const document = editor.document; + const phpClassRange = new vscode.Range( + new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), + new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column) + ); + + let newDocumentText = document.getText(phpClassRange); + + const astClassBody = phpClass.ast.body; + for (let i = 0; i < astClassBody.length; i++) { + const node = astClassBody[i]; + + if (node.kind === 'propertystatement') { + for (let j = 0; j < node.properties.length; j++) { + const propertyNode = node.properties[j]; + + if (propertyNode.name?.name === property.getName()) { + if (node.properties.length === 1) { + const nextNotEmptyLine = i + 1 < astClassBody.length + ? astClassBody[i + 1].loc.start.line - 1 + : node.loc.end.line; + const propertyStatementRange = new vscode.Range( + new vscode.Position(node.loc.start.line - 1, 0), + new vscode.Position(nextNotEmptyLine, 0) + ); + + const propertyStatementText = document.getText(propertyStatementRange); + + newDocumentText = newDocumentText.replace(propertyStatementText, ''); + } else { + const regexp = new RegExp(`(,\\s*(?!.*,))?${escapeForRegExp(propertyNode.loc.source)}(\\s*,\\s*)?`); + newDocumentText = newDocumentText.replace(regexp, ''); + } + + for (let i = 0; i < node.leadingComments?.length; i++) { + const commentNode = node.leadingComments[i]; + + const commentRange = new vscode.Range( + new vscode.Position(commentNode.loc.start.line - 1, 0), + new vscode.Position(commentNode.loc.end.line, 0) + ); + + const commentText = document.getText(commentRange); + + newDocumentText = newDocumentText.replace(commentText, ''); + } + + break; + } + } + } + } + + const constructor = phpClass.getConstructor(); + + if (constructor) { + if (constructor.ast.body?.children.length <= 1) { + const constructorRange = new vscode.Range( + new vscode.Position(constructor.ast.loc.start.line - 1, 0), + new vscode.Position(constructor.ast.loc.end.line, 0) + ); + + const constructorText = document.getText(constructorRange); + + newDocumentText = newDocumentText.replace(constructorText, ''); + } else { + for (let i = 0; i < constructor.ast.arguments.length; i++) { + const node = constructor.ast.arguments[i]; + + if (node.name?.name == property.getName()) { + const constructorText = constructor.ast.loc.source; + const regexp = new RegExp(`(,\\s*(?!.*,))?${escapeForRegExp(node.loc.source)}(\\s*,\\s*)?`); + const newConstructorText = constructorText.replace(regexp, ''); + newDocumentText = newDocumentText.replace(constructorText, newConstructorText); + break; + } + } + + for (let i = 0; i < constructor.ast.body?.children.length; i++) { + const node = constructor.ast.body.children[i]; + + if (node.kind === 'expressionstatement' + && node.expression.kind === 'assign' + && node.expression.left.kind === 'propertylookup' + && node.expression.left.offset.name === property.getName() + ) { + const propertyAssignmentRange = new vscode.Range( + new vscode.Position(node.loc.start.line - 1, 0), + new vscode.Position(node.loc.end.line, 0) + ); + + const propertyAssignmentText = document.getText(propertyAssignmentRange); + + newDocumentText = newDocumentText.replace(propertyAssignmentText, ''); + break; + } + } + } + } + + if (newDocumentText === document.getText()) { + return; + } + + vscode.window.activeTextEditor?.edit( + editBuilder => { + editBuilder.replace(phpClassRange, newDocumentText); + }, + { + undoStopBefore: true, + undoStopAfter: false + } + ); +} + diff --git a/src/test/suite/RemoveProperty.test.ts b/src/test/suite/RemoveProperty.test.ts new file mode 100644 index 0000000..f987934 --- /dev/null +++ b/src/test/suite/RemoveProperty.test.ts @@ -0,0 +1,88 @@ +import * as vscode from 'vscode'; +import * as path from 'path'; +import * as assert from 'assert'; +import * as fs from 'fs'; +import { waitToAssertInSeconds, delay, resetDefaultSettings } from './utils'; + +const testFolderRelativeLocation = '/../fixtures/remove/'; + +suite('Remove Property', function () { + setup(async () => { + await resetDefaultSettings(); + }); + + teardown(async () => { + await resetDefaultSettings(); + }); + + test('Should remove an existing property by name', async () => { + await runFixture('ConstructorWithMultipleProperties.php'); + }); + + test('Should remove the constructor method when the body is empty after removing the last property', async () => { + await runFixture('ConstructorWithSingleProperty.php'); + }); + + test('Should NOT remove the constructor method when the body is NOT empty after removing the last property', async () => { + await runFixture('ConstructorWithOneProperty.php'); + }); + + test('Should remove typed properties', async () => { + await runFixture('TypedProperty.php'); + }); + + test('Should remove the property docblock', async () => { + await runFixture('PropertyWithDocblock.php'); + }); + + test('Should remove a property when the cursor is placed in its statement', async () => { + await runFixture('ConstructorWithMultiplePropertiesCursorInPropertyStatement.php', new vscode.Position(11, 13)); + }); + + test('Should remove a property when the cursor is placed in its constructor argument', async () => { + await runFixture('ConstructorWithMultiplePropertiesCursorInArgument.php', new vscode.Position(13, 35)); + }); + + test('Should remove a property when the cursor is placed in its assignment', async () => { + await runFixture('ConstructorWithMultiplePropertiesCursorInAssignment.php', new vscode.Position(15, 18)); + }); +}); + +async function runFixture(fileName: string, cursorPosition?: vscode.Position) { + const uri = vscode.Uri.file( + getInputFilePath(fileName) + ); + const document = await vscode.workspace.openTextDocument(uri); + await vscode.window.showTextDocument(document); + + if (!vscode.window.activeTextEditor) { + return; + } + + if (cursorPosition === undefined) { + vscode.window.showInputBox = function ( + options?: vscode.InputBoxOptions | undefined, + token?: vscode.CancellationToken | undefined + ): Thenable { + return Promise.resolve('name'); + }; + } else { + vscode.window.activeTextEditor.selections = [new vscode.Selection(cursorPosition, cursorPosition)]; + } + + await vscode.commands.executeCommand('phpAddProperty.remove'); + + const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); + + await delay(waitToAssertInSeconds, () => { + assert.strictEqual(vscode.window.activeTextEditor?.document.getText(), expectedText); + }); +} + +function getInputFilePath(name: string) { + return path.join(__dirname + testFolderRelativeLocation + `inputs/${name}`); +} + +function getOutputFilePath(name: string) { + return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); +} From 205f44371f2f0c251b29ee47030e97d4afed4b62 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 14 Jun 2020 18:11:02 +0200 Subject: [PATCH 06/41] Re-organize code into files --- out/addPropertyStatement.js | 63 ++++ out/addPropertyStatement.js.map | 1 + out/extension.js | 437 +--------------------- out/extension.js.map | 2 +- out/insertProperty.js | 141 +++++++ out/insertProperty.js.map | 1 + out/property.js | 72 ++++ out/property.js.map | 2 +- out/removeProperty.js | 83 +++++ out/removeProperty.js.map | 1 + out/utils.js | 104 ++++++ out/utils.js.map | 1 + src/addPropertyStatement.ts | 103 ++++++ src/extension.ts | 637 +------------------------------- src/insertProperty.ts | 207 +++++++++++ src/property.ts | 98 +++++ src/removeProperty.ts | 120 ++++++ src/utils.ts | 122 ++++++ 18 files changed, 1126 insertions(+), 1069 deletions(-) create mode 100644 out/addPropertyStatement.js create mode 100644 out/addPropertyStatement.js.map create mode 100644 out/insertProperty.js create mode 100644 out/insertProperty.js.map create mode 100644 out/removeProperty.js create mode 100644 out/removeProperty.js.map create mode 100644 out/utils.js create mode 100644 out/utils.js.map create mode 100644 src/addPropertyStatement.ts create mode 100644 src/insertProperty.ts create mode 100644 src/removeProperty.ts create mode 100644 src/utils.ts diff --git a/out/addPropertyStatement.js b/out/addPropertyStatement.js new file mode 100644 index 0000000..83cb224 --- /dev/null +++ b/out/addPropertyStatement.js @@ -0,0 +1,63 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const vscode = require("vscode"); +const utils_1 = require("./utils"); +function addPropertyStatement(document, phpClass, property, tabStops) { + var _a; + const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); + let newDocumentText = utils_1.escapeForSnippet(document.getText(phpClassRange)); + let lastProperty; + let firstMethod; + let lastNode; + const astClassBody = phpClass.ast.body; + for (let i = 0; i < astClassBody.length; i++) { + const node = astClassBody[i]; + lastNode = node; + if (node.kind === 'propertystatement') { + lastProperty = node; + // Check that property does not already exist + for (let j = 0; j < node.properties.length; j++) { + const propertyNode = node.properties[j]; + if (((_a = propertyNode.name) === null || _a === void 0 ? void 0 : _a.name) === property.getName()) { + return newDocumentText; + } + } + } + else if (!firstMethod && node.kind === 'method' && node.name !== '__construct') { + firstMethod = node; + } + } + const propertyStatementText = property.getStatementText(tabStops); + if (lastProperty) { + const lastPropertyLine = document.lineAt(lastProperty.loc.start.line - 1); + const newPropertyText = utils_1.escapeForSnippet(`${lastPropertyLine.text}`) + "\n\n" + utils_1.indentText(propertyStatementText, utils_1.calculateIndentationLevel(utils_1.getLineFirstNonIndentationCharacterIndex(lastPropertyLine.text))); + newDocumentText = newDocumentText.replace(utils_1.escapeForSnippet(lastPropertyLine.text), newPropertyText); + } + else if (firstMethod) { + const firstMethodLine = document.lineAt(firstMethod.loc.start.line - 1); + const newPropertyText = utils_1.indentText(propertyStatementText, utils_1.calculateIndentationLevel(utils_1.getLineFirstNonIndentationCharacterIndex(firstMethodLine.text))) + "\n\n" + utils_1.escapeForSnippet(firstMethodLine.text); + newDocumentText = newDocumentText.replace(utils_1.escapeForSnippet(firstMethodLine.text), newPropertyText); + } + else if (lastNode) { + const lastNodeLine = document.lineAt(lastNode.loc.start.line - 1); + const newPropertyText = utils_1.escapeForSnippet(lastNodeLine.text) + "\n\n" + utils_1.indentText(propertyStatementText, utils_1.calculateIndentationLevel(utils_1.getLineFirstNonIndentationCharacterIndex(lastNodeLine.text))); + newDocumentText = newDocumentText.replace(utils_1.escapeForSnippet(lastNodeLine.text), newPropertyText); + } + else { + const isOneLineClass = phpClass.ast.loc.start.line === phpClass.ast.loc.end.line; + if (isOneLineClass) { + const match = phpClass.ast.loc.source.match(/(.*)\}/); + const newPropertyText = utils_1.escapeForSnippet(match[1]) + "\n" + utils_1.indentText(propertyStatementText, 1) + "\n" + '}'; + newDocumentText = newDocumentText.replace(utils_1.escapeForSnippet(phpClass.ast.loc.source), newPropertyText); + } + else { + const classBodyLine = document.lineAt(phpClass.ast.loc.start.line - 1); + const classText = utils_1.escapeForSnippet(phpClass.ast.loc.source); + const newPropertyText = classText.replace(/{(?:\s|[\r\n]|\s)*}/, "{\n" + utils_1.indentText(propertyStatementText, utils_1.calculateIndentationLevel(utils_1.getLineFirstNonIndentationCharacterIndex(classBodyLine.text)) + 1)) + "\n}"; + newDocumentText = newDocumentText.replace(classText, newPropertyText); + } + } + return newDocumentText; +} +exports.default = addPropertyStatement; +//# sourceMappingURL=addPropertyStatement.js.map \ No newline at end of file diff --git a/out/addPropertyStatement.js.map b/out/addPropertyStatement.js.map new file mode 100644 index 0000000..4024a71 --- /dev/null +++ b/out/addPropertyStatement.js.map @@ -0,0 +1 @@ +{"version":3,"file":"addPropertyStatement.js","sourceRoot":"","sources":["../src/addPropertyStatement.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/extension.js b/out/extension.js index fff0259..2a46a2d 100644 --- a/out/extension.js +++ b/out/extension.js @@ -13,6 +13,8 @@ const vscode = require("vscode"); const php_parser_1 = require("php-parser"); const locator_1 = require("./locator"); const property_1 = require("./property"); +const insertProperty_1 = require("./insertProperty"); +const removeProperty_1 = require("./removeProperty"); function activate(context) { context.subscriptions.push(vscode.commands.registerCommand('phpAddProperty.add', () => __awaiter(this, void 0, void 0, function* () { if (vscode.window.activeTextEditor === undefined) { @@ -53,7 +55,7 @@ function activate(context) { return; } const property = new property_1.default(name); - insertProperty(vscode.window.activeTextEditor, property, phpClass, `${property.getName()};`); + insertProperty_1.default(vscode.window.activeTextEditor, property, phpClass, `${property.getName()};`); })), vscode.commands.registerCommand('phpAddProperty.append', () => __awaiter(this, void 0, void 0, function* () { var _a, _b, _c, _d, _e, _f, _g; if (vscode.window.activeTextEditor === undefined) { @@ -117,7 +119,7 @@ function activate(context) { } } const property = new property_1.default(propertyName, (_g = (_f = propertyAst.type) === null || _f === void 0 ? void 0 : _f.name) !== null && _g !== void 0 ? _g : docblockType); - insertProperty(vscode.window.activeTextEditor, property, phpClass, line.text); + insertProperty_1.default(vscode.window.activeTextEditor, property, phpClass, line.text); })), vscode.commands.registerCommand('phpAddProperty.remove', () => __awaiter(this, void 0, void 0, function* () { var _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v; if (vscode.window.activeTextEditor === undefined) { @@ -180,440 +182,11 @@ function activate(context) { return; } const property = new property_1.default(propertyName); - removeProperty(vscode.window.activeTextEditor, property, phpClass); + removeProperty_1.removeProperty(vscode.window.activeTextEditor, property, phpClass); }))); } exports.activate = activate; // this method is called when your extension is deactivated function deactivate() { } exports.deactivate = deactivate; -function calculateIndentationLevel(index) { - return Math.floor(index / configUsingResource('editor.tabSize')); -} -function getLineFirstNonIndentationCharacterIndex(lineText) { - const tabSize = configUsingResource('editor.tabSize'); - let index = 0; - for (let i = 0; i < lineText.length; i++) { - const char = lineText[i]; - if (/[^\s\t]/.test(char)) { - index++; - break; - } - index += char === "\t" ? tabSize : 1; - } - return index; -} -function indentText(text, level = 1) { - /** - * Good to have - * Listen for view options changes and use these values - * https://github.com/jedmao/tabsanity-vs/blob/faa41a99ccb47c8e7717edfcbdfba4c093e670fe/TabSanity/TabOptionsListener.cs - */ - let tab = "\t"; - if (configUsingResource('editor.insertSpaces')) { - const tabSize = configUsingResource('editor.tabSize'); - tab = ' '.repeat(tabSize); - } - return tab.repeat(level) + text; -} -function configUsingResource(key) { - var _a; - const parts = key.split(/\.(.+)/, 2); - const configuration = vscode.workspace.getConfiguration(parts[0], (_a = vscode.window.activeTextEditor) === null || _a === void 0 ? void 0 : _a.document.uri); - return parts[1] ? configuration.get(parts[1]) : configuration; -} -function config(key) { - return vscode.workspace.getConfiguration().get(key); -} -function escapeForRegExp(text) { - return text.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); -} -function escapeForSnippet(text) { - return text.replace(/(? { - editBuilder.replace(range, "\n".repeat(rangeLines)); - }, { - undoStopBefore: true, - undoStopAfter: false - }).then(() => { - const editor = vscode.window.activeTextEditor; - if (editor) { - editor.insertSnippet(new vscode.SnippetString(snippet), range, { - undoStopBefore: false, - undoStopAfter: false, - }); - } - }); -} -function addPropertyStatement(document, phpClass, property, tabStops) { - var _a; - const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); - let newDocumentText = escapeForSnippet(document.getText(phpClassRange)); - let lastProperty; - let firstMethod; - let lastNode; - const astClassBody = phpClass.ast.body; - for (let i = 0; i < astClassBody.length; i++) { - const node = astClassBody[i]; - lastNode = node; - if (node.kind === 'propertystatement') { - lastProperty = node; - // Check that property does not already exist - for (let j = 0; j < node.properties.length; j++) { - const propertyNode = node.properties[j]; - if (((_a = propertyNode.name) === null || _a === void 0 ? void 0 : _a.name) === property.getName()) { - return newDocumentText; - } - } - } - else if (!firstMethod && node.kind === 'method' && node.name !== '__construct') { - firstMethod = node; - } - } - const propertyStatementText = getPropertyStatementText(property, tabStops); - if (lastProperty) { - const lastPropertyLine = document.lineAt(lastProperty.loc.start.line - 1); - const newPropertyText = escapeForSnippet(`${lastPropertyLine.text}`) + "\n\n" + indentText(propertyStatementText, calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(lastPropertyLine.text))); - newDocumentText = newDocumentText.replace(escapeForSnippet(lastPropertyLine.text), newPropertyText); - } - else if (firstMethod) { - const firstMethodLine = document.lineAt(firstMethod.loc.start.line - 1); - const newPropertyText = indentText(propertyStatementText, calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(firstMethodLine.text))) + "\n\n" + escapeForSnippet(firstMethodLine.text); - newDocumentText = newDocumentText.replace(escapeForSnippet(firstMethodLine.text), newPropertyText); - } - else if (lastNode) { - const lastNodeLine = document.lineAt(lastNode.loc.start.line - 1); - const newPropertyText = escapeForSnippet(lastNodeLine.text) + "\n\n" + indentText(propertyStatementText, calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(lastNodeLine.text))); - newDocumentText = newDocumentText.replace(escapeForSnippet(lastNodeLine.text), newPropertyText); - } - else { - const isOneLineClass = phpClass.ast.loc.start.line === phpClass.ast.loc.end.line; - if (isOneLineClass) { - const match = phpClass.ast.loc.source.match(/(.*)\}/); - const newPropertyText = escapeForSnippet(match[1]) + "\n" + indentText(propertyStatementText, 1) + "\n" + '}'; - newDocumentText = newDocumentText.replace(escapeForSnippet(phpClass.ast.loc.source), newPropertyText); - } - else { - const classBodyLine = document.lineAt(phpClass.ast.loc.start.line - 1); - const classText = escapeForSnippet(phpClass.ast.loc.source); - const newPropertyText = classText.replace(/{(?:\s|[\r\n]|\s)*}/, "{\n" + indentText(propertyStatementText, calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(classBodyLine.text)) + 1)) + "\n}"; - newDocumentText = newDocumentText.replace(classText, newPropertyText); - } - } - return newDocumentText; -} -function getPropertyStatementText(property, tabStops) { - let docblockTypeStop = tabStops.propertyDocblockType; - let dockblockImportStop = tabStops.propertyDocblockImport; - if (config('phpAddProperty.property.docblock.withParameter') === true) { - docblockTypeStop = tabStops.constructorParameterType; - dockblockImportStop = tabStops.constructorParameterStop; - tabStops.constructorParameterStop++; - } - let propertyStatementText = ''; - if (config('phpAddProperty.property.docblock.add') === true) { - let stopText = ''; - if (config('phpAddProperty.property.docblock.stopToImport') === true) { - stopText += `$${dockblockImportStop}`; - } - stopText += `$${docblockTypeStop}`; - if (config('phpAddProperty.property.docblock.multiline') === true) { - propertyStatementText += `/**\n${indentText(' * @var ')}${stopText}\n${indentText(' */')}\n${indentText('')}`; - } - else { - if (config('phpAddProperty.property.docblock.withParameter') === false) { - stopText += ' '; - } - propertyStatementText += `/** @var ${stopText}*/\n${indentText('')}`; - } - } - const visibility = config('phpAddProperty.property.visibility.default'); - propertyStatementText += config('phpAddProperty.property.visibility.choose') === true - ? `\${${tabStops.propertyVisibility}${getVisibilityChoice(visibility)}} ` - : `${visibility} `; - if (config('phpAddProperty.property.types') === true) { - propertyStatementText += `$${tabStops.constructorParameterType}`; - } - propertyStatementText += `\\$${property.getName()};`; - return propertyStatementText; -} -function getVisibilityChoice(defaultValue) { - let visibilityChoices = ['public', 'protected', 'private']; - if (visibilityChoices.indexOf(defaultValue) !== -1) { - visibilityChoices.splice(visibilityChoices.indexOf(defaultValue), 1); - } - return `|${[defaultValue, ...visibilityChoices].join(',')}|`; -} -function getParameterText(property, tabStops) { - let tabStopsText = `$${tabStops.constructorParameterType}`; - if (property.getType()) { - tabStopsText = `\${${tabStops.constructorParameterType}:${property.getType()}}`; - } - if (config('phpAddProperty.property.stopToImport') === true) { - tabStopsText += `$${tabStops.constructorParameterStop}`; - } - let parameterText = `${tabStopsText}`; - if (property.getType()) { - parameterText += ' '; - } - parameterText += `\\$${property.getName()}`; - return parameterText; -} -function getConstructorParamDocblockText(property, tabStops) { - let docblockTypeStop = tabStops.constructorDocblockType; - let dockblockImportStop = tabStops.constructorDocblockImport; - if (config('phpAddProperty.constructor.docblock.withParameter') === true) { - docblockTypeStop = tabStops.constructorParameterType; - dockblockImportStop = tabStops.constructorParameterStop; - tabStops.constructorParameterStop++; - } - let constructorParamDocblockText = `\${${docblockTypeStop}}`; - if (property.getType()) { - constructorParamDocblockText = `\${${docblockTypeStop}:${property.getType()} }`; - } - if (config('phpAddProperty.constructor.docblock.stopToImport') === true) { - constructorParamDocblockText += `\$${dockblockImportStop}`; - } - constructorParamDocblockText += `\\$${property.getName()}`; - if (config('phpAddProperty.constructor.docblock.stopForDescription') === true) { - constructorParamDocblockText += `\$${tabStops.constructorDocblockDescription}`; - } - return ` * @param ${constructorParamDocblockText}`; -} -function breakConstructorIntoMultiline(text) { - if (config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.enabled') !== true) { - return text; - } - const regex = /(.*__construct\s*)\(((?:\s|\S)*?)(?=\))\s*\)\s*{/; - const match = regex.exec(text); - if (match) { - const constructorLineText = match[0]; - const maxLineLength = config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.maxLineLength'); - if (constructorLineText.length > maxLineLength) { - const parametersText = match[2]; - const parameters = parametersText.split(',').map(parameter => indentText(parameter.trim(), 2)); - const multilineConstructorText = match[1] - + '(\n' - + `${parameters.join(',\n')}\n` - + indentText(') {'); - text = text.replace(match[0], multilineConstructorText); - } - } - return text; -} -function insertProperty(editor, property, phpClass, anchorText) { - var _a, _b, _c, _d; - let tabStops = { - propertyDocblockType: 1, - propertyDocblockImport: 2, - propertyVisibility: 3, - constructorDocblockType: 4, - constructorDocblockImport: 5, - constructorDocblockDescription: 6, - constructorVisibility: 7, - constructorParameterType: 8, - constructorParameterStop: 9 - }; - const document = editor.document; - const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); - let newDocumentText = addPropertyStatement(document, phpClass, property, tabStops); - if (!phpClass.getConstructor()) { - let snippet = "\n\n"; - if (config('phpAddProperty.constructor.docblock.enable') === true) { - snippet += indentText("/**\n") - + indentText(" * Constructor.\n") - + indentText(`${getConstructorParamDocblockText(property, tabStops)}\n`) - + indentText(" */\n"); - } - const visibility = config('phpAddProperty.constructor.visibility.default'); - let constructorText = indentText(config('phpAddProperty.constructor.visibility.choose') === true - ? `\${${tabStops.constructorVisibility}${getVisibilityChoice(visibility)}} ` - : `${visibility} `); - const parameterText = getParameterText(property, tabStops); - constructorText += `function __construct(${parameterText})\n` - + indentText('{\n') - + indentText(`\\$this->${property.getName()} = \\$${property.getName()};\$0\n`, 2) - + indentText('}'); - snippet += constructorText; - const searchText = escapeForSnippet(anchorText); - newDocumentText = newDocumentText.replace(searchText, `${searchText}${snippet}`); - } - else { - const constructor = (_a = phpClass.getConstructor()) === null || _a === void 0 ? void 0 : _a.ast; - let docblock; - for (let i = 0; i < ((_b = constructor.leadingComments) === null || _b === void 0 ? void 0 : _b.length); i++) { - const node = constructor.leadingComments[i]; - if (node.kind === 'commentblock') { - docblock = node; - break; - } - } - if (docblock) { - const paramRegex = /@param(?:\s+\S+)?\s+\$(\S+).*/g; - let paramExists = false; - let lastParamText; - let paramMatch; - while (paramMatch = paramRegex.exec(docblock.value)) { - lastParamText = paramMatch[0]; - if (paramMatch[1] === property.getName()) { - paramExists = true; - break; - } - } - if (!paramExists) { - if (lastParamText) { - const docblockClosingLine = editor.document.lineAt(docblock.loc.start.line - 1); - newDocumentText = newDocumentText.replace(escapeForSnippet(lastParamText), escapeForSnippet(lastParamText) + "\n" + indentText(getConstructorParamDocblockText(property, tabStops), calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(docblockClosingLine.text)))); - } - } - } - let argumentExists = false; - for (let i = 0; i < constructor.arguments.length; i++) { - const node = constructor.arguments[i]; - if (((_c = node.name) === null || _c === void 0 ? void 0 : _c.name) == property.getName()) { - argumentExists = true; - break; - } - } - if (!argumentExists) { - const constructorMethodText = constructor.loc.source; - const constructorHasArgs = constructor.arguments.length > 0; - let newConstructorMethodText = ''; - const isMultiLineConstructor = (/\(\r\n|\r|\n/.test(constructorMethodText)); //constructor.loc.start.line !== constructor.loc.end.line; - const argumentText = getParameterText(property, tabStops); - if (constructorHasArgs) { - const lastArg = constructor.arguments[constructor.arguments.length - 1]; - const lastArgLine = document.lineAt(lastArg.loc.end.line - 1); - let newArg = escapeForSnippet(`${lastArg.loc.source}`); - if (isMultiLineConstructor) { - newArg += ",\n" + indentText(argumentText, calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(lastArgLine.text))); - } - else { - newArg += `, ${argumentText}`; - } - newConstructorMethodText = escapeForSnippet(constructorMethodText).replace(escapeForSnippet(lastArg.loc.source), newArg); - } - else { - const argsParenthesis = /\(\)/; - newConstructorMethodText = constructorMethodText.replace(argsParenthesis, `(${argumentText})`); - } - newDocumentText = newDocumentText.replace(escapeForSnippet(constructorMethodText), newConstructorMethodText); - } - let assignationExists = false; - for (let i = 0; i < ((_d = constructor.body) === null || _d === void 0 ? void 0 : _d.children.length); i++) { - const node = constructor.body.children[i]; - if (node.kind === 'expressionstatement' - && node.expression.kind === 'assign' - && node.expression.left.kind === 'propertylookup' - && node.expression.left.offset.name === property.getName()) { - assignationExists = true; - break; - } - } - if (!assignationExists) { - const constructorBodyText = constructor.body.loc.source; - const constructorBodyLine = document.lineAt(constructor.body.loc.start.line - 1); - const constructorBodyIsEmpty = constructor.body.children.length === 0; - let newConstructorBodyText = ''; - if (constructorBodyIsEmpty) { - const indentationLevel = calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(constructorBodyLine.text)); - newConstructorBodyText = "{\n" + indentText(`\\$this->${property.getName()} = \\$${property.getName()};\$0\n`, indentationLevel + 1) + indentText("}", indentationLevel); - } - else { - const lastChildren = constructor.body.children[constructor.body.children.length - 1]; - const lastChildrenText = lastChildren.loc.source; - const lastChildrenLine = document.lineAt(lastChildren.loc.end.line - 1); - const indentationLevel = calculateIndentationLevel(getLineFirstNonIndentationCharacterIndex(lastChildrenLine.text)); - newConstructorBodyText = escapeForSnippet(constructorBodyText).replace(escapeForSnippet(lastChildrenText), escapeForSnippet(lastChildrenText) + "\n" + indentText(`\\$this->${property.getName()} = \\$${property.getName()};\$0`, indentationLevel)); - } - newDocumentText = newDocumentText.replace(escapeForSnippet(constructorBodyText), newConstructorBodyText); - } - } - newDocumentText = breakConstructorIntoMultiline(newDocumentText); - if (newDocumentText === escapeForSnippet(document.getText(phpClassRange))) { - return; - } - replaceWithSnippet(newDocumentText, phpClassRange); -} -function removeProperty(editor, property, phpClass) { - var _a, _b, _c, _d, _e, _f; - const document = editor.document; - const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); - let newDocumentText = document.getText(phpClassRange); - const astClassBody = phpClass.ast.body; - for (let i = 0; i < astClassBody.length; i++) { - const node = astClassBody[i]; - if (node.kind === 'propertystatement') { - for (let j = 0; j < node.properties.length; j++) { - const propertyNode = node.properties[j]; - if (((_a = propertyNode.name) === null || _a === void 0 ? void 0 : _a.name) === property.getName()) { - if (node.properties.length === 1) { - const nextNotEmptyLine = i + 1 < astClassBody.length - ? astClassBody[i + 1].loc.start.line - 1 - : node.loc.end.line; - const propertyStatementRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(nextNotEmptyLine, 0)); - const propertyStatementText = document.getText(propertyStatementRange); - newDocumentText = newDocumentText.replace(propertyStatementText, ''); - } - else { - const regexp = new RegExp(`(,\\s*(?!.*,))?${escapeForRegExp(propertyNode.loc.source)}(\\s*,\\s*)?`); - newDocumentText = newDocumentText.replace(regexp, ''); - } - for (let i = 0; i < ((_b = node.leadingComments) === null || _b === void 0 ? void 0 : _b.length); i++) { - const commentNode = node.leadingComments[i]; - const commentRange = new vscode.Range(new vscode.Position(commentNode.loc.start.line - 1, 0), new vscode.Position(commentNode.loc.end.line, 0)); - const commentText = document.getText(commentRange); - newDocumentText = newDocumentText.replace(commentText, ''); - } - break; - } - } - } - } - const constructor = phpClass.getConstructor(); - if (constructor) { - if (((_c = constructor.ast.body) === null || _c === void 0 ? void 0 : _c.children.length) <= 1) { - const constructorRange = new vscode.Range(new vscode.Position(constructor.ast.loc.start.line - 1, 0), new vscode.Position(constructor.ast.loc.end.line, 0)); - const constructorText = document.getText(constructorRange); - newDocumentText = newDocumentText.replace(constructorText, ''); - } - else { - for (let i = 0; i < constructor.ast.arguments.length; i++) { - const node = constructor.ast.arguments[i]; - if (((_d = node.name) === null || _d === void 0 ? void 0 : _d.name) == property.getName()) { - const constructorText = constructor.ast.loc.source; - const regexp = new RegExp(`(,\\s*(?!.*,))?${escapeForRegExp(node.loc.source)}(\\s*,\\s*)?`); - const newConstructorText = constructorText.replace(regexp, ''); - newDocumentText = newDocumentText.replace(constructorText, newConstructorText); - break; - } - } - for (let i = 0; i < ((_e = constructor.ast.body) === null || _e === void 0 ? void 0 : _e.children.length); i++) { - const node = constructor.ast.body.children[i]; - if (node.kind === 'expressionstatement' - && node.expression.kind === 'assign' - && node.expression.left.kind === 'propertylookup' - && node.expression.left.offset.name === property.getName()) { - const propertyAssignmentRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0)); - const propertyAssignmentText = document.getText(propertyAssignmentRange); - newDocumentText = newDocumentText.replace(propertyAssignmentText, ''); - break; - } - } - } - } - if (newDocumentText === document.getText()) { - return; - } - (_f = vscode.window.activeTextEditor) === null || _f === void 0 ? void 0 : _f.edit(editBuilder => { - editBuilder.replace(phpClassRange, newDocumentText); - }, { - undoStopBefore: true, - undoStopAfter: false - }); -} //# sourceMappingURL=extension.js.map \ No newline at end of file diff --git a/out/extension.js.map b/out/extension.js.map index fdb4186..5b5f59c 100644 --- a/out/extension.js.map +++ b/out/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/insertProperty.js b/out/insertProperty.js new file mode 100644 index 0000000..4ae1c4e --- /dev/null +++ b/out/insertProperty.js @@ -0,0 +1,141 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const vscode = require("vscode"); +const addPropertyStatement_1 = require("./addPropertyStatement"); +const utils_1 = require("./utils"); +function insertProperty(editor, property, phpClass, anchorText) { + var _a, _b, _c, _d; + let tabStops = { + propertyDocblockType: 1, + propertyDocblockImport: 2, + propertyVisibility: 3, + constructorDocblockType: 4, + constructorDocblockImport: 5, + constructorDocblockDescription: 6, + constructorVisibility: 7, + constructorParameterType: 8, + constructorParameterStop: 9 + }; + const document = editor.document; + const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); + let newDocumentText = addPropertyStatement_1.default(document, phpClass, property, tabStops); + if (!phpClass.getConstructor()) { + let snippet = "\n\n"; + if (utils_1.config('phpAddProperty.constructor.docblock.enable') === true) { + snippet += utils_1.indentText("/**\n") + + utils_1.indentText(" * Constructor.\n") + + utils_1.indentText(`${property.getConstructorParamDocblockText(tabStops)}\n`) + + utils_1.indentText(" */\n"); + } + const visibility = utils_1.config('phpAddProperty.constructor.visibility.default'); + let constructorText = utils_1.indentText(utils_1.config('phpAddProperty.constructor.visibility.choose') === true + ? `\${${tabStops.constructorVisibility}${utils_1.getVisibilityChoice(visibility)}} ` + : `${visibility} `); + const parameterText = property.getParameterText(tabStops); + constructorText += `function __construct(${parameterText})\n` + + utils_1.indentText('{\n') + + utils_1.indentText(`\\$this->${property.getName()} = \\$${property.getName()};\$0\n`, 2) + + utils_1.indentText('}'); + snippet += constructorText; + const searchText = utils_1.escapeForSnippet(anchorText); + newDocumentText = newDocumentText.replace(searchText, `${searchText}${snippet}`); + } + else { + const constructor = (_a = phpClass.getConstructor()) === null || _a === void 0 ? void 0 : _a.ast; + let docblock; + for (let i = 0; i < ((_b = constructor.leadingComments) === null || _b === void 0 ? void 0 : _b.length); i++) { + const node = constructor.leadingComments[i]; + if (node.kind === 'commentblock') { + docblock = node; + break; + } + } + if (docblock) { + const paramRegex = /@param(?:\s+\S+)?\s+\$(\S+).*/g; + let paramExists = false; + let lastParamText; + let paramMatch; + while (paramMatch = paramRegex.exec(docblock.value)) { + lastParamText = paramMatch[0]; + if (paramMatch[1] === property.getName()) { + paramExists = true; + break; + } + } + if (!paramExists) { + if (lastParamText) { + const docblockClosingLine = editor.document.lineAt(docblock.loc.start.line - 1); + newDocumentText = newDocumentText.replace(utils_1.escapeForSnippet(lastParamText), utils_1.escapeForSnippet(lastParamText) + "\n" + utils_1.indentText(property.getConstructorParamDocblockText(tabStops), utils_1.calculateIndentationLevel(utils_1.getLineFirstNonIndentationCharacterIndex(docblockClosingLine.text)))); + } + } + } + let argumentExists = false; + for (let i = 0; i < constructor.arguments.length; i++) { + const node = constructor.arguments[i]; + if (((_c = node.name) === null || _c === void 0 ? void 0 : _c.name) == property.getName()) { + argumentExists = true; + break; + } + } + if (!argumentExists) { + const constructorMethodText = constructor.loc.source; + const constructorHasArgs = constructor.arguments.length > 0; + let newConstructorMethodText = ''; + const isMultiLineConstructor = (/\(\r\n|\r|\n/.test(constructorMethodText)); //constructor.loc.start.line !== constructor.loc.end.line; + const argumentText = property.getParameterText(tabStops); + if (constructorHasArgs) { + const lastArg = constructor.arguments[constructor.arguments.length - 1]; + const lastArgLine = document.lineAt(lastArg.loc.end.line - 1); + let newArg = utils_1.escapeForSnippet(`${lastArg.loc.source}`); + if (isMultiLineConstructor) { + newArg += ",\n" + utils_1.indentText(argumentText, utils_1.calculateIndentationLevel(utils_1.getLineFirstNonIndentationCharacterIndex(lastArgLine.text))); + } + else { + newArg += `, ${argumentText}`; + } + newConstructorMethodText = utils_1.escapeForSnippet(constructorMethodText).replace(utils_1.escapeForSnippet(lastArg.loc.source), newArg); + } + else { + const argsParenthesis = /\(\)/; + newConstructorMethodText = constructorMethodText.replace(argsParenthesis, `(${argumentText})`); + } + newDocumentText = newDocumentText.replace(utils_1.escapeForSnippet(constructorMethodText), newConstructorMethodText); + } + let assignationExists = false; + for (let i = 0; i < ((_d = constructor.body) === null || _d === void 0 ? void 0 : _d.children.length); i++) { + const node = constructor.body.children[i]; + if (node.kind === 'expressionstatement' + && node.expression.kind === 'assign' + && node.expression.left.kind === 'propertylookup' + && node.expression.left.offset.name === property.getName()) { + assignationExists = true; + break; + } + } + if (!assignationExists) { + const constructorBodyText = constructor.body.loc.source; + const constructorBodyLine = document.lineAt(constructor.body.loc.start.line - 1); + const constructorBodyIsEmpty = constructor.body.children.length === 0; + let newConstructorBodyText = ''; + if (constructorBodyIsEmpty) { + const indentationLevel = utils_1.calculateIndentationLevel(utils_1.getLineFirstNonIndentationCharacterIndex(constructorBodyLine.text)); + newConstructorBodyText = "{\n" + utils_1.indentText(`\\$this->${property.getName()} = \\$${property.getName()};\$0\n`, indentationLevel + 1) + utils_1.indentText("}", indentationLevel); + } + else { + const lastChildren = constructor.body.children[constructor.body.children.length - 1]; + const lastChildrenText = lastChildren.loc.source; + const lastChildrenLine = document.lineAt(lastChildren.loc.end.line - 1); + const indentationLevel = utils_1.calculateIndentationLevel(utils_1.getLineFirstNonIndentationCharacterIndex(lastChildrenLine.text)); + newConstructorBodyText = utils_1.escapeForSnippet(constructorBodyText).replace(utils_1.escapeForSnippet(lastChildrenText), utils_1.escapeForSnippet(lastChildrenText) + "\n" + utils_1.indentText(`\\$this->${property.getName()} = \\$${property.getName()};\$0`, indentationLevel)); + } + newDocumentText = newDocumentText.replace(utils_1.escapeForSnippet(constructorBodyText), newConstructorBodyText); + } + } + newDocumentText = utils_1.breakConstructorIntoMultiline(newDocumentText); + if (newDocumentText === utils_1.escapeForSnippet(document.getText(phpClassRange))) { + return; + } + utils_1.replaceWithSnippet(newDocumentText, phpClassRange); +} +exports.default = insertProperty; +//# sourceMappingURL=insertProperty.js.map \ No newline at end of file diff --git a/out/insertProperty.js.map b/out/insertProperty.js.map new file mode 100644 index 0000000..ac22262 --- /dev/null +++ b/out/insertProperty.js.map @@ -0,0 +1 @@ +{"version":3,"file":"insertProperty.js","sourceRoot":"","sources":["../src/insertProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/property.js b/out/property.js index abe6c73..833face 100644 --- a/out/property.js +++ b/out/property.js @@ -1,5 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +const utils_1 = require("./utils"); class Property { constructor(name, type) { this.name = name; @@ -11,6 +12,77 @@ class Property { getType() { return this.type; } + getStatementText(tabStops) { + let docblockTypeStop = tabStops.propertyDocblockType; + let dockblockImportStop = tabStops.propertyDocblockImport; + if (utils_1.config('phpAddProperty.property.docblock.withParameter') === true) { + docblockTypeStop = tabStops.constructorParameterType; + dockblockImportStop = tabStops.constructorParameterStop; + tabStops.constructorParameterStop++; + } + let propertyStatementText = ''; + if (utils_1.config('phpAddProperty.property.docblock.add') === true) { + let stopText = ''; + if (utils_1.config('phpAddProperty.property.docblock.stopToImport') === true) { + stopText += `$${dockblockImportStop}`; + } + stopText += `$${docblockTypeStop}`; + if (utils_1.config('phpAddProperty.property.docblock.multiline') === true) { + propertyStatementText += `/**\n${utils_1.indentText(' * @var ')}${stopText}\n${utils_1.indentText(' */')}\n${utils_1.indentText('')}`; + } + else { + if (utils_1.config('phpAddProperty.property.docblock.withParameter') === false) { + stopText += ' '; + } + propertyStatementText += `/** @var ${stopText}*/\n${utils_1.indentText('')}`; + } + } + const visibility = utils_1.config('phpAddProperty.property.visibility.default'); + propertyStatementText += utils_1.config('phpAddProperty.property.visibility.choose') === true + ? `\${${tabStops.propertyVisibility}${utils_1.getVisibilityChoice(visibility)}} ` + : `${visibility} `; + if (utils_1.config('phpAddProperty.property.types') === true) { + propertyStatementText += `$${tabStops.constructorParameterType}`; + } + propertyStatementText += `\\$${this.getName()};`; + return propertyStatementText; + } + getParameterText(tabStops) { + let tabStopsText = `$${tabStops.constructorParameterType}`; + if (this.getType()) { + tabStopsText = `\${${tabStops.constructorParameterType}:${this.getType()}}`; + } + if (utils_1.config('phpAddProperty.property.stopToImport') === true) { + tabStopsText += `$${tabStops.constructorParameterStop}`; + } + let parameterText = `${tabStopsText}`; + if (this.getType()) { + parameterText += ' '; + } + parameterText += `\\$${this.getName()}`; + return parameterText; + } + getConstructorParamDocblockText(tabStops) { + let docblockTypeStop = tabStops.constructorDocblockType; + let dockblockImportStop = tabStops.constructorDocblockImport; + if (utils_1.config('phpAddProperty.constructor.docblock.withParameter') === true) { + docblockTypeStop = tabStops.constructorParameterType; + dockblockImportStop = tabStops.constructorParameterStop; + tabStops.constructorParameterStop++; + } + let constructorParamDocblockText = `\${${docblockTypeStop}}`; + if (this.getType()) { + constructorParamDocblockText = `\${${docblockTypeStop}:${this.getType()} }`; + } + if (utils_1.config('phpAddProperty.constructor.docblock.stopToImport') === true) { + constructorParamDocblockText += `\$${dockblockImportStop}`; + } + constructorParamDocblockText += `\\$${this.getName()}`; + if (utils_1.config('phpAddProperty.constructor.docblock.stopForDescription') === true) { + constructorParamDocblockText += `\$${tabStops.constructorDocblockDescription}`; + } + return ` * @param ${constructorParamDocblockText}`; + } } exports.default = Property; //# sourceMappingURL=property.js.map \ No newline at end of file diff --git a/out/property.js.map b/out/property.js.map index 2b2447b..42256d0 100644 --- a/out/property.js.map +++ b/out/property.js.map @@ -1 +1 @@ -{"version":3,"file":"property.js","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":";;AAAA,MAAqB,QAAQ;IAIzB,YAAY,IAAY,EAAE,IAAa;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAEM,OAAO;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAEM,OAAO;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;CACJ;AAhBD,2BAgBC"} \ No newline at end of file +{"version":3,"file":"property.js","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/removeProperty.js b/out/removeProperty.js new file mode 100644 index 0000000..d3b3ee5 --- /dev/null +++ b/out/removeProperty.js @@ -0,0 +1,83 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const vscode = require("vscode"); +const utils_1 = require("./utils"); +function removeProperty(editor, property, phpClass) { + var _a, _b, _c, _d, _e, _f; + const document = editor.document; + const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); + let newDocumentText = document.getText(phpClassRange); + const astClassBody = phpClass.ast.body; + for (let i = 0; i < astClassBody.length; i++) { + const node = astClassBody[i]; + if (node.kind === 'propertystatement') { + for (let j = 0; j < node.properties.length; j++) { + const propertyNode = node.properties[j]; + if (((_a = propertyNode.name) === null || _a === void 0 ? void 0 : _a.name) === property.getName()) { + if (node.properties.length === 1) { + const nextNotEmptyLine = i + 1 < astClassBody.length + ? astClassBody[i + 1].loc.start.line - 1 + : node.loc.end.line; + const propertyStatementRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(nextNotEmptyLine, 0)); + const propertyStatementText = document.getText(propertyStatementRange); + newDocumentText = newDocumentText.replace(propertyStatementText, ''); + } + else { + const regexp = new RegExp(`(,\\s*(?!.*,))?${utils_1.escapeForRegExp(propertyNode.loc.source)}(\\s*,\\s*)?`); + newDocumentText = newDocumentText.replace(regexp, ''); + } + for (let i = 0; i < ((_b = node.leadingComments) === null || _b === void 0 ? void 0 : _b.length); i++) { + const commentNode = node.leadingComments[i]; + const commentRange = new vscode.Range(new vscode.Position(commentNode.loc.start.line - 1, 0), new vscode.Position(commentNode.loc.end.line, 0)); + const commentText = document.getText(commentRange); + newDocumentText = newDocumentText.replace(commentText, ''); + } + break; + } + } + } + } + const constructor = phpClass.getConstructor(); + if (constructor) { + if (((_c = constructor.ast.body) === null || _c === void 0 ? void 0 : _c.children.length) <= 1) { + const constructorRange = new vscode.Range(new vscode.Position(constructor.ast.loc.start.line - 1, 0), new vscode.Position(constructor.ast.loc.end.line, 0)); + const constructorText = document.getText(constructorRange); + newDocumentText = newDocumentText.replace(constructorText, ''); + } + else { + for (let i = 0; i < constructor.ast.arguments.length; i++) { + const node = constructor.ast.arguments[i]; + if (((_d = node.name) === null || _d === void 0 ? void 0 : _d.name) == property.getName()) { + const constructorText = constructor.ast.loc.source; + const regexp = new RegExp(`(,\\s*(?!.*,))?${utils_1.escapeForRegExp(node.loc.source)}(\\s*,\\s*)?`); + const newConstructorText = constructorText.replace(regexp, ''); + newDocumentText = newDocumentText.replace(constructorText, newConstructorText); + break; + } + } + for (let i = 0; i < ((_e = constructor.ast.body) === null || _e === void 0 ? void 0 : _e.children.length); i++) { + const node = constructor.ast.body.children[i]; + if (node.kind === 'expressionstatement' + && node.expression.kind === 'assign' + && node.expression.left.kind === 'propertylookup' + && node.expression.left.offset.name === property.getName()) { + const propertyAssignmentRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0)); + const propertyAssignmentText = document.getText(propertyAssignmentRange); + newDocumentText = newDocumentText.replace(propertyAssignmentText, ''); + break; + } + } + } + } + if (newDocumentText === document.getText()) { + return; + } + (_f = vscode.window.activeTextEditor) === null || _f === void 0 ? void 0 : _f.edit(editBuilder => { + editBuilder.replace(phpClassRange, newDocumentText); + }, { + undoStopBefore: true, + undoStopAfter: false + }); +} +exports.removeProperty = removeProperty; +//# sourceMappingURL=removeProperty.js.map \ No newline at end of file diff --git a/out/removeProperty.js.map b/out/removeProperty.js.map new file mode 100644 index 0000000..16d681a --- /dev/null +++ b/out/removeProperty.js.map @@ -0,0 +1 @@ +{"version":3,"file":"removeProperty.js","sourceRoot":"","sources":["../src/removeProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/utils.js b/out/utils.js new file mode 100644 index 0000000..e263271 --- /dev/null +++ b/out/utils.js @@ -0,0 +1,104 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const vscode = require("vscode"); +function getVisibilityChoice(defaultValue) { + let visibilityChoices = ['public', 'protected', 'private']; + if (visibilityChoices.indexOf(defaultValue) !== -1) { + visibilityChoices.splice(visibilityChoices.indexOf(defaultValue), 1); + } + return `|${[defaultValue, ...visibilityChoices].join(',')}|`; +} +exports.getVisibilityChoice = getVisibilityChoice; +function breakConstructorIntoMultiline(text) { + if (config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.enabled') !== true) { + return text; + } + const regex = /(.*__construct\s*)\(((?:\s|\S)*?)(?=\))\s*\)\s*{/; + const match = regex.exec(text); + if (match) { + const constructorLineText = match[0]; + const maxLineLength = config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.maxLineLength'); + if (constructorLineText.length > maxLineLength) { + const parametersText = match[2]; + const parameters = parametersText.split(',').map(parameter => indentText(parameter.trim(), 2)); + const multilineConstructorText = match[1] + + '(\n' + + `${parameters.join(',\n')}\n` + + indentText(') {'); + text = text.replace(match[0], multilineConstructorText); + } + } + return text; +} +exports.breakConstructorIntoMultiline = breakConstructorIntoMultiline; +function calculateIndentationLevel(index) { + return Math.floor(index / configUsingResource('editor.tabSize')); +} +exports.calculateIndentationLevel = calculateIndentationLevel; +function getLineFirstNonIndentationCharacterIndex(lineText) { + const tabSize = configUsingResource('editor.tabSize'); + let index = 0; + for (let i = 0; i < lineText.length; i++) { + const char = lineText[i]; + if (/[^\s\t]/.test(char)) { + index++; + break; + } + index += char === "\t" ? tabSize : 1; + } + return index; +} +exports.getLineFirstNonIndentationCharacterIndex = getLineFirstNonIndentationCharacterIndex; +function indentText(text, level = 1) { + /** + * Good to have + * Listen for view options changes and use these values + * https://github.com/jedmao/tabsanity-vs/blob/faa41a99ccb47c8e7717edfcbdfba4c093e670fe/TabSanity/TabOptionsListener.cs + */ + let tab = "\t"; + if (configUsingResource('editor.insertSpaces')) { + const tabSize = configUsingResource('editor.tabSize'); + tab = ' '.repeat(tabSize); + } + return tab.repeat(level) + text; +} +exports.indentText = indentText; +function configUsingResource(key) { + var _a; + const parts = key.split(/\.(.+)/, 2); + const configuration = vscode.workspace.getConfiguration(parts[0], (_a = vscode.window.activeTextEditor) === null || _a === void 0 ? void 0 : _a.document.uri); + return parts[1] ? configuration.get(parts[1]) : configuration; +} +exports.configUsingResource = configUsingResource; +function config(key) { + return vscode.workspace.getConfiguration().get(key); +} +exports.config = config; +function escapeForRegExp(text) { + return text.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); +} +exports.escapeForRegExp = escapeForRegExp; +function escapeForSnippet(text) { + return text.replace(/(? { + editBuilder.replace(range, "\n".repeat(rangeLines)); + }, { + undoStopBefore: true, + undoStopAfter: false + }).then(() => { + const editor = vscode.window.activeTextEditor; + if (editor) { + editor.insertSnippet(new vscode.SnippetString(snippet), range, { + undoStopBefore: false, + undoStopAfter: false, + }); + } + }); +} +exports.replaceWithSnippet = replaceWithSnippet; +//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/out/utils.js.map b/out/utils.js.map new file mode 100644 index 0000000..866ca21 --- /dev/null +++ b/out/utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/addPropertyStatement.ts b/src/addPropertyStatement.ts new file mode 100644 index 0000000..78c2c2b --- /dev/null +++ b/src/addPropertyStatement.ts @@ -0,0 +1,103 @@ +import * as vscode from 'vscode'; +import Class from './class'; +import Property from './property'; +import { escapeForSnippet, indentText, calculateIndentationLevel, getLineFirstNonIndentationCharacterIndex } from './utils'; + +export default function addPropertyStatement(document: vscode.TextDocument, phpClass: Class, property: Property, tabStops: any): string { + const phpClassRange = new vscode.Range( + new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), + new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column) + ); + + let newDocumentText = escapeForSnippet(document.getText(phpClassRange)); + + let lastProperty; + let firstMethod; + let lastNode; + + const astClassBody = phpClass.ast.body; + for (let i = 0; i < astClassBody.length; i++) { + const node = astClassBody[i]; + + lastNode = node; + + if (node.kind === 'propertystatement') { + lastProperty = node; + + // Check that property does not already exist + for (let j = 0; j < node.properties.length; j++) { + const propertyNode = node.properties[j]; + + if (propertyNode.name?.name === property.getName()) { + return newDocumentText; + } + } + } else if (!firstMethod && node.kind === 'method' && node.name !== '__construct') { + firstMethod = node; + } + } + + const propertyStatementText = property.getStatementText(tabStops); + + if (lastProperty) { + const lastPropertyLine = document.lineAt(lastProperty.loc.start.line - 1); + + const newPropertyText = escapeForSnippet(`${lastPropertyLine.text}`) + "\n\n" + indentText( + propertyStatementText, + calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(lastPropertyLine.text) + ) + ); + + newDocumentText = newDocumentText.replace(escapeForSnippet(lastPropertyLine.text), newPropertyText); + } else if (firstMethod) { + const firstMethodLine = document.lineAt(firstMethod.loc.start.line - 1); + + const newPropertyText = indentText( + propertyStatementText, + calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(firstMethodLine.text) + ) + ) + "\n\n" + escapeForSnippet(firstMethodLine.text); + + newDocumentText = newDocumentText.replace(escapeForSnippet(firstMethodLine.text), newPropertyText); + } else if (lastNode) { + const lastNodeLine = document.lineAt(lastNode.loc.start.line - 1); + + const newPropertyText = escapeForSnippet(lastNodeLine.text) + "\n\n" + indentText( + propertyStatementText, + calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(lastNodeLine.text) + ) + ); + + newDocumentText = newDocumentText.replace(escapeForSnippet(lastNodeLine.text), newPropertyText); + } else { + const isOneLineClass = phpClass.ast.loc.start.line === phpClass.ast.loc.end.line; + + if (isOneLineClass) { + const match = phpClass.ast.loc.source.match(/(.*)\}/); + + const newPropertyText = escapeForSnippet(match[1]) + "\n" + indentText( + propertyStatementText, + 1 + ) + "\n" + '}'; + + newDocumentText = newDocumentText.replace(escapeForSnippet(phpClass.ast.loc.source), newPropertyText); + } else { + const classBodyLine = document.lineAt(phpClass.ast.loc.start.line - 1); + const classText = escapeForSnippet(phpClass.ast.loc.source); + + const newPropertyText = classText.replace(/{(?:\s|[\r\n]|\s)*}/, "{\n" + indentText( + propertyStatementText, + calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(classBodyLine.text) + ) + 1 + )) + "\n}"; + + newDocumentText = newDocumentText.replace(classText, newPropertyText); + } + } + + return newDocumentText; +} diff --git a/src/extension.ts b/src/extension.ts index da19aa2..b18ab23 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,8 +1,9 @@ import * as vscode from 'vscode'; import PhpEngine from 'php-parser'; import Locator from './locator'; -import PhpClass from './class'; import Property from './property'; +import insertProperty from './insertProperty'; +import { removeProperty } from './removeProperty'; export function activate(context: vscode.ExtensionContext) { context.subscriptions.push( @@ -234,637 +235,3 @@ export function activate(context: vscode.ExtensionContext) { // this method is called when your extension is deactivated export function deactivate() { } - -function calculateIndentationLevel(index: number): number { - return Math.floor(index / configUsingResource('editor.tabSize')); -} - -function getLineFirstNonIndentationCharacterIndex(lineText: string): number { - const tabSize = configUsingResource('editor.tabSize'); - - let index = 0; - for (let i = 0; i < lineText.length; i++) { - const char = lineText[i]; - - if (/[^\s\t]/.test(char)) { - index++; - break; - } - - index += char === "\t" ? tabSize : 1; - } - - return index; -} - -function indentText(text: string, level: number = 1) { - /** - * Good to have - * Listen for view options changes and use these values - * https://github.com/jedmao/tabsanity-vs/blob/faa41a99ccb47c8e7717edfcbdfba4c093e670fe/TabSanity/TabOptionsListener.cs - */ - let tab = "\t"; - if (configUsingResource('editor.insertSpaces')) { - const tabSize = configUsingResource('editor.tabSize'); - tab = ' '.repeat(tabSize); - } - return tab.repeat(level) + text; -} - -function configUsingResource(key: string): any { - const parts = key.split(/\.(.+)/, 2); - const configuration = vscode.workspace.getConfiguration( - parts[0], - vscode.window.activeTextEditor?.document.uri - ); - - return parts[1] ? configuration.get(parts[1]) : configuration; -} - -function config(key: string) { - return vscode.workspace.getConfiguration().get(key); -} - -function escapeForRegExp(text: string): string { - return text.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); -} - -function escapeForSnippet(text: string): string { - return text.replace(/(? { - editBuilder.replace(range, "\n".repeat(rangeLines)); - }, - { - undoStopBefore: true, - undoStopAfter: false - } - ).then(() => { - const editor = vscode.window.activeTextEditor; - - if (editor) { - editor.insertSnippet( - new vscode.SnippetString(snippet), - range, - { - undoStopBefore: false, - undoStopAfter: false, - } - ); - } - }); -} - -function addPropertyStatement(document: vscode.TextDocument, phpClass: PhpClass, property: Property, tabStops: any): string { - const phpClassRange = new vscode.Range( - new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), - new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column) - ); - - let newDocumentText = escapeForSnippet(document.getText(phpClassRange)); - - let lastProperty; - let firstMethod; - let lastNode; - - const astClassBody = phpClass.ast.body; - for (let i = 0; i < astClassBody.length; i++) { - const node = astClassBody[i]; - - lastNode = node; - - if (node.kind === 'propertystatement') { - lastProperty = node; - - // Check that property does not already exist - for (let j = 0; j < node.properties.length; j++) { - const propertyNode = node.properties[j]; - - if (propertyNode.name?.name === property.getName()) { - return newDocumentText; - } - } - } else if (!firstMethod && node.kind === 'method' && node.name !== '__construct') { - firstMethod = node; - } - } - - const propertyStatementText = getPropertyStatementText(property, tabStops); - - if (lastProperty) { - const lastPropertyLine = document.lineAt(lastProperty.loc.start.line - 1); - - const newPropertyText = escapeForSnippet(`${lastPropertyLine.text}`) + "\n\n" + indentText( - propertyStatementText, - calculateIndentationLevel( - getLineFirstNonIndentationCharacterIndex(lastPropertyLine.text) - ) - ); - - newDocumentText = newDocumentText.replace(escapeForSnippet(lastPropertyLine.text), newPropertyText); - } else if (firstMethod) { - const firstMethodLine = document.lineAt(firstMethod.loc.start.line - 1); - - const newPropertyText = indentText( - propertyStatementText, - calculateIndentationLevel( - getLineFirstNonIndentationCharacterIndex(firstMethodLine.text) - ) - ) + "\n\n" + escapeForSnippet(firstMethodLine.text); - - newDocumentText = newDocumentText.replace(escapeForSnippet(firstMethodLine.text), newPropertyText); - } else if (lastNode) { - const lastNodeLine = document.lineAt(lastNode.loc.start.line - 1); - - const newPropertyText = escapeForSnippet(lastNodeLine.text) + "\n\n" + indentText( - propertyStatementText, - calculateIndentationLevel( - getLineFirstNonIndentationCharacterIndex(lastNodeLine.text) - ) - ); - - newDocumentText = newDocumentText.replace(escapeForSnippet(lastNodeLine.text), newPropertyText); - } else { - const isOneLineClass = phpClass.ast.loc.start.line === phpClass.ast.loc.end.line; - - if (isOneLineClass) { - const match = phpClass.ast.loc.source.match(/(.*)\}/); - - const newPropertyText = escapeForSnippet(match[1]) + "\n" + indentText( - propertyStatementText, - 1 - ) + "\n" + '}'; - - newDocumentText = newDocumentText.replace(escapeForSnippet(phpClass.ast.loc.source), newPropertyText); - } else { - const classBodyLine = document.lineAt(phpClass.ast.loc.start.line - 1); - const classText = escapeForSnippet(phpClass.ast.loc.source); - - const newPropertyText = classText.replace(/{(?:\s|[\r\n]|\s)*}/, "{\n" + indentText( - propertyStatementText, - calculateIndentationLevel( - getLineFirstNonIndentationCharacterIndex(classBodyLine.text) - ) + 1 - )) + "\n}"; - - newDocumentText = newDocumentText.replace(classText, newPropertyText); - } - } - - return newDocumentText; -} - -function getPropertyStatementText(property: Property, tabStops: any): string { - let docblockTypeStop = tabStops.propertyDocblockType; - let dockblockImportStop = tabStops.propertyDocblockImport; - - if (config('phpAddProperty.property.docblock.withParameter') === true) { - docblockTypeStop = tabStops.constructorParameterType; - dockblockImportStop = tabStops.constructorParameterStop; - tabStops.constructorParameterStop++; - } - - let propertyStatementText = ''; - if (config('phpAddProperty.property.docblock.add') === true) { - let stopText = ''; - - if (config('phpAddProperty.property.docblock.stopToImport') === true) { - stopText += `$${dockblockImportStop}`; - } - - stopText += `$${docblockTypeStop}`; - - if (config('phpAddProperty.property.docblock.multiline') === true) { - propertyStatementText += `/**\n${indentText(' * @var ')}${stopText}\n${indentText(' */')}\n${indentText('')}`; - } else { - if (config('phpAddProperty.property.docblock.withParameter') === false) { - stopText += ' '; - } - - propertyStatementText += `/** @var ${stopText}*/\n${indentText('')}`; - } - } - - const visibility = (config('phpAddProperty.property.visibility.default') as string); - propertyStatementText += config('phpAddProperty.property.visibility.choose') === true - ? `\${${tabStops.propertyVisibility}${getVisibilityChoice(visibility)}} ` - : `${visibility} `; - - if (config('phpAddProperty.property.types') === true) { - propertyStatementText += `$${tabStops.constructorParameterType}`; - } - propertyStatementText += `\\$${property.getName()};`; - - return propertyStatementText; -} - -function getVisibilityChoice(defaultValue: string): string { - let visibilityChoices = ['public', 'protected', 'private']; - if (visibilityChoices.indexOf(defaultValue) !== -1) { - visibilityChoices.splice(visibilityChoices.indexOf(defaultValue), 1); - } - return `|${[defaultValue, ...visibilityChoices].join(',')}|`; -} - -function getParameterText(property: Property, tabStops: any): string { - let tabStopsText = `$${tabStops.constructorParameterType}`; - - if (property.getType()) { - tabStopsText = `\${${tabStops.constructorParameterType}:${property.getType()}}`; - } - - if (config('phpAddProperty.property.stopToImport') === true) { - tabStopsText += `$${tabStops.constructorParameterStop}`; - } - - let parameterText = `${tabStopsText}`; - - if (property.getType()) { - parameterText += ' '; - } - - parameterText += `\\$${property.getName()}`; - - return parameterText; -} - -function getConstructorParamDocblockText(property: Property, tabStops: any): string { - let docblockTypeStop = tabStops.constructorDocblockType; - let dockblockImportStop = tabStops.constructorDocblockImport; - - if (config('phpAddProperty.constructor.docblock.withParameter') === true) { - docblockTypeStop = tabStops.constructorParameterType; - dockblockImportStop = tabStops.constructorParameterStop; - tabStops.constructorParameterStop++; - } - - let constructorParamDocblockText = `\${${docblockTypeStop}}`; - - if (property.getType()) { - constructorParamDocblockText = `\${${docblockTypeStop}:${property.getType()} }`; - } - - if (config('phpAddProperty.constructor.docblock.stopToImport') === true) { - constructorParamDocblockText += `\$${dockblockImportStop}`; - } - - constructorParamDocblockText += `\\$${property.getName()}`; - - if (config('phpAddProperty.constructor.docblock.stopForDescription') === true) { - constructorParamDocblockText += `\$${tabStops.constructorDocblockDescription}`; - } - - return ` * @param ${constructorParamDocblockText}`; -} - -function breakConstructorIntoMultiline(text: string): string { - if (config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.enabled') !== true) { - return text; - } - - const regex = /(.*__construct\s*)\(((?:\s|\S)*?)(?=\))\s*\)\s*{/; - const match = regex.exec(text); - - if (match) { - const constructorLineText = match[0]; - const maxLineLength = config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.maxLineLength') as Number; - - if (constructorLineText.length > maxLineLength) { - const parametersText = match[2]; - const parameters = parametersText.split(',').map(parameter => indentText(parameter.trim(), 2)); - - const multilineConstructorText = match[1] - + '(\n' - + `${parameters.join(',\n')}\n` - + indentText(') {'); - - text = text.replace(match[0], multilineConstructorText); - } - } - - return text; -} - -function insertProperty(editor: vscode.TextEditor, property: Property, phpClass: PhpClass, anchorText: string) { - let tabStops = { - propertyDocblockType: 1, - propertyDocblockImport: 2, - propertyVisibility: 3, - constructorDocblockType: 4, - constructorDocblockImport: 5, - constructorDocblockDescription: 6, - constructorVisibility: 7, - constructorParameterType: 8, - constructorParameterStop: 9 - }; - - const document = editor.document; - const phpClassRange = new vscode.Range( - new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), - new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column) - ); - - let newDocumentText = addPropertyStatement(document, phpClass, property, tabStops); - - if (!phpClass.getConstructor()) { - let snippet = "\n\n"; - - if (config('phpAddProperty.constructor.docblock.enable') === true) { - snippet += indentText("/**\n") - + indentText(" * Constructor.\n") - + indentText(`${getConstructorParamDocblockText(property, tabStops)}\n`) - + indentText(" */\n") - } - - const visibility = (config('phpAddProperty.constructor.visibility.default') as string); - let constructorText = indentText( - config('phpAddProperty.constructor.visibility.choose') === true - ? `\${${tabStops.constructorVisibility}${getVisibilityChoice(visibility)}} ` - : `${visibility} ` - ); - - const parameterText = getParameterText(property, tabStops); - - constructorText += `function __construct(${parameterText})\n` - + indentText('{\n') - + indentText(`\\$this->${property.getName()} = \\$${property.getName()};\$0\n`, 2) - + indentText('}'); - - snippet += constructorText; - - const searchText = escapeForSnippet(anchorText); - - newDocumentText = newDocumentText.replace(searchText, `${searchText}${snippet}`); - } else { - const constructor = phpClass.getConstructor()?.ast; - - let docblock; - for (let i = 0; i < constructor.leadingComments?.length; i++) { - const node = constructor.leadingComments[i]; - - if (node.kind === 'commentblock') { - docblock = node; - break; - } - } - - if (docblock) { - const paramRegex = /@param(?:\s+\S+)?\s+\$(\S+).*/g; - - let paramExists = false; - let lastParamText; - let paramMatch; - while (paramMatch = paramRegex.exec(docblock.value)) { - lastParamText = paramMatch[0]; - if (paramMatch[1] === property.getName()) { - paramExists = true; - break; - } - } - - if (!paramExists) { - if (lastParamText) { - const docblockClosingLine = editor.document.lineAt(docblock.loc.start.line - 1); - - newDocumentText = newDocumentText.replace( - escapeForSnippet(lastParamText), - escapeForSnippet(lastParamText) + "\n" + indentText( - getConstructorParamDocblockText(property, tabStops), - calculateIndentationLevel( - getLineFirstNonIndentationCharacterIndex(docblockClosingLine.text) - ) - ) - ); - } - } - } - - let argumentExists = false; - for (let i = 0; i < constructor.arguments.length; i++) { - const node = constructor.arguments[i]; - - if (node.name?.name == property.getName()) { - argumentExists = true; - break; - } - } - - if (!argumentExists) { - const constructorMethodText = (constructor.loc.source as string); - const constructorHasArgs = constructor.arguments.length > 0; - - let newConstructorMethodText = ''; - - const isMultiLineConstructor = (/\(\r\n|\r|\n/.test(constructorMethodText)); //constructor.loc.start.line !== constructor.loc.end.line; - - const argumentText = getParameterText(property, tabStops); - if (constructorHasArgs) { - const lastArg = constructor.arguments[constructor.arguments.length - 1]; - - const lastArgLine = document.lineAt(lastArg.loc.end.line - 1); - - let newArg = escapeForSnippet(`${lastArg.loc.source}`); - - if (isMultiLineConstructor) { - newArg += ",\n" + indentText( - argumentText, - calculateIndentationLevel( - getLineFirstNonIndentationCharacterIndex(lastArgLine.text) - ) - ); - } else { - newArg += `, ${argumentText}`; - } - - newConstructorMethodText = escapeForSnippet(constructorMethodText).replace(escapeForSnippet(lastArg.loc.source), newArg); - } else { - const argsParenthesis = /\(\)/; - - newConstructorMethodText = constructorMethodText.replace(argsParenthesis, `(${argumentText})`); - } - - newDocumentText = newDocumentText.replace(escapeForSnippet(constructorMethodText), newConstructorMethodText); - } - - let assignationExists = false; - for (let i = 0; i < constructor.body?.children.length; i++) { - const node = constructor.body.children[i]; - - if (node.kind === 'expressionstatement' - && node.expression.kind === 'assign' - && node.expression.left.kind === 'propertylookup' - && node.expression.left.offset.name === property.getName() - ) { - assignationExists = true; - break; - } - } - - if (!assignationExists) { - const constructorBodyText = constructor.body.loc.source; - const constructorBodyLine = document.lineAt(constructor.body.loc.start.line - 1); - - const constructorBodyIsEmpty = constructor.body.children.length === 0; - - let newConstructorBodyText = ''; - if (constructorBodyIsEmpty) { - const indentationLevel = calculateIndentationLevel( - getLineFirstNonIndentationCharacterIndex(constructorBodyLine.text) - ); - - newConstructorBodyText = "{\n" + indentText( - `\\$this->${property.getName()} = \\$${property.getName()};\$0\n`, - indentationLevel + 1 - ) + indentText("}", indentationLevel); - } else { - const lastChildren = constructor.body.children[constructor.body.children.length - 1]; - const lastChildrenText = lastChildren.loc.source; - const lastChildrenLine = document.lineAt(lastChildren.loc.end.line - 1); - - const indentationLevel = calculateIndentationLevel( - getLineFirstNonIndentationCharacterIndex(lastChildrenLine.text) - ); - - newConstructorBodyText = escapeForSnippet(constructorBodyText).replace( - escapeForSnippet(lastChildrenText), - escapeForSnippet(lastChildrenText) + "\n" + indentText( - `\\$this->${property.getName()} = \\$${property.getName()};\$0`, - indentationLevel - ) - ); - } - - newDocumentText = newDocumentText.replace(escapeForSnippet(constructorBodyText), newConstructorBodyText); - } - } - - newDocumentText = breakConstructorIntoMultiline(newDocumentText); - - if (newDocumentText === escapeForSnippet(document.getText(phpClassRange))) { - return; - } - - replaceWithSnippet(newDocumentText, phpClassRange); -} - -function removeProperty(editor: vscode.TextEditor, property: Property, phpClass: PhpClass) { - const document = editor.document; - const phpClassRange = new vscode.Range( - new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), - new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column) - ); - - let newDocumentText = document.getText(phpClassRange); - - const astClassBody = phpClass.ast.body; - for (let i = 0; i < astClassBody.length; i++) { - const node = astClassBody[i]; - - if (node.kind === 'propertystatement') { - for (let j = 0; j < node.properties.length; j++) { - const propertyNode = node.properties[j]; - - if (propertyNode.name?.name === property.getName()) { - if (node.properties.length === 1) { - const nextNotEmptyLine = i + 1 < astClassBody.length - ? astClassBody[i + 1].loc.start.line - 1 - : node.loc.end.line; - const propertyStatementRange = new vscode.Range( - new vscode.Position(node.loc.start.line - 1, 0), - new vscode.Position(nextNotEmptyLine, 0) - ); - - const propertyStatementText = document.getText(propertyStatementRange); - - newDocumentText = newDocumentText.replace(propertyStatementText, ''); - } else { - const regexp = new RegExp(`(,\\s*(?!.*,))?${escapeForRegExp(propertyNode.loc.source)}(\\s*,\\s*)?`); - newDocumentText = newDocumentText.replace(regexp, ''); - } - - for (let i = 0; i < node.leadingComments?.length; i++) { - const commentNode = node.leadingComments[i]; - - const commentRange = new vscode.Range( - new vscode.Position(commentNode.loc.start.line - 1, 0), - new vscode.Position(commentNode.loc.end.line, 0) - ); - - const commentText = document.getText(commentRange); - - newDocumentText = newDocumentText.replace(commentText, ''); - } - - break; - } - } - } - } - - const constructor = phpClass.getConstructor(); - - if (constructor) { - if (constructor.ast.body?.children.length <= 1) { - const constructorRange = new vscode.Range( - new vscode.Position(constructor.ast.loc.start.line - 1, 0), - new vscode.Position(constructor.ast.loc.end.line, 0) - ); - - const constructorText = document.getText(constructorRange); - - newDocumentText = newDocumentText.replace(constructorText, ''); - } else { - for (let i = 0; i < constructor.ast.arguments.length; i++) { - const node = constructor.ast.arguments[i]; - - if (node.name?.name == property.getName()) { - const constructorText = constructor.ast.loc.source; - const regexp = new RegExp(`(,\\s*(?!.*,))?${escapeForRegExp(node.loc.source)}(\\s*,\\s*)?`); - const newConstructorText = constructorText.replace(regexp, ''); - newDocumentText = newDocumentText.replace(constructorText, newConstructorText); - break; - } - } - - for (let i = 0; i < constructor.ast.body?.children.length; i++) { - const node = constructor.ast.body.children[i]; - - if (node.kind === 'expressionstatement' - && node.expression.kind === 'assign' - && node.expression.left.kind === 'propertylookup' - && node.expression.left.offset.name === property.getName() - ) { - const propertyAssignmentRange = new vscode.Range( - new vscode.Position(node.loc.start.line - 1, 0), - new vscode.Position(node.loc.end.line, 0) - ); - - const propertyAssignmentText = document.getText(propertyAssignmentRange); - - newDocumentText = newDocumentText.replace(propertyAssignmentText, ''); - break; - } - } - } - } - - if (newDocumentText === document.getText()) { - return; - } - - vscode.window.activeTextEditor?.edit( - editBuilder => { - editBuilder.replace(phpClassRange, newDocumentText); - }, - { - undoStopBefore: true, - undoStopAfter: false - } - ); -} - diff --git a/src/insertProperty.ts b/src/insertProperty.ts new file mode 100644 index 0000000..8ba675f --- /dev/null +++ b/src/insertProperty.ts @@ -0,0 +1,207 @@ +import * as vscode from 'vscode'; +import PhpClass from './class'; +import Property from './property'; +import addPropertyStatement from './addPropertyStatement'; +import { config, indentText, getVisibilityChoice, escapeForSnippet, calculateIndentationLevel, getLineFirstNonIndentationCharacterIndex, breakConstructorIntoMultiline, replaceWithSnippet } from './utils'; + +export default function insertProperty(editor: vscode.TextEditor, property: Property, phpClass: PhpClass, anchorText: string) { + let tabStops = { + propertyDocblockType: 1, + propertyDocblockImport: 2, + propertyVisibility: 3, + constructorDocblockType: 4, + constructorDocblockImport: 5, + constructorDocblockDescription: 6, + constructorVisibility: 7, + constructorParameterType: 8, + constructorParameterStop: 9 + }; + + const document = editor.document; + const phpClassRange = new vscode.Range( + new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), + new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column) + ); + + let newDocumentText = addPropertyStatement(document, phpClass, property, tabStops); + + if (!phpClass.getConstructor()) { + let snippet = "\n\n"; + + if (config('phpAddProperty.constructor.docblock.enable') === true) { + snippet += indentText("/**\n") + + indentText(" * Constructor.\n") + + indentText(`${property.getConstructorParamDocblockText(tabStops)}\n`) + + indentText(" */\n") + } + + const visibility = (config('phpAddProperty.constructor.visibility.default') as string); + let constructorText = indentText( + config('phpAddProperty.constructor.visibility.choose') === true + ? `\${${tabStops.constructorVisibility}${getVisibilityChoice(visibility)}} ` + : `${visibility} ` + ); + + const parameterText = property.getParameterText(tabStops); + + constructorText += `function __construct(${parameterText})\n` + + indentText('{\n') + + indentText(`\\$this->${property.getName()} = \\$${property.getName()};\$0\n`, 2) + + indentText('}'); + + snippet += constructorText; + + const searchText = escapeForSnippet(anchorText); + + newDocumentText = newDocumentText.replace(searchText, `${searchText}${snippet}`); + } else { + const constructor = phpClass.getConstructor()?.ast; + + let docblock; + for (let i = 0; i < constructor.leadingComments?.length; i++) { + const node = constructor.leadingComments[i]; + + if (node.kind === 'commentblock') { + docblock = node; + break; + } + } + + if (docblock) { + const paramRegex = /@param(?:\s+\S+)?\s+\$(\S+).*/g; + + let paramExists = false; + let lastParamText; + let paramMatch; + while (paramMatch = paramRegex.exec(docblock.value)) { + lastParamText = paramMatch[0]; + if (paramMatch[1] === property.getName()) { + paramExists = true; + break; + } + } + + if (!paramExists) { + if (lastParamText) { + const docblockClosingLine = editor.document.lineAt(docblock.loc.start.line - 1); + + newDocumentText = newDocumentText.replace( + escapeForSnippet(lastParamText), + escapeForSnippet(lastParamText) + "\n" + indentText( + property.getConstructorParamDocblockText(tabStops), + calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(docblockClosingLine.text) + ) + ) + ); + } + } + } + + let argumentExists = false; + for (let i = 0; i < constructor.arguments.length; i++) { + const node = constructor.arguments[i]; + + if (node.name?.name == property.getName()) { + argumentExists = true; + break; + } + } + + if (!argumentExists) { + const constructorMethodText = (constructor.loc.source as string); + const constructorHasArgs = constructor.arguments.length > 0; + + let newConstructorMethodText = ''; + + const isMultiLineConstructor = (/\(\r\n|\r|\n/.test(constructorMethodText)); //constructor.loc.start.line !== constructor.loc.end.line; + + const argumentText = property.getParameterText(tabStops); + if (constructorHasArgs) { + const lastArg = constructor.arguments[constructor.arguments.length - 1]; + + const lastArgLine = document.lineAt(lastArg.loc.end.line - 1); + + let newArg = escapeForSnippet(`${lastArg.loc.source}`); + + if (isMultiLineConstructor) { + newArg += ",\n" + indentText( + argumentText, + calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(lastArgLine.text) + ) + ); + } else { + newArg += `, ${argumentText}`; + } + + newConstructorMethodText = escapeForSnippet(constructorMethodText).replace(escapeForSnippet(lastArg.loc.source), newArg); + } else { + const argsParenthesis = /\(\)/; + + newConstructorMethodText = constructorMethodText.replace(argsParenthesis, `(${argumentText})`); + } + + newDocumentText = newDocumentText.replace(escapeForSnippet(constructorMethodText), newConstructorMethodText); + } + + let assignationExists = false; + for (let i = 0; i < constructor.body?.children.length; i++) { + const node = constructor.body.children[i]; + + if (node.kind === 'expressionstatement' + && node.expression.kind === 'assign' + && node.expression.left.kind === 'propertylookup' + && node.expression.left.offset.name === property.getName() + ) { + assignationExists = true; + break; + } + } + + if (!assignationExists) { + const constructorBodyText = constructor.body.loc.source; + const constructorBodyLine = document.lineAt(constructor.body.loc.start.line - 1); + + const constructorBodyIsEmpty = constructor.body.children.length === 0; + + let newConstructorBodyText = ''; + if (constructorBodyIsEmpty) { + const indentationLevel = calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(constructorBodyLine.text) + ); + + newConstructorBodyText = "{\n" + indentText( + `\\$this->${property.getName()} = \\$${property.getName()};\$0\n`, + indentationLevel + 1 + ) + indentText("}", indentationLevel); + } else { + const lastChildren = constructor.body.children[constructor.body.children.length - 1]; + const lastChildrenText = lastChildren.loc.source; + const lastChildrenLine = document.lineAt(lastChildren.loc.end.line - 1); + + const indentationLevel = calculateIndentationLevel( + getLineFirstNonIndentationCharacterIndex(lastChildrenLine.text) + ); + + newConstructorBodyText = escapeForSnippet(constructorBodyText).replace( + escapeForSnippet(lastChildrenText), + escapeForSnippet(lastChildrenText) + "\n" + indentText( + `\\$this->${property.getName()} = \\$${property.getName()};\$0`, + indentationLevel + ) + ); + } + + newDocumentText = newDocumentText.replace(escapeForSnippet(constructorBodyText), newConstructorBodyText); + } + } + + newDocumentText = breakConstructorIntoMultiline(newDocumentText); + + if (newDocumentText === escapeForSnippet(document.getText(phpClassRange))) { + return; + } + + replaceWithSnippet(newDocumentText, phpClassRange); +} \ No newline at end of file diff --git a/src/property.ts b/src/property.ts index e51990f..14115ba 100644 --- a/src/property.ts +++ b/src/property.ts @@ -1,3 +1,5 @@ +import { config, indentText, getVisibilityChoice } from "./utils"; + export default class Property { private name: string; private type?: string; @@ -14,4 +16,100 @@ export default class Property { public getType() { return this.type; } + + public getStatementText(tabStops: any): string { + let docblockTypeStop = tabStops.propertyDocblockType; + let dockblockImportStop = tabStops.propertyDocblockImport; + + if (config('phpAddProperty.property.docblock.withParameter') === true) { + docblockTypeStop = tabStops.constructorParameterType; + dockblockImportStop = tabStops.constructorParameterStop; + tabStops.constructorParameterStop++; + } + + let propertyStatementText = ''; + if (config('phpAddProperty.property.docblock.add') === true) { + let stopText = ''; + + if (config('phpAddProperty.property.docblock.stopToImport') === true) { + stopText += `$${dockblockImportStop}`; + } + + stopText += `$${docblockTypeStop}`; + + if (config('phpAddProperty.property.docblock.multiline') === true) { + propertyStatementText += `/**\n${indentText(' * @var ')}${stopText}\n${indentText(' */')}\n${indentText('')}`; + } else { + if (config('phpAddProperty.property.docblock.withParameter') === false) { + stopText += ' '; + } + + propertyStatementText += `/** @var ${stopText}*/\n${indentText('')}`; + } + } + + const visibility = (config('phpAddProperty.property.visibility.default') as string); + propertyStatementText += config('phpAddProperty.property.visibility.choose') === true + ? `\${${tabStops.propertyVisibility}${getVisibilityChoice(visibility)}} ` + : `${visibility} `; + + if (config('phpAddProperty.property.types') === true) { + propertyStatementText += `$${tabStops.constructorParameterType}`; + } + propertyStatementText += `\\$${this.getName()};`; + + return propertyStatementText; + } + + public getParameterText(tabStops: any): string { + let tabStopsText = `$${tabStops.constructorParameterType}`; + + if (this.getType()) { + tabStopsText = `\${${tabStops.constructorParameterType}:${this.getType()}}`; + } + + if (config('phpAddProperty.property.stopToImport') === true) { + tabStopsText += `$${tabStops.constructorParameterStop}`; + } + + let parameterText = `${tabStopsText}`; + + if (this.getType()) { + parameterText += ' '; + } + + parameterText += `\\$${this.getName()}`; + + return parameterText; + } + + public getConstructorParamDocblockText(tabStops: any): string { + let docblockTypeStop = tabStops.constructorDocblockType; + let dockblockImportStop = tabStops.constructorDocblockImport; + + if (config('phpAddProperty.constructor.docblock.withParameter') === true) { + docblockTypeStop = tabStops.constructorParameterType; + dockblockImportStop = tabStops.constructorParameterStop; + tabStops.constructorParameterStop++; + } + + let constructorParamDocblockText = `\${${docblockTypeStop}}`; + + if (this.getType()) { + constructorParamDocblockText = `\${${docblockTypeStop}:${this.getType()} }`; + } + + if (config('phpAddProperty.constructor.docblock.stopToImport') === true) { + constructorParamDocblockText += `\$${dockblockImportStop}`; + } + + constructorParamDocblockText += `\\$${this.getName()}`; + + if (config('phpAddProperty.constructor.docblock.stopForDescription') === true) { + constructorParamDocblockText += `\$${tabStops.constructorDocblockDescription}`; + } + + return ` * @param ${constructorParamDocblockText}`; + } + } diff --git a/src/removeProperty.ts b/src/removeProperty.ts new file mode 100644 index 0000000..d5e2b22 --- /dev/null +++ b/src/removeProperty.ts @@ -0,0 +1,120 @@ +import * as vscode from 'vscode'; +import Property from './property'; +import Class from './class'; +import { escapeForRegExp } from './utils'; + +export function removeProperty(editor: vscode.TextEditor, property: Property, phpClass: Class) { + const document = editor.document; + const phpClassRange = new vscode.Range( + new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), + new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column) + ); + + let newDocumentText = document.getText(phpClassRange); + + const astClassBody = phpClass.ast.body; + for (let i = 0; i < astClassBody.length; i++) { + const node = astClassBody[i]; + + if (node.kind === 'propertystatement') { + for (let j = 0; j < node.properties.length; j++) { + const propertyNode = node.properties[j]; + + if (propertyNode.name?.name === property.getName()) { + if (node.properties.length === 1) { + const nextNotEmptyLine = i + 1 < astClassBody.length + ? astClassBody[i + 1].loc.start.line - 1 + : node.loc.end.line; + const propertyStatementRange = new vscode.Range( + new vscode.Position(node.loc.start.line - 1, 0), + new vscode.Position(nextNotEmptyLine, 0) + ); + + const propertyStatementText = document.getText(propertyStatementRange); + + newDocumentText = newDocumentText.replace(propertyStatementText, ''); + } else { + const regexp = new RegExp(`(,\\s*(?!.*,))?${escapeForRegExp(propertyNode.loc.source)}(\\s*,\\s*)?`); + newDocumentText = newDocumentText.replace(regexp, ''); + } + + for (let i = 0; i < node.leadingComments?.length; i++) { + const commentNode = node.leadingComments[i]; + + const commentRange = new vscode.Range( + new vscode.Position(commentNode.loc.start.line - 1, 0), + new vscode.Position(commentNode.loc.end.line, 0) + ); + + const commentText = document.getText(commentRange); + + newDocumentText = newDocumentText.replace(commentText, ''); + } + + break; + } + } + } + } + + const constructor = phpClass.getConstructor(); + + if (constructor) { + if (constructor.ast.body?.children.length <= 1) { + const constructorRange = new vscode.Range( + new vscode.Position(constructor.ast.loc.start.line - 1, 0), + new vscode.Position(constructor.ast.loc.end.line, 0) + ); + + const constructorText = document.getText(constructorRange); + + newDocumentText = newDocumentText.replace(constructorText, ''); + } else { + for (let i = 0; i < constructor.ast.arguments.length; i++) { + const node = constructor.ast.arguments[i]; + + if (node.name?.name == property.getName()) { + const constructorText = constructor.ast.loc.source; + const regexp = new RegExp(`(,\\s*(?!.*,))?${escapeForRegExp(node.loc.source)}(\\s*,\\s*)?`); + const newConstructorText = constructorText.replace(regexp, ''); + newDocumentText = newDocumentText.replace(constructorText, newConstructorText); + break; + } + } + + for (let i = 0; i < constructor.ast.body?.children.length; i++) { + const node = constructor.ast.body.children[i]; + + if (node.kind === 'expressionstatement' + && node.expression.kind === 'assign' + && node.expression.left.kind === 'propertylookup' + && node.expression.left.offset.name === property.getName() + ) { + const propertyAssignmentRange = new vscode.Range( + new vscode.Position(node.loc.start.line - 1, 0), + new vscode.Position(node.loc.end.line, 0) + ); + + const propertyAssignmentText = document.getText(propertyAssignmentRange); + + newDocumentText = newDocumentText.replace(propertyAssignmentText, ''); + break; + } + } + } + } + + if (newDocumentText === document.getText()) { + return; + } + + vscode.window.activeTextEditor?.edit( + editBuilder => { + editBuilder.replace(phpClassRange, newDocumentText); + }, + { + undoStopBefore: true, + undoStopAfter: false + } + ); +} diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..5e63c23 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,122 @@ +import * as vscode from 'vscode'; + +export function getVisibilityChoice(defaultValue: string): string { + let visibilityChoices = ['public', 'protected', 'private']; + if (visibilityChoices.indexOf(defaultValue) !== -1) { + visibilityChoices.splice(visibilityChoices.indexOf(defaultValue), 1); + } + return `|${[defaultValue, ...visibilityChoices].join(',')}|`; +} + +export function breakConstructorIntoMultiline(text: string): string { + if (config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.enabled') !== true) { + return text; + } + + const regex = /(.*__construct\s*)\(((?:\s|\S)*?)(?=\))\s*\)\s*{/; + const match = regex.exec(text); + + if (match) { + const constructorLineText = match[0]; + const maxLineLength = config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.maxLineLength') as Number; + + if (constructorLineText.length > maxLineLength) { + const parametersText = match[2]; + const parameters = parametersText.split(',').map(parameter => indentText(parameter.trim(), 2)); + + const multilineConstructorText = match[1] + + '(\n' + + `${parameters.join(',\n')}\n` + + indentText(') {'); + + text = text.replace(match[0], multilineConstructorText); + } + } + + return text; +} + +export function calculateIndentationLevel(index: number): number { + return Math.floor(index / configUsingResource('editor.tabSize')); +} + +export function getLineFirstNonIndentationCharacterIndex(lineText: string): number { + const tabSize = configUsingResource('editor.tabSize'); + + let index = 0; + for (let i = 0; i < lineText.length; i++) { + const char = lineText[i]; + + if (/[^\s\t]/.test(char)) { + index++; + break; + } + + index += char === "\t" ? tabSize : 1; + } + + return index; +} + +export function indentText(text: string, level: number = 1) { + /** + * Good to have + * Listen for view options changes and use these values + * https://github.com/jedmao/tabsanity-vs/blob/faa41a99ccb47c8e7717edfcbdfba4c093e670fe/TabSanity/TabOptionsListener.cs + */ + let tab = "\t"; + if (configUsingResource('editor.insertSpaces')) { + const tabSize = configUsingResource('editor.tabSize'); + tab = ' '.repeat(tabSize); + } + return tab.repeat(level) + text; +} + +export function configUsingResource(key: string): any { + const parts = key.split(/\.(.+)/, 2); + const configuration = vscode.workspace.getConfiguration( + parts[0], + vscode.window.activeTextEditor?.document.uri + ); + + return parts[1] ? configuration.get(parts[1]) : configuration; +} + +export function config(key: string) { + return vscode.workspace.getConfiguration().get(key); +} + +export function escapeForRegExp(text: string): string { + return text.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); +} + +export function escapeForSnippet(text: string): string { + return text.replace(/(? { + editBuilder.replace(range, "\n".repeat(rangeLines)); + }, + { + undoStopBefore: true, + undoStopAfter: false + } + ).then(() => { + const editor = vscode.window.activeTextEditor; + + if (editor) { + editor.insertSnippet( + new vscode.SnippetString(snippet), + range, + { + undoStopBefore: false, + undoStopAfter: false, + } + ); + } + }); +} From cea7576eb40e0459ab5f10d56017db423643a97d Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 14 Jun 2020 18:39:22 +0200 Subject: [PATCH 07/41] Allow to configure the context menu commands --- README.md | 5 ++++- package.json | 35 +++++++++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c6fe9a2..6fb8b39 100644 --- a/README.md +++ b/README.md @@ -53,4 +53,7 @@ This extension contributes the following settings: * `phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.enabled`: Specifies whether to break the constructor into multiple lines if the given line length is exceeded * `phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.maxLineLength`: Specifies the maximum line length before using a multiline constructor * `phpAddProperty.showMessagesOnStatusBar`: Specifies whether to show messages on status bar instead of notification box -* `phpAddProperty.showContextMenuOptions`: Specifies whether to show the context menu options +* `phpAddProperty.contextMenuOptions.enable`: Specifies whether to show the context menu options +* `phpAddProperty.contextMenuOptions.addProperty`: Specifies whether to show the add property command in the context menu options +* `phpAddProperty.contextMenuOptions.appendProperty`: Specifies whether to show the append property command in the context menu options +* `phpAddProperty.contextMenuOptions.removeProperty`: Specifies whether to show the remove property command in the context menu options diff --git a/package.json b/package.json index 629e4c1..2698997 100644 --- a/package.json +++ b/package.json @@ -44,26 +44,38 @@ ], "menus": { "commandPalette": [ + { + "command": "phpAddProperty.add", + "when": "editorLangId == php" + }, { "command": "phpAddProperty.append", "when": "editorLangId == php" + }, + { + "command": "phpAddProperty.remove", + "when": "editorLangId == php" + }, + { + "command": "phpAddProperty.breakConstructorIntoMultiline", + "when": "editorLangId == php" } ], "editor/context": [ { - "when": "resourceLangId == php && config.phpAddProperty.showContextMenuOptions", + "when": "resourceLangId == php && config.phpAddProperty.contextMenuOptions.enable && config.phpAddProperty.contextMenuOptions.addProperty", "command": "phpAddProperty.add", "alt": "phpAddProperty.add", "group": "0_phpAddProperty@1" }, { - "when": "resourceLangId == php && config.phpAddProperty.showContextMenuOptions", + "when": "resourceLangId == php && config.phpAddProperty.contextMenuOptions.enable && config.phpAddProperty.contextMenuOptions.appendProperty", "command": "phpAddProperty.append", "alt": "phpAddProperty.append", "group": "0_phpAddProperty@2" }, { - "when": "resourceLangId == php && config.phpAddProperty.showContextMenuOptions", + "when": "resourceLangId == php && config.phpAddProperty.contextMenuOptions.enable && config.phpAddProperty.contextMenuOptions.removeProperty", "command": "phpAddProperty.remove", "alt": "phpAddProperty.remove", "group": "0_phpAddProperty@3" @@ -169,10 +181,25 @@ "default": false, "description": "Specifies whether to show messages on status bar instead of notification box" }, - "phpAddProperty.showContextMenuOptions": { + "phpAddProperty.contextMenuOptions.enable": { "type": "boolean", "default": false, "description": "Specifies whether to show the context menu options" + }, + "phpAddProperty.contextMenuOptions.addProperty": { + "type": "boolean", + "default": true, + "description": "Specifies whether to show the add property command in the context menu options" + }, + "phpAddProperty.contextMenuOptions.appendProperty": { + "type": "boolean", + "default": true, + "description": "Specifies whether to show the append property command in the context menu options" + }, + "phpAddProperty.contextMenuOptions.removeProperty": { + "type": "boolean", + "default": true, + "description": "Specifies whether to show the remove property command in the context menu options" } } } From 6c33f79660e9775d1520fbd8348931a22787686a Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 14 Jun 2020 21:02:29 +0200 Subject: [PATCH 08/41] Add a command to break constructor into multiline --- README.md | 1 + out/extension.js | 45 +++++ out/extension.js.map | 2 +- out/removeProperty.js | 2 +- out/removeProperty.js.map | 2 +- .../inputs/Constructor.php | 14 ++ .../outputs/Constructor.php | 15 ++ .../breakConstructorIntoMultiline.test.js | 50 +++++ .../breakConstructorIntoMultiline.test.js.map | 1 + out/utils.js | 45 +++-- out/utils.js.map | 2 +- package.json | 18 +- src/extension.ts | 63 ++++++ src/removeProperty.ts | 2 +- .../breakConstructorIntoMultiline.test.ts | 48 +++++ src/utils.ts | 181 ++++++++++-------- 16 files changed, 390 insertions(+), 101 deletions(-) create mode 100644 out/test/fixtures/breakConstructorIntoMultiline/inputs/Constructor.php create mode 100644 out/test/fixtures/breakConstructorIntoMultiline/outputs/Constructor.php create mode 100644 out/test/suite/breakConstructorIntoMultiline.test.js create mode 100644 out/test/suite/breakConstructorIntoMultiline.test.js.map create mode 100644 src/test/suite/breakConstructorIntoMultiline.test.ts diff --git a/README.md b/README.md index 6fb8b39..2b73d5e 100644 --- a/README.md +++ b/README.md @@ -57,3 +57,4 @@ This extension contributes the following settings: * `phpAddProperty.contextMenuOptions.addProperty`: Specifies whether to show the add property command in the context menu options * `phpAddProperty.contextMenuOptions.appendProperty`: Specifies whether to show the append property command in the context menu options * `phpAddProperty.contextMenuOptions.removeProperty`: Specifies whether to show the remove property command in the context menu options +* `phpAddProperty.contextMenuOptions.breakConstructorIntoMultiline`: Specifies whether to show the break constructor into multiline command in the context menu options diff --git a/out/extension.js b/out/extension.js index 2a46a2d..41487ad 100644 --- a/out/extension.js +++ b/out/extension.js @@ -15,6 +15,7 @@ const locator_1 = require("./locator"); const property_1 = require("./property"); const insertProperty_1 = require("./insertProperty"); const removeProperty_1 = require("./removeProperty"); +const utils_1 = require("./utils"); function activate(context) { context.subscriptions.push(vscode.commands.registerCommand('phpAddProperty.add', () => __awaiter(this, void 0, void 0, function* () { if (vscode.window.activeTextEditor === undefined) { @@ -183,6 +184,50 @@ function activate(context) { } const property = new property_1.default(propertyName); removeProperty_1.removeProperty(vscode.window.activeTextEditor, property, phpClass); + })), vscode.commands.registerCommand('phpAddProperty.breakConstructorIntoMultiline', () => __awaiter(this, void 0, void 0, function* () { + var _w; + if (vscode.window.activeTextEditor === undefined) { + return; + } + const document = vscode.window.activeTextEditor.document; + const phpEngine = new php_parser_1.default({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + const ast = phpEngine.parseCode(document.getText()); + const locator = new locator_1.default(ast); + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + const phpClass = locator.findClass(selectionLineNumber + 1); + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + return; + } + const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); + const newDocumentText = utils_1.forceBreakConstructorIntoMultiline(document.getText(phpClassRange)); + if (newDocumentText === document.getText(phpClassRange)) { + return; + } + (_w = vscode.window.activeTextEditor) === null || _w === void 0 ? void 0 : _w.edit(editBuilder => { + editBuilder.replace(phpClassRange, newDocumentText); + }, { + undoStopBefore: true, + undoStopAfter: false + }); }))); } exports.activate = activate; diff --git a/out/extension.js.map b/out/extension.js.map index 5b5f59c..6069f3c 100644 --- a/out/extension.js.map +++ b/out/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/removeProperty.js b/out/removeProperty.js index d3b3ee5..c99bea5 100644 --- a/out/removeProperty.js +++ b/out/removeProperty.js @@ -69,7 +69,7 @@ function removeProperty(editor, property, phpClass) { } } } - if (newDocumentText === document.getText()) { + if (newDocumentText === document.getText(phpClassRange)) { return; } (_f = vscode.window.activeTextEditor) === null || _f === void 0 ? void 0 : _f.edit(editBuilder => { diff --git a/out/removeProperty.js.map b/out/removeProperty.js.map index 16d681a..4814f38 100644 --- a/out/removeProperty.js.map +++ b/out/removeProperty.js.map @@ -1 +1 @@ -{"version":3,"file":"removeProperty.js","sourceRoot":"","sources":["../src/removeProperty.ts"],"names":[],"mappings":";;AAAA,iCAAiC;AAGjC,mCAA0C;AAE1C,SAAgB,cAAc,CAAC,MAAyB,EAAE,QAAkB,EAAE,QAAe;;IAC5F,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,KAAK,CACrC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EACnF,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAC/E,CAAC;IAEF,IAAI,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEtD,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAE7B,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAChD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAExC,IAAI,OAAA,YAAY,CAAC,IAAI,0CAAE,IAAI,MAAK,QAAQ,CAAC,OAAO,EAAE,EAAE;oBACnD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;wBACjC,MAAM,gBAAgB,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM;4BACnD,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;4BACxC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;wBACrB,MAAM,sBAAsB,GAAG,IAAI,MAAM,CAAC,KAAK,CAC9C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,EAC/C,IAAI,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC,CACxC,CAAC;wBAEF,MAAM,qBAAqB,GAAG,QAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;wBAEvE,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;qBACrE;yBAAM;wBACN,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,kBAAkB,uBAAe,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;wBACpG,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;qBACtD;oBAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAG,IAAI,CAAC,eAAe,0CAAE,MAAM,CAAA,EAAE,CAAC,EAAE,EAAE;wBACtD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;wBAE5C,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,KAAK,CACpC,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,EACtD,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAChD,CAAC;wBAEF,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;wBAEnD,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;qBAC3D;oBAED,MAAM;iBACN;aACD;SACD;KACD;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;IAE9C,IAAI,WAAW,EAAE;QAChB,IAAI,OAAA,WAAW,CAAC,GAAG,CAAC,IAAI,0CAAE,QAAQ,CAAC,MAAM,KAAI,CAAC,EAAE;YAC/C,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,KAAK,CACxC,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,EAC1D,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CACpD,CAAC;YAEF,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAE3D,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;SAC/D;aAAM;YACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC1D,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAE1C,IAAI,OAAA,IAAI,CAAC,IAAI,0CAAE,IAAI,KAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;oBAC1C,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;oBACnD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,kBAAkB,uBAAe,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;oBAC5F,MAAM,kBAAkB,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBAC/D,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;oBAC/E,MAAM;iBACN;aACD;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAG,WAAW,CAAC,GAAG,CAAC,IAAI,0CAAE,QAAQ,CAAC,MAAM,CAAA,EAAE,CAAC,EAAE,EAAE;gBAC/D,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAE9C,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB;uBACnC,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ;uBACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB;uBAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,EAAE,EACzD;oBACD,MAAM,uBAAuB,GAAG,IAAI,MAAM,CAAC,KAAK,CAC/C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,EAC/C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CACzC,CAAC;oBAEF,MAAM,sBAAsB,GAAG,QAAQ,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;oBAEzE,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;oBACtE,MAAM;iBACN;aACD;SACD;KACD;IAED,IAAI,eAAe,KAAK,QAAQ,CAAC,OAAO,EAAE,EAAE;QAC3C,OAAO;KACP;IAED,MAAA,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,IAAI,CACnC,WAAW,CAAC,EAAE;QACb,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IACrD,CAAC,EACD;QACC,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,KAAK;KACpB,EACA;AACH,CAAC;AAlHD,wCAkHC"} \ No newline at end of file +{"version":3,"file":"removeProperty.js","sourceRoot":"","sources":["../src/removeProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/breakConstructorIntoMultiline/inputs/Constructor.php b/out/test/fixtures/breakConstructorIntoMultiline/inputs/Constructor.php new file mode 100644 index 0000000..2349ad4 --- /dev/null +++ b/out/test/fixtures/breakConstructorIntoMultiline/inputs/Constructor.php @@ -0,0 +1,14 @@ +rank = $rank; + } +} diff --git a/out/test/fixtures/breakConstructorIntoMultiline/outputs/Constructor.php b/out/test/fixtures/breakConstructorIntoMultiline/outputs/Constructor.php new file mode 100644 index 0000000..4b9d352 --- /dev/null +++ b/out/test/fixtures/breakConstructorIntoMultiline/outputs/Constructor.php @@ -0,0 +1,15 @@ +rank = $rank; + } +} diff --git a/out/test/suite/breakConstructorIntoMultiline.test.js b/out/test/suite/breakConstructorIntoMultiline.test.js new file mode 100644 index 0000000..0cc9c03 --- /dev/null +++ b/out/test/suite/breakConstructorIntoMultiline.test.js @@ -0,0 +1,50 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const vscode = require("vscode"); +const path = require("path"); +const assert = require("assert"); +const fs = require("fs"); +const utils_1 = require("./utils"); +const testFolderRelativeLocation = '/../fixtures/breakConstructorIntoMultiline/'; +suite('Customizations', function () { + setup(() => __awaiter(this, void 0, void 0, function* () { + yield utils_1.resetDefaultSettings(); + })); + teardown(() => __awaiter(this, void 0, void 0, function* () { + yield utils_1.resetDefaultSettings(); + })); + test('Should break the constructor into multiline regardless of the settings', () => __awaiter(this, void 0, void 0, function* () { + yield vscode.workspace.getConfiguration('phpAddProperty').update('constructor.breakIntoMultilineIfLengthExceeded.enabled', false, true); + yield vscode.workspace.getConfiguration('phpAddProperty').update('constructor.breakIntoMultilineIfLengthExceeded.maxLineLength', 999, true); + yield runFixture('Constructor.php'); + })); +}); +function runFixture(fileName) { + return __awaiter(this, void 0, void 0, function* () { + const uri = vscode.Uri.file(getInputFilePath(fileName)); + const document = yield vscode.workspace.openTextDocument(uri); + yield vscode.window.showTextDocument(document); + yield vscode.commands.executeCommand('phpAddProperty.breakConstructorIntoMultiline'); + const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); + yield utils_1.delay(utils_1.waitToAssertInSeconds, () => { + var _a; + assert.strictEqual((_a = vscode.window.activeTextEditor) === null || _a === void 0 ? void 0 : _a.document.getText(), expectedText); + }); + }); +} +function getInputFilePath(name) { + return path.join(__dirname + testFolderRelativeLocation + `inputs/${name}`); +} +function getOutputFilePath(name) { + return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); +} +//# sourceMappingURL=breakConstructorIntoMultiline.test.js.map \ No newline at end of file diff --git a/out/test/suite/breakConstructorIntoMultiline.test.js.map b/out/test/suite/breakConstructorIntoMultiline.test.js.map new file mode 100644 index 0000000..4a65e63 --- /dev/null +++ b/out/test/suite/breakConstructorIntoMultiline.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"breakConstructorIntoMultiline.test.js","sourceRoot":"","sources":["../../../src/test/suite/breakConstructorIntoMultiline.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAiC;AACjC,6BAA6B;AAC7B,iCAAiC;AACjC,yBAAyB;AACzB,mCAA6E;AAE7E,MAAM,0BAA0B,GAAG,6CAA6C,CAAC;AAEjF,KAAK,CAAC,gBAAgB,EAAE;IACpB,KAAK,CAAC,GAAS,EAAE;QACb,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAS,EAAE;QAChB,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,wEAAwE,EAAE,GAAS,EAAE;QACtF,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,wDAAwD,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACxI,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,8DAA8D,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5I,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;IACxC,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,SAAe,UAAU,CAAC,QAAgB;;QACtC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CACvB,gBAAgB,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE/C,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,8CAA8C,CAAC,CAAC;QAErF,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE7E,MAAM,aAAK,CAAC,6BAAqB,EAAE,GAAG,EAAE;;YACpC,MAAM,CAAC,WAAW,OAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;IACP,CAAC;CAAA;AAED,SAAS,gBAAgB,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC"} \ No newline at end of file diff --git a/out/utils.js b/out/utils.js index e263271..d32d697 100644 --- a/out/utils.js +++ b/out/utils.js @@ -9,28 +9,43 @@ function getVisibilityChoice(defaultValue) { return `|${[defaultValue, ...visibilityChoices].join(',')}|`; } exports.getVisibilityChoice = getVisibilityChoice; +function extractConstructorParts(text) { + const regex = /(.*__construct\s*)\(((?:\s|\S)*?)(?=\))\s*\)\s*{/; + const match = regex.exec(text); + return match; +} +function getMultilineConstructorText(text, functionDefinition, parametersText) { + const parameters = parametersText.split(',').map(parameter => indentText(parameter.trim(), 2)); + const multilineConstructorText = functionDefinition + + '(\n' + + `${parameters.join(',\n')}\n` + + indentText(') {'); + return text.replace(text, multilineConstructorText); +} function breakConstructorIntoMultiline(text) { if (config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.enabled') !== true) { return text; } - const regex = /(.*__construct\s*)\(((?:\s|\S)*?)(?=\))\s*\)\s*{/; - const match = regex.exec(text); - if (match) { - const constructorLineText = match[0]; - const maxLineLength = config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.maxLineLength'); - if (constructorLineText.length > maxLineLength) { - const parametersText = match[2]; - const parameters = parametersText.split(',').map(parameter => indentText(parameter.trim(), 2)); - const multilineConstructorText = match[1] - + '(\n' - + `${parameters.join(',\n')}\n` - + indentText(') {'); - text = text.replace(match[0], multilineConstructorText); - } + const match = extractConstructorParts(text); + if (!match) { + return text; + } + const constructorLineText = match[0]; + const maxLineLength = config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.maxLineLength'); + if (constructorLineText.length <= maxLineLength) { + return text; } - return text; + return text.replace(constructorLineText, getMultilineConstructorText(constructorLineText, match[1], match[2])); } exports.breakConstructorIntoMultiline = breakConstructorIntoMultiline; +function forceBreakConstructorIntoMultiline(text) { + const match = extractConstructorParts(text); + if (!match) { + return text; + } + return text.replace(match[0], getMultilineConstructorText(match[0], match[1], match[2])); +} +exports.forceBreakConstructorIntoMultiline = forceBreakConstructorIntoMultiline; function calculateIndentationLevel(index) { return Math.floor(index / configUsingResource('editor.tabSize')); } diff --git a/out/utils.js.map b/out/utils.js.map index 866ca21..71b68aa 100644 --- a/out/utils.js.map +++ b/out/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;AAAA,iCAAiC;AAEjC,SAAgB,mBAAmB,CAAC,YAAoB;IACvD,IAAI,iBAAiB,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC3D,IAAI,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE;QACnD,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;KACrE;IACD,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC9D,CAAC;AAND,kDAMC;AAED,SAAgB,6BAA6B,CAAC,IAAY;IACzD,IAAI,MAAM,CAAC,uEAAuE,CAAC,KAAK,IAAI,EAAE;QAC7F,OAAO,IAAI,CAAC;KACZ;IAED,MAAM,KAAK,GAAG,kDAAkD,CAAC;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,KAAK,EAAE;QACV,MAAM,mBAAmB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,MAAM,CAAC,6EAA6E,CAAW,CAAC;QAEtH,IAAI,mBAAmB,CAAC,MAAM,GAAG,aAAa,EAAE;YAC/C,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAE/F,MAAM,wBAAwB,GAAG,KAAK,CAAC,CAAC,CAAC;kBACtC,KAAK;kBACL,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;kBAC7B,UAAU,CAAC,KAAK,CAAC,CAAC;YAErB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;SACxD;KACD;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AA1BD,sEA0BC;AAED,SAAgB,yBAAyB,CAAC,KAAa;IACtD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAClE,CAAC;AAFD,8DAEC;AAED,SAAgB,wCAAwC,CAAC,QAAgB;IACxE,MAAM,OAAO,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAEtD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEzB,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACzB,KAAK,EAAE,CAAC;YACR,MAAM;SACN;QAED,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;KACrC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAhBD,4FAgBC;AAED,SAAgB,UAAU,CAAC,IAAY,EAAE,QAAgB,CAAC;IACzD;;;;OAIG;IACH,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,IAAI,mBAAmB,CAAC,qBAAqB,CAAC,EAAE;QAC/C,MAAM,OAAO,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACtD,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC1B;IACD,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAZD,gCAYC;AAED,SAAgB,mBAAmB,CAAC,GAAW;;IAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CACtD,KAAK,CAAC,CAAC,CAAC,QACR,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,GAAG,CAC5C,CAAC;IAEF,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AAC/D,CAAC;AARD,kDAQC;AAED,SAAgB,MAAM,CAAC,GAAW;IACjC,OAAO,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC;AAFD,wBAEC;AAED,SAAgB,eAAe,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAFD,0CAEC;AAED,SAAgB,gBAAgB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AAC1C,CAAC;AAFD,4CAEC;AAED,SAAgB,kBAAkB,CAAC,OAAe,EAAE,KAAmB;;IACtE,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;IAErD,MAAA,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,IAAI,CACnC,WAAW,CAAC,EAAE;QACb,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACrD,CAAC,EACD;QACC,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,KAAK;KACpB,EACA,IAAI,CAAC,GAAG,EAAE;QACX,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAE9C,IAAI,MAAM,EAAE;YACX,MAAM,CAAC,aAAa,CACnB,IAAI,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EACjC,KAAK,EACL;gBACC,cAAc,EAAE,KAAK;gBACrB,aAAa,EAAE,KAAK;aACpB,CACD,CAAC;SACF;IACF,CAAC,EAAE;AACJ,CAAC;AAzBD,gDAyBC"} \ No newline at end of file +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 2698997..71b5c7b 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,8 @@ "onLanguage:php", "onCommand:phpAddProperty.add", "onCommand:phpAddProperty.append", - "onCommand:phpAddProperty.remove" + "onCommand:phpAddProperty.remove", + "onCommand:phpAddProperty.breakConstructorIntoMultiline" ], "main": "./out/extension.js", "contributes": { @@ -40,6 +41,10 @@ { "command": "phpAddProperty.remove", "title": "Remove Existing PHP Property" + }, + { + "command": "phpAddProperty.breakConstructorIntoMultiline", + "title": "Break Constructor Into Multiline" } ], "menus": { @@ -79,6 +84,12 @@ "command": "phpAddProperty.remove", "alt": "phpAddProperty.remove", "group": "0_phpAddProperty@3" + }, + { + "when": "resourceLangId == php && config.phpAddProperty.contextMenuOptions.enable && config.phpAddProperty.contextMenuOptions.breakConstructorIntoMultiline", + "command": "phpAddProperty.breakConstructorIntoMultiline", + "alt": "phpAddProperty.breakConstructorIntoMultiline", + "group": "0_phpAddProperty@4" } ] }, @@ -200,6 +211,11 @@ "type": "boolean", "default": true, "description": "Specifies whether to show the remove property command in the context menu options" + }, + "phpAddProperty.contextMenuOptions.breakConstructorIntoMultiline": { + "type": "boolean", + "default": true, + "description": "Specifies whether to show the break constructor into multiline command in the context menu options" } } } diff --git a/src/extension.ts b/src/extension.ts index b18ab23..2706e70 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -4,6 +4,7 @@ import Locator from './locator'; import Property from './property'; import insertProperty from './insertProperty'; import { removeProperty } from './removeProperty'; +import { forceBreakConstructorIntoMultiline } from './utils'; export function activate(context: vscode.ExtensionContext) { context.subscriptions.push( @@ -229,6 +230,68 @@ export function activate(context: vscode.ExtensionContext) { const property = new Property(propertyName); removeProperty(vscode.window.activeTextEditor, property, phpClass); + }), + vscode.commands.registerCommand('phpAddProperty.breakConstructorIntoMultiline', async () => { + if (vscode.window.activeTextEditor === undefined) { + return; + } + + const document = vscode.window.activeTextEditor.document; + + const phpEngine = new PhpEngine({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + + const ast = phpEngine.parseCode(document.getText()); + + const locator = new Locator(ast); + + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + + const phpClass = locator.findClass(selectionLineNumber + 1); + + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + + return; + } + + const phpClassRange = new vscode.Range( + new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), + new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column) + ); + + const newDocumentText = forceBreakConstructorIntoMultiline(document.getText(phpClassRange)); + + if (newDocumentText === document.getText(phpClassRange)) { + return; + } + + vscode.window.activeTextEditor?.edit( + editBuilder => { + editBuilder.replace(phpClassRange, newDocumentText); + }, + { + undoStopBefore: true, + undoStopAfter: false + } + ); }) ); } diff --git a/src/removeProperty.ts b/src/removeProperty.ts index d5e2b22..97c97fa 100644 --- a/src/removeProperty.ts +++ b/src/removeProperty.ts @@ -104,7 +104,7 @@ export function removeProperty(editor: vscode.TextEditor, property: Property, ph } } - if (newDocumentText === document.getText()) { + if (newDocumentText === document.getText(phpClassRange)) { return; } diff --git a/src/test/suite/breakConstructorIntoMultiline.test.ts b/src/test/suite/breakConstructorIntoMultiline.test.ts new file mode 100644 index 0000000..06f4d29 --- /dev/null +++ b/src/test/suite/breakConstructorIntoMultiline.test.ts @@ -0,0 +1,48 @@ +import * as vscode from 'vscode'; +import * as path from 'path'; +import * as assert from 'assert'; +import * as fs from 'fs'; +import { waitToAssertInSeconds, delay, resetDefaultSettings } from './utils'; + +const testFolderRelativeLocation = '/../fixtures/breakConstructorIntoMultiline/'; + +suite('Customizations', function () { + setup(async () => { + await resetDefaultSettings(); + }); + + teardown(async () => { + await resetDefaultSettings(); + }); + + test('Should break the constructor into multiline regardless of the settings', async () => { + await vscode.workspace.getConfiguration('phpAddProperty').update('constructor.breakIntoMultilineIfLengthExceeded.enabled', false, true); + await vscode.workspace.getConfiguration('phpAddProperty').update('constructor.breakIntoMultilineIfLengthExceeded.maxLineLength', 999, true); + await runFixture('Constructor.php'); + }); +}); + +async function runFixture(fileName: string) { + const uri = vscode.Uri.file( + getInputFilePath(fileName) + ); + const document = await vscode.workspace.openTextDocument(uri); + await vscode.window.showTextDocument(document); + + await vscode.commands.executeCommand('phpAddProperty.breakConstructorIntoMultiline'); + + const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); + + await delay(waitToAssertInSeconds, () => { + assert.strictEqual(vscode.window.activeTextEditor?.document.getText(), expectedText); + }); +} + +function getInputFilePath(name: string) { + return path.join(__dirname + testFolderRelativeLocation + `inputs/${name}`); +} + +function getOutputFilePath(name: string) { + return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); +} + diff --git a/src/utils.ts b/src/utils.ts index 5e63c23..253cdf5 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,122 +1,143 @@ import * as vscode from 'vscode'; export function getVisibilityChoice(defaultValue: string): string { - let visibilityChoices = ['public', 'protected', 'private']; - if (visibilityChoices.indexOf(defaultValue) !== -1) { - visibilityChoices.splice(visibilityChoices.indexOf(defaultValue), 1); - } - return `|${[defaultValue, ...visibilityChoices].join(',')}|`; + let visibilityChoices = ['public', 'protected', 'private']; + if (visibilityChoices.indexOf(defaultValue) !== -1) { + visibilityChoices.splice(visibilityChoices.indexOf(defaultValue), 1); + } + return `|${[defaultValue, ...visibilityChoices].join(',')}|`; +} + +function extractConstructorParts(text: string): RegExpExecArray | null { + const regex = /(.*__construct\s*)\(((?:\s|\S)*?)(?=\))\s*\)\s*{/; + const match = regex.exec(text); + + return match; +} + +function getMultilineConstructorText(text: string, functionDefinition: string, parametersText: string) { + const parameters = parametersText.split(',').map(parameter => indentText(parameter.trim(), 2)); + + const multilineConstructorText = functionDefinition + + '(\n' + + `${parameters.join(',\n')}\n` + + indentText(') {'); + + return text.replace(text, multilineConstructorText); } export function breakConstructorIntoMultiline(text: string): string { - if (config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.enabled') !== true) { - return text; - } + if (config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.enabled') !== true) { + return text; + } + + const match = extractConstructorParts(text); - const regex = /(.*__construct\s*)\(((?:\s|\S)*?)(?=\))\s*\)\s*{/; - const match = regex.exec(text); + if (!match) { + return text; + } - if (match) { - const constructorLineText = match[0]; - const maxLineLength = config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.maxLineLength') as Number; + const constructorLineText = match[0]; + const maxLineLength = config('phpAddProperty.constructor.breakIntoMultilineIfLengthExceeded.maxLineLength') as Number; - if (constructorLineText.length > maxLineLength) { - const parametersText = match[2]; - const parameters = parametersText.split(',').map(parameter => indentText(parameter.trim(), 2)); + if (constructorLineText.length <= maxLineLength) { + return text; + } + + return text.replace(constructorLineText, getMultilineConstructorText(constructorLineText, match[1], match[2])); +} - const multilineConstructorText = match[1] - + '(\n' - + `${parameters.join(',\n')}\n` - + indentText(') {'); +export function forceBreakConstructorIntoMultiline(text: string): string { + const match = extractConstructorParts(text); - text = text.replace(match[0], multilineConstructorText); - } - } + if (!match) { + return text; + } - return text; + return text.replace(match[0], getMultilineConstructorText(match[0], match[1], match[2])); } export function calculateIndentationLevel(index: number): number { - return Math.floor(index / configUsingResource('editor.tabSize')); + return Math.floor(index / configUsingResource('editor.tabSize')); } export function getLineFirstNonIndentationCharacterIndex(lineText: string): number { - const tabSize = configUsingResource('editor.tabSize'); + const tabSize = configUsingResource('editor.tabSize'); - let index = 0; - for (let i = 0; i < lineText.length; i++) { - const char = lineText[i]; + let index = 0; + for (let i = 0; i < lineText.length; i++) { + const char = lineText[i]; - if (/[^\s\t]/.test(char)) { - index++; - break; - } + if (/[^\s\t]/.test(char)) { + index++; + break; + } - index += char === "\t" ? tabSize : 1; - } + index += char === "\t" ? tabSize : 1; + } - return index; + return index; } export function indentText(text: string, level: number = 1) { - /** - * Good to have - * Listen for view options changes and use these values - * https://github.com/jedmao/tabsanity-vs/blob/faa41a99ccb47c8e7717edfcbdfba4c093e670fe/TabSanity/TabOptionsListener.cs - */ - let tab = "\t"; - if (configUsingResource('editor.insertSpaces')) { - const tabSize = configUsingResource('editor.tabSize'); - tab = ' '.repeat(tabSize); - } - return tab.repeat(level) + text; + /** + * Good to have + * Listen for view options changes and use these values + * https://github.com/jedmao/tabsanity-vs/blob/faa41a99ccb47c8e7717edfcbdfba4c093e670fe/TabSanity/TabOptionsListener.cs + */ + let tab = "\t"; + if (configUsingResource('editor.insertSpaces')) { + const tabSize = configUsingResource('editor.tabSize'); + tab = ' '.repeat(tabSize); + } + return tab.repeat(level) + text; } export function configUsingResource(key: string): any { - const parts = key.split(/\.(.+)/, 2); - const configuration = vscode.workspace.getConfiguration( - parts[0], - vscode.window.activeTextEditor?.document.uri - ); + const parts = key.split(/\.(.+)/, 2); + const configuration = vscode.workspace.getConfiguration( + parts[0], + vscode.window.activeTextEditor?.document.uri + ); - return parts[1] ? configuration.get(parts[1]) : configuration; + return parts[1] ? configuration.get(parts[1]) : configuration; } export function config(key: string) { - return vscode.workspace.getConfiguration().get(key); + return vscode.workspace.getConfiguration().get(key); } export function escapeForRegExp(text: string): string { - return text.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); + return text.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); } export function escapeForSnippet(text: string): string { - return text.replace(/(? { - editBuilder.replace(range, "\n".repeat(rangeLines)); - }, - { - undoStopBefore: true, - undoStopAfter: false - } - ).then(() => { - const editor = vscode.window.activeTextEditor; - - if (editor) { - editor.insertSnippet( - new vscode.SnippetString(snippet), - range, - { - undoStopBefore: false, - undoStopAfter: false, - } - ); - } - }); + const rangeLines = range.end.line - range.start.line; + + vscode.window.activeTextEditor?.edit( + editBuilder => { + editBuilder.replace(range, "\n".repeat(rangeLines)); + }, + { + undoStopBefore: true, + undoStopAfter: false + } + ).then(() => { + const editor = vscode.window.activeTextEditor; + + if (editor) { + editor.insertSnippet( + new vscode.SnippetString(snippet), + range, + { + undoStopBefore: false, + undoStopAfter: false, + } + ); + } + }); } From 6bfa29ebbe0e1a27b985d83d1b1d726555f07d77 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 14 Jun 2020 21:26:34 +0200 Subject: [PATCH 09/41] Try to improve extension discovery --- package.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 71b5c7b..c737adb 100644 --- a/package.json +++ b/package.json @@ -10,14 +10,17 @@ }, "categories": [ "Programming Languages", - "Snippets" + "Snippets", + "Formatters" ], "keywords": [ "php", "autocompletion", - "help", + "refactor", "constructor", - "property" + "property", + "class", + "help" ], "icon": "images/icon.png", "activationEvents": [ From ab2e8705cf9c0df1dd260266a42acc186f453bfd Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 20 Jun 2020 14:48:51 +0200 Subject: [PATCH 10/41] Disable linter --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c737adb..3b1cb2b 100644 --- a/package.json +++ b/package.json @@ -228,7 +228,7 @@ "compile": "tsc -p ./", "lint": "eslint src --ext ts", "watch": "tsc -watch -p ./", - "pretest": "npm run compile && npm run lint", + "pretest": "npm run compile", "test": "node ./out/test/runTest.js" }, "devDependencies": { From abeca3a8a0c8f2ec430f307e6f67707d2e6b2cbf Mon Sep 17 00:00:00 2001 From: Gustavo Date: Wed, 12 Aug 2020 18:08:01 +0200 Subject: [PATCH 11/41] Decrease the minimum vscode version required --- out/test/runTest.js | 11 +++++++++++ out/test/runTest.js.map | 2 +- package.json | 2 +- src/test/runTest.ts | 15 +++++++++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/out/test/runTest.js b/out/test/runTest.js index 784a5ac..c7cd78c 100644 --- a/out/test/runTest.js +++ b/out/test/runTest.js @@ -21,6 +21,17 @@ function main() { // Passed to --extensionTestsPath const extensionTestsPath = path.resolve(__dirname, './suite/index'); const testUserDir = path.resolve(__dirname, './user'); + const vscodeCompatibilityString = require('../../package.json').engines.vscode; + const vscodeMinimumVersion = vscodeCompatibilityString.replace(/[^\d\.]/g, ''); + yield vscode_test_1.runTests({ + version: vscodeMinimumVersion, + extensionDevelopmentPath, + extensionTestsPath, + launchArgs: [ + `--user-data-dir=${testUserDir}`, + '--disable-extensions' + ] + }); yield vscode_test_1.runTests({ extensionDevelopmentPath, extensionTestsPath, diff --git a/out/test/runTest.js.map b/out/test/runTest.js.map index 9a1adc7..fde9dae 100644 --- a/out/test/runTest.js.map +++ b/out/test/runTest.js.map @@ -1 +1 @@ -{"version":3,"file":"runTest.js","sourceRoot":"","sources":["../../src/test/runTest.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,6BAA6B;AAE7B,6CAAuC;AAEvC,SAAe,IAAI;;QAClB,IAAI;YACH,4DAA4D;YAC5D,yCAAyC;YACzC,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEnE,0BAA0B;YAC1B,iCAAiC;YACjC,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YAEpE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEtD,MAAM,sBAAQ,CACb;gBACC,wBAAwB;gBACxB,kBAAkB;gBAClB,UAAU,EAAE;oBACX,mBAAmB,WAAW,EAAE;oBAChC,sBAAsB;iBACtB;aACD,CACD,CAAC;SACF;QAAC,OAAO,GAAG,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAChB;IACF,CAAC;CAAA;AAED,IAAI,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"runTest.js","sourceRoot":"","sources":["../../src/test/runTest.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,6BAA6B;AAE7B,6CAAuC;AAEvC,SAAe,IAAI;;QAClB,IAAI;YACH,4DAA4D;YAC5D,yCAAyC;YACzC,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEnE,0BAA0B;YAC1B,iCAAiC;YACjC,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YAEpE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEtD,MAAM,yBAAyB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;YAC/E,MAAM,oBAAoB,GAAG,yBAAyB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAE/E,MAAM,sBAAQ,CACb;gBACC,OAAO,EAAE,oBAAoB;gBAC7B,wBAAwB;gBACxB,kBAAkB;gBAClB,UAAU,EAAE;oBACX,mBAAmB,WAAW,EAAE;oBAChC,sBAAsB;iBACtB;aACD,CACD,CAAC;YAEF,MAAM,sBAAQ,CACb;gBACC,wBAAwB;gBACxB,kBAAkB;gBAClB,UAAU,EAAE;oBACX,mBAAmB,WAAW,EAAE;oBAChC,sBAAsB;iBACtB;aACD,CACD,CAAC;SACF;QAAC,OAAO,GAAG,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAChB;IACF,CAAC;CAAA;AAED,IAAI,EAAE,CAAC"} \ No newline at end of file diff --git a/package.json b/package.json index 3b1cb2b..171e077 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "license": "SEE LICENSE IN LICENSE", "version": "0.5.0", "engines": { - "vscode": "^1.38.0" + "vscode": "^1.31.0" }, "categories": [ "Programming Languages", diff --git a/src/test/runTest.ts b/src/test/runTest.ts index c381656..8286fa9 100644 --- a/src/test/runTest.ts +++ b/src/test/runTest.ts @@ -14,6 +14,21 @@ async function main() { const testUserDir = path.resolve(__dirname, './user'); + const vscodeCompatibilityString = require('../../package.json').engines.vscode; + const vscodeMinimumVersion = vscodeCompatibilityString.replace(/[^\d\.]/g, ''); + + await runTests( + { + version: vscodeMinimumVersion, + extensionDevelopmentPath, + extensionTestsPath, + launchArgs: [ + `--user-data-dir=${testUserDir}`, + '--disable-extensions' + ] + } + ); + await runTests( { extensionDevelopmentPath, From 56ebe65ca0bb4538ea0ede4b58f8ea31e145419f Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 15 Aug 2020 14:46:58 +0200 Subject: [PATCH 12/41] Update extension description --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 171e077..b3b186a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "php-add-property", "displayName": "PHP Add Property", - "description": "Quick way to manage PHP class properties", + "description": "Manage PHP class properties", "publisher": "kotfire", "license": "SEE LICENSE IN LICENSE", "version": "0.5.0", From ec9251e0e73f1e4c6f3a258f093dc27b2364848b Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 15 Aug 2020 16:42:09 +0200 Subject: [PATCH 13/41] Add rename property command --- out/extension.js | 77 +++++++++++- out/extension.js.map | 2 +- out/renameProperty.js | 74 +++++++++++ out/renameProperty.js.map | 1 + .../ConstructorWithMultipleProperties.php | 20 +++ ...WithMultiplePropertiesCursorInArgument.php | 20 +++ ...thMultiplePropertiesCursorInAssignment.php | 20 +++ ...plePropertiesCursorInPropertyStatement.php | 20 +++ .../inputs/ConstructorWithSingleProperty.php | 14 +++ .../ConstructorWithMultipleProperties.php | 20 +++ ...WithMultiplePropertiesCursorInArgument.php | 20 +++ ...thMultiplePropertiesCursorInAssignment.php | 20 +++ ...plePropertiesCursorInPropertyStatement.php | 20 +++ .../outputs/ConstructorWithSingleProperty.php | 14 +++ out/test/suite/renameProperty.test.js | 79 ++++++++++++ out/test/suite/renameProperty.test.js.map | 1 + package.json | 24 +++- src/extension.ts | 93 ++++++++++++++ src/renameProperty.ts | 119 ++++++++++++++++++ src/test/suite/renameProperty.test.ts | 90 +++++++++++++ 20 files changed, 742 insertions(+), 6 deletions(-) create mode 100644 out/renameProperty.js create mode 100644 out/renameProperty.js.map create mode 100644 out/test/fixtures/rename/inputs/ConstructorWithMultipleProperties.php create mode 100644 out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInArgument.php create mode 100644 out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInAssignment.php create mode 100644 out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php create mode 100644 out/test/fixtures/rename/inputs/ConstructorWithSingleProperty.php create mode 100644 out/test/fixtures/rename/outputs/ConstructorWithMultipleProperties.php create mode 100644 out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInArgument.php create mode 100644 out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInAssignment.php create mode 100644 out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php create mode 100644 out/test/fixtures/rename/outputs/ConstructorWithSingleProperty.php create mode 100644 out/test/suite/renameProperty.test.js create mode 100644 out/test/suite/renameProperty.test.js.map create mode 100644 src/renameProperty.ts create mode 100644 src/test/suite/renameProperty.test.ts diff --git a/out/extension.js b/out/extension.js index 41487ad..ba9b762 100644 --- a/out/extension.js +++ b/out/extension.js @@ -16,6 +16,7 @@ const property_1 = require("./property"); const insertProperty_1 = require("./insertProperty"); const removeProperty_1 = require("./removeProperty"); const utils_1 = require("./utils"); +const renameProperty_1 = require("./renameProperty"); function activate(context) { context.subscriptions.push(vscode.commands.registerCommand('phpAddProperty.add', () => __awaiter(this, void 0, void 0, function* () { if (vscode.window.activeTextEditor === undefined) { @@ -121,7 +122,7 @@ function activate(context) { } const property = new property_1.default(propertyName, (_g = (_f = propertyAst.type) === null || _f === void 0 ? void 0 : _f.name) !== null && _g !== void 0 ? _g : docblockType); insertProperty_1.default(vscode.window.activeTextEditor, property, phpClass, line.text); - })), vscode.commands.registerCommand('phpAddProperty.remove', () => __awaiter(this, void 0, void 0, function* () { + })), vscode.commands.registerCommand('phpAddProperty.rename', () => __awaiter(this, void 0, void 0, function* () { var _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v; if (vscode.window.activeTextEditor === undefined) { return; @@ -174,6 +175,76 @@ function activate(context) { const argumentAst = (_u = constructorArgs.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _u !== void 0 ? _u : constructorArgs[0]; propertyName = (_v = argumentAst.name) === null || _v === void 0 ? void 0 : _v.name; } + if (!propertyName) { + propertyName = yield vscode.window.showInputBox({ + placeHolder: 'Enter the property name you want to rename' + }); + } + if (propertyName === undefined || propertyName.trim() === "") { + return; + } + const property = new property_1.default(propertyName); + const newPropertyName = yield vscode.window.showInputBox({ + placeHolder: 'Enter the new property name' + }); + if (newPropertyName === undefined || newPropertyName.trim() === "") { + return; + } + const newProperty = new property_1.default(newPropertyName); + renameProperty_1.renameProperty(vscode.window.activeTextEditor, property, newProperty, phpClass); + })), vscode.commands.registerCommand('phpAddProperty.remove', () => __awaiter(this, void 0, void 0, function* () { + var _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8; + if (vscode.window.activeTextEditor === undefined) { + return; + } + const document = vscode.window.activeTextEditor.document; + const phpEngine = new php_parser_1.default({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + const ast = phpEngine.parseCode(document.getText()); + const locator = new locator_1.default(ast); + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + const phpClass = locator.findClass(selectionLineNumber); + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + return; + } + const line = document.lineAt(selectionLineNumber); + const lineAst = phpEngine.parseEval(`class A { ${line.text} }`); + const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); + let propertyName; + if (((_x = (_w = lineAst.children[0]) === null || _w === void 0 ? void 0 : _w.body[0]) === null || _x === void 0 ? void 0 : _x.kind) === 'propertystatement') { + const properties = lineAst.children[0].body[0].properties; + const propertyAst = (_y = properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _y !== void 0 ? _y : properties[0]; + propertyName = (_z = propertyAst.name) === null || _z === void 0 ? void 0 : _z.name; + if (propertyName === 'this') { + const assignmentAst = phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`); + if (((_3 = (_2 = (_1 = (_0 = assignmentAst.children[0]) === null || _0 === void 0 ? void 0 : _0.body[0]) === null || _1 === void 0 ? void 0 : _1.body) === null || _2 === void 0 ? void 0 : _2.children[0]) === null || _3 === void 0 ? void 0 : _3.kind) === 'expressionstatement') { + propertyName = (_4 = assignmentAst.children[0].body[0].body.children[0].expression.right) === null || _4 === void 0 ? void 0 : _4.name; + } + } + } + else if (((_6 = (_5 = lineAst.children[0]) === null || _5 === void 0 ? void 0 : _5.body[0]) === null || _6 === void 0 ? void 0 : _6.kind) === 'method') { + const constructorArgs = lineAst.children[0].body[0].arguments; + const argumentAst = (_7 = constructorArgs.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _7 !== void 0 ? _7 : constructorArgs[0]; + propertyName = (_8 = argumentAst.name) === null || _8 === void 0 ? void 0 : _8.name; + } if (!propertyName) { propertyName = yield vscode.window.showInputBox({ placeHolder: 'Enter the property name you want to remove' @@ -185,7 +256,7 @@ function activate(context) { const property = new property_1.default(propertyName); removeProperty_1.removeProperty(vscode.window.activeTextEditor, property, phpClass); })), vscode.commands.registerCommand('phpAddProperty.breakConstructorIntoMultiline', () => __awaiter(this, void 0, void 0, function* () { - var _w; + var _9; if (vscode.window.activeTextEditor === undefined) { return; } @@ -222,7 +293,7 @@ function activate(context) { if (newDocumentText === document.getText(phpClassRange)) { return; } - (_w = vscode.window.activeTextEditor) === null || _w === void 0 ? void 0 : _w.edit(editBuilder => { + (_9 = vscode.window.activeTextEditor) === null || _9 === void 0 ? void 0 : _9.edit(editBuilder => { editBuilder.replace(phpClassRange, newDocumentText); }, { undoStopBefore: true, diff --git a/out/extension.js.map b/out/extension.js.map index 6069f3c..9a93884 100644 --- a/out/extension.js.map +++ b/out/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/renameProperty.js b/out/renameProperty.js new file mode 100644 index 0000000..11b42fc --- /dev/null +++ b/out/renameProperty.js @@ -0,0 +1,74 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const vscode = require("vscode"); +function renameProperty(editor, property, newProperty, phpClass) { + var _a, _b, _c, _d, _e, _f; + const document = editor.document; + const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); + let newDocumentText = document.getText(phpClassRange); + const astClassBody = phpClass.ast.body; + for (let i = 0; i < astClassBody.length; i++) { + const node = astClassBody[i]; + if (node.kind === 'propertystatement') { + for (let j = 0; j < node.properties.length; j++) { + const propertyNode = node.properties[j]; + if (((_a = propertyNode.name) === null || _a === void 0 ? void 0 : _a.name) === property.getName()) { + const propertyStatementRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0)); + const propertyStatementText = document.getText(propertyStatementRange); + const newPropertyStatementText = propertyStatementText.replace(property.getName(), newProperty.getName()); + newDocumentText = newDocumentText.replace(propertyStatementText, newPropertyStatementText); + break; + } + } + } + } + const constructor = phpClass.getConstructor(); + if (constructor) { + if (((_b = constructor.ast.body) === null || _b === void 0 ? void 0 : _b.children.length) == 1) { + const node = constructor.ast.arguments[0]; + if (((_c = node.name) === null || _c === void 0 ? void 0 : _c.name) == property.getName()) { + const constructorText = constructor.ast.loc.source; + const newConstructorText = constructorText.replace(`\$${property.getName()}`, `\$${newProperty.getName()}`); + newDocumentText = newDocumentText.replace(constructorText, newConstructorText); + } + } + else { + for (let i = 0; i < constructor.ast.arguments.length; i++) { + const node = constructor.ast.arguments[i]; + if (((_d = node.name) === null || _d === void 0 ? void 0 : _d.name) == property.getName()) { + const constructorText = constructor.ast.loc.source; + const newConstructorText = constructorText.replace(`\$${property.getName()},`, `\$${newProperty.getName()},`); + newDocumentText = newDocumentText.replace(constructorText, newConstructorText); + break; + } + } + } + for (let i = 0; i < ((_e = constructor.ast.body) === null || _e === void 0 ? void 0 : _e.children.length); i++) { + const node = constructor.ast.body.children[i]; + if (node.kind === 'expressionstatement' + && node.expression.kind === 'assign' + && node.expression.left.kind === 'propertylookup' + && node.expression.left.offset.name === property.getName()) { + const propertyAssignmentRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0)); + const propertyAssignmentText = document.getText(propertyAssignmentRange); + let newPropertyAssignmentText = propertyAssignmentText.replace(property.getName(), newProperty.getName()); + if (node.expression.right.kind === 'variable' && node.expression.right.name === property.getName()) { + newPropertyAssignmentText = newPropertyAssignmentText.replace(`\$${property.getName()}`, `\$${newProperty.getName()}`); + } + newDocumentText = newDocumentText.replace(propertyAssignmentText, newPropertyAssignmentText); + break; + } + } + } + if (newDocumentText === document.getText(phpClassRange)) { + return; + } + (_f = vscode.window.activeTextEditor) === null || _f === void 0 ? void 0 : _f.edit(editBuilder => { + editBuilder.replace(phpClassRange, newDocumentText); + }, { + undoStopBefore: true, + undoStopAfter: false + }); +} +exports.renameProperty = renameProperty; +//# sourceMappingURL=renameProperty.js.map \ No newline at end of file diff --git a/out/renameProperty.js.map b/out/renameProperty.js.map new file mode 100644 index 0000000..1f2e8de --- /dev/null +++ b/out/renameProperty.js.map @@ -0,0 +1 @@ +{"version":3,"file":"renameProperty.js","sourceRoot":"","sources":["../src/renameProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/rename/inputs/ConstructorWithMultipleProperties.php b/out/test/fixtures/rename/inputs/ConstructorWithMultipleProperties.php new file mode 100644 index 0000000..74d99da --- /dev/null +++ b/out/test/fixtures/rename/inputs/ConstructorWithMultipleProperties.php @@ -0,0 +1,20 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInArgument.php b/out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInArgument.php new file mode 100644 index 0000000..74d99da --- /dev/null +++ b/out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInArgument.php @@ -0,0 +1,20 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInAssignment.php b/out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInAssignment.php new file mode 100644 index 0000000..74d99da --- /dev/null +++ b/out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInAssignment.php @@ -0,0 +1,20 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php b/out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php new file mode 100644 index 0000000..74d99da --- /dev/null +++ b/out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php @@ -0,0 +1,20 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/rename/inputs/ConstructorWithSingleProperty.php b/out/test/fixtures/rename/inputs/ConstructorWithSingleProperty.php new file mode 100644 index 0000000..685bdba --- /dev/null +++ b/out/test/fixtures/rename/inputs/ConstructorWithSingleProperty.php @@ -0,0 +1,14 @@ +name = $name; + } +} diff --git a/out/test/fixtures/rename/outputs/ConstructorWithMultipleProperties.php b/out/test/fixtures/rename/outputs/ConstructorWithMultipleProperties.php new file mode 100644 index 0000000..e15b2f6 --- /dev/null +++ b/out/test/fixtures/rename/outputs/ConstructorWithMultipleProperties.php @@ -0,0 +1,20 @@ +class = $class; + $this->newName = $newName; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInArgument.php b/out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInArgument.php new file mode 100644 index 0000000..e15b2f6 --- /dev/null +++ b/out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInArgument.php @@ -0,0 +1,20 @@ +class = $class; + $this->newName = $newName; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInAssignment.php b/out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInAssignment.php new file mode 100644 index 0000000..e15b2f6 --- /dev/null +++ b/out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInAssignment.php @@ -0,0 +1,20 @@ +class = $class; + $this->newName = $newName; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php b/out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php new file mode 100644 index 0000000..e15b2f6 --- /dev/null +++ b/out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInPropertyStatement.php @@ -0,0 +1,20 @@ +class = $class; + $this->newName = $newName; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/rename/outputs/ConstructorWithSingleProperty.php b/out/test/fixtures/rename/outputs/ConstructorWithSingleProperty.php new file mode 100644 index 0000000..3b3ad90 --- /dev/null +++ b/out/test/fixtures/rename/outputs/ConstructorWithSingleProperty.php @@ -0,0 +1,14 @@ +newName = $newName; + } +} diff --git a/out/test/suite/renameProperty.test.js b/out/test/suite/renameProperty.test.js new file mode 100644 index 0000000..808270c --- /dev/null +++ b/out/test/suite/renameProperty.test.js @@ -0,0 +1,79 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const vscode = require("vscode"); +const path = require("path"); +const assert = require("assert"); +const fs = require("fs"); +const utils_1 = require("./utils"); +const testFolderRelativeLocation = '/../fixtures/rename/'; +suite('Rename Property', function () { + setup(() => __awaiter(this, void 0, void 0, function* () { + yield utils_1.resetDefaultSettings(); + })); + teardown(() => __awaiter(this, void 0, void 0, function* () { + yield utils_1.resetDefaultSettings(); + })); + test('Should rename a property by name', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithMultipleProperties.php'); + })); + test('Should rename a single property', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithSingleProperty.php'); + })); + test('Should rename a property when the cursor is placed in its statement', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithMultiplePropertiesCursorInPropertyStatement.php', new vscode.Position(9, 13)); + })); + test('Should rename a property when the cursor is placed in its constructor argument', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithMultiplePropertiesCursorInArgument.php', new vscode.Position(13, 50)); + })); + test('Should rename a property when the cursor is placed in its assignment', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithMultiplePropertiesCursorInAssignment.php', new vscode.Position(16, 18)); + })); +}); +function runFixture(fileName, cursorPosition) { + return __awaiter(this, void 0, void 0, function* () { + const uri = vscode.Uri.file(getInputFilePath(fileName)); + const document = yield vscode.workspace.openTextDocument(uri); + yield vscode.window.showTextDocument(document); + if (!vscode.window.activeTextEditor) { + return; + } + if (cursorPosition === undefined) { + let first = true; + vscode.window.showInputBox = function (options, token) { + if (first === true) { + first = false; + return Promise.resolve('name'); + } + return Promise.resolve('newName'); + }; + } + else { + vscode.window.activeTextEditor.selections = [new vscode.Selection(cursorPosition, cursorPosition)]; + vscode.window.showInputBox = function (options, token) { + return Promise.resolve('newName'); + }; + } + yield vscode.commands.executeCommand('phpAddProperty.rename'); + const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); + yield utils_1.delay(utils_1.waitToAssertInSeconds, () => { + var _a; + assert.strictEqual((_a = vscode.window.activeTextEditor) === null || _a === void 0 ? void 0 : _a.document.getText(), expectedText); + }); + }); +} +function getInputFilePath(name) { + return path.join(__dirname + testFolderRelativeLocation + `inputs/${name}`); +} +function getOutputFilePath(name) { + return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); +} +//# sourceMappingURL=renameProperty.test.js.map \ No newline at end of file diff --git a/out/test/suite/renameProperty.test.js.map b/out/test/suite/renameProperty.test.js.map new file mode 100644 index 0000000..779903c --- /dev/null +++ b/out/test/suite/renameProperty.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"renameProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/renameProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index b3b186a..c422f39 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "onLanguage:php", "onCommand:phpAddProperty.add", "onCommand:phpAddProperty.append", + "onCommand:phpAddProperty.rename", "onCommand:phpAddProperty.remove", "onCommand:phpAddProperty.breakConstructorIntoMultiline" ], @@ -41,6 +42,10 @@ "command": "phpAddProperty.append", "title": "Add Existing PHP Property" }, + { + "command": "phpAddProperty.rename", + "title": "Rename PHP Property" + }, { "command": "phpAddProperty.remove", "title": "Remove Existing PHP Property" @@ -60,6 +65,10 @@ "command": "phpAddProperty.append", "when": "editorLangId == php" }, + { + "command": "phpAddProperty.rename", + "when": "editorLangId == php" + }, { "command": "phpAddProperty.remove", "when": "editorLangId == php" @@ -82,17 +91,23 @@ "alt": "phpAddProperty.append", "group": "0_phpAddProperty@2" }, + { + "when": "resourceLangId == php && config.phpAddProperty.contextMenuOptions.enable && config.phpAddProperty.contextMenuOptions.renameProperty", + "command": "phpAddProperty.rename", + "alt": "phpAddProperty.rename", + "group": "0_phpAddProperty@3" + }, { "when": "resourceLangId == php && config.phpAddProperty.contextMenuOptions.enable && config.phpAddProperty.contextMenuOptions.removeProperty", "command": "phpAddProperty.remove", "alt": "phpAddProperty.remove", - "group": "0_phpAddProperty@3" + "group": "0_phpAddProperty@4" }, { "when": "resourceLangId == php && config.phpAddProperty.contextMenuOptions.enable && config.phpAddProperty.contextMenuOptions.breakConstructorIntoMultiline", "command": "phpAddProperty.breakConstructorIntoMultiline", "alt": "phpAddProperty.breakConstructorIntoMultiline", - "group": "0_phpAddProperty@4" + "group": "0_phpAddProperty@5" } ] }, @@ -210,6 +225,11 @@ "default": true, "description": "Specifies whether to show the append property command in the context menu options" }, + "phpAddProperty.contextMenuOptions.renameProperty": { + "type": "boolean", + "default": true, + "description": "Specifies whether to show the rename property command in the context menu options" + }, "phpAddProperty.contextMenuOptions.removeProperty": { "type": "boolean", "default": true, diff --git a/src/extension.ts b/src/extension.ts index 2706e70..bf3522b 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -5,6 +5,7 @@ import Property from './property'; import insertProperty from './insertProperty'; import { removeProperty } from './removeProperty'; import { forceBreakConstructorIntoMultiline } from './utils'; +import { renameProperty } from './renameProperty'; export function activate(context: vscode.ExtensionContext) { context.subscriptions.push( @@ -149,6 +150,98 @@ export function activate(context: vscode.ExtensionContext) { insertProperty(vscode.window.activeTextEditor, property, phpClass, line.text); }), + vscode.commands.registerCommand('phpAddProperty.rename', async () => { + if (vscode.window.activeTextEditor === undefined) { + return; + } + + const document = vscode.window.activeTextEditor.document; + + const phpEngine = new PhpEngine({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + + const ast = phpEngine.parseCode(document.getText()); + + const locator = new Locator(ast); + + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + + const phpClass = locator.findClass(selectionLineNumber); + + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + + return; + } + + const line = document.lineAt(selectionLineNumber); + + const lineAst = (phpEngine.parseEval(`class A { ${line.text} }`) as any); + + const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); + + let propertyName; + if (lineAst.children[0]?.body[0]?.kind === 'propertystatement') { + const properties = (lineAst.children[0].body[0].properties as any[]); + + const propertyAst = properties.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? properties[0]; + propertyName = propertyAst.name?.name; + + if (propertyName === 'this') { + const assignmentAst = (phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`) as any); + + if (assignmentAst.children[0]?.body[0]?.body?.children[0]?.kind === 'expressionstatement') { + propertyName = assignmentAst.children[0].body[0].body.children[0].expression.right?.name; + } + } + } else if (lineAst.children[0]?.body[0]?.kind === 'method') { + const constructorArgs = (lineAst.children[0].body[0].arguments as any[]); + + const argumentAst = constructorArgs.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? constructorArgs[0]; + propertyName = argumentAst.name?.name; + } + + if (!propertyName) { + propertyName = await vscode.window.showInputBox({ + placeHolder: 'Enter the property name you want to rename' + }); + } + + if (propertyName === undefined || propertyName.trim() === "") { + return; + } + + const property = new Property(propertyName); + + const newPropertyName = await vscode.window.showInputBox({ + placeHolder: 'Enter the new property name' + }); + + if (newPropertyName === undefined || newPropertyName.trim() === "") { + return; + } + + const newProperty = new Property(newPropertyName); + + renameProperty(vscode.window.activeTextEditor, property, newProperty, phpClass); + }), vscode.commands.registerCommand('phpAddProperty.remove', async () => { if (vscode.window.activeTextEditor === undefined) { return; diff --git a/src/renameProperty.ts b/src/renameProperty.ts new file mode 100644 index 0000000..f497e0b --- /dev/null +++ b/src/renameProperty.ts @@ -0,0 +1,119 @@ +import * as vscode from 'vscode'; +import Property from './property'; +import Class from './class'; + +export function renameProperty(editor: vscode.TextEditor, property: Property, newProperty: Property, phpClass: Class) { + const document = editor.document; + const phpClassRange = new vscode.Range( + new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), + new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column) + ); + + let newDocumentText = document.getText(phpClassRange); + + const astClassBody = phpClass.ast.body; + for (let i = 0; i < astClassBody.length; i++) { + const node = astClassBody[i]; + + if (node.kind === 'propertystatement') { + for (let j = 0; j < node.properties.length; j++) { + const propertyNode = node.properties[j]; + + if (propertyNode.name?.name === property.getName()) { + const propertyStatementRange = new vscode.Range( + new vscode.Position(node.loc.start.line - 1, 0), + new vscode.Position(node.loc.end.line, 0) + ); + + const propertyStatementText = document.getText(propertyStatementRange); + + const newPropertyStatementText = propertyStatementText.replace( + property.getName(), + newProperty.getName() + ); + + newDocumentText = newDocumentText.replace(propertyStatementText, newPropertyStatementText); + + break; + } + } + } + } + + const constructor = phpClass.getConstructor(); + + if (constructor) { + if (constructor.ast.body?.children.length == 1) { + const node = constructor.ast.arguments[0]; + + if (node.name?.name == property.getName()) { + const constructorText = constructor.ast.loc.source; + const newConstructorText = constructorText.replace( + `\$${property.getName()}`, + `\$${newProperty.getName()}` + ); + + newDocumentText = newDocumentText.replace(constructorText, newConstructorText); + } + } else { + for (let i = 0; i < constructor.ast.arguments.length; i++) { + const node = constructor.ast.arguments[i]; + + if (node.name?.name == property.getName()) { + const constructorText = constructor.ast.loc.source; + const newConstructorText = constructorText.replace( + `\$${property.getName()},`, + `\$${newProperty.getName()},` + ); + newDocumentText = newDocumentText.replace(constructorText, newConstructorText); + break; + } + } + } + + for (let i = 0; i < constructor.ast.body?.children.length; i++) { + const node = constructor.ast.body.children[i]; + + if (node.kind === 'expressionstatement' + && node.expression.kind === 'assign' + && node.expression.left.kind === 'propertylookup' + && node.expression.left.offset.name === property.getName() + ) { + const propertyAssignmentRange = new vscode.Range( + new vscode.Position(node.loc.start.line - 1, 0), + new vscode.Position(node.loc.end.line, 0) + ); + + const propertyAssignmentText = document.getText(propertyAssignmentRange); + let newPropertyAssignmentText = propertyAssignmentText.replace( + property.getName(), + newProperty.getName() + ); + + if (node.expression.right.kind === 'variable' && node.expression.right.name === property.getName()) { + newPropertyAssignmentText = newPropertyAssignmentText.replace( + `\$${property.getName()}`, + `\$${newProperty.getName()}` + ); + } + + newDocumentText = newDocumentText.replace(propertyAssignmentText, newPropertyAssignmentText); + break; + } + } + } + + if (newDocumentText === document.getText(phpClassRange)) { + return; + } + + vscode.window.activeTextEditor?.edit( + editBuilder => { + editBuilder.replace(phpClassRange, newDocumentText); + }, + { + undoStopBefore: true, + undoStopAfter: false + } + ); +} diff --git a/src/test/suite/renameProperty.test.ts b/src/test/suite/renameProperty.test.ts new file mode 100644 index 0000000..8ad1580 --- /dev/null +++ b/src/test/suite/renameProperty.test.ts @@ -0,0 +1,90 @@ +import * as vscode from 'vscode'; +import * as path from 'path'; +import * as assert from 'assert'; +import * as fs from 'fs'; +import { waitToAssertInSeconds, delay, resetDefaultSettings } from './utils'; + +const testFolderRelativeLocation = '/../fixtures/rename/'; + +suite('Rename Property', function () { + setup(async () => { + await resetDefaultSettings(); + }); + + teardown(async () => { + await resetDefaultSettings(); + }); + + test('Should rename a property by name', async () => { + await runFixture('ConstructorWithMultipleProperties.php'); + }); + + test('Should rename a single property', async () => { + await runFixture('ConstructorWithSingleProperty.php'); + }); + + test('Should rename a property when the cursor is placed in its statement', async () => { + await runFixture('ConstructorWithMultiplePropertiesCursorInPropertyStatement.php', new vscode.Position(9, 13)); + }); + + test('Should rename a property when the cursor is placed in its constructor argument', async () => { + await runFixture('ConstructorWithMultiplePropertiesCursorInArgument.php', new vscode.Position(13, 50)); + }); + + test('Should rename a property when the cursor is placed in its assignment', async () => { + await runFixture('ConstructorWithMultiplePropertiesCursorInAssignment.php', new vscode.Position(16, 18)); + }); +}); + +async function runFixture(fileName: string, cursorPosition?: vscode.Position) { + const uri = vscode.Uri.file( + getInputFilePath(fileName) + ); + const document = await vscode.workspace.openTextDocument(uri); + await vscode.window.showTextDocument(document); + + if (!vscode.window.activeTextEditor) { + return; + } + + if (cursorPosition === undefined) { + let first = true; + vscode.window.showInputBox = function ( + options?: vscode.InputBoxOptions | undefined, + token?: vscode.CancellationToken | undefined + ): Thenable { + if (first === true) { + first = false; + + return Promise.resolve('name'); + } + + return Promise.resolve('newName'); + }; + } else { + vscode.window.activeTextEditor.selections = [new vscode.Selection(cursorPosition, cursorPosition)]; + + vscode.window.showInputBox = function ( + options?: vscode.InputBoxOptions | undefined, + token?: vscode.CancellationToken | undefined + ): Thenable { + return Promise.resolve('newName'); + }; + } + + await vscode.commands.executeCommand('phpAddProperty.rename'); + + const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); + + await delay(waitToAssertInSeconds, () => { + assert.strictEqual(vscode.window.activeTextEditor?.document.getText(), expectedText); + }); +} + +function getInputFilePath(name: string) { + return path.join(__dirname + testFolderRelativeLocation + `inputs/${name}`); +} + +function getOutputFilePath(name: string) { + return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); +} From 6699ad1829385fb0c7dcb96abab9bb4b442d60cb Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 16 Aug 2020 08:14:59 +0200 Subject: [PATCH 14/41] Do not remove constructor if not empty --- out/removeProperty.js | 17 ++++++++++------- out/removeProperty.js.map | 2 +- .../inputs/ConstructorWithOtherArgument.php | 16 ++++++++++++++++ .../fixtures/remove/inputs/EmptyConstructor.php | 13 +++++++++++++ .../outputs/ConstructorWithOtherArgument.php | 14 ++++++++++++++ .../remove/outputs/EmptyConstructor.php | 8 ++++++++ ...eProperty.test.js => removeProperty.test.js} | 8 +++++++- out/test/suite/removeProperty.test.js.map | 1 + src/removeProperty.ts | 16 ++++++++++------ ...eProperty.test.ts => removeProperty.test.ts} | 8 ++++++++ 10 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 out/test/fixtures/remove/inputs/ConstructorWithOtherArgument.php create mode 100644 out/test/fixtures/remove/inputs/EmptyConstructor.php create mode 100644 out/test/fixtures/remove/outputs/ConstructorWithOtherArgument.php create mode 100644 out/test/fixtures/remove/outputs/EmptyConstructor.php rename out/test/suite/{RemoveProperty.test.js => removeProperty.test.js} (90%) create mode 100644 out/test/suite/removeProperty.test.js.map rename src/test/suite/{RemoveProperty.test.ts => removeProperty.test.ts} (90%) diff --git a/out/removeProperty.js b/out/removeProperty.js index c99bea5..82b7d40 100644 --- a/out/removeProperty.js +++ b/out/removeProperty.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const vscode = require("vscode"); const utils_1 = require("./utils"); function removeProperty(editor, property, phpClass) { - var _a, _b, _c, _d, _e, _f; + var _a, _b, _c, _d, _e, _f, _g; const document = editor.document; const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); let newDocumentText = document.getText(phpClassRange); @@ -40,14 +40,17 @@ function removeProperty(editor, property, phpClass) { const constructor = phpClass.getConstructor(); if (constructor) { if (((_c = constructor.ast.body) === null || _c === void 0 ? void 0 : _c.children.length) <= 1) { - const constructorRange = new vscode.Range(new vscode.Position(constructor.ast.loc.start.line - 1, 0), new vscode.Position(constructor.ast.loc.end.line, 0)); - const constructorText = document.getText(constructorRange); - newDocumentText = newDocumentText.replace(constructorText, ''); + const node = constructor.ast.arguments[0]; + if (constructor.ast.body.children.length == 0 || ((_d = node.name) === null || _d === void 0 ? void 0 : _d.name) == property.getName()) { + const constructorRange = new vscode.Range(new vscode.Position(constructor.ast.loc.start.line - 1, 0), new vscode.Position(constructor.ast.loc.end.line, 0)); + const constructorText = document.getText(constructorRange); + newDocumentText = newDocumentText.replace(constructorText, ''); + } } else { for (let i = 0; i < constructor.ast.arguments.length; i++) { const node = constructor.ast.arguments[i]; - if (((_d = node.name) === null || _d === void 0 ? void 0 : _d.name) == property.getName()) { + if (((_e = node.name) === null || _e === void 0 ? void 0 : _e.name) == property.getName()) { const constructorText = constructor.ast.loc.source; const regexp = new RegExp(`(,\\s*(?!.*,))?${utils_1.escapeForRegExp(node.loc.source)}(\\s*,\\s*)?`); const newConstructorText = constructorText.replace(regexp, ''); @@ -55,7 +58,7 @@ function removeProperty(editor, property, phpClass) { break; } } - for (let i = 0; i < ((_e = constructor.ast.body) === null || _e === void 0 ? void 0 : _e.children.length); i++) { + for (let i = 0; i < ((_f = constructor.ast.body) === null || _f === void 0 ? void 0 : _f.children.length); i++) { const node = constructor.ast.body.children[i]; if (node.kind === 'expressionstatement' && node.expression.kind === 'assign' @@ -72,7 +75,7 @@ function removeProperty(editor, property, phpClass) { if (newDocumentText === document.getText(phpClassRange)) { return; } - (_f = vscode.window.activeTextEditor) === null || _f === void 0 ? void 0 : _f.edit(editBuilder => { + (_g = vscode.window.activeTextEditor) === null || _g === void 0 ? void 0 : _g.edit(editBuilder => { editBuilder.replace(phpClassRange, newDocumentText); }, { undoStopBefore: true, diff --git a/out/removeProperty.js.map b/out/removeProperty.js.map index 4814f38..123f249 100644 --- a/out/removeProperty.js.map +++ b/out/removeProperty.js.map @@ -1 +1 @@ -{"version":3,"file":"removeProperty.js","sourceRoot":"","sources":["../src/removeProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"removeProperty.js","sourceRoot":"","sources":["../src/removeProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/remove/inputs/ConstructorWithOtherArgument.php b/out/test/fixtures/remove/inputs/ConstructorWithOtherArgument.php new file mode 100644 index 0000000..0ab216a --- /dev/null +++ b/out/test/fixtures/remove/inputs/ConstructorWithOtherArgument.php @@ -0,0 +1,16 @@ +class = $class; + } +} diff --git a/out/test/fixtures/remove/inputs/EmptyConstructor.php b/out/test/fixtures/remove/inputs/EmptyConstructor.php new file mode 100644 index 0000000..a59fa4c --- /dev/null +++ b/out/test/fixtures/remove/inputs/EmptyConstructor.php @@ -0,0 +1,13 @@ +class = $class; + } +} diff --git a/out/test/fixtures/remove/outputs/EmptyConstructor.php b/out/test/fixtures/remove/outputs/EmptyConstructor.php new file mode 100644 index 0000000..7bdd7bf --- /dev/null +++ b/out/test/fixtures/remove/outputs/EmptyConstructor.php @@ -0,0 +1,8 @@ + __awaiter(this, void 0, void 0, function* () { yield runFixture('ConstructorWithMultipleProperties.php'); })); + test('Should remove the constructor method when the body is empty', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('EmptyConstructor.php'); + })); test('Should remove the constructor method when the body is empty after removing the last property', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('ConstructorWithSingleProperty.php'); })); test('Should NOT remove the constructor method when the body is NOT empty after removing the last property', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('ConstructorWithOneProperty.php'); })); + test('Should NOT remove the constructor argument when the property name does not match', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithOtherArgument.php'); + })); test('Should remove typed properties', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('TypedProperty.php'); })); @@ -77,4 +83,4 @@ function getInputFilePath(name) { function getOutputFilePath(name) { return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); } -//# sourceMappingURL=RemoveProperty.test.js.map \ No newline at end of file +//# sourceMappingURL=removeProperty.test.js.map \ No newline at end of file diff --git a/out/test/suite/removeProperty.test.js.map b/out/test/suite/removeProperty.test.js.map new file mode 100644 index 0000000..c396d1e --- /dev/null +++ b/out/test/suite/removeProperty.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"removeProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/removeProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/removeProperty.ts b/src/removeProperty.ts index 97c97fa..1ca27a3 100644 --- a/src/removeProperty.ts +++ b/src/removeProperty.ts @@ -61,14 +61,18 @@ export function removeProperty(editor: vscode.TextEditor, property: Property, ph if (constructor) { if (constructor.ast.body?.children.length <= 1) { - const constructorRange = new vscode.Range( - new vscode.Position(constructor.ast.loc.start.line - 1, 0), - new vscode.Position(constructor.ast.loc.end.line, 0) - ); + const node = constructor.ast.arguments[0]; - const constructorText = document.getText(constructorRange); + if (constructor.ast.body.children.length == 0 || node.name?.name == property.getName()) { + const constructorRange = new vscode.Range( + new vscode.Position(constructor.ast.loc.start.line - 1, 0), + new vscode.Position(constructor.ast.loc.end.line, 0) + ); - newDocumentText = newDocumentText.replace(constructorText, ''); + const constructorText = document.getText(constructorRange); + + newDocumentText = newDocumentText.replace(constructorText, ''); + } } else { for (let i = 0; i < constructor.ast.arguments.length; i++) { const node = constructor.ast.arguments[i]; diff --git a/src/test/suite/RemoveProperty.test.ts b/src/test/suite/removeProperty.test.ts similarity index 90% rename from src/test/suite/RemoveProperty.test.ts rename to src/test/suite/removeProperty.test.ts index f987934..e816ce4 100644 --- a/src/test/suite/RemoveProperty.test.ts +++ b/src/test/suite/removeProperty.test.ts @@ -19,6 +19,10 @@ suite('Remove Property', function () { await runFixture('ConstructorWithMultipleProperties.php'); }); + test('Should remove the constructor method when the body is empty', async () => { + await runFixture('EmptyConstructor.php'); + }); + test('Should remove the constructor method when the body is empty after removing the last property', async () => { await runFixture('ConstructorWithSingleProperty.php'); }); @@ -26,6 +30,10 @@ suite('Remove Property', function () { test('Should NOT remove the constructor method when the body is NOT empty after removing the last property', async () => { await runFixture('ConstructorWithOneProperty.php'); }); + + test('Should NOT remove the constructor argument when the property name does not match', async () => { + await runFixture('ConstructorWithOtherArgument.php'); + }); test('Should remove typed properties', async () => { await runFixture('TypedProperty.php'); From f90f4c3330fe6fc6853717e1a9a46708bf5be588 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 16 Aug 2020 08:37:05 +0200 Subject: [PATCH 15/41] Rename all property references in the class --- out/renameProperty.js | 46 ++++++++++++++--- out/renameProperty.js.map | 2 +- .../rename/inputs/PropertyReferences.php | 36 +++++++++++++ .../rename/outputs/PropertyReferences.php | 36 +++++++++++++ out/test/suite/renameProperty.test.js | 3 ++ out/test/suite/renameProperty.test.js.map | 2 +- src/renameProperty.ts | 50 ++++++++++++++++++- src/test/suite/renameProperty.test.ts | 4 ++ 8 files changed, 170 insertions(+), 9 deletions(-) create mode 100644 out/test/fixtures/rename/inputs/PropertyReferences.php create mode 100644 out/test/fixtures/rename/outputs/PropertyReferences.php diff --git a/out/renameProperty.js b/out/renameProperty.js index 11b42fc..f1b5b75 100644 --- a/out/renameProperty.js +++ b/out/renameProperty.js @@ -2,7 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const vscode = require("vscode"); function renameProperty(editor, property, newProperty, phpClass) { - var _a, _b, _c, _d, _e, _f; + var _a, _b, _c, _d, _e; const document = editor.document; const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); let newDocumentText = document.getText(phpClassRange); @@ -24,9 +24,9 @@ function renameProperty(editor, property, newProperty, phpClass) { } const constructor = phpClass.getConstructor(); if (constructor) { - if (((_b = constructor.ast.body) === null || _b === void 0 ? void 0 : _b.children.length) == 1) { + if (constructor.ast.arguments.length == 1) { const node = constructor.ast.arguments[0]; - if (((_c = node.name) === null || _c === void 0 ? void 0 : _c.name) == property.getName()) { + if (((_b = node.name) === null || _b === void 0 ? void 0 : _b.name) == property.getName()) { const constructorText = constructor.ast.loc.source; const newConstructorText = constructorText.replace(`\$${property.getName()}`, `\$${newProperty.getName()}`); newDocumentText = newDocumentText.replace(constructorText, newConstructorText); @@ -35,7 +35,7 @@ function renameProperty(editor, property, newProperty, phpClass) { else { for (let i = 0; i < constructor.ast.arguments.length; i++) { const node = constructor.ast.arguments[i]; - if (((_d = node.name) === null || _d === void 0 ? void 0 : _d.name) == property.getName()) { + if (((_c = node.name) === null || _c === void 0 ? void 0 : _c.name) == property.getName()) { const constructorText = constructor.ast.loc.source; const newConstructorText = constructorText.replace(`\$${property.getName()},`, `\$${newProperty.getName()},`); newDocumentText = newDocumentText.replace(constructorText, newConstructorText); @@ -43,7 +43,7 @@ function renameProperty(editor, property, newProperty, phpClass) { } } } - for (let i = 0; i < ((_e = constructor.ast.body) === null || _e === void 0 ? void 0 : _e.children.length); i++) { + for (let i = 0; i < ((_d = constructor.ast.body) === null || _d === void 0 ? void 0 : _d.children.length); i++) { const node = constructor.ast.body.children[i]; if (node.kind === 'expressionstatement' && node.expression.kind === 'assign' @@ -60,10 +60,18 @@ function renameProperty(editor, property, newProperty, phpClass) { } } } + const propertyReferences = findPropertyReferences(phpClass.ast, property.getName()); + for (let i = 0; i < propertyReferences.length; i++) { + const node = propertyReferences[i]; + const propertyReferenceRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0)); + const propertyReferenceText = document.getText(propertyReferenceRange); + const newPropertyReferenceText = propertyReferenceText.replace(`this->${property.getName()}`, `this->${newProperty.getName()}`); + newDocumentText = newDocumentText.replace(propertyReferenceText, newPropertyReferenceText); + } if (newDocumentText === document.getText(phpClassRange)) { return; } - (_f = vscode.window.activeTextEditor) === null || _f === void 0 ? void 0 : _f.edit(editBuilder => { + (_e = vscode.window.activeTextEditor) === null || _e === void 0 ? void 0 : _e.edit(editBuilder => { editBuilder.replace(phpClassRange, newDocumentText); }, { undoStopBefore: true, @@ -71,4 +79,30 @@ function renameProperty(editor, property, newProperty, phpClass) { }); } exports.renameProperty = renameProperty; +function findPropertyReferences(ast, name) { + var _a; + let propertyReferences = []; + if (Array.isArray(ast)) { + for (var i = 0; i < ast.length; i++) { + const newPropertyReferences = findPropertyReferences(ast[i], name); + for (let i = 0; i < newPropertyReferences.length; i++) { + propertyReferences.push(newPropertyReferences[i]); + } + } + } + else { + if ((ast === null || ast === void 0 ? void 0 : ast.kind) === 'propertylookup' && ((_a = ast.offset) === null || _a === void 0 ? void 0 : _a.name) === name) { + return [ast]; + } + for (const node in ast) { + if (ast.hasOwnProperty(node) && ast[node] !== ast) { + const newPropertyReferences = findPropertyReferences(ast[node], name); + for (let i = 0; i < newPropertyReferences.length; i++) { + propertyReferences.push(newPropertyReferences[i]); + } + } + } + } + return propertyReferences; +} //# sourceMappingURL=renameProperty.js.map \ No newline at end of file diff --git a/out/renameProperty.js.map b/out/renameProperty.js.map index 1f2e8de..62d4e81 100644 --- a/out/renameProperty.js.map +++ b/out/renameProperty.js.map @@ -1 +1 @@ -{"version":3,"file":"renameProperty.js","sourceRoot":"","sources":["../src/renameProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"renameProperty.js","sourceRoot":"","sources":["../src/renameProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/rename/inputs/PropertyReferences.php b/out/test/fixtures/rename/inputs/PropertyReferences.php new file mode 100644 index 0000000..b4ee998 --- /dev/null +++ b/out/test/fixtures/rename/inputs/PropertyReferences.php @@ -0,0 +1,36 @@ +name = "Yoda"; + } + + public function getName(): string + { + return $this->name; + } + + public function getFormattedName(): string + { + $title = self::getTitle($this->name); + + return "{$title} {$this->name}"; + } + + public function setName(string $name) + { + $this->name = $name; + } + + public static function getTitle(string $name): string + { + return $name === "Yoda" ? "Master" : ""; + } +} diff --git a/out/test/fixtures/rename/outputs/PropertyReferences.php b/out/test/fixtures/rename/outputs/PropertyReferences.php new file mode 100644 index 0000000..cc57a21 --- /dev/null +++ b/out/test/fixtures/rename/outputs/PropertyReferences.php @@ -0,0 +1,36 @@ +newName = "Yoda"; + } + + public function getName(): string + { + return $this->newName; + } + + public function getFormattedName(): string + { + $title = self::getTitle($this->newName); + + return "{$title} {$this->newName}"; + } + + public function setName(string $name) + { + $this->newName = $name; + } + + public static function getTitle(string $name): string + { + return $name === "Yoda" ? "Master" : ""; + } +} diff --git a/out/test/suite/renameProperty.test.js b/out/test/suite/renameProperty.test.js index 808270c..61d0b7e 100644 --- a/out/test/suite/renameProperty.test.js +++ b/out/test/suite/renameProperty.test.js @@ -37,6 +37,9 @@ suite('Rename Property', function () { test('Should rename a property when the cursor is placed in its assignment', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('ConstructorWithMultiplePropertiesCursorInAssignment.php', new vscode.Position(16, 18)); })); + test('Should rename all property references', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('PropertyReferences.php'); + })); }); function runFixture(fileName, cursorPosition) { return __awaiter(this, void 0, void 0, function* () { diff --git a/out/test/suite/renameProperty.test.js.map b/out/test/suite/renameProperty.test.js.map index 779903c..b90813b 100644 --- a/out/test/suite/renameProperty.test.js.map +++ b/out/test/suite/renameProperty.test.js.map @@ -1 +1 @@ -{"version":3,"file":"renameProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/renameProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"renameProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/renameProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/renameProperty.ts b/src/renameProperty.ts index f497e0b..9268cab 100644 --- a/src/renameProperty.ts +++ b/src/renameProperty.ts @@ -43,7 +43,7 @@ export function renameProperty(editor: vscode.TextEditor, property: Property, ne const constructor = phpClass.getConstructor(); if (constructor) { - if (constructor.ast.body?.children.length == 1) { + if (constructor.ast.arguments.length == 1) { const node = constructor.ast.arguments[0]; if (node.name?.name == property.getName()) { @@ -103,6 +103,26 @@ export function renameProperty(editor: vscode.TextEditor, property: Property, ne } } + const propertyReferences = findPropertyReferences(phpClass.ast, property.getName()); + + for (let i = 0; i < propertyReferences.length; i++) { + const node = propertyReferences[i]; + + const propertyReferenceRange = new vscode.Range( + new vscode.Position(node.loc.start.line - 1, 0), + new vscode.Position(node.loc.end.line, 0) + ); + + const propertyReferenceText = document.getText(propertyReferenceRange); + + const newPropertyReferenceText = propertyReferenceText.replace( + `this->${property.getName()}`, + `this->${newProperty.getName()}` + ); + + newDocumentText = newDocumentText.replace(propertyReferenceText, newPropertyReferenceText); + } + if (newDocumentText === document.getText(phpClassRange)) { return; } @@ -117,3 +137,31 @@ export function renameProperty(editor: vscode.TextEditor, property: Property, ne } ); } + +function findPropertyReferences(ast: any, name: string): any { + let propertyReferences: any = []; + + if (Array.isArray(ast)) { + for (var i = 0; i < ast.length; i++) { + const newPropertyReferences = findPropertyReferences(ast[i], name); + for (let i = 0; i < newPropertyReferences.length; i++) { + propertyReferences.push(newPropertyReferences[i]); + } + } + } else { + if (ast?.kind === 'propertylookup' && ast.offset?.name === name) { + return [ast]; + } + + for (const node in ast) { + if (ast.hasOwnProperty(node) && ast[node] !== ast) { + const newPropertyReferences = findPropertyReferences(ast[node], name); + for (let i = 0; i < newPropertyReferences.length; i++) { + propertyReferences.push(newPropertyReferences[i]); + } + } + } + } + + return propertyReferences; +} diff --git a/src/test/suite/renameProperty.test.ts b/src/test/suite/renameProperty.test.ts index 8ad1580..6102063 100644 --- a/src/test/suite/renameProperty.test.ts +++ b/src/test/suite/renameProperty.test.ts @@ -34,6 +34,10 @@ suite('Rename Property', function () { test('Should rename a property when the cursor is placed in its assignment', async () => { await runFixture('ConstructorWithMultiplePropertiesCursorInAssignment.php', new vscode.Position(16, 18)); }); + + test('Should rename all property references', async () => { + await runFixture('PropertyReferences.php'); + }); }); async function runFixture(fileName: string, cursorPosition?: vscode.Position) { From 5da270fd1801757bc14b6e5c15569caa41a13e5e Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 16 Aug 2020 09:22:35 +0200 Subject: [PATCH 16/41] Allow to rename on multiple properties statement --- out/renameProperty.js | 14 +++++--- out/renameProperty.js.map | 2 +- .../inputs/MultiplePropertyStatements.php | 14 ++++++++ .../outputs/MultiplePropertyStatements.php | 14 ++++++++ out/test/suite/renameProperty.test.js | 3 ++ out/test/suite/renameProperty.test.js.map | 2 +- src/renameProperty.ts | 35 ++++++++++++------- src/test/suite/renameProperty.test.ts | 4 +++ 8 files changed, 69 insertions(+), 19 deletions(-) create mode 100644 out/test/fixtures/rename/inputs/MultiplePropertyStatements.php create mode 100644 out/test/fixtures/rename/outputs/MultiplePropertyStatements.php diff --git a/out/renameProperty.js b/out/renameProperty.js index f1b5b75..1f429ec 100644 --- a/out/renameProperty.js +++ b/out/renameProperty.js @@ -13,10 +13,16 @@ function renameProperty(editor, property, newProperty, phpClass) { for (let j = 0; j < node.properties.length; j++) { const propertyNode = node.properties[j]; if (((_a = propertyNode.name) === null || _a === void 0 ? void 0 : _a.name) === property.getName()) { - const propertyStatementRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0)); - const propertyStatementText = document.getText(propertyStatementRange); - const newPropertyStatementText = propertyStatementText.replace(property.getName(), newProperty.getName()); - newDocumentText = newDocumentText.replace(propertyStatementText, newPropertyStatementText); + if (node.properties.length === 1) { + const propertyStatementRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0)); + const propertyStatementText = document.getText(propertyStatementRange); + const newPropertyStatementText = propertyStatementText.replace(property.getName(), newProperty.getName()); + newDocumentText = newDocumentText.replace(propertyStatementText, newPropertyStatementText); + } + else { + const regexp = new RegExp(`\\$${property.getName()}(\\s*,|\\s*;)`); + newDocumentText = newDocumentText.replace(regexp, `\$${newProperty.getName()}$1`); + } break; } } diff --git a/out/renameProperty.js.map b/out/renameProperty.js.map index 62d4e81..f58aa87 100644 --- a/out/renameProperty.js.map +++ b/out/renameProperty.js.map @@ -1 +1 @@ -{"version":3,"file":"renameProperty.js","sourceRoot":"","sources":["../src/renameProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"renameProperty.js","sourceRoot":"","sources":["../src/renameProperty.ts"],"names":[],"mappings":";;AAAA,iCAAiC;AAKjC,SAAgB,cAAc,CAAC,MAAyB,EAAE,QAAkB,EAAE,WAAqB,EAAE,QAAe;;IACnH,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,KAAK,CACrC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EACnF,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAC/E,CAAC;IAEF,IAAI,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEtD,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAE7B,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAChD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAExC,IAAI,OAAA,YAAY,CAAC,IAAI,0CAAE,IAAI,MAAK,QAAQ,CAAC,OAAO,EAAE,EAAE;oBACnD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;wBACjC,MAAM,sBAAsB,GAAG,IAAI,MAAM,CAAC,KAAK,CAC9C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,EAC/C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CACzC,CAAC;wBAEF,MAAM,qBAAqB,GAAG,QAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;wBAEvE,MAAM,wBAAwB,GAAG,qBAAqB,CAAC,OAAO,CAC7D,QAAQ,CAAC,OAAO,EAAE,EAClB,WAAW,CAAC,OAAO,EAAE,CACrB,CAAC;wBAEF,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,CAAC;qBAC3F;yBAAM;wBACN,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;wBACnE,eAAe,GAAG,eAAe,CAAC,OAAO,CACxC,MAAM,EACN,KAAK,WAAW,CAAC,OAAO,EAAE,IAAI,CAC9B,CAAC;qBACF;oBAED,MAAM;iBACN;aACD;SACD;KACD;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;IAE9C,IAAI,WAAW,EAAE;QAChB,IAAI,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;YAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAE1C,IAAI,OAAA,IAAI,CAAC,IAAI,0CAAE,IAAI,KAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;gBAC1C,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;gBACnD,MAAM,kBAAkB,GAAG,eAAe,CAAC,OAAO,CACjD,KAAK,QAAQ,CAAC,OAAO,EAAE,EAAE,EACzB,KAAK,WAAW,CAAC,OAAO,EAAE,EAAE,CAC5B,CAAC;gBAEF,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;aAC/E;SACD;aAAM;YACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC1D,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAE1C,IAAI,OAAA,IAAI,CAAC,IAAI,0CAAE,IAAI,KAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;oBAC1C,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;oBACnD,MAAM,kBAAkB,GAAG,eAAe,CAAC,OAAO,CAC/B,KAAK,QAAQ,CAAC,OAAO,EAAE,GAAG,EAC1B,KAAK,WAAW,CAAC,OAAO,EAAE,GAAG,CAChC,CAAC;oBACjB,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;oBAC/E,MAAM;iBACN;aACD;SACD;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAG,WAAW,CAAC,GAAG,CAAC,IAAI,0CAAE,QAAQ,CAAC,MAAM,CAAA,EAAE,CAAC,EAAE,EAAE;YAC/D,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAE9C,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB;mBACnC,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ;mBACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB;mBAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,EAAE,EACzD;gBACD,MAAM,uBAAuB,GAAG,IAAI,MAAM,CAAC,KAAK,CAC/C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,EAC/C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CACzC,CAAC;gBAEF,MAAM,sBAAsB,GAAG,QAAQ,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;gBACzE,IAAI,yBAAyB,GAAG,sBAAsB,CAAC,OAAO,CAC7D,QAAQ,CAAC,OAAO,EAAE,EAClB,WAAW,CAAC,OAAO,EAAE,CACrB,CAAC;gBAEF,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,EAAE,EAAE;oBACnG,yBAAyB,GAAG,yBAAyB,CAAC,OAAO,CAC5D,KAAK,QAAQ,CAAC,OAAO,EAAE,EAAE,EACzB,KAAK,WAAW,CAAC,OAAO,EAAE,EAAE,CAC5B,CAAC;iBACF;gBAED,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,CAAC;gBAC7F,MAAM;aACN;SACD;KACD;IAED,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAEpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAEnC,MAAM,sBAAsB,GAAG,IAAI,MAAM,CAAC,KAAK,CAC9C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,EAC/C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CACzC,CAAC;QAEF,MAAM,qBAAqB,GAAG,QAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAEvE,MAAM,wBAAwB,GAAG,qBAAqB,CAAC,OAAO,CAC7D,SAAS,QAAQ,CAAC,OAAO,EAAE,EAAE,EAC7B,SAAS,WAAW,CAAC,OAAO,EAAE,EAAE,CAChC,CAAC;QAEF,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,CAAC;KAC3F;IAED,IAAI,eAAe,KAAK,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;QACxD,OAAO;KACP;IAED,MAAA,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,IAAI,CACnC,WAAW,CAAC,EAAE;QACb,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IACrD,CAAC,EACD;QACC,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,KAAK;KACpB,EACA;AACH,CAAC;AA9ID,wCA8IC;AAED,SAAS,sBAAsB,CAAC,GAAQ,EAAE,IAAY;;IAClD,IAAI,kBAAkB,GAAQ,EAAE,CAAC;IAEjC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC1C,MAAM,qBAAqB,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACtD,kBAAkB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;aAClD;SACK;KACJ;SAAM;QACT,IAAI,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,MAAK,gBAAgB,IAAI,OAAA,GAAG,CAAC,MAAM,0CAAE,IAAI,MAAK,IAAI,EAAE;YAChE,OAAO,CAAC,GAAG,CAAC,CAAC;SACb;QAEK,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE;YACpB,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE;gBAC3D,MAAM,qBAAqB,GAAG,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;gBACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,qBAAqB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACtD,kBAAkB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;iBAClD;aACQ;SACJ;KACP;IAED,OAAO,kBAAkB,CAAC;AAC3B,CAAC"} \ No newline at end of file diff --git a/out/test/fixtures/rename/inputs/MultiplePropertyStatements.php b/out/test/fixtures/rename/inputs/MultiplePropertyStatements.php new file mode 100644 index 0000000..be7cebe --- /dev/null +++ b/out/test/fixtures/rename/inputs/MultiplePropertyStatements.php @@ -0,0 +1,14 @@ +name = $name; + } +} diff --git a/out/test/fixtures/rename/outputs/MultiplePropertyStatements.php b/out/test/fixtures/rename/outputs/MultiplePropertyStatements.php new file mode 100644 index 0000000..09062f9 --- /dev/null +++ b/out/test/fixtures/rename/outputs/MultiplePropertyStatements.php @@ -0,0 +1,14 @@ +newName = $newName; + } +} diff --git a/out/test/suite/renameProperty.test.js b/out/test/suite/renameProperty.test.js index 61d0b7e..178c4c5 100644 --- a/out/test/suite/renameProperty.test.js +++ b/out/test/suite/renameProperty.test.js @@ -40,6 +40,9 @@ suite('Rename Property', function () { test('Should rename all property references', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('PropertyReferences.php'); })); + test('Should rename only one property when there are more than one properties per statement', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('MultiplePropertyStatements.php'); + })); }); function runFixture(fileName, cursorPosition) { return __awaiter(this, void 0, void 0, function* () { diff --git a/out/test/suite/renameProperty.test.js.map b/out/test/suite/renameProperty.test.js.map index b90813b..c0d0bf9 100644 --- a/out/test/suite/renameProperty.test.js.map +++ b/out/test/suite/renameProperty.test.js.map @@ -1 +1 @@ -{"version":3,"file":"renameProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/renameProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"renameProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/renameProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/renameProperty.ts b/src/renameProperty.ts index 9268cab..716df59 100644 --- a/src/renameProperty.ts +++ b/src/renameProperty.ts @@ -1,6 +1,7 @@ import * as vscode from 'vscode'; import Property from './property'; import Class from './class'; +import { escapeForRegExp } from './utils'; export function renameProperty(editor: vscode.TextEditor, property: Property, newProperty: Property, phpClass: Class) { const document = editor.document; @@ -20,19 +21,27 @@ export function renameProperty(editor: vscode.TextEditor, property: Property, ne const propertyNode = node.properties[j]; if (propertyNode.name?.name === property.getName()) { - const propertyStatementRange = new vscode.Range( - new vscode.Position(node.loc.start.line - 1, 0), - new vscode.Position(node.loc.end.line, 0) - ); - - const propertyStatementText = document.getText(propertyStatementRange); - - const newPropertyStatementText = propertyStatementText.replace( - property.getName(), - newProperty.getName() - ); - - newDocumentText = newDocumentText.replace(propertyStatementText, newPropertyStatementText); + if (node.properties.length === 1) { + const propertyStatementRange = new vscode.Range( + new vscode.Position(node.loc.start.line - 1, 0), + new vscode.Position(node.loc.end.line, 0) + ); + + const propertyStatementText = document.getText(propertyStatementRange); + + const newPropertyStatementText = propertyStatementText.replace( + property.getName(), + newProperty.getName() + ); + + newDocumentText = newDocumentText.replace(propertyStatementText, newPropertyStatementText); + } else { + const regexp = new RegExp(`\\$${property.getName()}(\\s*,|\\s*;)`); + newDocumentText = newDocumentText.replace( + regexp, + `\$${newProperty.getName()}$1` + ); + } break; } diff --git a/src/test/suite/renameProperty.test.ts b/src/test/suite/renameProperty.test.ts index 6102063..0a030ac 100644 --- a/src/test/suite/renameProperty.test.ts +++ b/src/test/suite/renameProperty.test.ts @@ -38,6 +38,10 @@ suite('Rename Property', function () { test('Should rename all property references', async () => { await runFixture('PropertyReferences.php'); }); + + test('Should rename only one property when there are more than one properties per statement', async () => { + await runFixture('MultiplePropertyStatements.php'); + }); }); async function runFixture(fileName: string, cursorPosition?: vscode.Position) { From 7b5488da8141f7f3b6fc46f04d2cfcb26b06bea6 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 16 Aug 2020 09:36:17 +0200 Subject: [PATCH 17/41] Rename constructor docblock params --- out/renameProperty.js | 12 ++++++++-- out/renameProperty.js.map | 2 +- .../rename/inputs/ConstructorDocblock.php | 23 +++++++++++++++++++ .../rename/outputs/ConstructorDocblock.php | 23 +++++++++++++++++++ out/test/suite/renameProperty.test.js | 3 +++ out/test/suite/renameProperty.test.js.map | 2 +- src/renameProperty.ts | 20 +++++++++++++++- src/test/suite/renameProperty.test.ts | 4 ++++ 8 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 out/test/fixtures/rename/inputs/ConstructorDocblock.php create mode 100644 out/test/fixtures/rename/outputs/ConstructorDocblock.php diff --git a/out/renameProperty.js b/out/renameProperty.js index 1f429ec..189889a 100644 --- a/out/renameProperty.js +++ b/out/renameProperty.js @@ -2,7 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const vscode = require("vscode"); function renameProperty(editor, property, newProperty, phpClass) { - var _a, _b, _c, _d, _e; + var _a, _b, _c, _d, _e, _f; const document = editor.document; const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); let newDocumentText = document.getText(phpClassRange); @@ -65,6 +65,14 @@ function renameProperty(editor, property, newProperty, phpClass) { break; } } + for (let i = 0; i < ((_e = constructor.ast.leadingComments) === null || _e === void 0 ? void 0 : _e.length); i++) { + const commentNode = constructor.ast.leadingComments[i]; + const commentRange = new vscode.Range(new vscode.Position(commentNode.loc.start.line - 1, 0), new vscode.Position(commentNode.loc.end.line, 0)); + const commentText = document.getText(commentRange); + const regexp = new RegExp(`\\$${property.getName()}(\\s+)`); + const newCommentText = commentText.replace(regexp, `\$${newProperty.getName()}$1`); + newDocumentText = newDocumentText.replace(commentText, newCommentText); + } } const propertyReferences = findPropertyReferences(phpClass.ast, property.getName()); for (let i = 0; i < propertyReferences.length; i++) { @@ -77,7 +85,7 @@ function renameProperty(editor, property, newProperty, phpClass) { if (newDocumentText === document.getText(phpClassRange)) { return; } - (_e = vscode.window.activeTextEditor) === null || _e === void 0 ? void 0 : _e.edit(editBuilder => { + (_f = vscode.window.activeTextEditor) === null || _f === void 0 ? void 0 : _f.edit(editBuilder => { editBuilder.replace(phpClassRange, newDocumentText); }, { undoStopBefore: true, diff --git a/out/renameProperty.js.map b/out/renameProperty.js.map index f58aa87..1dfd5a9 100644 --- a/out/renameProperty.js.map +++ b/out/renameProperty.js.map @@ -1 +1 @@ -{"version":3,"file":"renameProperty.js","sourceRoot":"","sources":["../src/renameProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"renameProperty.js","sourceRoot":"","sources":["../src/renameProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/rename/inputs/ConstructorDocblock.php b/out/test/fixtures/rename/inputs/ConstructorDocblock.php new file mode 100644 index 0000000..e6292a1 --- /dev/null +++ b/out/test/fixtures/rename/inputs/ConstructorDocblock.php @@ -0,0 +1,23 @@ +name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/rename/outputs/ConstructorDocblock.php b/out/test/fixtures/rename/outputs/ConstructorDocblock.php new file mode 100644 index 0000000..764d02f --- /dev/null +++ b/out/test/fixtures/rename/outputs/ConstructorDocblock.php @@ -0,0 +1,23 @@ +newName = $newName; + $this->rank = $rank; + } +} diff --git a/out/test/suite/renameProperty.test.js b/out/test/suite/renameProperty.test.js index 178c4c5..aab8e56 100644 --- a/out/test/suite/renameProperty.test.js +++ b/out/test/suite/renameProperty.test.js @@ -43,6 +43,9 @@ suite('Rename Property', function () { test('Should rename only one property when there are more than one properties per statement', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('MultiplePropertyStatements.php'); })); + test('Should rename constructor param docblock', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorDocblock.php'); + })); }); function runFixture(fileName, cursorPosition) { return __awaiter(this, void 0, void 0, function* () { diff --git a/out/test/suite/renameProperty.test.js.map b/out/test/suite/renameProperty.test.js.map index c0d0bf9..efbd38d 100644 --- a/out/test/suite/renameProperty.test.js.map +++ b/out/test/suite/renameProperty.test.js.map @@ -1 +1 @@ -{"version":3,"file":"renameProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/renameProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"renameProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/renameProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/renameProperty.ts b/src/renameProperty.ts index 716df59..df07ff3 100644 --- a/src/renameProperty.ts +++ b/src/renameProperty.ts @@ -1,7 +1,6 @@ import * as vscode from 'vscode'; import Property from './property'; import Class from './class'; -import { escapeForRegExp } from './utils'; export function renameProperty(editor: vscode.TextEditor, property: Property, newProperty: Property, phpClass: Class) { const document = editor.document; @@ -110,6 +109,25 @@ export function renameProperty(editor: vscode.TextEditor, property: Property, ne break; } } + + for (let i = 0; i < constructor.ast.leadingComments?.length; i++) { + const commentNode = constructor.ast.leadingComments[i]; + + const commentRange = new vscode.Range( + new vscode.Position(commentNode.loc.start.line - 1, 0), + new vscode.Position(commentNode.loc.end.line, 0) + ); + + const commentText = document.getText(commentRange); + + const regexp = new RegExp(`\\$${property.getName()}(\\s+)`); + const newCommentText = commentText.replace( + regexp, + `\$${newProperty.getName()}$1` + ); + + newDocumentText = newDocumentText.replace(commentText, newCommentText); + } } const propertyReferences = findPropertyReferences(phpClass.ast, property.getName()); diff --git a/src/test/suite/renameProperty.test.ts b/src/test/suite/renameProperty.test.ts index 0a030ac..4c10278 100644 --- a/src/test/suite/renameProperty.test.ts +++ b/src/test/suite/renameProperty.test.ts @@ -42,6 +42,10 @@ suite('Rename Property', function () { test('Should rename only one property when there are more than one properties per statement', async () => { await runFixture('MultiplePropertyStatements.php'); }); + + test('Should rename constructor param docblock', async () => { + await runFixture('ConstructorDocblock.php'); + }); }); async function runFixture(fileName: string, cursorPosition?: vscode.Position) { From 200a798f2425e6c379c36a2b62f480d65c86484d Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 22 Aug 2020 09:21:17 +0200 Subject: [PATCH 18/41] Add change property type command --- out/changePropertyType.js | 47 ++++++++++ out/changePropertyType.js.map | 1 + out/extension.js | 76 +++++++++++++++- out/extension.js.map | 2 +- .../ConstructorWithMultipleProperties.php | 20 ++++ .../ConstructorWithMultipleProperties.php | 20 ++++ out/test/suite/changePropertyType.test.js | 67 ++++++++++++++ out/test/suite/changePropertyType.test.js.map | 1 + package.json | 24 ++++- src/changePropertyType.ts | 72 +++++++++++++++ src/extension.ts | 91 +++++++++++++++++++ src/test/suite/changePropertyType.test.ts | 74 +++++++++++++++ 12 files changed, 489 insertions(+), 6 deletions(-) create mode 100644 out/changePropertyType.js create mode 100644 out/changePropertyType.js.map create mode 100644 out/test/fixtures/changePropertyType/inputs/ConstructorWithMultipleProperties.php create mode 100644 out/test/fixtures/changePropertyType/outputs/ConstructorWithMultipleProperties.php create mode 100644 out/test/suite/changePropertyType.test.js create mode 100644 out/test/suite/changePropertyType.test.js.map create mode 100644 src/changePropertyType.ts create mode 100644 src/test/suite/changePropertyType.test.ts diff --git a/out/changePropertyType.js b/out/changePropertyType.js new file mode 100644 index 0000000..c284865 --- /dev/null +++ b/out/changePropertyType.js @@ -0,0 +1,47 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const vscode = require("vscode"); +function changePropertyType(editor, property, newPropertyType, phpClass) { + var _a, _b, _c; + const document = editor.document; + const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); + let newDocumentText = document.getText(phpClassRange); + const astClassBody = phpClass.ast.body; + for (let i = 0; i < astClassBody.length; i++) { + const node = astClassBody[i]; + if (node.kind === 'propertystatement') { + for (let j = 0; j < node.properties.length; j++) { + const propertyNode = node.properties[j]; + if (((_a = propertyNode.name) === null || _a === void 0 ? void 0 : _a.name) == property.getName()) { + const propertyStatementRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0)); + const propertyStatementText = document.getText(propertyStatementRange); + const newPropertyStatementText = propertyStatementText.replace(propertyNode.loc.source, `\$${property.getName()}`); + newDocumentText = newDocumentText.replace(propertyStatementText, newPropertyStatementText); + } + } + } + } + const constructor = phpClass.getConstructor(); + if (constructor) { + for (let i = 0; i < constructor.ast.arguments.length; i++) { + const node = constructor.ast.arguments[i]; + if (((_b = node.name) === null || _b === void 0 ? void 0 : _b.name) == property.getName()) { + const constructorText = constructor.ast.loc.source; + const newConstructorText = constructorText.replace(node.loc.source, `${newPropertyType} \$${property.getName()}`); + newDocumentText = newDocumentText.replace(constructorText, newConstructorText); + break; + } + } + } + if (newDocumentText === document.getText(phpClassRange)) { + return; + } + (_c = vscode.window.activeTextEditor) === null || _c === void 0 ? void 0 : _c.edit(editBuilder => { + editBuilder.replace(phpClassRange, newDocumentText); + }, { + undoStopBefore: true, + undoStopAfter: false + }); +} +exports.changePropertyType = changePropertyType; +//# sourceMappingURL=changePropertyType.js.map \ No newline at end of file diff --git a/out/changePropertyType.js.map b/out/changePropertyType.js.map new file mode 100644 index 0000000..eb9262e --- /dev/null +++ b/out/changePropertyType.js.map @@ -0,0 +1 @@ +{"version":3,"file":"changePropertyType.js","sourceRoot":"","sources":["../src/changePropertyType.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/extension.js b/out/extension.js index ba9b762..cbf0b8a 100644 --- a/out/extension.js +++ b/out/extension.js @@ -17,6 +17,7 @@ const insertProperty_1 = require("./insertProperty"); const removeProperty_1 = require("./removeProperty"); const utils_1 = require("./utils"); const renameProperty_1 = require("./renameProperty"); +const changePropertyType_1 = require("./changePropertyType"); function activate(context) { context.subscriptions.push(vscode.commands.registerCommand('phpAddProperty.add', () => __awaiter(this, void 0, void 0, function* () { if (vscode.window.activeTextEditor === undefined) { @@ -192,7 +193,7 @@ function activate(context) { } const newProperty = new property_1.default(newPropertyName); renameProperty_1.renameProperty(vscode.window.activeTextEditor, property, newProperty, phpClass); - })), vscode.commands.registerCommand('phpAddProperty.remove', () => __awaiter(this, void 0, void 0, function* () { + })), vscode.commands.registerCommand('phpAddProperty.changeType', () => __awaiter(this, void 0, void 0, function* () { var _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8; if (vscode.window.activeTextEditor === undefined) { return; @@ -245,6 +246,75 @@ function activate(context) { const argumentAst = (_7 = constructorArgs.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _7 !== void 0 ? _7 : constructorArgs[0]; propertyName = (_8 = argumentAst.name) === null || _8 === void 0 ? void 0 : _8.name; } + if (!propertyName) { + propertyName = yield vscode.window.showInputBox({ + placeHolder: 'Enter the property name you want to change type' + }); + } + if (propertyName === undefined || propertyName.trim() === "") { + return; + } + const property = new property_1.default(propertyName); + const newPropertyType = yield vscode.window.showInputBox({ + placeHolder: 'Enter the new property type' + }); + if (newPropertyType === undefined || newPropertyType.trim() === "") { + return; + } + changePropertyType_1.changePropertyType(vscode.window.activeTextEditor, property, newPropertyType, phpClass); + })), vscode.commands.registerCommand('phpAddProperty.remove', () => __awaiter(this, void 0, void 0, function* () { + var _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21; + if (vscode.window.activeTextEditor === undefined) { + return; + } + const document = vscode.window.activeTextEditor.document; + const phpEngine = new php_parser_1.default({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + const ast = phpEngine.parseCode(document.getText()); + const locator = new locator_1.default(ast); + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + const phpClass = locator.findClass(selectionLineNumber); + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + return; + } + const line = document.lineAt(selectionLineNumber); + const lineAst = phpEngine.parseEval(`class A { ${line.text} }`); + const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); + let propertyName; + if (((_10 = (_9 = lineAst.children[0]) === null || _9 === void 0 ? void 0 : _9.body[0]) === null || _10 === void 0 ? void 0 : _10.kind) === 'propertystatement') { + const properties = lineAst.children[0].body[0].properties; + const propertyAst = (_11 = properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _11 !== void 0 ? _11 : properties[0]; + propertyName = (_12 = propertyAst.name) === null || _12 === void 0 ? void 0 : _12.name; + if (propertyName === 'this') { + const assignmentAst = phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`); + if (((_16 = (_15 = (_14 = (_13 = assignmentAst.children[0]) === null || _13 === void 0 ? void 0 : _13.body[0]) === null || _14 === void 0 ? void 0 : _14.body) === null || _15 === void 0 ? void 0 : _15.children[0]) === null || _16 === void 0 ? void 0 : _16.kind) === 'expressionstatement') { + propertyName = (_17 = assignmentAst.children[0].body[0].body.children[0].expression.right) === null || _17 === void 0 ? void 0 : _17.name; + } + } + } + else if (((_19 = (_18 = lineAst.children[0]) === null || _18 === void 0 ? void 0 : _18.body[0]) === null || _19 === void 0 ? void 0 : _19.kind) === 'method') { + const constructorArgs = lineAst.children[0].body[0].arguments; + const argumentAst = (_20 = constructorArgs.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _20 !== void 0 ? _20 : constructorArgs[0]; + propertyName = (_21 = argumentAst.name) === null || _21 === void 0 ? void 0 : _21.name; + } if (!propertyName) { propertyName = yield vscode.window.showInputBox({ placeHolder: 'Enter the property name you want to remove' @@ -256,7 +326,7 @@ function activate(context) { const property = new property_1.default(propertyName); removeProperty_1.removeProperty(vscode.window.activeTextEditor, property, phpClass); })), vscode.commands.registerCommand('phpAddProperty.breakConstructorIntoMultiline', () => __awaiter(this, void 0, void 0, function* () { - var _9; + var _22; if (vscode.window.activeTextEditor === undefined) { return; } @@ -293,7 +363,7 @@ function activate(context) { if (newDocumentText === document.getText(phpClassRange)) { return; } - (_9 = vscode.window.activeTextEditor) === null || _9 === void 0 ? void 0 : _9.edit(editBuilder => { + (_22 = vscode.window.activeTextEditor) === null || _22 === void 0 ? void 0 : _22.edit(editBuilder => { editBuilder.replace(phpClassRange, newDocumentText); }, { undoStopBefore: true, diff --git a/out/extension.js.map b/out/extension.js.map index 9a93884..8ba1422 100644 --- a/out/extension.js.map +++ b/out/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/changePropertyType/inputs/ConstructorWithMultipleProperties.php b/out/test/fixtures/changePropertyType/inputs/ConstructorWithMultipleProperties.php new file mode 100644 index 0000000..74d99da --- /dev/null +++ b/out/test/fixtures/changePropertyType/inputs/ConstructorWithMultipleProperties.php @@ -0,0 +1,20 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/changePropertyType/outputs/ConstructorWithMultipleProperties.php b/out/test/fixtures/changePropertyType/outputs/ConstructorWithMultipleProperties.php new file mode 100644 index 0000000..17d6a3f --- /dev/null +++ b/out/test/fixtures/changePropertyType/outputs/ConstructorWithMultipleProperties.php @@ -0,0 +1,20 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/suite/changePropertyType.test.js b/out/test/suite/changePropertyType.test.js new file mode 100644 index 0000000..d6d85cf --- /dev/null +++ b/out/test/suite/changePropertyType.test.js @@ -0,0 +1,67 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const vscode = require("vscode"); +const path = require("path"); +const assert = require("assert"); +const fs = require("fs"); +const utils_1 = require("./utils"); +const testFolderRelativeLocation = '/../fixtures/changePropertyType/'; +suite('Change Property Type', function () { + setup(() => __awaiter(this, void 0, void 0, function* () { + yield utils_1.resetDefaultSettings(); + })); + teardown(() => __awaiter(this, void 0, void 0, function* () { + yield utils_1.resetDefaultSettings(); + })); + test('Should change a property type by name', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithMultipleProperties.php'); + })); +}); +function runFixture(fileName, cursorPosition) { + return __awaiter(this, void 0, void 0, function* () { + const uri = vscode.Uri.file(getInputFilePath(fileName)); + const document = yield vscode.workspace.openTextDocument(uri); + yield vscode.window.showTextDocument(document); + if (!vscode.window.activeTextEditor) { + return; + } + if (cursorPosition === undefined) { + let first = true; + vscode.window.showInputBox = function (options, token) { + if (first === true) { + first = false; + return Promise.resolve('name'); + } + return Promise.resolve('Name'); + }; + } + else { + vscode.window.activeTextEditor.selections = [new vscode.Selection(cursorPosition, cursorPosition)]; + vscode.window.showInputBox = function (options, token) { + return Promise.resolve('Name'); + }; + } + yield vscode.commands.executeCommand('phpAddProperty.changeType'); + const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); + yield utils_1.delay(utils_1.waitToAssertInSeconds, () => { + var _a; + assert.strictEqual((_a = vscode.window.activeTextEditor) === null || _a === void 0 ? void 0 : _a.document.getText(), expectedText); + }); + }); +} +function getInputFilePath(name) { + return path.join(__dirname + testFolderRelativeLocation + `inputs/${name}`); +} +function getOutputFilePath(name) { + return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); +} +//# sourceMappingURL=changePropertyType.test.js.map \ No newline at end of file diff --git a/out/test/suite/changePropertyType.test.js.map b/out/test/suite/changePropertyType.test.js.map new file mode 100644 index 0000000..e686332 --- /dev/null +++ b/out/test/suite/changePropertyType.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"changePropertyType.test.js","sourceRoot":"","sources":["../../../src/test/suite/changePropertyType.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAiC;AACjC,6BAA6B;AAC7B,iCAAiC;AACjC,yBAAyB;AACzB,mCAA6E;AAE7E,MAAM,0BAA0B,GAAG,kCAAkC,CAAC;AAEtE,KAAK,CAAC,sBAAsB,EAAE;IAC1B,KAAK,CAAC,GAAS,EAAE;QACb,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAS,EAAE;QAChB,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,GAAS,EAAE;QACrD,MAAM,UAAU,CAAC,uCAAuC,CAAC,CAAC;IAC9D,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,SAAe,UAAU,CAAC,QAAgB,EAAE,cAAgC;;QACxE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CACvB,gBAAgB,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;YACjC,OAAO;SACV;QAED,IAAI,cAAc,KAAK,SAAS,EAAE;YAC9B,IAAI,KAAK,GAAG,IAAI,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,UACzB,OAA4C,EAC5C,KAA4C;gBAE5C,IAAI,KAAK,KAAK,IAAI,EAAE;oBAChB,KAAK,GAAG,KAAK,CAAC;oBAEd,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;iBAClC;gBAED,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC,CAAC;SACL;aAAM;YACH,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;YAEnG,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,UACzB,OAA4C,EAC5C,KAA4C;gBAE5C,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC,CAAC;SACL;QAED,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC;QAElE,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE7E,MAAM,aAAK,CAAC,6BAAqB,EAAE,GAAG,EAAE;;YACpC,MAAM,CAAC,WAAW,OAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;IACP,CAAC;CAAA;AAED,SAAS,gBAAgB,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC"} \ No newline at end of file diff --git a/package.json b/package.json index c422f39..b35b08f 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "onCommand:phpAddProperty.add", "onCommand:phpAddProperty.append", "onCommand:phpAddProperty.rename", + "onCommand:phpAddProperty.changeType", "onCommand:phpAddProperty.remove", "onCommand:phpAddProperty.breakConstructorIntoMultiline" ], @@ -46,6 +47,10 @@ "command": "phpAddProperty.rename", "title": "Rename PHP Property" }, + { + "command": "phpAddProperty.changeType", + "title": "Change PHP Property type" + }, { "command": "phpAddProperty.remove", "title": "Remove Existing PHP Property" @@ -69,6 +74,10 @@ "command": "phpAddProperty.rename", "when": "editorLangId == php" }, + { + "command": "phpAddProperty.changeType", + "when": "editorLangId == php" + }, { "command": "phpAddProperty.remove", "when": "editorLangId == php" @@ -97,17 +106,23 @@ "alt": "phpAddProperty.rename", "group": "0_phpAddProperty@3" }, + { + "when": "resourceLangId == php && config.phpAddProperty.contextMenuOptions.enable && config.phpAddProperty.contextMenuOptions.changePropertyType", + "command": "phpAddProperty.changeType", + "alt": "phpAddProperty.changeType", + "group": "0_phpAddProperty@4" + }, { "when": "resourceLangId == php && config.phpAddProperty.contextMenuOptions.enable && config.phpAddProperty.contextMenuOptions.removeProperty", "command": "phpAddProperty.remove", "alt": "phpAddProperty.remove", - "group": "0_phpAddProperty@4" + "group": "0_phpAddProperty@5" }, { "when": "resourceLangId == php && config.phpAddProperty.contextMenuOptions.enable && config.phpAddProperty.contextMenuOptions.breakConstructorIntoMultiline", "command": "phpAddProperty.breakConstructorIntoMultiline", "alt": "phpAddProperty.breakConstructorIntoMultiline", - "group": "0_phpAddProperty@5" + "group": "0_phpAddProperty@6" } ] }, @@ -230,6 +245,11 @@ "default": true, "description": "Specifies whether to show the rename property command in the context menu options" }, + "phpAddProperty.contextMenuOptions.changePropertyType": { + "type": "boolean", + "default": true, + "description": "Specifies whether to show the change property type command in the context menu options" + }, "phpAddProperty.contextMenuOptions.removeProperty": { "type": "boolean", "default": true, diff --git a/src/changePropertyType.ts b/src/changePropertyType.ts new file mode 100644 index 0000000..4f06278 --- /dev/null +++ b/src/changePropertyType.ts @@ -0,0 +1,72 @@ +import * as vscode from 'vscode'; +import Property from './property'; +import Class from './class'; + +export function changePropertyType(editor: vscode.TextEditor, property: Property, newPropertyType: string, phpClass: Class) { + const document = editor.document; + const phpClassRange = new vscode.Range( + new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), + new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column) + ); + + let newDocumentText = document.getText(phpClassRange); + + const astClassBody = phpClass.ast.body; + for (let i = 0; i < astClassBody.length; i++) { + const node = astClassBody[i]; + + if (node.kind === 'propertystatement') { + for (let j = 0; j < node.properties.length; j++) { + const propertyNode = node.properties[j]; + + if (propertyNode.name?.name == property.getName()) { + const propertyStatementRange = new vscode.Range( + new vscode.Position(node.loc.start.line - 1, 0), + new vscode.Position(node.loc.end.line, 0) + ); + + const propertyStatementText = document.getText(propertyStatementRange); + + const newPropertyStatementText = propertyStatementText.replace( + propertyNode.loc.source, + `\$${property.getName()}` + ); + + newDocumentText = newDocumentText.replace(propertyStatementText, newPropertyStatementText); + } + } + } + } + + const constructor = phpClass.getConstructor(); + + if (constructor) { + for (let i = 0; i < constructor.ast.arguments.length; i++) { + const node = constructor.ast.arguments[i]; + + if (node.name?.name == property.getName()) { + const constructorText = constructor.ast.loc.source; + const newConstructorText = constructorText.replace( + node.loc.source, + `${newPropertyType} \$${property.getName()}` + ); + newDocumentText = newDocumentText.replace(constructorText, newConstructorText); + break; + } + } + } + + if (newDocumentText === document.getText(phpClassRange)) { + return; + } + + vscode.window.activeTextEditor?.edit( + editBuilder => { + editBuilder.replace(phpClassRange, newDocumentText); + }, + { + undoStopBefore: true, + undoStopAfter: false + } + ); +} diff --git a/src/extension.ts b/src/extension.ts index bf3522b..aa31dc3 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -6,6 +6,7 @@ import insertProperty from './insertProperty'; import { removeProperty } from './removeProperty'; import { forceBreakConstructorIntoMultiline } from './utils'; import { renameProperty } from './renameProperty'; +import { changePropertyType } from './changePropertyType'; export function activate(context: vscode.ExtensionContext) { context.subscriptions.push( @@ -242,6 +243,96 @@ export function activate(context: vscode.ExtensionContext) { renameProperty(vscode.window.activeTextEditor, property, newProperty, phpClass); }), + vscode.commands.registerCommand('phpAddProperty.changeType', async () => { + if (vscode.window.activeTextEditor === undefined) { + return; + } + + const document = vscode.window.activeTextEditor.document; + + const phpEngine = new PhpEngine({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + + const ast = phpEngine.parseCode(document.getText()); + + const locator = new Locator(ast); + + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + + const phpClass = locator.findClass(selectionLineNumber); + + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + + return; + } + + const line = document.lineAt(selectionLineNumber); + + const lineAst = (phpEngine.parseEval(`class A { ${line.text} }`) as any); + + const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); + + let propertyName; + if (lineAst.children[0]?.body[0]?.kind === 'propertystatement') { + const properties = (lineAst.children[0].body[0].properties as any[]); + + const propertyAst = properties.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? properties[0]; + propertyName = propertyAst.name?.name; + + if (propertyName === 'this') { + const assignmentAst = (phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`) as any); + + if (assignmentAst.children[0]?.body[0]?.body?.children[0]?.kind === 'expressionstatement') { + propertyName = assignmentAst.children[0].body[0].body.children[0].expression.right?.name; + } + } + } else if (lineAst.children[0]?.body[0]?.kind === 'method') { + const constructorArgs = (lineAst.children[0].body[0].arguments as any[]); + + const argumentAst = constructorArgs.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? constructorArgs[0]; + propertyName = argumentAst.name?.name; + } + + if (!propertyName) { + propertyName = await vscode.window.showInputBox({ + placeHolder: 'Enter the property name you want to change type' + }); + } + + if (propertyName === undefined || propertyName.trim() === "") { + return; + } + + const property = new Property(propertyName); + + const newPropertyType = await vscode.window.showInputBox({ + placeHolder: 'Enter the new property type' + }); + + if (newPropertyType === undefined || newPropertyType.trim() === "") { + return; + } + + changePropertyType(vscode.window.activeTextEditor, property, newPropertyType, phpClass); + }), vscode.commands.registerCommand('phpAddProperty.remove', async () => { if (vscode.window.activeTextEditor === undefined) { return; diff --git a/src/test/suite/changePropertyType.test.ts b/src/test/suite/changePropertyType.test.ts new file mode 100644 index 0000000..057bc6a --- /dev/null +++ b/src/test/suite/changePropertyType.test.ts @@ -0,0 +1,74 @@ +import * as vscode from 'vscode'; +import * as path from 'path'; +import * as assert from 'assert'; +import * as fs from 'fs'; +import { waitToAssertInSeconds, delay, resetDefaultSettings } from './utils'; + +const testFolderRelativeLocation = '/../fixtures/changePropertyType/'; + +suite('Change Property Type', function () { + setup(async () => { + await resetDefaultSettings(); + }); + + teardown(async () => { + await resetDefaultSettings(); + }); + + test('Should change a property type by name', async () => { + await runFixture('ConstructorWithMultipleProperties.php'); + }); +}); + +async function runFixture(fileName: string, cursorPosition?: vscode.Position) { + const uri = vscode.Uri.file( + getInputFilePath(fileName) + ); + const document = await vscode.workspace.openTextDocument(uri); + await vscode.window.showTextDocument(document); + + if (!vscode.window.activeTextEditor) { + return; + } + + if (cursorPosition === undefined) { + let first = true; + vscode.window.showInputBox = function ( + options?: vscode.InputBoxOptions | undefined, + token?: vscode.CancellationToken | undefined + ): Thenable { + if (first === true) { + first = false; + + return Promise.resolve('name'); + } + + return Promise.resolve('Name'); + }; + } else { + vscode.window.activeTextEditor.selections = [new vscode.Selection(cursorPosition, cursorPosition)]; + + vscode.window.showInputBox = function ( + options?: vscode.InputBoxOptions | undefined, + token?: vscode.CancellationToken | undefined + ): Thenable { + return Promise.resolve('Name'); + }; + } + + await vscode.commands.executeCommand('phpAddProperty.changeType'); + + const expectedText = fs.readFileSync(getOutputFilePath(fileName)).toString(); + + await delay(waitToAssertInSeconds, () => { + assert.strictEqual(vscode.window.activeTextEditor?.document.getText(), expectedText); + }); +} + +function getInputFilePath(name: string) { + return path.join(__dirname + testFolderRelativeLocation + `inputs/${name}`); +} + +function getOutputFilePath(name: string) { + return path.join(__dirname + testFolderRelativeLocation + `outputs/${name}`); +} From b2a4d3657f39ac4b3c4d1a9ec9444a9eb0551b19 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 22 Aug 2020 09:34:41 +0200 Subject: [PATCH 19/41] Change property statement type if already exists --- out/changePropertyType.js | 6 +++++- out/changePropertyType.js.map | 2 +- .../inputs/TypedPropertyStatement.php | 14 ++++++++++++++ .../outputs/TypedPropertyStatement.php | 14 ++++++++++++++ out/test/suite/changePropertyType.test.js | 3 +++ out/test/suite/changePropertyType.test.js.map | 2 +- src/changePropertyType.ts | 8 +++++++- src/test/suite/changePropertyType.test.ts | 4 ++++ 8 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 out/test/fixtures/changePropertyType/inputs/TypedPropertyStatement.php create mode 100644 out/test/fixtures/changePropertyType/outputs/TypedPropertyStatement.php diff --git a/out/changePropertyType.js b/out/changePropertyType.js index c284865..764d73b 100644 --- a/out/changePropertyType.js +++ b/out/changePropertyType.js @@ -15,7 +15,11 @@ function changePropertyType(editor, property, newPropertyType, phpClass) { if (((_a = propertyNode.name) === null || _a === void 0 ? void 0 : _a.name) == property.getName()) { const propertyStatementRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0)); const propertyStatementText = document.getText(propertyStatementRange); - const newPropertyStatementText = propertyStatementText.replace(propertyNode.loc.source, `\$${property.getName()}`); + let newPropertyText = `\$${property.getName()}`; + if (propertyNode.type) { + newPropertyText = `${newPropertyType} ${newPropertyText}`; + } + const newPropertyStatementText = propertyStatementText.replace(propertyNode.loc.source, newPropertyText); newDocumentText = newDocumentText.replace(propertyStatementText, newPropertyStatementText); } } diff --git a/out/changePropertyType.js.map b/out/changePropertyType.js.map index eb9262e..266e59d 100644 --- a/out/changePropertyType.js.map +++ b/out/changePropertyType.js.map @@ -1 +1 @@ -{"version":3,"file":"changePropertyType.js","sourceRoot":"","sources":["../src/changePropertyType.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"changePropertyType.js","sourceRoot":"","sources":["../src/changePropertyType.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/changePropertyType/inputs/TypedPropertyStatement.php b/out/test/fixtures/changePropertyType/inputs/TypedPropertyStatement.php new file mode 100644 index 0000000..ffff80a --- /dev/null +++ b/out/test/fixtures/changePropertyType/inputs/TypedPropertyStatement.php @@ -0,0 +1,14 @@ +name = $name; + } +} diff --git a/out/test/fixtures/changePropertyType/outputs/TypedPropertyStatement.php b/out/test/fixtures/changePropertyType/outputs/TypedPropertyStatement.php new file mode 100644 index 0000000..d7c6716 --- /dev/null +++ b/out/test/fixtures/changePropertyType/outputs/TypedPropertyStatement.php @@ -0,0 +1,14 @@ +name = $name; + } +} diff --git a/out/test/suite/changePropertyType.test.js b/out/test/suite/changePropertyType.test.js index d6d85cf..332ecf7 100644 --- a/out/test/suite/changePropertyType.test.js +++ b/out/test/suite/changePropertyType.test.js @@ -25,6 +25,9 @@ suite('Change Property Type', function () { test('Should change a property type by name', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('ConstructorWithMultipleProperties.php'); })); + test('Should change the property statement type if already exists', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('TypedPropertyStatement.php'); + })); }); function runFixture(fileName, cursorPosition) { return __awaiter(this, void 0, void 0, function* () { diff --git a/out/test/suite/changePropertyType.test.js.map b/out/test/suite/changePropertyType.test.js.map index e686332..e838acb 100644 --- a/out/test/suite/changePropertyType.test.js.map +++ b/out/test/suite/changePropertyType.test.js.map @@ -1 +1 @@ -{"version":3,"file":"changePropertyType.test.js","sourceRoot":"","sources":["../../../src/test/suite/changePropertyType.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAiC;AACjC,6BAA6B;AAC7B,iCAAiC;AACjC,yBAAyB;AACzB,mCAA6E;AAE7E,MAAM,0BAA0B,GAAG,kCAAkC,CAAC;AAEtE,KAAK,CAAC,sBAAsB,EAAE;IAC1B,KAAK,CAAC,GAAS,EAAE;QACb,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAS,EAAE;QAChB,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,GAAS,EAAE;QACrD,MAAM,UAAU,CAAC,uCAAuC,CAAC,CAAC;IAC9D,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,SAAe,UAAU,CAAC,QAAgB,EAAE,cAAgC;;QACxE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CACvB,gBAAgB,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;YACjC,OAAO;SACV;QAED,IAAI,cAAc,KAAK,SAAS,EAAE;YAC9B,IAAI,KAAK,GAAG,IAAI,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,UACzB,OAA4C,EAC5C,KAA4C;gBAE5C,IAAI,KAAK,KAAK,IAAI,EAAE;oBAChB,KAAK,GAAG,KAAK,CAAC;oBAEd,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;iBAClC;gBAED,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC,CAAC;SACL;aAAM;YACH,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;YAEnG,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,UACzB,OAA4C,EAC5C,KAA4C;gBAE5C,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC,CAAC;SACL;QAED,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC;QAElE,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE7E,MAAM,aAAK,CAAC,6BAAqB,EAAE,GAAG,EAAE;;YACpC,MAAM,CAAC,WAAW,OAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;IACP,CAAC;CAAA;AAED,SAAS,gBAAgB,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC"} \ No newline at end of file +{"version":3,"file":"changePropertyType.test.js","sourceRoot":"","sources":["../../../src/test/suite/changePropertyType.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAiC;AACjC,6BAA6B;AAC7B,iCAAiC;AACjC,yBAAyB;AACzB,mCAA6E;AAE7E,MAAM,0BAA0B,GAAG,kCAAkC,CAAC;AAEtE,KAAK,CAAC,sBAAsB,EAAE;IAC1B,KAAK,CAAC,GAAS,EAAE;QACb,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAS,EAAE;QAChB,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,GAAS,EAAE;QACrD,MAAM,UAAU,CAAC,uCAAuC,CAAC,CAAC;IAC9D,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,6DAA6D,EAAE,GAAS,EAAE;QAC3E,MAAM,UAAU,CAAC,4BAA4B,CAAC,CAAC;IACnD,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,SAAe,UAAU,CAAC,QAAgB,EAAE,cAAgC;;QACxE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CACvB,gBAAgB,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;YACjC,OAAO;SACV;QAED,IAAI,cAAc,KAAK,SAAS,EAAE;YAC9B,IAAI,KAAK,GAAG,IAAI,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,UACzB,OAA4C,EAC5C,KAA4C;gBAE5C,IAAI,KAAK,KAAK,IAAI,EAAE;oBAChB,KAAK,GAAG,KAAK,CAAC;oBAEd,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;iBAClC;gBAED,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC,CAAC;SACL;aAAM;YACH,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;YAEnG,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,UACzB,OAA4C,EAC5C,KAA4C;gBAE5C,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC,CAAC;SACL;QAED,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC;QAElE,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE7E,MAAM,aAAK,CAAC,6BAAqB,EAAE,GAAG,EAAE;;YACpC,MAAM,CAAC,WAAW,OAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;IACP,CAAC;CAAA;AAED,SAAS,gBAAgB,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC"} \ No newline at end of file diff --git a/src/changePropertyType.ts b/src/changePropertyType.ts index 4f06278..7942c2f 100644 --- a/src/changePropertyType.ts +++ b/src/changePropertyType.ts @@ -26,10 +26,16 @@ export function changePropertyType(editor: vscode.TextEditor, property: Property ); const propertyStatementText = document.getText(propertyStatementRange); + + let newPropertyText = `\$${property.getName()}`; + + if (propertyNode.type) { + newPropertyText = `${newPropertyType} ${newPropertyText}`; + } const newPropertyStatementText = propertyStatementText.replace( propertyNode.loc.source, - `\$${property.getName()}` + newPropertyText ); newDocumentText = newDocumentText.replace(propertyStatementText, newPropertyStatementText); diff --git a/src/test/suite/changePropertyType.test.ts b/src/test/suite/changePropertyType.test.ts index 057bc6a..6c58dbb 100644 --- a/src/test/suite/changePropertyType.test.ts +++ b/src/test/suite/changePropertyType.test.ts @@ -18,6 +18,10 @@ suite('Change Property Type', function () { test('Should change a property type by name', async () => { await runFixture('ConstructorWithMultipleProperties.php'); }); + + test('Should change the property statement type if already exists', async () => { + await runFixture('TypedPropertyStatement.php'); + }); }); async function runFixture(fileName: string, cursorPosition?: vscode.Position) { From 90248b97bd01daeb1c29dd13b493203fb58ac966 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 22 Aug 2020 09:49:01 +0200 Subject: [PATCH 20/41] Add property statement type if php types enabled --- out/changePropertyType.js | 3 ++- out/changePropertyType.js.map | 2 +- .../inputs/PropertyWithoutType.php | 14 ++++++++++++++ .../outputs/PropertyWithoutType.php | 14 ++++++++++++++ out/test/suite/changePropertyType.test.js | 4 ++++ out/test/suite/changePropertyType.test.js.map | 2 +- src/changePropertyType.ts | 3 ++- src/test/suite/changePropertyType.test.ts | 5 +++++ 8 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 out/test/fixtures/changePropertyType/inputs/PropertyWithoutType.php create mode 100644 out/test/fixtures/changePropertyType/outputs/PropertyWithoutType.php diff --git a/out/changePropertyType.js b/out/changePropertyType.js index 764d73b..3df191f 100644 --- a/out/changePropertyType.js +++ b/out/changePropertyType.js @@ -1,6 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const vscode = require("vscode"); +const utils_1 = require("./utils"); function changePropertyType(editor, property, newPropertyType, phpClass) { var _a, _b, _c; const document = editor.document; @@ -16,7 +17,7 @@ function changePropertyType(editor, property, newPropertyType, phpClass) { const propertyStatementRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0)); const propertyStatementText = document.getText(propertyStatementRange); let newPropertyText = `\$${property.getName()}`; - if (propertyNode.type) { + if (utils_1.config('phpAddProperty.property.types') === true || propertyNode.type) { newPropertyText = `${newPropertyType} ${newPropertyText}`; } const newPropertyStatementText = propertyStatementText.replace(propertyNode.loc.source, newPropertyText); diff --git a/out/changePropertyType.js.map b/out/changePropertyType.js.map index 266e59d..314f4d1 100644 --- a/out/changePropertyType.js.map +++ b/out/changePropertyType.js.map @@ -1 +1 @@ -{"version":3,"file":"changePropertyType.js","sourceRoot":"","sources":["../src/changePropertyType.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"changePropertyType.js","sourceRoot":"","sources":["../src/changePropertyType.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/changePropertyType/inputs/PropertyWithoutType.php b/out/test/fixtures/changePropertyType/inputs/PropertyWithoutType.php new file mode 100644 index 0000000..685bdba --- /dev/null +++ b/out/test/fixtures/changePropertyType/inputs/PropertyWithoutType.php @@ -0,0 +1,14 @@ +name = $name; + } +} diff --git a/out/test/fixtures/changePropertyType/outputs/PropertyWithoutType.php b/out/test/fixtures/changePropertyType/outputs/PropertyWithoutType.php new file mode 100644 index 0000000..d7c6716 --- /dev/null +++ b/out/test/fixtures/changePropertyType/outputs/PropertyWithoutType.php @@ -0,0 +1,14 @@ +name = $name; + } +} diff --git a/out/test/suite/changePropertyType.test.js b/out/test/suite/changePropertyType.test.js index 332ecf7..ed43b97 100644 --- a/out/test/suite/changePropertyType.test.js +++ b/out/test/suite/changePropertyType.test.js @@ -28,6 +28,10 @@ suite('Change Property Type', function () { test('Should change the property statement type if already exists', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('TypedPropertyStatement.php'); })); + test('Should change the property statement type if typed properties is enabled', () => __awaiter(this, void 0, void 0, function* () { + yield vscode.workspace.getConfiguration('phpAddProperty').update('property.types', true, true); + yield runFixture('PropertyWithoutType.php'); + })); }); function runFixture(fileName, cursorPosition) { return __awaiter(this, void 0, void 0, function* () { diff --git a/out/test/suite/changePropertyType.test.js.map b/out/test/suite/changePropertyType.test.js.map index e838acb..9a9ce65 100644 --- a/out/test/suite/changePropertyType.test.js.map +++ b/out/test/suite/changePropertyType.test.js.map @@ -1 +1 @@ -{"version":3,"file":"changePropertyType.test.js","sourceRoot":"","sources":["../../../src/test/suite/changePropertyType.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAiC;AACjC,6BAA6B;AAC7B,iCAAiC;AACjC,yBAAyB;AACzB,mCAA6E;AAE7E,MAAM,0BAA0B,GAAG,kCAAkC,CAAC;AAEtE,KAAK,CAAC,sBAAsB,EAAE;IAC1B,KAAK,CAAC,GAAS,EAAE;QACb,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAS,EAAE;QAChB,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,GAAS,EAAE;QACrD,MAAM,UAAU,CAAC,uCAAuC,CAAC,CAAC;IAC9D,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,6DAA6D,EAAE,GAAS,EAAE;QAC3E,MAAM,UAAU,CAAC,4BAA4B,CAAC,CAAC;IACnD,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,SAAe,UAAU,CAAC,QAAgB,EAAE,cAAgC;;QACxE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CACvB,gBAAgB,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;YACjC,OAAO;SACV;QAED,IAAI,cAAc,KAAK,SAAS,EAAE;YAC9B,IAAI,KAAK,GAAG,IAAI,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,UACzB,OAA4C,EAC5C,KAA4C;gBAE5C,IAAI,KAAK,KAAK,IAAI,EAAE;oBAChB,KAAK,GAAG,KAAK,CAAC;oBAEd,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;iBAClC;gBAED,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC,CAAC;SACL;aAAM;YACH,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;YAEnG,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,UACzB,OAA4C,EAC5C,KAA4C;gBAE5C,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC,CAAC;SACL;QAED,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC;QAElE,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE7E,MAAM,aAAK,CAAC,6BAAqB,EAAE,GAAG,EAAE;;YACpC,MAAM,CAAC,WAAW,OAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;IACP,CAAC;CAAA;AAED,SAAS,gBAAgB,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC"} \ No newline at end of file +{"version":3,"file":"changePropertyType.test.js","sourceRoot":"","sources":["../../../src/test/suite/changePropertyType.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/changePropertyType.ts b/src/changePropertyType.ts index 7942c2f..428acdc 100644 --- a/src/changePropertyType.ts +++ b/src/changePropertyType.ts @@ -1,6 +1,7 @@ import * as vscode from 'vscode'; import Property from './property'; import Class from './class'; +import { config } from './utils'; export function changePropertyType(editor: vscode.TextEditor, property: Property, newPropertyType: string, phpClass: Class) { const document = editor.document; @@ -29,7 +30,7 @@ export function changePropertyType(editor: vscode.TextEditor, property: Property let newPropertyText = `\$${property.getName()}`; - if (propertyNode.type) { + if (config('phpAddProperty.property.types') === true || propertyNode.type) { newPropertyText = `${newPropertyType} ${newPropertyText}`; } diff --git a/src/test/suite/changePropertyType.test.ts b/src/test/suite/changePropertyType.test.ts index 6c58dbb..0c5417d 100644 --- a/src/test/suite/changePropertyType.test.ts +++ b/src/test/suite/changePropertyType.test.ts @@ -22,6 +22,11 @@ suite('Change Property Type', function () { test('Should change the property statement type if already exists', async () => { await runFixture('TypedPropertyStatement.php'); }); + + test('Should change the property statement type if typed properties is enabled', async () => { + await vscode.workspace.getConfiguration('phpAddProperty').update('property.types', true, true); + await runFixture('PropertyWithoutType.php'); + }); }); async function runFixture(fileName: string, cursorPosition?: vscode.Position) { From 850ee2da21bf089af5bf09e8b387657952b52b56 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 22 Aug 2020 10:20:25 +0200 Subject: [PATCH 21/41] Change property statement docblock type --- out/changePropertyType.js | 21 +++++++++++-- out/changePropertyType.js.map | 2 +- .../inputs/PropertyStatementDocblock.php | 15 ++++++++++ .../outputs/PropertyStatementDocblock.php | 15 ++++++++++ out/test/suite/changePropertyType.test.js | 3 ++ out/test/suite/changePropertyType.test.js.map | 2 +- src/changePropertyType.ts | 30 +++++++++++++++++-- src/test/suite/changePropertyType.test.ts | 4 +++ 8 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 out/test/fixtures/changePropertyType/inputs/PropertyStatementDocblock.php create mode 100644 out/test/fixtures/changePropertyType/outputs/PropertyStatementDocblock.php diff --git a/out/changePropertyType.js b/out/changePropertyType.js index 3df191f..0065ed3 100644 --- a/out/changePropertyType.js +++ b/out/changePropertyType.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const vscode = require("vscode"); const utils_1 = require("./utils"); function changePropertyType(editor, property, newPropertyType, phpClass) { - var _a, _b, _c; + var _a, _b, _c, _d; const document = editor.document; const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); let newDocumentText = document.getText(phpClassRange); @@ -11,9 +11,11 @@ function changePropertyType(editor, property, newPropertyType, phpClass) { for (let i = 0; i < astClassBody.length; i++) { const node = astClassBody[i]; if (node.kind === 'propertystatement') { + let propertyFound = false; for (let j = 0; j < node.properties.length; j++) { const propertyNode = node.properties[j]; if (((_a = propertyNode.name) === null || _a === void 0 ? void 0 : _a.name) == property.getName()) { + propertyFound = true; const propertyStatementRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0)); const propertyStatementText = document.getText(propertyStatementRange); let newPropertyText = `\$${property.getName()}`; @@ -24,13 +26,26 @@ function changePropertyType(editor, property, newPropertyType, phpClass) { newDocumentText = newDocumentText.replace(propertyStatementText, newPropertyStatementText); } } + if (propertyFound) { + for (let i = 0; i < ((_b = node.leadingComments) === null || _b === void 0 ? void 0 : _b.length); i++) { + const commentNode = node.leadingComments[i]; + const commentRange = new vscode.Range(new vscode.Position(commentNode.loc.start.line - 1, 0), new vscode.Position(commentNode.loc.end.line, 0)); + const commentText = document.getText(commentRange); + const typeMatch = /@var\s(\S*)/g.exec(commentText); + if (typeMatch) { + const newCommentText = commentText.replace(typeMatch[1], newPropertyType); + newDocumentText = newDocumentText.replace(commentText, newCommentText); + } + } + break; + } } } const constructor = phpClass.getConstructor(); if (constructor) { for (let i = 0; i < constructor.ast.arguments.length; i++) { const node = constructor.ast.arguments[i]; - if (((_b = node.name) === null || _b === void 0 ? void 0 : _b.name) == property.getName()) { + if (((_c = node.name) === null || _c === void 0 ? void 0 : _c.name) == property.getName()) { const constructorText = constructor.ast.loc.source; const newConstructorText = constructorText.replace(node.loc.source, `${newPropertyType} \$${property.getName()}`); newDocumentText = newDocumentText.replace(constructorText, newConstructorText); @@ -41,7 +56,7 @@ function changePropertyType(editor, property, newPropertyType, phpClass) { if (newDocumentText === document.getText(phpClassRange)) { return; } - (_c = vscode.window.activeTextEditor) === null || _c === void 0 ? void 0 : _c.edit(editBuilder => { + (_d = vscode.window.activeTextEditor) === null || _d === void 0 ? void 0 : _d.edit(editBuilder => { editBuilder.replace(phpClassRange, newDocumentText); }, { undoStopBefore: true, diff --git a/out/changePropertyType.js.map b/out/changePropertyType.js.map index 314f4d1..a195c82 100644 --- a/out/changePropertyType.js.map +++ b/out/changePropertyType.js.map @@ -1 +1 @@ -{"version":3,"file":"changePropertyType.js","sourceRoot":"","sources":["../src/changePropertyType.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"changePropertyType.js","sourceRoot":"","sources":["../src/changePropertyType.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/changePropertyType/inputs/PropertyStatementDocblock.php b/out/test/fixtures/changePropertyType/inputs/PropertyStatementDocblock.php new file mode 100644 index 0000000..6039468 --- /dev/null +++ b/out/test/fixtures/changePropertyType/inputs/PropertyStatementDocblock.php @@ -0,0 +1,15 @@ +name = $name; + } +} diff --git a/out/test/fixtures/changePropertyType/outputs/PropertyStatementDocblock.php b/out/test/fixtures/changePropertyType/outputs/PropertyStatementDocblock.php new file mode 100644 index 0000000..df2702c --- /dev/null +++ b/out/test/fixtures/changePropertyType/outputs/PropertyStatementDocblock.php @@ -0,0 +1,15 @@ +name = $name; + } +} diff --git a/out/test/suite/changePropertyType.test.js b/out/test/suite/changePropertyType.test.js index ed43b97..2ad34f5 100644 --- a/out/test/suite/changePropertyType.test.js +++ b/out/test/suite/changePropertyType.test.js @@ -32,6 +32,9 @@ suite('Change Property Type', function () { yield vscode.workspace.getConfiguration('phpAddProperty').update('property.types', true, true); yield runFixture('PropertyWithoutType.php'); })); + test('Should change property statement docblock type', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('PropertyStatementDocblock.php'); + })); }); function runFixture(fileName, cursorPosition) { return __awaiter(this, void 0, void 0, function* () { diff --git a/out/test/suite/changePropertyType.test.js.map b/out/test/suite/changePropertyType.test.js.map index 9a9ce65..46e9046 100644 --- a/out/test/suite/changePropertyType.test.js.map +++ b/out/test/suite/changePropertyType.test.js.map @@ -1 +1 @@ -{"version":3,"file":"changePropertyType.test.js","sourceRoot":"","sources":["../../../src/test/suite/changePropertyType.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"changePropertyType.test.js","sourceRoot":"","sources":["../../../src/test/suite/changePropertyType.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/changePropertyType.ts b/src/changePropertyType.ts index 428acdc..681abbc 100644 --- a/src/changePropertyType.ts +++ b/src/changePropertyType.ts @@ -12,15 +12,18 @@ export function changePropertyType(editor: vscode.TextEditor, property: Property let newDocumentText = document.getText(phpClassRange); - const astClassBody = phpClass.ast.body; + const astClassBody = phpClass.ast.body; for (let i = 0; i < astClassBody.length; i++) { const node = astClassBody[i]; if (node.kind === 'propertystatement') { + let propertyFound = false; + for (let j = 0; j < node.properties.length; j++) { const propertyNode = node.properties[j]; if (propertyNode.name?.name == property.getName()) { + propertyFound = true; const propertyStatementRange = new vscode.Range( new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0) @@ -41,7 +44,30 @@ export function changePropertyType(editor: vscode.TextEditor, property: Property newDocumentText = newDocumentText.replace(propertyStatementText, newPropertyStatementText); } - } + } + + if (propertyFound) { + for (let i = 0; i < node.leadingComments?.length; i++) { + const commentNode = node.leadingComments[i]; + + const commentRange = new vscode.Range( + new vscode.Position(commentNode.loc.start.line - 1, 0), + new vscode.Position(commentNode.loc.end.line, 0) + ); + + const commentText = document.getText(commentRange); + + const typeMatch = /@var\s(\S*)/g.exec(commentText); + + if (typeMatch) { + const newCommentText = commentText.replace(typeMatch[1], newPropertyType); + + newDocumentText = newDocumentText.replace(commentText, newCommentText); + } + } + + break; + } } } diff --git a/src/test/suite/changePropertyType.test.ts b/src/test/suite/changePropertyType.test.ts index 0c5417d..3fec252 100644 --- a/src/test/suite/changePropertyType.test.ts +++ b/src/test/suite/changePropertyType.test.ts @@ -27,6 +27,10 @@ suite('Change Property Type', function () { await vscode.workspace.getConfiguration('phpAddProperty').update('property.types', true, true); await runFixture('PropertyWithoutType.php'); }); + + test('Should change property statement docblock type', async () => { + await runFixture('PropertyStatementDocblock.php'); + }); }); async function runFixture(fileName: string, cursorPosition?: vscode.Position) { From 580ae4d6995882247a0bea447b68fe88be584f83 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 22 Aug 2020 10:48:31 +0200 Subject: [PATCH 22/41] Do not replace other properties docblock --- out/changePropertyType.js | 10 +++++----- out/changePropertyType.js.map | 2 +- .../OtherPropertiesStatementDocblock.php | 19 +++++++++++++++++++ .../OtherPropertiesStatementDocblock.php | 19 +++++++++++++++++++ out/test/suite/changePropertyType.test.js | 3 +++ out/test/suite/changePropertyType.test.js.map | 2 +- src/changePropertyType.ts | 17 +++++++++++------ src/test/suite/changePropertyType.test.ts | 4 ++++ 8 files changed, 63 insertions(+), 13 deletions(-) create mode 100644 out/test/fixtures/changePropertyType/inputs/OtherPropertiesStatementDocblock.php create mode 100644 out/test/fixtures/changePropertyType/outputs/OtherPropertiesStatementDocblock.php diff --git a/out/changePropertyType.js b/out/changePropertyType.js index 0065ed3..673283c 100644 --- a/out/changePropertyType.js +++ b/out/changePropertyType.js @@ -11,22 +11,21 @@ function changePropertyType(editor, property, newPropertyType, phpClass) { for (let i = 0; i < astClassBody.length; i++) { const node = astClassBody[i]; if (node.kind === 'propertystatement') { - let propertyFound = false; + let newPropertyStatementText; for (let j = 0; j < node.properties.length; j++) { const propertyNode = node.properties[j]; if (((_a = propertyNode.name) === null || _a === void 0 ? void 0 : _a.name) == property.getName()) { - propertyFound = true; const propertyStatementRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0)); const propertyStatementText = document.getText(propertyStatementRange); let newPropertyText = `\$${property.getName()}`; if (utils_1.config('phpAddProperty.property.types') === true || propertyNode.type) { newPropertyText = `${newPropertyType} ${newPropertyText}`; } - const newPropertyStatementText = propertyStatementText.replace(propertyNode.loc.source, newPropertyText); + newPropertyStatementText = propertyStatementText.replace(propertyNode.loc.source, newPropertyText); newDocumentText = newDocumentText.replace(propertyStatementText, newPropertyStatementText); } } - if (propertyFound) { + if (newPropertyStatementText) { for (let i = 0; i < ((_b = node.leadingComments) === null || _b === void 0 ? void 0 : _b.length); i++) { const commentNode = node.leadingComments[i]; const commentRange = new vscode.Range(new vscode.Position(commentNode.loc.start.line - 1, 0), new vscode.Position(commentNode.loc.end.line, 0)); @@ -34,7 +33,8 @@ function changePropertyType(editor, property, newPropertyType, phpClass) { const typeMatch = /@var\s(\S*)/g.exec(commentText); if (typeMatch) { const newCommentText = commentText.replace(typeMatch[1], newPropertyType); - newDocumentText = newDocumentText.replace(commentText, newCommentText); + const regexp = new RegExp(`${utils_1.escapeForRegExp(commentText)}((?:\s|[\r\n])*)${utils_1.escapeForRegExp(newPropertyStatementText)}`); + newDocumentText = newDocumentText.replace(regexp, `${newCommentText}$1${newPropertyStatementText}`); } } break; diff --git a/out/changePropertyType.js.map b/out/changePropertyType.js.map index a195c82..b9782f6 100644 --- a/out/changePropertyType.js.map +++ b/out/changePropertyType.js.map @@ -1 +1 @@ -{"version":3,"file":"changePropertyType.js","sourceRoot":"","sources":["../src/changePropertyType.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"changePropertyType.js","sourceRoot":"","sources":["../src/changePropertyType.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/changePropertyType/inputs/OtherPropertiesStatementDocblock.php b/out/test/fixtures/changePropertyType/inputs/OtherPropertiesStatementDocblock.php new file mode 100644 index 0000000..3096006 --- /dev/null +++ b/out/test/fixtures/changePropertyType/inputs/OtherPropertiesStatementDocblock.php @@ -0,0 +1,19 @@ +class = $class; + $this->name = $name; + } +} diff --git a/out/test/fixtures/changePropertyType/outputs/OtherPropertiesStatementDocblock.php b/out/test/fixtures/changePropertyType/outputs/OtherPropertiesStatementDocblock.php new file mode 100644 index 0000000..af58951 --- /dev/null +++ b/out/test/fixtures/changePropertyType/outputs/OtherPropertiesStatementDocblock.php @@ -0,0 +1,19 @@ +class = $class; + $this->name = $name; + } +} diff --git a/out/test/suite/changePropertyType.test.js b/out/test/suite/changePropertyType.test.js index 2ad34f5..b4ec926 100644 --- a/out/test/suite/changePropertyType.test.js +++ b/out/test/suite/changePropertyType.test.js @@ -35,6 +35,9 @@ suite('Change Property Type', function () { test('Should change property statement docblock type', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('PropertyStatementDocblock.php'); })); + test('Should NOT change other properties statement docblock type', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('OtherPropertiesStatementDocblock.php'); + })); }); function runFixture(fileName, cursorPosition) { return __awaiter(this, void 0, void 0, function* () { diff --git a/out/test/suite/changePropertyType.test.js.map b/out/test/suite/changePropertyType.test.js.map index 46e9046..c85f6f5 100644 --- a/out/test/suite/changePropertyType.test.js.map +++ b/out/test/suite/changePropertyType.test.js.map @@ -1 +1 @@ -{"version":3,"file":"changePropertyType.test.js","sourceRoot":"","sources":["../../../src/test/suite/changePropertyType.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAiC;AACjC,6BAA6B;AAC7B,iCAAiC;AACjC,yBAAyB;AACzB,mCAA6E;AAE7E,MAAM,0BAA0B,GAAG,kCAAkC,CAAC;AAEtE,KAAK,CAAC,sBAAsB,EAAE;IAC1B,KAAK,CAAC,GAAS,EAAE;QACb,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAS,EAAE;QAChB,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,GAAS,EAAE;QACrD,MAAM,UAAU,CAAC,uCAAuC,CAAC,CAAC;IAC9D,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,6DAA6D,EAAE,GAAS,EAAE;QAC3E,MAAM,UAAU,CAAC,4BAA4B,CAAC,CAAC;IACnD,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,0EAA0E,EAAE,GAAS,EAAE;QACxF,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/F,MAAM,UAAU,CAAC,yBAAyB,CAAC,CAAC;IAChD,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,gDAAgD,EAAE,GAAS,EAAE;QAC9D,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;IACtD,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,SAAe,UAAU,CAAC,QAAgB,EAAE,cAAgC;;QACxE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CACvB,gBAAgB,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;YACjC,OAAO;SACV;QAED,IAAI,cAAc,KAAK,SAAS,EAAE;YAC9B,IAAI,KAAK,GAAG,IAAI,CAAC;YACjB,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,UACzB,OAA4C,EAC5C,KAA4C;gBAE5C,IAAI,KAAK,KAAK,IAAI,EAAE;oBAChB,KAAK,GAAG,KAAK,CAAC;oBAEd,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;iBAClC;gBAED,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC,CAAC;SACL;aAAM;YACH,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;YAEnG,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,UACzB,OAA4C,EAC5C,KAA4C;gBAE5C,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC,CAAC;SACL;QAED,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC;QAElE,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE7E,MAAM,aAAK,CAAC,6BAAqB,EAAE,GAAG,EAAE;;YACpC,MAAM,CAAC,WAAW,OAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;IACP,CAAC;CAAA;AAED,SAAS,gBAAgB,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC"} \ No newline at end of file +{"version":3,"file":"changePropertyType.test.js","sourceRoot":"","sources":["../../../src/test/suite/changePropertyType.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/changePropertyType.ts b/src/changePropertyType.ts index 681abbc..b4cd50c 100644 --- a/src/changePropertyType.ts +++ b/src/changePropertyType.ts @@ -1,7 +1,7 @@ import * as vscode from 'vscode'; import Property from './property'; import Class from './class'; -import { config } from './utils'; +import { config, escapeForRegExp } from './utils'; export function changePropertyType(editor: vscode.TextEditor, property: Property, newPropertyType: string, phpClass: Class) { const document = editor.document; @@ -17,13 +17,12 @@ export function changePropertyType(editor: vscode.TextEditor, property: Property const node = astClassBody[i]; if (node.kind === 'propertystatement') { - let propertyFound = false; + let newPropertyStatementText; for (let j = 0; j < node.properties.length; j++) { const propertyNode = node.properties[j]; if (propertyNode.name?.name == property.getName()) { - propertyFound = true; const propertyStatementRange = new vscode.Range( new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(node.loc.end.line, 0) @@ -37,7 +36,7 @@ export function changePropertyType(editor: vscode.TextEditor, property: Property newPropertyText = `${newPropertyType} ${newPropertyText}`; } - const newPropertyStatementText = propertyStatementText.replace( + newPropertyStatementText = propertyStatementText.replace( propertyNode.loc.source, newPropertyText ); @@ -46,7 +45,7 @@ export function changePropertyType(editor: vscode.TextEditor, property: Property } } - if (propertyFound) { + if (newPropertyStatementText) { for (let i = 0; i < node.leadingComments?.length; i++) { const commentNode = node.leadingComments[i]; @@ -62,7 +61,13 @@ export function changePropertyType(editor: vscode.TextEditor, property: Property if (typeMatch) { const newCommentText = commentText.replace(typeMatch[1], newPropertyType); - newDocumentText = newDocumentText.replace(commentText, newCommentText); + const regexp = new RegExp( + `${escapeForRegExp(commentText)}((?:\s|[\r\n])*)${escapeForRegExp(newPropertyStatementText)}` + ); + newDocumentText = newDocumentText.replace( + regexp, + `${newCommentText}$1${newPropertyStatementText}` + ); } } diff --git a/src/test/suite/changePropertyType.test.ts b/src/test/suite/changePropertyType.test.ts index 3fec252..e9284e4 100644 --- a/src/test/suite/changePropertyType.test.ts +++ b/src/test/suite/changePropertyType.test.ts @@ -31,6 +31,10 @@ suite('Change Property Type', function () { test('Should change property statement docblock type', async () => { await runFixture('PropertyStatementDocblock.php'); }); + + test('Should NOT change other properties statement docblock type', async () => { + await runFixture('OtherPropertiesStatementDocblock.php'); + }); }); async function runFixture(fileName: string, cursorPosition?: vscode.Position) { From 03154cca07bb1c7dbd27828f881ef264485fdd5d Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 22 Aug 2020 11:00:08 +0200 Subject: [PATCH 23/41] Change property type in constructor docblock --- out/changePropertyType.js | 12 +++++++-- out/changePropertyType.js.map | 2 +- .../inputs/ConstructorDocblock.php | 25 +++++++++++++++++++ .../outputs/ConstructorDocblock.php | 25 +++++++++++++++++++ out/test/suite/changePropertyType.test.js | 3 +++ out/test/suite/changePropertyType.test.js.map | 2 +- src/changePropertyType.ts | 19 ++++++++++++++ src/test/suite/changePropertyType.test.ts | 4 +++ 8 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 out/test/fixtures/changePropertyType/inputs/ConstructorDocblock.php create mode 100644 out/test/fixtures/changePropertyType/outputs/ConstructorDocblock.php diff --git a/out/changePropertyType.js b/out/changePropertyType.js index 673283c..7155860 100644 --- a/out/changePropertyType.js +++ b/out/changePropertyType.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const vscode = require("vscode"); const utils_1 = require("./utils"); function changePropertyType(editor, property, newPropertyType, phpClass) { - var _a, _b, _c, _d; + var _a, _b, _c, _d, _e; const document = editor.document; const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); let newDocumentText = document.getText(phpClassRange); @@ -52,11 +52,19 @@ function changePropertyType(editor, property, newPropertyType, phpClass) { break; } } + for (let i = 0; i < ((_d = constructor.ast.leadingComments) === null || _d === void 0 ? void 0 : _d.length); i++) { + const commentNode = constructor.ast.leadingComments[i]; + const commentRange = new vscode.Range(new vscode.Position(commentNode.loc.start.line - 1, 0), new vscode.Position(commentNode.loc.end.line, 0)); + const commentText = document.getText(commentRange); + const regexp = new RegExp(`\\S*(\\s+\\$${property.getName()})`); + const newCommentText = commentText.replace(regexp, `${newPropertyType}$1`); + newDocumentText = newDocumentText.replace(commentText, newCommentText); + } } if (newDocumentText === document.getText(phpClassRange)) { return; } - (_d = vscode.window.activeTextEditor) === null || _d === void 0 ? void 0 : _d.edit(editBuilder => { + (_e = vscode.window.activeTextEditor) === null || _e === void 0 ? void 0 : _e.edit(editBuilder => { editBuilder.replace(phpClassRange, newDocumentText); }, { undoStopBefore: true, diff --git a/out/changePropertyType.js.map b/out/changePropertyType.js.map index b9782f6..c9deb1f 100644 --- a/out/changePropertyType.js.map +++ b/out/changePropertyType.js.map @@ -1 +1 @@ -{"version":3,"file":"changePropertyType.js","sourceRoot":"","sources":["../src/changePropertyType.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"changePropertyType.js","sourceRoot":"","sources":["../src/changePropertyType.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/changePropertyType/inputs/ConstructorDocblock.php b/out/test/fixtures/changePropertyType/inputs/ConstructorDocblock.php new file mode 100644 index 0000000..6d1fa2b --- /dev/null +++ b/out/test/fixtures/changePropertyType/inputs/ConstructorDocblock.php @@ -0,0 +1,25 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/changePropertyType/outputs/ConstructorDocblock.php b/out/test/fixtures/changePropertyType/outputs/ConstructorDocblock.php new file mode 100644 index 0000000..cc51e7f --- /dev/null +++ b/out/test/fixtures/changePropertyType/outputs/ConstructorDocblock.php @@ -0,0 +1,25 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/suite/changePropertyType.test.js b/out/test/suite/changePropertyType.test.js index b4ec926..e57f535 100644 --- a/out/test/suite/changePropertyType.test.js +++ b/out/test/suite/changePropertyType.test.js @@ -38,6 +38,9 @@ suite('Change Property Type', function () { test('Should NOT change other properties statement docblock type', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('OtherPropertiesStatementDocblock.php'); })); + test('Should change property type in constructor docblock', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorDocblock.php'); + })); }); function runFixture(fileName, cursorPosition) { return __awaiter(this, void 0, void 0, function* () { diff --git a/out/test/suite/changePropertyType.test.js.map b/out/test/suite/changePropertyType.test.js.map index c85f6f5..a0bc83a 100644 --- a/out/test/suite/changePropertyType.test.js.map +++ b/out/test/suite/changePropertyType.test.js.map @@ -1 +1 @@ -{"version":3,"file":"changePropertyType.test.js","sourceRoot":"","sources":["../../../src/test/suite/changePropertyType.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"changePropertyType.test.js","sourceRoot":"","sources":["../../../src/test/suite/changePropertyType.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/changePropertyType.ts b/src/changePropertyType.ts index b4cd50c..4575ed4 100644 --- a/src/changePropertyType.ts +++ b/src/changePropertyType.ts @@ -91,6 +91,25 @@ export function changePropertyType(editor: vscode.TextEditor, property: Property newDocumentText = newDocumentText.replace(constructorText, newConstructorText); break; } + } + + for (let i = 0; i < constructor.ast.leadingComments?.length; i++) { + const commentNode = constructor.ast.leadingComments[i]; + + const commentRange = new vscode.Range( + new vscode.Position(commentNode.loc.start.line - 1, 0), + new vscode.Position(commentNode.loc.end.line, 0) + ); + + const commentText = document.getText(commentRange); + + const regexp = new RegExp(`\\S*(\\s+\\$${property.getName()})`); + const newCommentText = commentText.replace( + regexp, + `${newPropertyType}$1` + ); + + newDocumentText = newDocumentText.replace(commentText, newCommentText); } } diff --git a/src/test/suite/changePropertyType.test.ts b/src/test/suite/changePropertyType.test.ts index e9284e4..12133e3 100644 --- a/src/test/suite/changePropertyType.test.ts +++ b/src/test/suite/changePropertyType.test.ts @@ -35,6 +35,10 @@ suite('Change Property Type', function () { test('Should NOT change other properties statement docblock type', async () => { await runFixture('OtherPropertiesStatementDocblock.php'); }); + + test('Should change property type in constructor docblock', async () => { + await runFixture('ConstructorDocblock.php'); + }); }); async function runFixture(fileName: string, cursorPosition?: vscode.Position) { From be1c977c2f3877d49556c170048f560d8fd7bb24 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 22 Aug 2020 11:16:39 +0200 Subject: [PATCH 24/41] Remove property docblock from constructor --- out/removeProperty.js | 12 +++++++-- out/removeProperty.js.map | 2 +- .../remove/inputs/ConstructorDocblock.php | 25 +++++++++++++++++++ .../remove/outputs/ConstructorDocblock.php | 21 ++++++++++++++++ out/test/suite/removeProperty.test.js | 3 +++ out/test/suite/removeProperty.test.js.map | 2 +- src/removeProperty.ts | 16 ++++++++++++ src/test/suite/removeProperty.test.ts | 4 +++ 8 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 out/test/fixtures/remove/inputs/ConstructorDocblock.php create mode 100644 out/test/fixtures/remove/outputs/ConstructorDocblock.php diff --git a/out/removeProperty.js b/out/removeProperty.js index 82b7d40..1dad22a 100644 --- a/out/removeProperty.js +++ b/out/removeProperty.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const vscode = require("vscode"); const utils_1 = require("./utils"); function removeProperty(editor, property, phpClass) { - var _a, _b, _c, _d, _e, _f, _g; + var _a, _b, _c, _d, _e, _f, _g, _h; const document = editor.document; const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); let newDocumentText = document.getText(phpClassRange); @@ -71,11 +71,19 @@ function removeProperty(editor, property, phpClass) { } } } + for (let i = 0; i < ((_g = constructor.ast.leadingComments) === null || _g === void 0 ? void 0 : _g.length); i++) { + const commentNode = constructor.ast.leadingComments[i]; + const commentRange = new vscode.Range(new vscode.Position(commentNode.loc.start.line - 1, 0), new vscode.Position(commentNode.loc.end.line, 0)); + const commentText = document.getText(commentRange); + const regexp = new RegExp(`.*\\*.*\\$${property.getName()}\\s*[\r\n]+`); + const newCommentText = commentText.replace(regexp, ''); + newDocumentText = newDocumentText.replace(commentText, newCommentText); + } } if (newDocumentText === document.getText(phpClassRange)) { return; } - (_g = vscode.window.activeTextEditor) === null || _g === void 0 ? void 0 : _g.edit(editBuilder => { + (_h = vscode.window.activeTextEditor) === null || _h === void 0 ? void 0 : _h.edit(editBuilder => { editBuilder.replace(phpClassRange, newDocumentText); }, { undoStopBefore: true, diff --git a/out/removeProperty.js.map b/out/removeProperty.js.map index 123f249..dedb600 100644 --- a/out/removeProperty.js.map +++ b/out/removeProperty.js.map @@ -1 +1 @@ -{"version":3,"file":"removeProperty.js","sourceRoot":"","sources":["../src/removeProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"removeProperty.js","sourceRoot":"","sources":["../src/removeProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/remove/inputs/ConstructorDocblock.php b/out/test/fixtures/remove/inputs/ConstructorDocblock.php new file mode 100644 index 0000000..838e025 --- /dev/null +++ b/out/test/fixtures/remove/inputs/ConstructorDocblock.php @@ -0,0 +1,25 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/remove/outputs/ConstructorDocblock.php b/out/test/fixtures/remove/outputs/ConstructorDocblock.php new file mode 100644 index 0000000..2798eaf --- /dev/null +++ b/out/test/fixtures/remove/outputs/ConstructorDocblock.php @@ -0,0 +1,21 @@ +class = $class; + $this->rank = $rank; + } +} diff --git a/out/test/suite/removeProperty.test.js b/out/test/suite/removeProperty.test.js index ee82717..29a1b09 100644 --- a/out/test/suite/removeProperty.test.js +++ b/out/test/suite/removeProperty.test.js @@ -43,6 +43,9 @@ suite('Remove Property', function () { test('Should remove the property docblock', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('PropertyWithDocblock.php'); })); + test('Should remove the property from the constructor docblock', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorDocblock.php'); + })); test('Should remove a property when the cursor is placed in its statement', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('ConstructorWithMultiplePropertiesCursorInPropertyStatement.php', new vscode.Position(11, 13)); })); diff --git a/out/test/suite/removeProperty.test.js.map b/out/test/suite/removeProperty.test.js.map index c396d1e..e2ce0c3 100644 --- a/out/test/suite/removeProperty.test.js.map +++ b/out/test/suite/removeProperty.test.js.map @@ -1 +1 @@ -{"version":3,"file":"removeProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/removeProperty.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAiC;AACjC,6BAA6B;AAC7B,iCAAiC;AACjC,yBAAyB;AACzB,mCAA6E;AAE7E,MAAM,0BAA0B,GAAG,sBAAsB,CAAC;AAE1D,KAAK,CAAC,iBAAiB,EAAE;IACrB,KAAK,CAAC,GAAS,EAAE;QACb,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAS,EAAE;QAChB,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,GAAS,EAAE;QAC1D,MAAM,UAAU,CAAC,uCAAuC,CAAC,CAAC;IAC9D,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,6DAA6D,EAAE,GAAS,EAAE;QAC3E,MAAM,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC7C,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,8FAA8F,EAAE,GAAS,EAAE;QAC5G,MAAM,UAAU,CAAC,mCAAmC,CAAC,CAAC;IAC1D,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,sGAAsG,EAAE,GAAS,EAAE;QACpH,MAAM,UAAU,CAAC,gCAAgC,CAAC,CAAC;IACvD,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,kFAAkF,EAAE,GAAS,EAAE;QAChG,MAAM,UAAU,CAAC,kCAAkC,CAAC,CAAC;IACzD,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAS,EAAE;QAC9C,MAAM,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAC1C,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,qCAAqC,EAAE,GAAS,EAAE;QACnD,MAAM,UAAU,CAAC,0BAA0B,CAAC,CAAC;IACjD,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,qEAAqE,EAAE,GAAS,EAAE;QACnF,MAAM,UAAU,CAAC,gEAAgE,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACpH,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,gFAAgF,EAAE,GAAS,EAAE;QAC9F,MAAM,UAAU,CAAC,uDAAuD,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3G,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,sEAAsE,EAAE,GAAS,EAAE;QACpF,MAAM,UAAU,CAAC,yDAAyD,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7G,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,SAAe,UAAU,CAAC,QAAgB,EAAE,cAAgC;;QACxE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CACvB,gBAAgB,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;YACjC,OAAO;SACV;QAED,IAAI,cAAc,KAAK,SAAS,EAAE;YAC9B,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,UACzB,OAA4C,EAC5C,KAA4C;gBAE5C,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC,CAAC;SACL;aAAM;YACH,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;SACtG;QAED,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;QAE9D,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE7E,MAAM,aAAK,CAAC,6BAAqB,EAAE,GAAG,EAAE;;YACpC,MAAM,CAAC,WAAW,OAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;IACP,CAAC;CAAA;AAED,SAAS,gBAAgB,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC"} \ No newline at end of file +{"version":3,"file":"removeProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/removeProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/removeProperty.ts b/src/removeProperty.ts index 1ca27a3..cef427f 100644 --- a/src/removeProperty.ts +++ b/src/removeProperty.ts @@ -106,6 +106,22 @@ export function removeProperty(editor: vscode.TextEditor, property: Property, ph } } } + + for (let i = 0; i < constructor.ast.leadingComments?.length; i++) { + const commentNode = constructor.ast.leadingComments[i]; + + const commentRange = new vscode.Range( + new vscode.Position(commentNode.loc.start.line - 1, 0), + new vscode.Position(commentNode.loc.end.line, 0) + ); + + const commentText = document.getText(commentRange); + + const regexp = new RegExp(`.*\\*.*\\$${property.getName()}\\s*[\r\n]+`); + const newCommentText = commentText.replace(regexp, ''); + + newDocumentText = newDocumentText.replace(commentText, newCommentText); + } } if (newDocumentText === document.getText(phpClassRange)) { diff --git a/src/test/suite/removeProperty.test.ts b/src/test/suite/removeProperty.test.ts index e816ce4..f0d1d87 100644 --- a/src/test/suite/removeProperty.test.ts +++ b/src/test/suite/removeProperty.test.ts @@ -42,6 +42,10 @@ suite('Remove Property', function () { test('Should remove the property docblock', async () => { await runFixture('PropertyWithDocblock.php'); }); + + test('Should remove the property from the constructor docblock', async () => { + await runFixture('ConstructorDocblock.php'); + }); test('Should remove a property when the cursor is placed in its statement', async () => { await runFixture('ConstructorWithMultiplePropertiesCursorInPropertyStatement.php', new vscode.Position(11, 13)); From ab5b7e523e00737aa0b1a7f13480456553d3901b Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 22 Aug 2020 14:06:08 +0200 Subject: [PATCH 25/41] Rename test suite --- out/test/suite/breakConstructorIntoMultiline.test.js | 2 +- out/test/suite/breakConstructorIntoMultiline.test.js.map | 2 +- src/test/suite/breakConstructorIntoMultiline.test.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/out/test/suite/breakConstructorIntoMultiline.test.js b/out/test/suite/breakConstructorIntoMultiline.test.js index 0cc9c03..84f4ff9 100644 --- a/out/test/suite/breakConstructorIntoMultiline.test.js +++ b/out/test/suite/breakConstructorIntoMultiline.test.js @@ -15,7 +15,7 @@ const assert = require("assert"); const fs = require("fs"); const utils_1 = require("./utils"); const testFolderRelativeLocation = '/../fixtures/breakConstructorIntoMultiline/'; -suite('Customizations', function () { +suite('Break Constructor Into Multilines', function () { setup(() => __awaiter(this, void 0, void 0, function* () { yield utils_1.resetDefaultSettings(); })); diff --git a/out/test/suite/breakConstructorIntoMultiline.test.js.map b/out/test/suite/breakConstructorIntoMultiline.test.js.map index 4a65e63..d137f27 100644 --- a/out/test/suite/breakConstructorIntoMultiline.test.js.map +++ b/out/test/suite/breakConstructorIntoMultiline.test.js.map @@ -1 +1 @@ -{"version":3,"file":"breakConstructorIntoMultiline.test.js","sourceRoot":"","sources":["../../../src/test/suite/breakConstructorIntoMultiline.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAiC;AACjC,6BAA6B;AAC7B,iCAAiC;AACjC,yBAAyB;AACzB,mCAA6E;AAE7E,MAAM,0BAA0B,GAAG,6CAA6C,CAAC;AAEjF,KAAK,CAAC,gBAAgB,EAAE;IACpB,KAAK,CAAC,GAAS,EAAE;QACb,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAS,EAAE;QAChB,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,wEAAwE,EAAE,GAAS,EAAE;QACtF,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,wDAAwD,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACxI,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,8DAA8D,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5I,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;IACxC,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,SAAe,UAAU,CAAC,QAAgB;;QACtC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CACvB,gBAAgB,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE/C,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,8CAA8C,CAAC,CAAC;QAErF,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE7E,MAAM,aAAK,CAAC,6BAAqB,EAAE,GAAG,EAAE;;YACpC,MAAM,CAAC,WAAW,OAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;IACP,CAAC;CAAA;AAED,SAAS,gBAAgB,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC"} \ No newline at end of file +{"version":3,"file":"breakConstructorIntoMultiline.test.js","sourceRoot":"","sources":["../../../src/test/suite/breakConstructorIntoMultiline.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAiC;AACjC,6BAA6B;AAC7B,iCAAiC;AACjC,yBAAyB;AACzB,mCAA6E;AAE7E,MAAM,0BAA0B,GAAG,6CAA6C,CAAC;AAEjF,KAAK,CAAC,mCAAmC,EAAE;IACvC,KAAK,CAAC,GAAS,EAAE;QACb,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAS,EAAE;QAChB,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,wEAAwE,EAAE,GAAS,EAAE;QACtF,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,wDAAwD,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACxI,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,8DAA8D,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5I,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;IACxC,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,SAAe,UAAU,CAAC,QAAgB;;QACtC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CACvB,gBAAgB,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE/C,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,8CAA8C,CAAC,CAAC;QAErF,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE7E,MAAM,aAAK,CAAC,6BAAqB,EAAE,GAAG,EAAE;;YACpC,MAAM,CAAC,WAAW,OAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;IACP,CAAC;CAAA;AAED,SAAS,gBAAgB,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC"} \ No newline at end of file diff --git a/src/test/suite/breakConstructorIntoMultiline.test.ts b/src/test/suite/breakConstructorIntoMultiline.test.ts index 06f4d29..6c4fc94 100644 --- a/src/test/suite/breakConstructorIntoMultiline.test.ts +++ b/src/test/suite/breakConstructorIntoMultiline.test.ts @@ -6,7 +6,7 @@ import { waitToAssertInSeconds, delay, resetDefaultSettings } from './utils'; const testFolderRelativeLocation = '/../fixtures/breakConstructorIntoMultiline/'; -suite('Customizations', function () { +suite('Break Constructor Into Multilines', function () { setup(async () => { await resetDefaultSettings(); }); From 3b6b8b51efe48f89fa42a44eb4b12e13f8898993 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 22 Aug 2020 14:28:25 +0200 Subject: [PATCH 26/41] Remove constructor docblock along with constructor --- out/removeProperty.js | 41 ++++++++----- out/removeProperty.js.map | 2 +- ...nstructorWithSinglePropertyAndDocblock.php | 17 ++++++ ...nstructorWithSinglePropertyAndDocblock.php | 8 +++ out/test/suite/removeProperty.test.js | 3 + out/test/suite/removeProperty.test.js.map | 2 +- src/removeProperty.ts | 58 +++++++++++++------ src/test/suite/removeProperty.test.ts | 4 ++ 8 files changed, 100 insertions(+), 35 deletions(-) create mode 100644 out/test/fixtures/remove/inputs/ConstructorWithSinglePropertyAndDocblock.php create mode 100644 out/test/fixtures/remove/outputs/ConstructorWithSinglePropertyAndDocblock.php diff --git a/out/removeProperty.js b/out/removeProperty.js index 1dad22a..71c3c69 100644 --- a/out/removeProperty.js +++ b/out/removeProperty.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const vscode = require("vscode"); const utils_1 = require("./utils"); function removeProperty(editor, property, phpClass) { - var _a, _b, _c, _d, _e, _f, _g, _h; + var _a, _b, _c, _d, _e, _f, _g, _h, _j; const document = editor.document; const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); let newDocumentText = document.getText(phpClassRange); @@ -15,9 +15,14 @@ function removeProperty(editor, property, phpClass) { const propertyNode = node.properties[j]; if (((_a = propertyNode.name) === null || _a === void 0 ? void 0 : _a.name) === property.getName()) { if (node.properties.length === 1) { - const nextNotEmptyLine = i + 1 < astClassBody.length - ? astClassBody[i + 1].loc.start.line - 1 - : node.loc.end.line; + let nextNotEmptyLine = node.loc.end.line; + if (i + 1 < astClassBody.length) { + const nextNode = astClassBody[i + 1]; + const startLine = nextNode.leadingComments + ? nextNode.leadingComments[0].loc.start.line + : nextNode.loc.start.line; + nextNotEmptyLine = startLine - 1; + } const propertyStatementRange = new vscode.Range(new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(nextNotEmptyLine, 0)); const propertyStatementText = document.getText(propertyStatementRange); newDocumentText = newDocumentText.replace(propertyStatementText, ''); @@ -45,12 +50,18 @@ function removeProperty(editor, property, phpClass) { const constructorRange = new vscode.Range(new vscode.Position(constructor.ast.loc.start.line - 1, 0), new vscode.Position(constructor.ast.loc.end.line, 0)); const constructorText = document.getText(constructorRange); newDocumentText = newDocumentText.replace(constructorText, ''); + for (let i = 0; i < ((_e = constructor.ast.leadingComments) === null || _e === void 0 ? void 0 : _e.length); i++) { + const commentNode = constructor.ast.leadingComments[i]; + const commentRange = new vscode.Range(new vscode.Position(commentNode.loc.start.line - 1, 0), new vscode.Position(commentNode.loc.end.line, 0)); + const commentText = document.getText(commentRange); + newDocumentText = newDocumentText.replace(commentText, ''); + } } } else { for (let i = 0; i < constructor.ast.arguments.length; i++) { const node = constructor.ast.arguments[i]; - if (((_e = node.name) === null || _e === void 0 ? void 0 : _e.name) == property.getName()) { + if (((_f = node.name) === null || _f === void 0 ? void 0 : _f.name) == property.getName()) { const constructorText = constructor.ast.loc.source; const regexp = new RegExp(`(,\\s*(?!.*,))?${utils_1.escapeForRegExp(node.loc.source)}(\\s*,\\s*)?`); const newConstructorText = constructorText.replace(regexp, ''); @@ -58,7 +69,7 @@ function removeProperty(editor, property, phpClass) { break; } } - for (let i = 0; i < ((_f = constructor.ast.body) === null || _f === void 0 ? void 0 : _f.children.length); i++) { + for (let i = 0; i < ((_g = constructor.ast.body) === null || _g === void 0 ? void 0 : _g.children.length); i++) { const node = constructor.ast.body.children[i]; if (node.kind === 'expressionstatement' && node.expression.kind === 'assign' @@ -70,20 +81,20 @@ function removeProperty(editor, property, phpClass) { break; } } - } - for (let i = 0; i < ((_g = constructor.ast.leadingComments) === null || _g === void 0 ? void 0 : _g.length); i++) { - const commentNode = constructor.ast.leadingComments[i]; - const commentRange = new vscode.Range(new vscode.Position(commentNode.loc.start.line - 1, 0), new vscode.Position(commentNode.loc.end.line, 0)); - const commentText = document.getText(commentRange); - const regexp = new RegExp(`.*\\*.*\\$${property.getName()}\\s*[\r\n]+`); - const newCommentText = commentText.replace(regexp, ''); - newDocumentText = newDocumentText.replace(commentText, newCommentText); + for (let i = 0; i < ((_h = constructor.ast.leadingComments) === null || _h === void 0 ? void 0 : _h.length); i++) { + const commentNode = constructor.ast.leadingComments[i]; + const commentRange = new vscode.Range(new vscode.Position(commentNode.loc.start.line - 1, 0), new vscode.Position(commentNode.loc.end.line, 0)); + const commentText = document.getText(commentRange); + const regexp = new RegExp(`.*\\*.*\\$${property.getName()}\\s*[\r\n]+`); + const newCommentText = commentText.replace(regexp, ''); + newDocumentText = newDocumentText.replace(commentText, newCommentText); + } } } if (newDocumentText === document.getText(phpClassRange)) { return; } - (_h = vscode.window.activeTextEditor) === null || _h === void 0 ? void 0 : _h.edit(editBuilder => { + (_j = vscode.window.activeTextEditor) === null || _j === void 0 ? void 0 : _j.edit(editBuilder => { editBuilder.replace(phpClassRange, newDocumentText); }, { undoStopBefore: true, diff --git a/out/removeProperty.js.map b/out/removeProperty.js.map index dedb600..9cd5b0b 100644 --- a/out/removeProperty.js.map +++ b/out/removeProperty.js.map @@ -1 +1 @@ -{"version":3,"file":"removeProperty.js","sourceRoot":"","sources":["../src/removeProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"removeProperty.js","sourceRoot":"","sources":["../src/removeProperty.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/remove/inputs/ConstructorWithSinglePropertyAndDocblock.php b/out/test/fixtures/remove/inputs/ConstructorWithSinglePropertyAndDocblock.php new file mode 100644 index 0000000..e3d2b34 --- /dev/null +++ b/out/test/fixtures/remove/inputs/ConstructorWithSinglePropertyAndDocblock.php @@ -0,0 +1,17 @@ +name = $name; + } +} diff --git a/out/test/fixtures/remove/outputs/ConstructorWithSinglePropertyAndDocblock.php b/out/test/fixtures/remove/outputs/ConstructorWithSinglePropertyAndDocblock.php new file mode 100644 index 0000000..7bdd7bf --- /dev/null +++ b/out/test/fixtures/remove/outputs/ConstructorWithSinglePropertyAndDocblock.php @@ -0,0 +1,8 @@ + __awaiter(this, void 0, void 0, function* () { yield runFixture('ConstructorWithOtherArgument.php'); })); + test('Should remove the constructor docblock along with the constructor', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithSinglePropertyAndDocblock.php'); + })); test('Should remove typed properties', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('TypedProperty.php'); })); diff --git a/out/test/suite/removeProperty.test.js.map b/out/test/suite/removeProperty.test.js.map index e2ce0c3..7a74f18 100644 --- a/out/test/suite/removeProperty.test.js.map +++ b/out/test/suite/removeProperty.test.js.map @@ -1 +1 @@ -{"version":3,"file":"removeProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/removeProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"removeProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/removeProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/removeProperty.ts b/src/removeProperty.ts index cef427f..4751aa4 100644 --- a/src/removeProperty.ts +++ b/src/removeProperty.ts @@ -22,9 +22,18 @@ export function removeProperty(editor: vscode.TextEditor, property: Property, ph if (propertyNode.name?.name === property.getName()) { if (node.properties.length === 1) { - const nextNotEmptyLine = i + 1 < astClassBody.length - ? astClassBody[i + 1].loc.start.line - 1 - : node.loc.end.line; + let nextNotEmptyLine = node.loc.end.line; + + if (i + 1 < astClassBody.length) { + const nextNode = astClassBody[i + 1]; + + const startLine = nextNode.leadingComments + ? nextNode.leadingComments[0].loc.start.line + : nextNode.loc.start.line; + + nextNotEmptyLine = startLine - 1; + } + const propertyStatementRange = new vscode.Range( new vscode.Position(node.loc.start.line - 1, 0), new vscode.Position(nextNotEmptyLine, 0) @@ -72,6 +81,19 @@ export function removeProperty(editor: vscode.TextEditor, property: Property, ph const constructorText = document.getText(constructorRange); newDocumentText = newDocumentText.replace(constructorText, ''); + + for (let i = 0; i < constructor.ast.leadingComments?.length; i++) { + const commentNode = constructor.ast.leadingComments[i]; + + const commentRange = new vscode.Range( + new vscode.Position(commentNode.loc.start.line - 1, 0), + new vscode.Position(commentNode.loc.end.line, 0) + ); + + const commentText = document.getText(commentRange); + + newDocumentText = newDocumentText.replace(commentText, ''); + } } } else { for (let i = 0; i < constructor.ast.arguments.length; i++) { @@ -105,22 +127,22 @@ export function removeProperty(editor: vscode.TextEditor, property: Property, ph break; } } - } - - for (let i = 0; i < constructor.ast.leadingComments?.length; i++) { - const commentNode = constructor.ast.leadingComments[i]; - - const commentRange = new vscode.Range( - new vscode.Position(commentNode.loc.start.line - 1, 0), - new vscode.Position(commentNode.loc.end.line, 0) - ); - const commentText = document.getText(commentRange); - - const regexp = new RegExp(`.*\\*.*\\$${property.getName()}\\s*[\r\n]+`); - const newCommentText = commentText.replace(regexp, ''); - - newDocumentText = newDocumentText.replace(commentText, newCommentText); + for (let i = 0; i < constructor.ast.leadingComments?.length; i++) { + const commentNode = constructor.ast.leadingComments[i]; + + const commentRange = new vscode.Range( + new vscode.Position(commentNode.loc.start.line - 1, 0), + new vscode.Position(commentNode.loc.end.line, 0) + ); + + const commentText = document.getText(commentRange); + + const regexp = new RegExp(`.*\\*.*\\$${property.getName()}\\s*[\r\n]+`); + const newCommentText = commentText.replace(regexp, ''); + + newDocumentText = newDocumentText.replace(commentText, newCommentText); + } } } diff --git a/src/test/suite/removeProperty.test.ts b/src/test/suite/removeProperty.test.ts index f0d1d87..74d1b9f 100644 --- a/src/test/suite/removeProperty.test.ts +++ b/src/test/suite/removeProperty.test.ts @@ -35,6 +35,10 @@ suite('Remove Property', function () { await runFixture('ConstructorWithOtherArgument.php'); }); + test('Should remove the constructor docblock along with the constructor', async () => { + await runFixture('ConstructorWithSinglePropertyAndDocblock.php'); + }); + test('Should remove typed properties', async () => { await runFixture('TypedProperty.php'); }); From 550eccccba39a5480d52fdba639b94293324f75c Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 22 Aug 2020 15:01:52 +0200 Subject: [PATCH 27/41] Remove property from constructor docblock param --- out/extension.js | 39 ++++++++++-------- out/extension.js.map | 2 +- ...ePropertiesCursorInConstructorDocblock.php | 25 +++++++++++ ...ePropertiesCursorInConstructorDocblock.php | 21 ++++++++++ out/test/suite/removeProperty.test.js | 3 ++ out/test/suite/removeProperty.test.js.map | 2 +- src/extension.ts | 41 +++++++++++-------- src/test/suite/removeProperty.test.ts | 4 ++ 8 files changed, 103 insertions(+), 34 deletions(-) create mode 100644 out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php create mode 100644 out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php diff --git a/out/extension.js b/out/extension.js index cbf0b8a..3b79d8f 100644 --- a/out/extension.js +++ b/out/extension.js @@ -295,25 +295,32 @@ function activate(context) { vscode.window.showInformationMessage('No class found'); return; } - const line = document.lineAt(selectionLineNumber); - const lineAst = phpEngine.parseEval(`class A { ${line.text} }`); - const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); let propertyName; - if (((_10 = (_9 = lineAst.children[0]) === null || _9 === void 0 ? void 0 : _9.body[0]) === null || _10 === void 0 ? void 0 : _10.kind) === 'propertystatement') { - const properties = lineAst.children[0].body[0].properties; - const propertyAst = (_11 = properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _11 !== void 0 ? _11 : properties[0]; - propertyName = (_12 = propertyAst.name) === null || _12 === void 0 ? void 0 : _12.name; - if (propertyName === 'this') { - const assignmentAst = phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`); - if (((_16 = (_15 = (_14 = (_13 = assignmentAst.children[0]) === null || _13 === void 0 ? void 0 : _13.body[0]) === null || _14 === void 0 ? void 0 : _14.body) === null || _15 === void 0 ? void 0 : _15.children[0]) === null || _16 === void 0 ? void 0 : _16.kind) === 'expressionstatement') { - propertyName = (_17 = assignmentAst.children[0].body[0].body.children[0].expression.right) === null || _17 === void 0 ? void 0 : _17.name; + const line = document.lineAt(selectionLineNumber); + const paramRegex = /@param(?:\s+\S+)?\s+\$(\S+).*/; + const matchParam = paramRegex.exec(line.text); + if (matchParam) { + propertyName = matchParam[1]; + } + else { + const lineAst = phpEngine.parseEval(`class A { ${line.text} }`); + const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); + if (((_10 = (_9 = lineAst.children[0]) === null || _9 === void 0 ? void 0 : _9.body[0]) === null || _10 === void 0 ? void 0 : _10.kind) === 'propertystatement') { + const properties = lineAst.children[0].body[0].properties; + const propertyAst = (_11 = properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _11 !== void 0 ? _11 : properties[0]; + propertyName = (_12 = propertyAst.name) === null || _12 === void 0 ? void 0 : _12.name; + if (propertyName === 'this') { + const assignmentAst = phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`); + if (((_16 = (_15 = (_14 = (_13 = assignmentAst.children[0]) === null || _13 === void 0 ? void 0 : _13.body[0]) === null || _14 === void 0 ? void 0 : _14.body) === null || _15 === void 0 ? void 0 : _15.children[0]) === null || _16 === void 0 ? void 0 : _16.kind) === 'expressionstatement') { + propertyName = (_17 = assignmentAst.children[0].body[0].body.children[0].expression.right) === null || _17 === void 0 ? void 0 : _17.name; + } } } - } - else if (((_19 = (_18 = lineAst.children[0]) === null || _18 === void 0 ? void 0 : _18.body[0]) === null || _19 === void 0 ? void 0 : _19.kind) === 'method') { - const constructorArgs = lineAst.children[0].body[0].arguments; - const argumentAst = (_20 = constructorArgs.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _20 !== void 0 ? _20 : constructorArgs[0]; - propertyName = (_21 = argumentAst.name) === null || _21 === void 0 ? void 0 : _21.name; + else if (((_19 = (_18 = lineAst.children[0]) === null || _18 === void 0 ? void 0 : _18.body[0]) === null || _19 === void 0 ? void 0 : _19.kind) === 'method') { + const constructorArgs = lineAst.children[0].body[0].arguments; + const argumentAst = (_20 = constructorArgs.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _20 !== void 0 ? _20 : constructorArgs[0]; + propertyName = (_21 = argumentAst.name) === null || _21 === void 0 ? void 0 : _21.name; + } } if (!propertyName) { propertyName = yield vscode.window.showInputBox({ diff --git a/out/extension.js.map b/out/extension.js.map index 8ba1422..36411e5 100644 --- a/out/extension.js.map +++ b/out/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php b/out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php new file mode 100644 index 0000000..838e025 --- /dev/null +++ b/out/test/fixtures/remove/inputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php @@ -0,0 +1,25 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php b/out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php new file mode 100644 index 0000000..742107f --- /dev/null +++ b/out/test/fixtures/remove/outputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php @@ -0,0 +1,21 @@ +class = $class; + $this->name = $name; + } +} diff --git a/out/test/suite/removeProperty.test.js b/out/test/suite/removeProperty.test.js index b32c13a..2a6c931 100644 --- a/out/test/suite/removeProperty.test.js +++ b/out/test/suite/removeProperty.test.js @@ -58,6 +58,9 @@ suite('Remove Property', function () { test('Should remove a property when the cursor is placed in its assignment', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('ConstructorWithMultiplePropertiesCursorInAssignment.php', new vscode.Position(15, 18)); })); + test('Should remove a property when the cursor is placed in its constructor docblock', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php', new vscode.Position(16, 24)); + })); }); function runFixture(fileName, cursorPosition) { return __awaiter(this, void 0, void 0, function* () { diff --git a/out/test/suite/removeProperty.test.js.map b/out/test/suite/removeProperty.test.js.map index 7a74f18..6ac645a 100644 --- a/out/test/suite/removeProperty.test.js.map +++ b/out/test/suite/removeProperty.test.js.map @@ -1 +1 @@ -{"version":3,"file":"removeProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/removeProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"removeProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/removeProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index aa31dc3..1a0f723 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -374,31 +374,40 @@ export function activate(context: vscode.ExtensionContext) { return; } + let propertyName; + const line = document.lineAt(selectionLineNumber); - const lineAst = (phpEngine.parseEval(`class A { ${line.text} }`) as any); + const paramRegex = /@param(?:\s+\S+)?\s+\$(\S+).*/; - const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); + const matchParam = paramRegex.exec(line.text); - let propertyName; - if (lineAst.children[0]?.body[0]?.kind === 'propertystatement') { - const properties = (lineAst.children[0].body[0].properties as any[]); + if (matchParam) { + propertyName = matchParam[1]; + } else { + const lineAst = (phpEngine.parseEval(`class A { ${line.text} }`) as any); - const propertyAst = properties.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? properties[0]; - propertyName = propertyAst.name?.name; + const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); + + if (lineAst.children[0]?.body[0]?.kind === 'propertystatement') { + const properties = (lineAst.children[0].body[0].properties as any[]); - if (propertyName === 'this') { - const assignmentAst = (phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`) as any); + const propertyAst = properties.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? properties[0]; + propertyName = propertyAst.name?.name; - if (assignmentAst.children[0]?.body[0]?.body?.children[0]?.kind === 'expressionstatement') { - propertyName = assignmentAst.children[0].body[0].body.children[0].expression.right?.name; + if (propertyName === 'this') { + const assignmentAst = (phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`) as any); + + if (assignmentAst.children[0]?.body[0]?.body?.children[0]?.kind === 'expressionstatement') { + propertyName = assignmentAst.children[0].body[0].body.children[0].expression.right?.name; + } } - } - } else if (lineAst.children[0]?.body[0]?.kind === 'method') { - const constructorArgs = (lineAst.children[0].body[0].arguments as any[]); + } else if (lineAst.children[0]?.body[0]?.kind === 'method') { + const constructorArgs = (lineAst.children[0].body[0].arguments as any[]); - const argumentAst = constructorArgs.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? constructorArgs[0]; - propertyName = argumentAst.name?.name; + const argumentAst = constructorArgs.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? constructorArgs[0]; + propertyName = argumentAst.name?.name; + } } if (!propertyName) { diff --git a/src/test/suite/removeProperty.test.ts b/src/test/suite/removeProperty.test.ts index 74d1b9f..5b3eb10 100644 --- a/src/test/suite/removeProperty.test.ts +++ b/src/test/suite/removeProperty.test.ts @@ -62,6 +62,10 @@ suite('Remove Property', function () { test('Should remove a property when the cursor is placed in its assignment', async () => { await runFixture('ConstructorWithMultiplePropertiesCursorInAssignment.php', new vscode.Position(15, 18)); }); + + test('Should remove a property when the cursor is placed in its constructor docblock', async () => { + await runFixture('ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php', new vscode.Position(16, 24)); + }); }); async function runFixture(fileName: string, cursorPosition?: vscode.Position) { From f1d21de6b5799f1cbc569502b7c3c673567d7c83 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 22 Aug 2020 15:18:03 +0200 Subject: [PATCH 28/41] Extract code to property name from cursor --- out/extension.js | 74 ++--------------------------- out/extension.js.map | 2 +- out/property.js.map | 2 +- out/utils.js | 30 ++++++++++++ out/utils.js.map | 2 +- src/extension.ts | 109 +++++++++---------------------------------- src/property.ts | 1 - src/utils.ts | 42 +++++++++++++++++ 8 files changed, 103 insertions(+), 159 deletions(-) diff --git a/out/extension.js b/out/extension.js index 3b79d8f..58b5fd2 100644 --- a/out/extension.js +++ b/out/extension.js @@ -124,7 +124,6 @@ function activate(context) { const property = new property_1.default(propertyName, (_g = (_f = propertyAst.type) === null || _f === void 0 ? void 0 : _f.name) !== null && _g !== void 0 ? _g : docblockType); insertProperty_1.default(vscode.window.activeTextEditor, property, phpClass, line.text); })), vscode.commands.registerCommand('phpAddProperty.rename', () => __awaiter(this, void 0, void 0, function* () { - var _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v; if (vscode.window.activeTextEditor === undefined) { return; } @@ -157,25 +156,7 @@ function activate(context) { return; } const line = document.lineAt(selectionLineNumber); - const lineAst = phpEngine.parseEval(`class A { ${line.text} }`); - const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); - let propertyName; - if (((_j = (_h = lineAst.children[0]) === null || _h === void 0 ? void 0 : _h.body[0]) === null || _j === void 0 ? void 0 : _j.kind) === 'propertystatement') { - const properties = lineAst.children[0].body[0].properties; - const propertyAst = (_k = properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _k !== void 0 ? _k : properties[0]; - propertyName = (_l = propertyAst.name) === null || _l === void 0 ? void 0 : _l.name; - if (propertyName === 'this') { - const assignmentAst = phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`); - if (((_q = (_p = (_o = (_m = assignmentAst.children[0]) === null || _m === void 0 ? void 0 : _m.body[0]) === null || _o === void 0 ? void 0 : _o.body) === null || _p === void 0 ? void 0 : _p.children[0]) === null || _q === void 0 ? void 0 : _q.kind) === 'expressionstatement') { - propertyName = (_r = assignmentAst.children[0].body[0].body.children[0].expression.right) === null || _r === void 0 ? void 0 : _r.name; - } - } - } - else if (((_t = (_s = lineAst.children[0]) === null || _s === void 0 ? void 0 : _s.body[0]) === null || _t === void 0 ? void 0 : _t.kind) === 'method') { - const constructorArgs = lineAst.children[0].body[0].arguments; - const argumentAst = (_u = constructorArgs.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _u !== void 0 ? _u : constructorArgs[0]; - propertyName = (_v = argumentAst.name) === null || _v === void 0 ? void 0 : _v.name; - } + let propertyName = utils_1.getPropertyNameFromLineText(line.text, document, phpEngine, vscode.window.activeTextEditor.selection.active); if (!propertyName) { propertyName = yield vscode.window.showInputBox({ placeHolder: 'Enter the property name you want to rename' @@ -194,7 +175,6 @@ function activate(context) { const newProperty = new property_1.default(newPropertyName); renameProperty_1.renameProperty(vscode.window.activeTextEditor, property, newProperty, phpClass); })), vscode.commands.registerCommand('phpAddProperty.changeType', () => __awaiter(this, void 0, void 0, function* () { - var _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8; if (vscode.window.activeTextEditor === undefined) { return; } @@ -227,25 +207,7 @@ function activate(context) { return; } const line = document.lineAt(selectionLineNumber); - const lineAst = phpEngine.parseEval(`class A { ${line.text} }`); - const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); - let propertyName; - if (((_x = (_w = lineAst.children[0]) === null || _w === void 0 ? void 0 : _w.body[0]) === null || _x === void 0 ? void 0 : _x.kind) === 'propertystatement') { - const properties = lineAst.children[0].body[0].properties; - const propertyAst = (_y = properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _y !== void 0 ? _y : properties[0]; - propertyName = (_z = propertyAst.name) === null || _z === void 0 ? void 0 : _z.name; - if (propertyName === 'this') { - const assignmentAst = phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`); - if (((_3 = (_2 = (_1 = (_0 = assignmentAst.children[0]) === null || _0 === void 0 ? void 0 : _0.body[0]) === null || _1 === void 0 ? void 0 : _1.body) === null || _2 === void 0 ? void 0 : _2.children[0]) === null || _3 === void 0 ? void 0 : _3.kind) === 'expressionstatement') { - propertyName = (_4 = assignmentAst.children[0].body[0].body.children[0].expression.right) === null || _4 === void 0 ? void 0 : _4.name; - } - } - } - else if (((_6 = (_5 = lineAst.children[0]) === null || _5 === void 0 ? void 0 : _5.body[0]) === null || _6 === void 0 ? void 0 : _6.kind) === 'method') { - const constructorArgs = lineAst.children[0].body[0].arguments; - const argumentAst = (_7 = constructorArgs.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _7 !== void 0 ? _7 : constructorArgs[0]; - propertyName = (_8 = argumentAst.name) === null || _8 === void 0 ? void 0 : _8.name; - } + let propertyName = utils_1.getPropertyNameFromLineText(line.text, document, phpEngine, vscode.window.activeTextEditor.selection.active); if (!propertyName) { propertyName = yield vscode.window.showInputBox({ placeHolder: 'Enter the property name you want to change type' @@ -263,7 +225,6 @@ function activate(context) { } changePropertyType_1.changePropertyType(vscode.window.activeTextEditor, property, newPropertyType, phpClass); })), vscode.commands.registerCommand('phpAddProperty.remove', () => __awaiter(this, void 0, void 0, function* () { - var _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21; if (vscode.window.activeTextEditor === undefined) { return; } @@ -295,33 +256,8 @@ function activate(context) { vscode.window.showInformationMessage('No class found'); return; } - let propertyName; const line = document.lineAt(selectionLineNumber); - const paramRegex = /@param(?:\s+\S+)?\s+\$(\S+).*/; - const matchParam = paramRegex.exec(line.text); - if (matchParam) { - propertyName = matchParam[1]; - } - else { - const lineAst = phpEngine.parseEval(`class A { ${line.text} }`); - const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); - if (((_10 = (_9 = lineAst.children[0]) === null || _9 === void 0 ? void 0 : _9.body[0]) === null || _10 === void 0 ? void 0 : _10.kind) === 'propertystatement') { - const properties = lineAst.children[0].body[0].properties; - const propertyAst = (_11 = properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _11 !== void 0 ? _11 : properties[0]; - propertyName = (_12 = propertyAst.name) === null || _12 === void 0 ? void 0 : _12.name; - if (propertyName === 'this') { - const assignmentAst = phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`); - if (((_16 = (_15 = (_14 = (_13 = assignmentAst.children[0]) === null || _13 === void 0 ? void 0 : _13.body[0]) === null || _14 === void 0 ? void 0 : _14.body) === null || _15 === void 0 ? void 0 : _15.children[0]) === null || _16 === void 0 ? void 0 : _16.kind) === 'expressionstatement') { - propertyName = (_17 = assignmentAst.children[0].body[0].body.children[0].expression.right) === null || _17 === void 0 ? void 0 : _17.name; - } - } - } - else if (((_19 = (_18 = lineAst.children[0]) === null || _18 === void 0 ? void 0 : _18.body[0]) === null || _19 === void 0 ? void 0 : _19.kind) === 'method') { - const constructorArgs = lineAst.children[0].body[0].arguments; - const argumentAst = (_20 = constructorArgs.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _20 !== void 0 ? _20 : constructorArgs[0]; - propertyName = (_21 = argumentAst.name) === null || _21 === void 0 ? void 0 : _21.name; - } - } + let propertyName = utils_1.getPropertyNameFromLineText(line.text, document, phpEngine, vscode.window.activeTextEditor.selection.active); if (!propertyName) { propertyName = yield vscode.window.showInputBox({ placeHolder: 'Enter the property name you want to remove' @@ -333,7 +269,7 @@ function activate(context) { const property = new property_1.default(propertyName); removeProperty_1.removeProperty(vscode.window.activeTextEditor, property, phpClass); })), vscode.commands.registerCommand('phpAddProperty.breakConstructorIntoMultiline', () => __awaiter(this, void 0, void 0, function* () { - var _22; + var _h; if (vscode.window.activeTextEditor === undefined) { return; } @@ -370,7 +306,7 @@ function activate(context) { if (newDocumentText === document.getText(phpClassRange)) { return; } - (_22 = vscode.window.activeTextEditor) === null || _22 === void 0 ? void 0 : _22.edit(editBuilder => { + (_h = vscode.window.activeTextEditor) === null || _h === void 0 ? void 0 : _h.edit(editBuilder => { editBuilder.replace(phpClassRange, newDocumentText); }, { undoStopBefore: true, diff --git a/out/extension.js.map b/out/extension.js.map index 36411e5..a1110e8 100644 --- a/out/extension.js.map +++ b/out/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/property.js.map b/out/property.js.map index 42256d0..ccb2721 100644 --- a/out/property.js.map +++ b/out/property.js.map @@ -1 +1 @@ -{"version":3,"file":"property.js","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"property.js","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/utils.js b/out/utils.js index d32d697..df6d91f 100644 --- a/out/utils.js +++ b/out/utils.js @@ -46,6 +46,36 @@ function forceBreakConstructorIntoMultiline(text) { return text.replace(match[0], getMultilineConstructorText(match[0], match[1], match[2])); } exports.forceBreakConstructorIntoMultiline = forceBreakConstructorIntoMultiline; +function getPropertyNameFromLineText(lineText, document, phpEngine, cursorPosition) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; + const paramRegex = /@param(?:\s+\S+)?\s+\$(\S+).*/; + const matchParam = paramRegex.exec(lineText); + if (matchParam) { + return matchParam[1]; + } + else { + const lineAst = phpEngine.parseEval(`class A { ${lineText} }`); + const selectedWord = document.getText(document.getWordRangeAtPosition(cursorPosition)).replace(/^\$/, ''); + if (((_b = (_a = lineAst.children[0]) === null || _a === void 0 ? void 0 : _a.body[0]) === null || _b === void 0 ? void 0 : _b.kind) === 'propertystatement') { + const properties = lineAst.children[0].body[0].properties; + const propertyAst = (_c = properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _c !== void 0 ? _c : properties[0]; + let propertyName = (_d = propertyAst.name) === null || _d === void 0 ? void 0 : _d.name; + if (propertyName === 'this') { + const assignmentAst = phpEngine.parseEval(`class A { public function __construct() { ${lineText} } }`); + if (((_h = (_g = (_f = (_e = assignmentAst.children[0]) === null || _e === void 0 ? void 0 : _e.body[0]) === null || _f === void 0 ? void 0 : _f.body) === null || _g === void 0 ? void 0 : _g.children[0]) === null || _h === void 0 ? void 0 : _h.kind) === 'expressionstatement') { + propertyName = (_j = assignmentAst.children[0].body[0].body.children[0].expression.right) === null || _j === void 0 ? void 0 : _j.name; + } + } + return propertyName; + } + else if (((_l = (_k = lineAst.children[0]) === null || _k === void 0 ? void 0 : _k.body[0]) === null || _l === void 0 ? void 0 : _l.kind) === 'method') { + const constructorArgs = lineAst.children[0].body[0].arguments; + const argumentAst = (_m = constructorArgs.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _m !== void 0 ? _m : constructorArgs[0]; + return (_o = argumentAst.name) === null || _o === void 0 ? void 0 : _o.name; + } + } +} +exports.getPropertyNameFromLineText = getPropertyNameFromLineText; function calculateIndentationLevel(index) { return Math.floor(index / configUsingResource('editor.tabSize')); } diff --git a/out/utils.js.map b/out/utils.js.map index 71b68aa..7157513 100644 --- a/out/utils.js.map +++ b/out/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;AAAA,iCAAiC;AAEjC,SAAgB,mBAAmB,CAAC,YAAoB;IACpD,IAAI,iBAAiB,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC3D,IAAI,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE;QAChD,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;KACxE;IACD,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACjE,CAAC;AAND,kDAMC;AAED,SAAS,uBAAuB,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,kDAAkD,CAAC;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/B,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,2BAA2B,CAAC,IAAY,EAAE,kBAA0B,EAAE,cAAsB;IACjG,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/F,MAAM,wBAAwB,GAAG,kBAAkB;UAC7C,KAAK;UACL,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;UAC7B,UAAU,CAAC,KAAK,CAAC,CAAC;IAExB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,6BAA6B,CAAC,IAAY;IACtD,IAAI,MAAM,CAAC,uEAAuE,CAAC,KAAK,IAAI,EAAE;QAC1F,OAAO,IAAI,CAAC;KACf;IAED,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAE5C,IAAI,CAAC,KAAK,EAAE;QACR,OAAO,IAAI,CAAC;KACf;IAED,MAAM,mBAAmB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,MAAM,CAAC,6EAA6E,CAAW,CAAC;IAEtH,IAAI,mBAAmB,CAAC,MAAM,IAAI,aAAa,EAAE;QAC7C,OAAO,IAAI,CAAC;KACf;IAED,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnH,CAAC;AAnBD,sEAmBC;AAED,SAAgB,kCAAkC,CAAC,IAAY;IAC3D,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAE5C,IAAI,CAAC,KAAK,EAAE;QACR,OAAO,IAAI,CAAC;KACf;IAED,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,2BAA2B,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7F,CAAC;AARD,gFAQC;AAED,SAAgB,yBAAyB,CAAC,KAAa;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACrE,CAAC;AAFD,8DAEC;AAED,SAAgB,wCAAwC,CAAC,QAAgB;IACrE,MAAM,OAAO,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAEtD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEzB,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACtB,KAAK,EAAE,CAAC;YACR,MAAM;SACT;QAED,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;KACxC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAhBD,4FAgBC;AAED,SAAgB,UAAU,CAAC,IAAY,EAAE,QAAgB,CAAC;IACtD;;;;OAIG;IACH,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,IAAI,mBAAmB,CAAC,qBAAqB,CAAC,EAAE;QAC5C,MAAM,OAAO,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACtD,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC7B;IACD,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;AACpC,CAAC;AAZD,gCAYC;AAED,SAAgB,mBAAmB,CAAC,GAAW;;IAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CACnD,KAAK,CAAC,CAAC,CAAC,QACR,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,GAAG,CAC/C,CAAC;IAEF,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AAClE,CAAC;AARD,kDAQC;AAED,SAAgB,MAAM,CAAC,GAAW;IAC9B,OAAO,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACxD,CAAC;AAFD,wBAEC;AAED,SAAgB,eAAe,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;AACzD,CAAC;AAFD,0CAEC;AAED,SAAgB,gBAAgB,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC;AAFD,4CAEC;AAED,SAAgB,kBAAkB,CAAC,OAAe,EAAE,KAAmB;;IACnE,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;IAErD,MAAA,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,IAAI,CAChC,WAAW,CAAC,EAAE;QACV,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACxD,CAAC,EACD;QACI,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,KAAK;KACvB,EACH,IAAI,CAAC,GAAG,EAAE;QACR,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAE9C,IAAI,MAAM,EAAE;YACR,MAAM,CAAC,aAAa,CAChB,IAAI,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EACjC,KAAK,EACL;gBACI,cAAc,EAAE,KAAK;gBACrB,aAAa,EAAE,KAAK;aACvB,CACJ,CAAC;SACL;IACL,CAAC,EAAE;AACP,CAAC;AAzBD,gDAyBC"} \ No newline at end of file +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index 1a0f723..eff42ae 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -4,7 +4,7 @@ import Locator from './locator'; import Property from './property'; import insertProperty from './insertProperty'; import { removeProperty } from './removeProperty'; -import { forceBreakConstructorIntoMultiline } from './utils'; +import { forceBreakConstructorIntoMultiline, getPropertyNameFromLineText } from './utils'; import { renameProperty } from './renameProperty'; import { changePropertyType } from './changePropertyType'; @@ -191,33 +191,15 @@ export function activate(context: vscode.ExtensionContext) { return; } - + const line = document.lineAt(selectionLineNumber); - - const lineAst = (phpEngine.parseEval(`class A { ${line.text} }`) as any); - - const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); - - let propertyName; - if (lineAst.children[0]?.body[0]?.kind === 'propertystatement') { - const properties = (lineAst.children[0].body[0].properties as any[]); - - const propertyAst = properties.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? properties[0]; - propertyName = propertyAst.name?.name; - - if (propertyName === 'this') { - const assignmentAst = (phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`) as any); - - if (assignmentAst.children[0]?.body[0]?.body?.children[0]?.kind === 'expressionstatement') { - propertyName = assignmentAst.children[0].body[0].body.children[0].expression.right?.name; - } - } - } else if (lineAst.children[0]?.body[0]?.kind === 'method') { - const constructorArgs = (lineAst.children[0].body[0].arguments as any[]); - - const argumentAst = constructorArgs.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? constructorArgs[0]; - propertyName = argumentAst.name?.name; - } + + let propertyName = getPropertyNameFromLineText( + line.text, + document, + phpEngine, + vscode.window.activeTextEditor.selection.active + ); if (!propertyName) { propertyName = await vscode.window.showInputBox({ @@ -285,31 +267,13 @@ export function activate(context: vscode.ExtensionContext) { } const line = document.lineAt(selectionLineNumber); - - const lineAst = (phpEngine.parseEval(`class A { ${line.text} }`) as any); - - const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); - - let propertyName; - if (lineAst.children[0]?.body[0]?.kind === 'propertystatement') { - const properties = (lineAst.children[0].body[0].properties as any[]); - - const propertyAst = properties.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? properties[0]; - propertyName = propertyAst.name?.name; - - if (propertyName === 'this') { - const assignmentAst = (phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`) as any); - - if (assignmentAst.children[0]?.body[0]?.body?.children[0]?.kind === 'expressionstatement') { - propertyName = assignmentAst.children[0].body[0].body.children[0].expression.right?.name; - } - } - } else if (lineAst.children[0]?.body[0]?.kind === 'method') { - const constructorArgs = (lineAst.children[0].body[0].arguments as any[]); - - const argumentAst = constructorArgs.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? constructorArgs[0]; - propertyName = argumentAst.name?.name; - } + + let propertyName = getPropertyNameFromLineText( + line.text, + document, + phpEngine, + vscode.window.activeTextEditor.selection.active + ); if (!propertyName) { propertyName = await vscode.window.showInputBox({ @@ -374,41 +338,14 @@ export function activate(context: vscode.ExtensionContext) { return; } - let propertyName; - const line = document.lineAt(selectionLineNumber); - - const paramRegex = /@param(?:\s+\S+)?\s+\$(\S+).*/; - - const matchParam = paramRegex.exec(line.text); - - if (matchParam) { - propertyName = matchParam[1]; - } else { - const lineAst = (phpEngine.parseEval(`class A { ${line.text} }`) as any); - - const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); - - if (lineAst.children[0]?.body[0]?.kind === 'propertystatement') { - const properties = (lineAst.children[0].body[0].properties as any[]); - - const propertyAst = properties.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? properties[0]; - propertyName = propertyAst.name?.name; - - if (propertyName === 'this') { - const assignmentAst = (phpEngine.parseEval(`class A { public function __construct() { ${line.text} } }`) as any); - - if (assignmentAst.children[0]?.body[0]?.body?.children[0]?.kind === 'expressionstatement') { - propertyName = assignmentAst.children[0].body[0].body.children[0].expression.right?.name; - } - } - } else if (lineAst.children[0]?.body[0]?.kind === 'method') { - const constructorArgs = (lineAst.children[0].body[0].arguments as any[]); - - const argumentAst = constructorArgs.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? constructorArgs[0]; - propertyName = argumentAst.name?.name; - } - } + + let propertyName = getPropertyNameFromLineText( + line.text, + document, + phpEngine, + vscode.window.activeTextEditor.selection.active + ); if (!propertyName) { propertyName = await vscode.window.showInputBox({ diff --git a/src/property.ts b/src/property.ts index 14115ba..d126a6d 100644 --- a/src/property.ts +++ b/src/property.ts @@ -111,5 +111,4 @@ export default class Property { return ` * @param ${constructorParamDocblockText}`; } - } diff --git a/src/utils.ts b/src/utils.ts index 253cdf5..663a62c 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,4 +1,5 @@ import * as vscode from 'vscode'; +import PhpEngine from 'php-parser'; export function getVisibilityChoice(defaultValue: string): string { let visibilityChoices = ['public', 'protected', 'private']; @@ -57,6 +58,47 @@ export function forceBreakConstructorIntoMultiline(text: string): string { return text.replace(match[0], getMultilineConstructorText(match[0], match[1], match[2])); } +export function getPropertyNameFromLineText( + lineText: string, + document: vscode.TextDocument, + phpEngine: PhpEngine, + cursorPosition: vscode.Position +): string|undefined { + const paramRegex = /@param(?:\s+\S+)?\s+\$(\S+).*/; + + const matchParam = paramRegex.exec(lineText); + + if (matchParam) { + return matchParam[1]; + } else { + const lineAst = (phpEngine.parseEval(`class A { ${lineText} }`) as any); + + const selectedWord = document.getText(document.getWordRangeAtPosition(cursorPosition)).replace(/^\$/, ''); + + if (lineAst.children[0]?.body[0]?.kind === 'propertystatement') { + const properties = (lineAst.children[0].body[0].properties as any[]); + + const propertyAst = properties.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? properties[0]; + let propertyName = propertyAst.name?.name; + + if (propertyName === 'this') { + const assignmentAst = (phpEngine.parseEval(`class A { public function __construct() { ${lineText} } }`) as any); + + if (assignmentAst.children[0]?.body[0]?.body?.children[0]?.kind === 'expressionstatement') { + propertyName = assignmentAst.children[0].body[0].body.children[0].expression.right?.name; + } + } + + return propertyName; + } else if (lineAst.children[0]?.body[0]?.kind === 'method') { + const constructorArgs = (lineAst.children[0].body[0].arguments as any[]); + + const argumentAst = constructorArgs.find((propertyAst) => propertyAst.name?.name === selectedWord) ?? constructorArgs[0]; + return argumentAst.name?.name; + } + } +} + export function calculateIndentationLevel(index: number): number { return Math.floor(index / configUsingResource('editor.tabSize')); } From a2dc4eb634b555cddc71fd804d211ca2df65f948 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 22 Aug 2020 15:26:45 +0200 Subject: [PATCH 29/41] Add property name from constructor docblock tests --- .../inputs/ConstructorDocblock.php | 4 +-- ...ePropertiesCursorInConstructorDocblock.php | 25 +++++++++++++++++++ .../outputs/ConstructorDocblock.php | 4 +-- ...ePropertiesCursorInConstructorDocblock.php | 25 +++++++++++++++++++ ...ePropertiesCursorInConstructorDocblock.php | 23 +++++++++++++++++ ...ePropertiesCursorInConstructorDocblock.php | 23 +++++++++++++++++ out/test/suite/changePropertyType.test.js | 3 +++ out/test/suite/changePropertyType.test.js.map | 2 +- out/test/suite/renameProperty.test.js | 3 +++ out/test/suite/renameProperty.test.js.map | 2 +- src/test/suite/changePropertyType.test.ts | 4 +++ src/test/suite/renameProperty.test.ts | 4 +++ 12 files changed, 116 insertions(+), 6 deletions(-) create mode 100644 out/test/fixtures/changePropertyType/inputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php create mode 100644 out/test/fixtures/changePropertyType/outputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php create mode 100644 out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php create mode 100644 out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php diff --git a/out/test/fixtures/changePropertyType/inputs/ConstructorDocblock.php b/out/test/fixtures/changePropertyType/inputs/ConstructorDocblock.php index 6d1fa2b..838e025 100644 --- a/out/test/fixtures/changePropertyType/inputs/ConstructorDocblock.php +++ b/out/test/fixtures/changePropertyType/inputs/ConstructorDocblock.php @@ -12,8 +12,8 @@ class Jedi private $rank; /** - * @param mixed $class - * @param string $name + * @param mixed $class + * @param string $name * @param mixed $rank */ public function __construct($class, string $name, $rank) diff --git a/out/test/fixtures/changePropertyType/inputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php b/out/test/fixtures/changePropertyType/inputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php new file mode 100644 index 0000000..838e025 --- /dev/null +++ b/out/test/fixtures/changePropertyType/inputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php @@ -0,0 +1,25 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/changePropertyType/outputs/ConstructorDocblock.php b/out/test/fixtures/changePropertyType/outputs/ConstructorDocblock.php index cc51e7f..bd069a8 100644 --- a/out/test/fixtures/changePropertyType/outputs/ConstructorDocblock.php +++ b/out/test/fixtures/changePropertyType/outputs/ConstructorDocblock.php @@ -12,8 +12,8 @@ class Jedi private $rank; /** - * @param mixed $class - * @param Name $name + * @param mixed $class + * @param Name $name * @param mixed $rank */ public function __construct($class, Name $name, $rank) diff --git a/out/test/fixtures/changePropertyType/outputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php b/out/test/fixtures/changePropertyType/outputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php new file mode 100644 index 0000000..bd069a8 --- /dev/null +++ b/out/test/fixtures/changePropertyType/outputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php @@ -0,0 +1,25 @@ +class = $class; + $this->name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php b/out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php new file mode 100644 index 0000000..e6292a1 --- /dev/null +++ b/out/test/fixtures/rename/inputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php @@ -0,0 +1,23 @@ +name = $name; + $this->rank = $rank; + } +} diff --git a/out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php b/out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php new file mode 100644 index 0000000..764d02f --- /dev/null +++ b/out/test/fixtures/rename/outputs/ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php @@ -0,0 +1,23 @@ +newName = $newName; + $this->rank = $rank; + } +} diff --git a/out/test/suite/changePropertyType.test.js b/out/test/suite/changePropertyType.test.js index e57f535..68d64b6 100644 --- a/out/test/suite/changePropertyType.test.js +++ b/out/test/suite/changePropertyType.test.js @@ -41,6 +41,9 @@ suite('Change Property Type', function () { test('Should change property type in constructor docblock', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('ConstructorDocblock.php'); })); + test('Should rename a property when the cursor is placed in its constructor docblock param', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php', new vscode.Position(15, 17)); + })); }); function runFixture(fileName, cursorPosition) { return __awaiter(this, void 0, void 0, function* () { diff --git a/out/test/suite/changePropertyType.test.js.map b/out/test/suite/changePropertyType.test.js.map index a0bc83a..c6135a9 100644 --- a/out/test/suite/changePropertyType.test.js.map +++ b/out/test/suite/changePropertyType.test.js.map @@ -1 +1 @@ -{"version":3,"file":"changePropertyType.test.js","sourceRoot":"","sources":["../../../src/test/suite/changePropertyType.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"changePropertyType.test.js","sourceRoot":"","sources":["../../../src/test/suite/changePropertyType.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/suite/renameProperty.test.js b/out/test/suite/renameProperty.test.js index aab8e56..c380863 100644 --- a/out/test/suite/renameProperty.test.js +++ b/out/test/suite/renameProperty.test.js @@ -37,6 +37,9 @@ suite('Rename Property', function () { test('Should rename a property when the cursor is placed in its assignment', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('ConstructorWithMultiplePropertiesCursorInAssignment.php', new vscode.Position(16, 18)); })); + test('Should rename a property when the cursor is placed in its constructor docblock param', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php', new vscode.Position(14, 10)); + })); test('Should rename all property references', () => __awaiter(this, void 0, void 0, function* () { yield runFixture('PropertyReferences.php'); })); diff --git a/out/test/suite/renameProperty.test.js.map b/out/test/suite/renameProperty.test.js.map index efbd38d..96aefe6 100644 --- a/out/test/suite/renameProperty.test.js.map +++ b/out/test/suite/renameProperty.test.js.map @@ -1 +1 @@ -{"version":3,"file":"renameProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/renameProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"renameProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/renameProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/test/suite/changePropertyType.test.ts b/src/test/suite/changePropertyType.test.ts index 12133e3..c2119dd 100644 --- a/src/test/suite/changePropertyType.test.ts +++ b/src/test/suite/changePropertyType.test.ts @@ -39,6 +39,10 @@ suite('Change Property Type', function () { test('Should change property type in constructor docblock', async () => { await runFixture('ConstructorDocblock.php'); }); + + test('Should rename a property when the cursor is placed in its constructor docblock param', async () => { + await runFixture('ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php', new vscode.Position(15, 17)); + }); }); async function runFixture(fileName: string, cursorPosition?: vscode.Position) { diff --git a/src/test/suite/renameProperty.test.ts b/src/test/suite/renameProperty.test.ts index 4c10278..a5d1bbe 100644 --- a/src/test/suite/renameProperty.test.ts +++ b/src/test/suite/renameProperty.test.ts @@ -35,6 +35,10 @@ suite('Rename Property', function () { await runFixture('ConstructorWithMultiplePropertiesCursorInAssignment.php', new vscode.Position(16, 18)); }); + test('Should rename a property when the cursor is placed in its constructor docblock param', async () => { + await runFixture('ConstructorWithMultiplePropertiesCursorInConstructorDocblock.php', new vscode.Position(14, 10)); + }); + test('Should rename all property references', async () => { await runFixture('PropertyReferences.php'); }); From 0268f52b1bd9e82499775e634dc585727175b2f4 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 29 Aug 2020 08:25:39 +0200 Subject: [PATCH 30/41] Show version update page --- out/constants.js | 9 + out/constants.js.map | 1 + out/extension.js | 600 +++++++++++++++--------------- out/extension.js.map | 2 +- package.json | 10 +- src/constants.ts | 6 + src/extension.ts | 40 +- webviews/1.0.0/css/main.css | 1 + webviews/1.0.0/i/code.jpg | Bin 0 -> 15049 bytes webviews/1.0.0/i/icon.png | Bin 0 -> 6198 bytes webviews/1.0.0/index.html | 711 ++++++++++++++++++++++++++++++++++++ 11 files changed, 1083 insertions(+), 297 deletions(-) create mode 100644 out/constants.js create mode 100644 out/constants.js.map create mode 100644 src/constants.ts create mode 100644 webviews/1.0.0/css/main.css create mode 100644 webviews/1.0.0/i/code.jpg create mode 100644 webviews/1.0.0/i/icon.png create mode 100644 webviews/1.0.0/index.html diff --git a/out/constants.js b/out/constants.js new file mode 100644 index 0000000..41b8268 --- /dev/null +++ b/out/constants.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.extensionId = 'php-add-property'; +exports.extensionQualifiedId = `kotfire.${exports.extensionId}`; +var GlobalState; +(function (GlobalState) { + GlobalState["version"] = "phpAddPropertyVersion"; +})(GlobalState = exports.GlobalState || (exports.GlobalState = {})); +//# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/out/constants.js.map b/out/constants.js.map new file mode 100644 index 0000000..0ed30d3 --- /dev/null +++ b/out/constants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;AAAa,QAAA,WAAW,GAAG,kBAAkB,CAAC;AACjC,QAAA,oBAAoB,GAAG,WAAW,mBAAW,EAAE,CAAC;AAE7D,IAAY,WAEX;AAFD,WAAY,WAAW;IACtB,gDAAiC,CAAA;AAClC,CAAC,EAFW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAEtB"} \ No newline at end of file diff --git a/out/extension.js b/out/extension.js index 58b5fd2..cdcca08 100644 --- a/out/extension.js +++ b/out/extension.js @@ -18,301 +18,327 @@ const removeProperty_1 = require("./removeProperty"); const utils_1 = require("./utils"); const renameProperty_1 = require("./renameProperty"); const changePropertyType_1 = require("./changePropertyType"); +const constants_1 = require("./constants"); function activate(context) { - context.subscriptions.push(vscode.commands.registerCommand('phpAddProperty.add', () => __awaiter(this, void 0, void 0, function* () { - if (vscode.window.activeTextEditor === undefined) { - return; - } - const document = vscode.window.activeTextEditor.document; - const phpEngine = new php_parser_1.default({ - ast: { - withPositions: false, - withSource: true, - }, - lexer: { - debug: false, - all_tokens: true, - comment_tokens: true, - mode_eval: false, - asp_tags: false, - short_tags: true, - }, - parser: { - debug: false, - extractDoc: true, - suppressErrors: true - }, - }); - const ast = phpEngine.parseCode(document.getText()); - const locator = new locator_1.default(ast); - const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; - const phpClass = locator.findClass(selectionLineNumber + 1); - if (!phpClass) { - vscode.window.showInformationMessage('No class found'); - return; - } - const name = yield vscode.window.showInputBox({ - placeHolder: 'Enter the property name' - }); - if (name === undefined || name.trim() === "") { - return; - } - const property = new property_1.default(name); - insertProperty_1.default(vscode.window.activeTextEditor, property, phpClass, `${property.getName()};`); - })), vscode.commands.registerCommand('phpAddProperty.append', () => __awaiter(this, void 0, void 0, function* () { - var _a, _b, _c, _d, _e, _f, _g; - if (vscode.window.activeTextEditor === undefined) { - return; - } - const document = vscode.window.activeTextEditor.document; - const phpEngine = new php_parser_1.default({ - ast: { - withPositions: false, - withSource: true, - }, - lexer: { - debug: false, - all_tokens: true, - comment_tokens: true, - mode_eval: false, - asp_tags: false, - short_tags: true, - }, - parser: { - debug: false, - extractDoc: true, - suppressErrors: true - }, - }); - const ast = phpEngine.parseCode(document.getText()); - const locator = new locator_1.default(ast); - const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; - const phpClass = locator.findClass(selectionLineNumber + 1); - if (!phpClass) { - vscode.window.showInformationMessage('No class found'); - return; - } - const line = document.lineAt(selectionLineNumber); - const lineAst = phpEngine.parseEval(`class A { ${line.text} }`); - if (((_b = (_a = lineAst.children[0]) === null || _a === void 0 ? void 0 : _a.body[0]) === null || _b === void 0 ? void 0 : _b.kind) !== 'propertystatement') { - return; - } - const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); - const properties = lineAst.children[0].body[0].properties; - const propertyAst = (_c = properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _c !== void 0 ? _c : properties[0]; - const propertyName = (_d = propertyAst.name) === null || _d === void 0 ? void 0 : _d.name; - const propertyStatementAst = phpClass.ast.body.find((node) => { - if (node.kind !== 'propertystatement') { - return false; + return __awaiter(this, void 0, void 0, function* () { + const extension = vscode.extensions.getExtension(constants_1.extensionQualifiedId); + const version = extension.packageJSON.version; + const previousVersion = context.globalState.get(constants_1.GlobalState.version); + const versionAsInt = parseInt(version.replace(/\./g, '')); + const previousVersionAsInt = previousVersion ? parseInt(previousVersion.replace(/\./g, '')) : 0; + if (previousVersionAsInt < versionAsInt) { + try { + const extensionRoot = context.asAbsolutePath(`webviews/${version}`); + const filename = `${extensionRoot}/index.html`; + const doc = yield vscode.workspace.openTextDocument(filename); + const content = doc.getText(); + const html = content.replace(/#{root}/g, vscode.Uri.file(extensionRoot) + .with({ scheme: 'vscode-resource' }) + .toString()); + const panel = vscode.window.createWebviewPanel(`phpAddPropertyWebView-${version}`, `PHP Add Property: What's new in v${version}`, vscode.ViewColumn.One, { + localResourceRoots: [vscode.Uri.file(context.extensionPath)], + }); + panel.iconPath = vscode.Uri.file(context.asAbsolutePath('images/icon.png')); + panel.webview.html = html; } - return node.properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === propertyName; }); - }); - if (!propertyStatementAst) { - return; + catch (error) { } } - let docblockType; - for (let i = 0; i < ((_e = propertyStatementAst.leadingComments) === null || _e === void 0 ? void 0 : _e.length); i++) { - const node = propertyStatementAst.leadingComments[i]; - if (node.kind !== 'commentblock') { - continue; + context.globalState.update(constants_1.GlobalState.version, version); + context.subscriptions.push(vscode.commands.registerCommand('phpAddProperty.add', () => __awaiter(this, void 0, void 0, function* () { + if (vscode.window.activeTextEditor === undefined) { + return; } - const typeMatch = /@var\s(\S*)/g.exec(node.value); - if (typeMatch) { - docblockType = typeMatch[1]; + const document = vscode.window.activeTextEditor.document; + const phpEngine = new php_parser_1.default({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + const ast = phpEngine.parseCode(document.getText()); + const locator = new locator_1.default(ast); + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + const phpClass = locator.findClass(selectionLineNumber + 1); + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + return; } - } - const property = new property_1.default(propertyName, (_g = (_f = propertyAst.type) === null || _f === void 0 ? void 0 : _f.name) !== null && _g !== void 0 ? _g : docblockType); - insertProperty_1.default(vscode.window.activeTextEditor, property, phpClass, line.text); - })), vscode.commands.registerCommand('phpAddProperty.rename', () => __awaiter(this, void 0, void 0, function* () { - if (vscode.window.activeTextEditor === undefined) { - return; - } - const document = vscode.window.activeTextEditor.document; - const phpEngine = new php_parser_1.default({ - ast: { - withPositions: false, - withSource: true, - }, - lexer: { - debug: false, - all_tokens: true, - comment_tokens: true, - mode_eval: false, - asp_tags: false, - short_tags: true, - }, - parser: { - debug: false, - extractDoc: true, - suppressErrors: true - }, - }); - const ast = phpEngine.parseCode(document.getText()); - const locator = new locator_1.default(ast); - const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; - const phpClass = locator.findClass(selectionLineNumber); - if (!phpClass) { - vscode.window.showInformationMessage('No class found'); - return; - } - const line = document.lineAt(selectionLineNumber); - let propertyName = utils_1.getPropertyNameFromLineText(line.text, document, phpEngine, vscode.window.activeTextEditor.selection.active); - if (!propertyName) { - propertyName = yield vscode.window.showInputBox({ - placeHolder: 'Enter the property name you want to rename' + const name = yield vscode.window.showInputBox({ + placeHolder: 'Enter the property name' }); - } - if (propertyName === undefined || propertyName.trim() === "") { - return; - } - const property = new property_1.default(propertyName); - const newPropertyName = yield vscode.window.showInputBox({ - placeHolder: 'Enter the new property name' - }); - if (newPropertyName === undefined || newPropertyName.trim() === "") { - return; - } - const newProperty = new property_1.default(newPropertyName); - renameProperty_1.renameProperty(vscode.window.activeTextEditor, property, newProperty, phpClass); - })), vscode.commands.registerCommand('phpAddProperty.changeType', () => __awaiter(this, void 0, void 0, function* () { - if (vscode.window.activeTextEditor === undefined) { - return; - } - const document = vscode.window.activeTextEditor.document; - const phpEngine = new php_parser_1.default({ - ast: { - withPositions: false, - withSource: true, - }, - lexer: { - debug: false, - all_tokens: true, - comment_tokens: true, - mode_eval: false, - asp_tags: false, - short_tags: true, - }, - parser: { - debug: false, - extractDoc: true, - suppressErrors: true - }, - }); - const ast = phpEngine.parseCode(document.getText()); - const locator = new locator_1.default(ast); - const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; - const phpClass = locator.findClass(selectionLineNumber); - if (!phpClass) { - vscode.window.showInformationMessage('No class found'); - return; - } - const line = document.lineAt(selectionLineNumber); - let propertyName = utils_1.getPropertyNameFromLineText(line.text, document, phpEngine, vscode.window.activeTextEditor.selection.active); - if (!propertyName) { - propertyName = yield vscode.window.showInputBox({ - placeHolder: 'Enter the property name you want to change type' + if (name === undefined || name.trim() === "") { + return; + } + const property = new property_1.default(name); + insertProperty_1.default(vscode.window.activeTextEditor, property, phpClass, `${property.getName()};`); + })), vscode.commands.registerCommand('phpAddProperty.append', () => __awaiter(this, void 0, void 0, function* () { + var _a, _b, _c, _d, _e, _f, _g; + if (vscode.window.activeTextEditor === undefined) { + return; + } + const document = vscode.window.activeTextEditor.document; + const phpEngine = new php_parser_1.default({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, }); - } - if (propertyName === undefined || propertyName.trim() === "") { - return; - } - const property = new property_1.default(propertyName); - const newPropertyType = yield vscode.window.showInputBox({ - placeHolder: 'Enter the new property type' - }); - if (newPropertyType === undefined || newPropertyType.trim() === "") { - return; - } - changePropertyType_1.changePropertyType(vscode.window.activeTextEditor, property, newPropertyType, phpClass); - })), vscode.commands.registerCommand('phpAddProperty.remove', () => __awaiter(this, void 0, void 0, function* () { - if (vscode.window.activeTextEditor === undefined) { - return; - } - const document = vscode.window.activeTextEditor.document; - const phpEngine = new php_parser_1.default({ - ast: { - withPositions: false, - withSource: true, - }, - lexer: { - debug: false, - all_tokens: true, - comment_tokens: true, - mode_eval: false, - asp_tags: false, - short_tags: true, - }, - parser: { - debug: false, - extractDoc: true, - suppressErrors: true - }, - }); - const ast = phpEngine.parseCode(document.getText()); - const locator = new locator_1.default(ast); - const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; - const phpClass = locator.findClass(selectionLineNumber); - if (!phpClass) { - vscode.window.showInformationMessage('No class found'); - return; - } - const line = document.lineAt(selectionLineNumber); - let propertyName = utils_1.getPropertyNameFromLineText(line.text, document, phpEngine, vscode.window.activeTextEditor.selection.active); - if (!propertyName) { - propertyName = yield vscode.window.showInputBox({ - placeHolder: 'Enter the property name you want to remove' + const ast = phpEngine.parseCode(document.getText()); + const locator = new locator_1.default(ast); + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + const phpClass = locator.findClass(selectionLineNumber + 1); + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + return; + } + const line = document.lineAt(selectionLineNumber); + const lineAst = phpEngine.parseEval(`class A { ${line.text} }`); + if (((_b = (_a = lineAst.children[0]) === null || _a === void 0 ? void 0 : _a.body[0]) === null || _b === void 0 ? void 0 : _b.kind) !== 'propertystatement') { + return; + } + const selectedWord = document.getText(document.getWordRangeAtPosition(vscode.window.activeTextEditor.selection.active)).replace(/^\$/, ''); + const properties = lineAst.children[0].body[0].properties; + const propertyAst = (_c = properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === selectedWord; })) !== null && _c !== void 0 ? _c : properties[0]; + const propertyName = (_d = propertyAst.name) === null || _d === void 0 ? void 0 : _d.name; + const propertyStatementAst = phpClass.ast.body.find((node) => { + if (node.kind !== 'propertystatement') { + return false; + } + return node.properties.find((propertyAst) => { var _a; return ((_a = propertyAst.name) === null || _a === void 0 ? void 0 : _a.name) === propertyName; }); }); - } - if (propertyName === undefined || propertyName.trim() === "") { - return; - } - const property = new property_1.default(propertyName); - removeProperty_1.removeProperty(vscode.window.activeTextEditor, property, phpClass); - })), vscode.commands.registerCommand('phpAddProperty.breakConstructorIntoMultiline', () => __awaiter(this, void 0, void 0, function* () { - var _h; - if (vscode.window.activeTextEditor === undefined) { - return; - } - const document = vscode.window.activeTextEditor.document; - const phpEngine = new php_parser_1.default({ - ast: { - withPositions: false, - withSource: true, - }, - lexer: { - debug: false, - all_tokens: true, - comment_tokens: true, - mode_eval: false, - asp_tags: false, - short_tags: true, - }, - parser: { - debug: false, - extractDoc: true, - suppressErrors: true - }, - }); - const ast = phpEngine.parseCode(document.getText()); - const locator = new locator_1.default(ast); - const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; - const phpClass = locator.findClass(selectionLineNumber + 1); - if (!phpClass) { - vscode.window.showInformationMessage('No class found'); - return; - } - const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); - const newDocumentText = utils_1.forceBreakConstructorIntoMultiline(document.getText(phpClassRange)); - if (newDocumentText === document.getText(phpClassRange)) { - return; - } - (_h = vscode.window.activeTextEditor) === null || _h === void 0 ? void 0 : _h.edit(editBuilder => { - editBuilder.replace(phpClassRange, newDocumentText); - }, { - undoStopBefore: true, - undoStopAfter: false - }); - }))); + if (!propertyStatementAst) { + return; + } + let docblockType; + for (let i = 0; i < ((_e = propertyStatementAst.leadingComments) === null || _e === void 0 ? void 0 : _e.length); i++) { + const node = propertyStatementAst.leadingComments[i]; + if (node.kind !== 'commentblock') { + continue; + } + const typeMatch = /@var\s(\S*)/g.exec(node.value); + if (typeMatch) { + docblockType = typeMatch[1]; + } + } + const property = new property_1.default(propertyName, (_g = (_f = propertyAst.type) === null || _f === void 0 ? void 0 : _f.name) !== null && _g !== void 0 ? _g : docblockType); + insertProperty_1.default(vscode.window.activeTextEditor, property, phpClass, line.text); + })), vscode.commands.registerCommand('phpAddProperty.rename', () => __awaiter(this, void 0, void 0, function* () { + if (vscode.window.activeTextEditor === undefined) { + return; + } + const document = vscode.window.activeTextEditor.document; + const phpEngine = new php_parser_1.default({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + const ast = phpEngine.parseCode(document.getText()); + const locator = new locator_1.default(ast); + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + const phpClass = locator.findClass(selectionLineNumber); + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + return; + } + const line = document.lineAt(selectionLineNumber); + let propertyName = utils_1.getPropertyNameFromLineText(line.text, document, phpEngine, vscode.window.activeTextEditor.selection.active); + if (!propertyName) { + propertyName = yield vscode.window.showInputBox({ + placeHolder: 'Enter the property name you want to rename' + }); + } + if (propertyName === undefined || propertyName.trim() === "") { + return; + } + const property = new property_1.default(propertyName); + const newPropertyName = yield vscode.window.showInputBox({ + placeHolder: 'Enter the new property name' + }); + if (newPropertyName === undefined || newPropertyName.trim() === "") { + return; + } + const newProperty = new property_1.default(newPropertyName); + renameProperty_1.renameProperty(vscode.window.activeTextEditor, property, newProperty, phpClass); + })), vscode.commands.registerCommand('phpAddProperty.changeType', () => __awaiter(this, void 0, void 0, function* () { + if (vscode.window.activeTextEditor === undefined) { + return; + } + const document = vscode.window.activeTextEditor.document; + const phpEngine = new php_parser_1.default({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + const ast = phpEngine.parseCode(document.getText()); + const locator = new locator_1.default(ast); + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + const phpClass = locator.findClass(selectionLineNumber); + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + return; + } + const line = document.lineAt(selectionLineNumber); + let propertyName = utils_1.getPropertyNameFromLineText(line.text, document, phpEngine, vscode.window.activeTextEditor.selection.active); + if (!propertyName) { + propertyName = yield vscode.window.showInputBox({ + placeHolder: 'Enter the property name you want to change type' + }); + } + if (propertyName === undefined || propertyName.trim() === "") { + return; + } + const property = new property_1.default(propertyName); + const newPropertyType = yield vscode.window.showInputBox({ + placeHolder: 'Enter the new property type' + }); + if (newPropertyType === undefined || newPropertyType.trim() === "") { + return; + } + changePropertyType_1.changePropertyType(vscode.window.activeTextEditor, property, newPropertyType, phpClass); + })), vscode.commands.registerCommand('phpAddProperty.remove', () => __awaiter(this, void 0, void 0, function* () { + if (vscode.window.activeTextEditor === undefined) { + return; + } + const document = vscode.window.activeTextEditor.document; + const phpEngine = new php_parser_1.default({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + const ast = phpEngine.parseCode(document.getText()); + const locator = new locator_1.default(ast); + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + const phpClass = locator.findClass(selectionLineNumber); + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + return; + } + const line = document.lineAt(selectionLineNumber); + let propertyName = utils_1.getPropertyNameFromLineText(line.text, document, phpEngine, vscode.window.activeTextEditor.selection.active); + if (!propertyName) { + propertyName = yield vscode.window.showInputBox({ + placeHolder: 'Enter the property name you want to remove' + }); + } + if (propertyName === undefined || propertyName.trim() === "") { + return; + } + const property = new property_1.default(propertyName); + removeProperty_1.removeProperty(vscode.window.activeTextEditor, property, phpClass); + })), vscode.commands.registerCommand('phpAddProperty.breakConstructorIntoMultiline', () => __awaiter(this, void 0, void 0, function* () { + var _h; + if (vscode.window.activeTextEditor === undefined) { + return; + } + const document = vscode.window.activeTextEditor.document; + const phpEngine = new php_parser_1.default({ + ast: { + withPositions: false, + withSource: true, + }, + lexer: { + debug: false, + all_tokens: true, + comment_tokens: true, + mode_eval: false, + asp_tags: false, + short_tags: true, + }, + parser: { + debug: false, + extractDoc: true, + suppressErrors: true + }, + }); + const ast = phpEngine.parseCode(document.getText()); + const locator = new locator_1.default(ast); + const selectionLineNumber = vscode.window.activeTextEditor.selection.active.line; + const phpClass = locator.findClass(selectionLineNumber + 1); + if (!phpClass) { + vscode.window.showInformationMessage('No class found'); + return; + } + const phpClassRange = new vscode.Range(new vscode.Position(phpClass.ast.loc.start.line - 1, phpClass.ast.loc.start.column), new vscode.Position(phpClass.ast.loc.end.line - 1, phpClass.ast.loc.end.column)); + const newDocumentText = utils_1.forceBreakConstructorIntoMultiline(document.getText(phpClassRange)); + if (newDocumentText === document.getText(phpClassRange)) { + return; + } + (_h = vscode.window.activeTextEditor) === null || _h === void 0 ? void 0 : _h.edit(editBuilder => { + editBuilder.replace(phpClassRange, newDocumentText); + }, { + undoStopBefore: true, + undoStopAfter: false + }); + }))); + }); } exports.activate = activate; // this method is called when your extension is deactivated diff --git a/out/extension.js.map b/out/extension.js.map index a1110e8..6f7d628 100644 --- a/out/extension.js.map +++ b/out/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAiC;AACjC,2CAAmC;AACnC,uCAAgC;AAChC,yCAAkC;AAClC,qDAA8C;AAC9C,qDAAkD;AAClD,mCAA0F;AAC1F,qDAAkD;AAClD,6DAA0D;AAE1D,SAAgB,QAAQ,CAAC,OAAgC;IACxD,OAAO,CAAC,aAAa,CAAC,IAAI,CACzB,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,oBAAoB,EAAE,GAAS,EAAE;QAChE,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACjD,OAAO;SACP;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAEzD,MAAM,SAAS,GAAG,IAAI,oBAAS,CAAC;YAC/B,GAAG,EAAE;gBACJ,aAAa,EAAE,KAAK;gBACpB,UAAU,EAAE,IAAI;aAChB;YACD,KAAK,EAAE;gBACN,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;gBACpB,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,IAAI;aAChB;YACD,MAAM,EAAE;gBACP,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;aACpB;SACD,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,GAAG,CAAC,CAAC;QAEjC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;QAEjF,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,EAAE;YACd,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;YAEvD,OAAO;SACP;QAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;YAC7C,WAAW,EAAE,yBAAyB;SACtC,CAAC,CAAC;QAEH,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC7C,OAAO;SACP;QAED,MAAM,QAAQ,GAAG,IAAI,kBAAQ,CAAC,IAAI,CAAC,CAAC;QAEpC,wBAAc,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC9F,CAAC,CAAA,CAAC,EACF,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE,GAAS,EAAE;;QACnE,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACjD,OAAO;SACP;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAEzD,MAAM,SAAS,GAAG,IAAI,oBAAS,CAAC;YAC/B,GAAG,EAAE;gBACJ,aAAa,EAAE,KAAK;gBACpB,UAAU,EAAE,IAAI;aAChB;YACD,KAAK,EAAE;gBACN,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;gBACpB,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,IAAI;aAChB;YACD,MAAM,EAAE;gBACP,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;aACpB;SACD,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,GAAG,CAAC,CAAC;QAEjC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;QAEjF,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,EAAE;YACd,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;YAEvD,OAAO;SACP;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAElD,MAAM,OAAO,GAAI,SAAS,CAAC,SAAS,CAAC,aAAa,IAAI,CAAC,IAAI,IAAI,CAAS,CAAC;QAEzE,IAAI,aAAA,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,0CAAE,IAAI,CAAC,CAAC,2CAAG,IAAI,MAAK,mBAAmB,EAAE;YAC/D,OAAO;SACP;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAE3I,MAAM,UAAU,GAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAoB,CAAC;QAErE,MAAM,WAAW,SAAG,UAAU,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,WAAC,OAAA,OAAA,WAAW,CAAC,IAAI,0CAAE,IAAI,MAAK,YAAY,CAAA,EAAA,CAAC,mCAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAE/G,MAAM,YAAY,SAAG,WAAW,CAAC,IAAI,0CAAE,IAAI,CAAC;QAE5C,MAAM,oBAAoB,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE;YACjE,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE;gBACtC,OAAO,KAAK,CAAA;aACZ;YAED,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,WAAgB,EAAE,EAAE,WAAC,OAAA,OAAA,WAAW,CAAC,IAAI,0CAAE,IAAI,MAAK,YAAY,CAAA,EAAA,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,oBAAoB,EAAE;YAC1B,OAAO;SACP;QAED,IAAI,YAAY,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAG,oBAAoB,CAAC,eAAe,0CAAE,MAAM,CAAA,EAAE,CAAC,EAAE,EAAE;YACtE,MAAM,IAAI,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAErD,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE;gBACjC,SAAS;aACT;YAED,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAElD,IAAI,SAAS,EAAE;gBACd,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;aAC5B;SACD;QAED,MAAM,QAAQ,GAAG,IAAI,kBAAQ,CAAC,YAAY,cAAE,WAAW,CAAC,IAAI,0CAAE,IAAI,mCAAI,YAAY,CAAC,CAAC;QAEpF,wBAAc,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC,CAAA,CAAC,EACF,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE,GAAS,EAAE;QACnE,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACjD,OAAO;SACP;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAEzD,MAAM,SAAS,GAAG,IAAI,oBAAS,CAAC;YAC/B,GAAG,EAAE;gBACJ,aAAa,EAAE,KAAK;gBACpB,UAAU,EAAE,IAAI;aAChB;YACD,KAAK,EAAE;gBACN,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;gBACpB,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,IAAI;aAChB;YACD,MAAM,EAAE;gBACP,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;aACpB;SACD,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,GAAG,CAAC,CAAC;QAEjC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;QAEjF,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAExD,IAAI,CAAC,QAAQ,EAAE;YACd,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;YAEvD,OAAO;SACP;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAElD,IAAI,YAAY,GAAG,mCAA2B,CAC7C,IAAI,CAAC,IAAI,EACT,QAAQ,EACR,SAAS,EACT,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAC/C,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE;YAClB,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;gBAC/C,WAAW,EAAE,4CAA4C;aACzD,CAAC,CAAC;SACH;QAED,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC7D,OAAO;SACP;QAED,MAAM,QAAQ,GAAG,IAAI,kBAAQ,CAAC,YAAY,CAAC,CAAC;QAE5C,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;YACxD,WAAW,EAAE,6BAA6B;SAC1C,CAAC,CAAC;QAEH,IAAI,eAAe,KAAK,SAAS,IAAI,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACnE,OAAO;SACP;QAED,MAAM,WAAW,GAAG,IAAI,kBAAQ,CAAC,eAAe,CAAC,CAAC;QAElD,+BAAc,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACjF,CAAC,CAAA,CAAC,EACF,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,2BAA2B,EAAE,GAAS,EAAE;QACvE,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACjD,OAAO;SACP;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAEzD,MAAM,SAAS,GAAG,IAAI,oBAAS,CAAC;YAC/B,GAAG,EAAE;gBACJ,aAAa,EAAE,KAAK;gBACpB,UAAU,EAAE,IAAI;aAChB;YACD,KAAK,EAAE;gBACN,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;gBACpB,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,IAAI;aAChB;YACD,MAAM,EAAE;gBACP,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;aACpB;SACD,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,GAAG,CAAC,CAAC;QAEjC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;QAEjF,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAExD,IAAI,CAAC,QAAQ,EAAE;YACd,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;YAEvD,OAAO;SACP;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAElD,IAAI,YAAY,GAAG,mCAA2B,CAC7C,IAAI,CAAC,IAAI,EACT,QAAQ,EACR,SAAS,EACT,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAC/C,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE;YAClB,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;gBAC/C,WAAW,EAAE,iDAAiD;aAC9D,CAAC,CAAC;SACH;QAED,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC7D,OAAO;SACP;QAED,MAAM,QAAQ,GAAG,IAAI,kBAAQ,CAAC,YAAY,CAAC,CAAC;QAE5C,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;YACxD,WAAW,EAAE,6BAA6B;SAC1C,CAAC,CAAC;QAEH,IAAI,eAAe,KAAK,SAAS,IAAI,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACnE,OAAO;SACP;QAED,uCAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;IACzF,CAAC,CAAA,CAAC,EACF,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE,GAAS,EAAE;QACnE,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACjD,OAAO;SACP;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAEzD,MAAM,SAAS,GAAG,IAAI,oBAAS,CAAC;YAC/B,GAAG,EAAE;gBACJ,aAAa,EAAE,KAAK;gBACpB,UAAU,EAAE,IAAI;aAChB;YACD,KAAK,EAAE;gBACN,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;gBACpB,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,IAAI;aAChB;YACD,MAAM,EAAE;gBACP,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;aACpB;SACD,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,GAAG,CAAC,CAAC;QAEjC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;QAEjF,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAExD,IAAI,CAAC,QAAQ,EAAE;YACd,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;YAEvD,OAAO;SACP;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAElD,IAAI,YAAY,GAAG,mCAA2B,CAC7C,IAAI,CAAC,IAAI,EACT,QAAQ,EACR,SAAS,EACT,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAC/C,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE;YAClB,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;gBAC/C,WAAW,EAAE,4CAA4C;aACzD,CAAC,CAAC;SACH;QAED,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC7D,OAAO;SACP;QAED,MAAM,QAAQ,GAAG,IAAI,kBAAQ,CAAC,YAAY,CAAC,CAAC;QAE5C,+BAAc,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpE,CAAC,CAAA,CAAC,EACF,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,8CAA8C,EAAE,GAAS,EAAE;;QAC1F,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACjD,OAAO;SACP;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAEzD,MAAM,SAAS,GAAG,IAAI,oBAAS,CAAC;YAC/B,GAAG,EAAE;gBACJ,aAAa,EAAE,KAAK;gBACpB,UAAU,EAAE,IAAI;aAChB;YACD,KAAK,EAAE;gBACN,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;gBACpB,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,IAAI;aAChB;YACD,MAAM,EAAE;gBACP,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;aACpB;SACD,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,GAAG,CAAC,CAAC;QAEjC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;QAEjF,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,EAAE;YACd,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;YAEvD,OAAO;SACP;QAED,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,KAAK,CACrC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EACnF,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAC/E,CAAC;QAEF,MAAM,eAAe,GAAG,0CAAkC,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;QAE5F,IAAI,eAAe,KAAK,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;YACxD,OAAO;SACP;QAED,MAAA,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,IAAI,CACnC,WAAW,CAAC,EAAE;YACb,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QACrD,CAAC,EACD;YACC,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACpB,EACA;IACH,CAAC,CAAA,CAAC,CACF,CAAC;AACH,CAAC;AAhaD,4BAgaC;AAED,2DAA2D;AAC3D,SAAgB,UAAU,KAAK,CAAC;AAAhC,gCAAgC"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index b35b08f..56067b2 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Manage PHP class properties", "publisher": "kotfire", "license": "SEE LICENSE IN LICENSE", - "version": "0.5.0", + "version": "1.0.0", "engines": { "vscode": "^1.31.0" }, @@ -24,13 +24,7 @@ ], "icon": "images/icon.png", "activationEvents": [ - "onLanguage:php", - "onCommand:phpAddProperty.add", - "onCommand:phpAddProperty.append", - "onCommand:phpAddProperty.rename", - "onCommand:phpAddProperty.changeType", - "onCommand:phpAddProperty.remove", - "onCommand:phpAddProperty.breakConstructorIntoMultiline" + "*" ], "main": "./out/extension.js", "contributes": { diff --git a/src/constants.ts b/src/constants.ts new file mode 100644 index 0000000..f211901 --- /dev/null +++ b/src/constants.ts @@ -0,0 +1,6 @@ +export const extensionId = 'php-add-property'; +export const extensionQualifiedId = `kotfire.${extensionId}`; + +export enum GlobalState { + version = 'phpAddPropertyVersion' +} \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index eff42ae..b3ed9b6 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -7,8 +7,46 @@ import { removeProperty } from './removeProperty'; import { forceBreakConstructorIntoMultiline, getPropertyNameFromLineText } from './utils'; import { renameProperty } from './renameProperty'; import { changePropertyType } from './changePropertyType'; +import { extensionQualifiedId, GlobalState } from './constants'; + +export async function activate(context: vscode.ExtensionContext) { + const extension = vscode.extensions.getExtension(extensionQualifiedId)!; + const version = extension.packageJSON.version; + const previousVersion = context.globalState.get(GlobalState.version); + + const versionAsInt = parseInt((version as string).replace(/\./g, '')); + const previousVersionAsInt = previousVersion ? parseInt((previousVersion as string).replace(/\./g, '')) : 0; + + if (previousVersionAsInt < versionAsInt) { + try { + const extensionRoot = context.asAbsolutePath(`webviews/${version}`); + const filename = `${extensionRoot}/index.html`; + const doc = await vscode.workspace.openTextDocument(filename); + const content = doc.getText(); + + const html = content.replace( + /#{root}/g, + vscode.Uri.file(extensionRoot) + .with({ scheme: 'vscode-resource' }) + .toString() + ); + + const panel = vscode.window.createWebviewPanel( + `phpAddPropertyWebView-${version}`, + `PHP Add Property: What's new in v${version}`, + vscode.ViewColumn.One, + { + localResourceRoots: [vscode.Uri.file(context.extensionPath)], + } + ); + + panel.iconPath = vscode.Uri.file(context.asAbsolutePath('images/icon.png')); + panel.webview.html = html; + } catch (error) {} + } + + context.globalState.update(GlobalState.version, version); -export function activate(context: vscode.ExtensionContext) { context.subscriptions.push( vscode.commands.registerCommand('phpAddProperty.add', async () => { if (vscode.window.activeTextEditor === undefined) { diff --git a/webviews/1.0.0/css/main.css b/webviews/1.0.0/css/main.css new file mode 100644 index 0000000..53b0427 --- /dev/null +++ b/webviews/1.0.0/css/main.css @@ -0,0 +1 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset{margin:0;padding:0}ol,ul{list-style:none;margin:0;padding:0}html{font-family:Inter var,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:1.5}*,::after,::before{box-sizing:border-box;border-width:0;border-style:solid;border-color:#d2d6dc}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.form-input{appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding-top:.5rem;padding-right:.75rem;padding-bottom:.5rem;padding-left:.75rem;font-size:1rem;line-height:1.5}.form-input::placeholder{color:#9fa6b2;opacity:1}.form-input:focus{outline:0;box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-textarea{appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding-top:.5rem;padding-right:.75rem;padding-bottom:.5rem;padding-left:.75rem;font-size:1rem;line-height:1.5}.form-textarea::placeholder{color:#9fa6b2;opacity:1}.form-textarea:focus{outline:0;box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-multiselect{appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding-top:.5rem;padding-right:.75rem;padding-bottom:.5rem;padding-left:.75rem;font-size:1rem;line-height:1.5}.form-multiselect:focus{outline:0;box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3e%3cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e");appearance:none;color-adjust:exact;background-repeat:no-repeat;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding-top:.5rem;padding-right:2.5rem;padding-bottom:.5rem;padding-left:.75rem;font-size:1rem;line-height:1.5;background-position:right .5rem center;background-size:1.5em 1.5em}.form-select::-ms-expand{color:#9fa6b2;border:none}@media not print{.form-select::-ms-expand{display:none}}@media print and (-ms-high-contrast:active),print and (-ms-high-contrast:none){.form-select{padding-right:.75rem}}.form-select:focus{outline:0;box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M5.707 7.293a1 1 0 0 0-1.414 1.414l2 2a1 1 0 0 0 1.414 0l4-4a1 1 0 0 0-1.414-1.414L7 8.586 5.707 7.293z'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}@media not print{.form-checkbox::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-checkbox{appearance:none;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.25rem}.form-checkbox:focus{outline:0;box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox:checked:focus{border-color:transparent}.form-radio:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}@media not print{.form-radio::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-radio{appearance:none;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;user-select:none;flex-shrink:0;border-radius:100%;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px}.form-radio:focus{outline:0;box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-radio:checked:focus{border-color:transparent}.prose{color:#374151;max-width:65ch}.prose [class~=lead]{color:#4b5563;font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose a{color:#5850ec;text-decoration:none;font-weight:600}.prose strong{color:#161e2e;font-weight:600}.prose ol{counter-reset:list-counter;margin-top:1.25em;margin-bottom:1.25em}.prose ol>li{position:relative;counter-increment:list-counter;padding-left:1.75em}.prose ol>li::before{content:counter(list-counter) ".";position:absolute;font-weight:400;color:#6b7280}.prose ul>li{position:relative;padding-left:1.75em}.prose ul>li::before{content:"";position:absolute;background-color:#d2d6dc;border-radius:50%;width:.375em;height:.375em;top:calc(.875em - .1875em);left:.25em}.prose hr{border-color:#e5e7eb;border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose blockquote{font-weight:500;font-style:italic;color:#161e2e;border-left-width:.25rem;border-left-color:#e5e7eb;quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.prose blockquote p:first-of-type::before{content:open-quote}.prose blockquote p:last-of-type::after{content:close-quote}.prose h1{color:#1a202c;font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose h2{color:#1a202c;font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose h3{color:#1a202c;font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose h4{color:#1a202c;font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose figure figcaption{color:#6b7280;font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose code{color:#161e2e;font-weight:600;font-size:.875em}.prose code::before{content:"`"}.prose code::after{content:"`"}.prose pre{color:#e5e7eb;background-color:#252f3f;overflow-x:auto;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-right:1.1428571em;padding-bottom:.8571429em;padding-left:1.1428571em}.prose pre code{background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:400;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose pre code::before{content:""}.prose pre code::after{content:""}.prose table{width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose thead{color:#161e2e;font-weight:600;border-bottom-width:1px;border-bottom-color:#d2d6dc}.prose thead th{vertical-align:bottom;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.prose tbody tr{border-bottom-width:1px;border-bottom-color:#e5e7eb}.prose tbody tr:last-child{border-bottom-width:0}.prose tbody td{vertical-align:top;padding-top:.5714286em;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.prose{font-size:1rem;line-height:1.75}.prose p{margin-top:1.25em;margin-bottom:1.25em}.prose img{margin-top:2em;margin-bottom:2em}.prose video{margin-top:2em;margin-bottom:2em}.prose figure{margin-top:2em;margin-bottom:2em}.prose figure>*{margin-top:0;margin-bottom:0}.prose h2 code{font-size:.875em}.prose h3 code{font-size:.9em}.prose ul{margin-top:1.25em;margin-bottom:1.25em}.prose li{margin-top:.5em;margin-bottom:.5em}.prose ol>li:before{left:0}.prose>ul>li p{margin-top:.75em;margin-bottom:.75em}.prose>ul>li>:first-child{margin-top:1.25em}.prose>ul>li>:last-child{margin-bottom:1.25em}.prose>ol>li>:first-child{margin-top:1.25em}.prose>ol>li>:last-child{margin-bottom:1.25em}.prose ol ol,.prose ol ul,.prose ul ol,.prose ul ul{margin-top:.75em;margin-bottom:.75em}.prose hr+*{margin-top:0}.prose h2+*{margin-top:0}.prose h3+*{margin-top:0}.prose h4+*{margin-top:0}.prose thead th:first-child{padding-left:0}.prose thead th:last-child{padding-right:0}.prose tbody td:first-child{padding-left:0}.prose tbody td:last-child{padding-right:0}.prose>:first-child{margin-top:0}.prose>:last-child{margin-bottom:0}.prose h1,.prose h2,.prose h3,.prose h4{color:#161e2e}.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm p{margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm [class~=lead]{font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.prose-sm blockquote{margin-top:1.3333333em;margin-bottom:1.3333333em;padding-left:1.1111111em}.prose-sm h1{font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.prose-sm h2{font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.prose-sm h3{font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.prose-sm h4{margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.prose-sm img{margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm video{margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm figure{margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm figure>*{margin-top:0;margin-bottom:0}.prose-sm figure figcaption{font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm code{font-size:.8571429em}.prose-sm h2 code{font-size:.9em}.prose-sm h3 code{font-size:.8888889em}.prose-sm pre{font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.prose-sm ol{margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm ul{margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm li{margin-top:.2857143em;margin-bottom:.2857143em}.prose-sm ol>li{padding-left:1.5714286em}.prose-sm ol>li:before{left:0}.prose-sm ul>li{padding-left:1.5714286em}.prose-sm ul>li::before{height:.3571429em;width:.3571429em;top:calc(.8571429em - .1785714em);left:.2142857em}.prose-sm>ul>li p{margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm>ul>li>:first-child{margin-top:1.1428571em}.prose-sm>ul>li>:last-child{margin-bottom:1.1428571em}.prose-sm>ol>li>:first-child{margin-top:1.1428571em}.prose-sm>ol>li>:last-child{margin-bottom:1.1428571em}.prose-sm ol ol,.prose-sm ol ul,.prose-sm ul ol,.prose-sm ul ul{margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm hr{margin-top:2.8571429em;margin-bottom:2.8571429em}.prose-sm hr+*{margin-top:0}.prose-sm h2+*{margin-top:0}.prose-sm h3+*{margin-top:0}.prose-sm h4+*{margin-top:0}.prose-sm table{font-size:.8571429em;line-height:1.5}.prose-sm thead th{padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.prose-sm thead th:first-child{padding-left:0}.prose-sm thead th:last-child{padding-right:0}.prose-sm tbody td{padding-top:.6666667em;padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.prose-sm tbody td:first-child{padding-left:0}.prose-sm tbody td:last-child{padding-right:0}.prose-sm>:first-child{margin-top:0}.prose-sm>:last-child{margin-bottom:0}.prose-lg{font-size:1.125rem;line-height:1.7777778}.prose-lg p{margin-top:1.3333333em;margin-bottom:1.3333333em}.prose-lg [class~=lead]{font-size:1.2222222em;line-height:1.4545455;margin-top:1.0909091em;margin-bottom:1.0909091em}.prose-lg blockquote{margin-top:1.6666667em;margin-bottom:1.6666667em;padding-left:1em}.prose-lg h1{font-size:2.6666667em;margin-top:0;margin-bottom:.8333333em;line-height:1}.prose-lg h2{font-size:1.6666667em;margin-top:1.8666667em;margin-bottom:1.0666667em;line-height:1.3333333}.prose-lg h3{font-size:1.3333333em;margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.prose-lg h4{margin-top:1.7777778em;margin-bottom:.4444444em;line-height:1.5555556}.prose-lg img{margin-top:1.7777778em;margin-bottom:1.7777778em}.prose-lg video{margin-top:1.7777778em;margin-bottom:1.7777778em}.prose-lg figure{margin-top:1.7777778em;margin-bottom:1.7777778em}.prose-lg figure>*{margin-top:0;margin-bottom:0}.prose-lg figure figcaption{font-size:.8888889em;line-height:1.5;margin-top:1em}.prose-lg code{font-size:.8888889em}.prose-lg h2 code{font-size:.8666667em}.prose-lg h3 code{font-size:.875em}.prose-lg pre{font-size:.8888889em;line-height:1.75;margin-top:2em;margin-bottom:2em;border-radius:.375rem;padding-top:1em;padding-right:1.5em;padding-bottom:1em;padding-left:1.5em}.prose-lg ol{margin-top:1.3333333em;margin-bottom:1.3333333em}.prose-lg ul{margin-top:1.3333333em;margin-bottom:1.3333333em}.prose-lg li{margin-top:.6666667em;margin-bottom:.6666667em}.prose-lg ol>li{padding-left:1.6666667em}.prose-lg ol>li:before{left:0}.prose-lg ul>li{padding-left:1.6666667em}.prose-lg ul>li::before{width:.3333333em;height:.3333333em;top:calc(.8888889em - .1666667em);left:.2222222em}.prose-lg>ul>li p{margin-top:.8888889em;margin-bottom:.8888889em}.prose-lg>ul>li>:first-child{margin-top:1.3333333em}.prose-lg>ul>li>:last-child{margin-bottom:1.3333333em}.prose-lg>ol>li>:first-child{margin-top:1.3333333em}.prose-lg>ol>li>:last-child{margin-bottom:1.3333333em}.prose-lg ol ol,.prose-lg ol ul,.prose-lg ul ol,.prose-lg ul ul{margin-top:.8888889em;margin-bottom:.8888889em}.prose-lg hr{margin-top:3.1111111em;margin-bottom:3.1111111em}.prose-lg hr+*{margin-top:0}.prose-lg h2+*{margin-top:0}.prose-lg h3+*{margin-top:0}.prose-lg h4+*{margin-top:0}.prose-lg table{font-size:.8888889em;line-height:1.5}.prose-lg thead th{padding-right:.75em;padding-bottom:.75em;padding-left:.75em}.prose-lg thead th:first-child{padding-left:0}.prose-lg thead th:last-child{padding-right:0}.prose-lg tbody td{padding-top:.75em;padding-right:.75em;padding-bottom:.75em;padding-left:.75em}.prose-lg tbody td:first-child{padding-left:0}.prose-lg tbody td:last-child{padding-right:0}.prose-lg>:first-child{margin-top:0}.prose-lg>:last-child{margin-bottom:0}.prose-xl{font-size:1.25rem;line-height:1.8}.prose-xl p{margin-top:1.2em;margin-bottom:1.2em}.prose-xl [class~=lead]{font-size:1.2em;line-height:1.5;margin-top:1em;margin-bottom:1em}.prose-xl blockquote{margin-top:1.6em;margin-bottom:1.6em;padding-left:1.0666667em}.prose-xl h1{font-size:2.8em;margin-top:0;margin-bottom:.8571429em;line-height:1}.prose-xl h2{font-size:1.8em;margin-top:1.5555556em;margin-bottom:.8888889em;line-height:1.1111111}.prose-xl h3{font-size:1.5em;margin-top:1.6em;margin-bottom:.6666667em;line-height:1.3333333}.prose-xl h4{margin-top:1.8em;margin-bottom:.6em;line-height:1.6}.prose-xl img{margin-top:2em;margin-bottom:2em}.prose-xl video{margin-top:2em;margin-bottom:2em}.prose-xl figure{margin-top:2em;margin-bottom:2em}.prose-xl figure>*{margin-top:0;margin-bottom:0}.prose-xl figure figcaption{font-size:.9em;line-height:1.5555556;margin-top:1em}.prose-xl code{font-size:.9em}.prose-xl h2 code{font-size:.8611111em}.prose-xl h3 code{font-size:.9em}.prose-xl pre{font-size:.9em;line-height:1.7777778;margin-top:2em;margin-bottom:2em;border-radius:.5rem;padding-top:1.1111111em;padding-right:1.3333333em;padding-bottom:1.1111111em;padding-left:1.3333333em}.prose-xl ol{margin-top:1.2em;margin-bottom:1.2em}.prose-xl ul{margin-top:1.2em;margin-bottom:1.2em}.prose-xl li{margin-top:.6em;margin-bottom:.6em}.prose-xl ol>li{padding-left:1.8em}.prose-xl ol>li:before{left:0}.prose-xl ul>li{padding-left:1.8em}.prose-xl ul>li::before{width:.35em;height:.35em;top:calc(.9em - .175em);left:.25em}.prose-xl>ul>li p{margin-top:.8em;margin-bottom:.8em}.prose-xl>ul>li>:first-child{margin-top:1.2em}.prose-xl>ul>li>:last-child{margin-bottom:1.2em}.prose-xl>ol>li>:first-child{margin-top:1.2em}.prose-xl>ol>li>:last-child{margin-bottom:1.2em}.prose-xl ol ol,.prose-xl ol ul,.prose-xl ul ol,.prose-xl ul ul{margin-top:.8em;margin-bottom:.8em}.prose-xl hr{margin-top:2.8em;margin-bottom:2.8em}.prose-xl hr+*{margin-top:0}.prose-xl h2+*{margin-top:0}.prose-xl h3+*{margin-top:0}.prose-xl h4+*{margin-top:0}.prose-xl table{font-size:.9em;line-height:1.5555556}.prose-xl thead th{padding-right:.6666667em;padding-bottom:.8888889em;padding-left:.6666667em}.prose-xl thead th:first-child{padding-left:0}.prose-xl thead th:last-child{padding-right:0}.prose-xl tbody td{padding-top:.8888889em;padding-right:.6666667em;padding-bottom:.8888889em;padding-left:.6666667em}.prose-xl tbody td:first-child{padding-left:0}.prose-xl tbody td:last-child{padding-right:0}.prose-xl>:first-child{margin-top:0}.prose-xl>:last-child{margin-bottom:0}.prose-2xl{font-size:1.5rem;line-height:1.6666667}.prose-2xl p{margin-top:1.3333333em;margin-bottom:1.3333333em}.prose-2xl [class~=lead]{font-size:1.25em;line-height:1.4666667;margin-top:1.0666667em;margin-bottom:1.0666667em}.prose-2xl blockquote{margin-top:1.7777778em;margin-bottom:1.7777778em;padding-left:1.1111111em}.prose-2xl h1{font-size:2.6666667em;margin-top:0;margin-bottom:.875em;line-height:1}.prose-2xl h2{font-size:2em;margin-top:1.5em;margin-bottom:.8333333em;line-height:1.0833333}.prose-2xl h3{font-size:1.5em;margin-top:1.5555556em;margin-bottom:.6666667em;line-height:1.2222222}.prose-2xl h4{margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.prose-2xl img{margin-top:2em;margin-bottom:2em}.prose-2xl video{margin-top:2em;margin-bottom:2em}.prose-2xl figure{margin-top:2em;margin-bottom:2em}.prose-2xl figure>*{margin-top:0;margin-bottom:0}.prose-2xl figure figcaption{font-size:.8333333em;line-height:1.6;margin-top:1em}.prose-2xl code{font-size:.8333333em}.prose-2xl h2 code{font-size:.875em}.prose-2xl h3 code{font-size:.8888889em}.prose-2xl pre{font-size:.8333333em;line-height:1.8;margin-top:2em;margin-bottom:2em;border-radius:.5rem;padding-top:1.2em;padding-right:1.6em;padding-bottom:1.2em;padding-left:1.6em}.prose-2xl ol{margin-top:1.3333333em;margin-bottom:1.3333333em}.prose-2xl ul{margin-top:1.3333333em;margin-bottom:1.3333333em}.prose-2xl li{margin-top:.5em;margin-bottom:.5em}.prose-2xl ol>li{padding-left:1.6666667em}.prose-2xl ol>li:before{left:0}.prose-2xl ul>li{padding-left:1.6666667em}.prose-2xl ul>li::before{width:.3333333em;height:.3333333em;top:calc(.8333333em - .1666667em);left:.25em}.prose-2xl>ul>li p{margin-top:.8333333em;margin-bottom:.8333333em}.prose-2xl>ul>li>:first-child{margin-top:1.3333333em}.prose-2xl>ul>li>:last-child{margin-bottom:1.3333333em}.prose-2xl>ol>li>:first-child{margin-top:1.3333333em}.prose-2xl>ol>li>:last-child{margin-bottom:1.3333333em}.prose-2xl ol ol,.prose-2xl ol ul,.prose-2xl ul ol,.prose-2xl ul ul{margin-top:.6666667em;margin-bottom:.6666667em}.prose-2xl hr{margin-top:3em;margin-bottom:3em}.prose-2xl hr+*{margin-top:0}.prose-2xl h2+*{margin-top:0}.prose-2xl h3+*{margin-top:0}.prose-2xl h4+*{margin-top:0}.prose-2xl table{font-size:.8333333em;line-height:1.4}.prose-2xl thead th{padding-right:.6em;padding-bottom:.8em;padding-left:.6em}.prose-2xl thead th:first-child{padding-left:0}.prose-2xl thead th:last-child{padding-right:0}.prose-2xl tbody td{padding-top:.8em;padding-right:.6em;padding-bottom:.8em;padding-left:.6em}.prose-2xl tbody td:first-child{padding-left:0}.prose-2xl tbody td:last-child{padding-right:0}.prose-2xl>:first-child{margin-top:0}.prose-2xl>:last-child{margin-bottom:0}.space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.5rem * var(--space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--space-x-reverse)))}.space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1rem * var(--space-y-reverse))}.space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem * var(--space-y-reverse))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-50{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.bg-gray-700{--bg-opacity:1;background-color:#374151;background-color:rgba(55,65,81,var(--bg-opacity))}.bg-gray-800{--bg-opacity:1;background-color:#252f3f;background-color:rgba(37,47,63,var(--bg-opacity))}.bg-gray-900{--bg-opacity:1;background-color:#161e2e;background-color:rgba(22,30,46,var(--bg-opacity))}.bg-green-600{--bg-opacity:1;background-color:#057a55;background-color:rgba(5,122,85,var(--bg-opacity))}.bg-indigo-200{--bg-opacity:1;background-color:#cddbfe;background-color:rgba(205,219,254,var(--bg-opacity))}.bg-indigo-600{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.bg-purple-500{--bg-opacity:1;background-color:#9061f9;background-color:rgba(144,97,249,var(--bg-opacity))}.hover\:bg-gray-600:hover{--bg-opacity:1;background-color:#4b5563;background-color:rgba(75,85,99,var(--bg-opacity))}.hover\:bg-gray-700:hover{--bg-opacity:1;background-color:#374151;background-color:rgba(55,65,81,var(--bg-opacity))}.hover\:bg-gray-800:hover{--bg-opacity:1;background-color:#252f3f;background-color:rgba(37,47,63,var(--bg-opacity))}.hover\:bg-green-500:hover{--bg-opacity:1;background-color:#0e9f6e;background-color:rgba(14,159,110,var(--bg-opacity))}.hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity))}.active\:bg-gray-50:active{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.active\:bg-gray-600:active{--bg-opacity:1;background-color:#4b5563;background-color:rgba(75,85,99,var(--bg-opacity))}.active\:bg-green-500:active{--bg-opacity:1;background-color:#0e9f6e;background-color:rgba(14,159,110,var(--bg-opacity))}.border-transparent{border-color:transparent}.border-white{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.border-gray-200{--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.border-gray-300{--border-opacity:1;border-color:#d2d6dc;border-color:rgba(210,214,220,var(--border-opacity))}.border-indigo-600{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity))}.focus\:border-gray-700:focus{--border-opacity:1;border-color:#374151;border-color:rgba(55,65,81,var(--border-opacity))}.focus\:border-red-300:focus{--border-opacity:1;border-color:#f8b4b4;border-color:rgba(248,180,180,var(--border-opacity))}.focus\:border-green-700:focus{--border-opacity:1;border-color:#046c4e;border-color:rgba(4,108,78,var(--border-opacity))}.focus\:border-blue-300:focus{--border-opacity:1;border-color:#a4cafe;border-color:rgba(164,202,254,var(--border-opacity))}.focus\:border-indigo-700:focus{--border-opacity:1;border-color:#5145cd;border-color:rgba(81,69,205,var(--border-opacity))}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.border-2{border-width:2px}.border-4{border-width:4px}.border{border-width:1px}.border-t-2{border-top-width:2px}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.hidden{display:none}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-shrink-0{flex-shrink:0}.clearfix:after{content:"";display:table;clear:both}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-12{height:3rem}.h-24{height:6rem}.h-32{height:8rem}.h-5\/6{height:83.333333%}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-8{line-height:2rem}.leading-9{line-height:2.25rem}.leading-normal{line-height:1.5}.leading-loose{line-height:2}.mx-auto{margin-left:auto;margin-right:auto}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mt-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.ml-4{margin-left:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mt-14{margin-top:3.5rem}.mt-16{margin-top:4rem}.-ml-0\.5{margin-left:-.125rem}.max-w-md{max-width:28rem}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.max-w-3xl{max-width:48rem}.max-w-6xl{max-width:72rem}.max-w-screen-lg{max-width:1024px}.max-w-screen-xl{max-width:1280px}.focus\:outline-none:focus{outline:0}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.pr-4{padding-right:1rem}.pt-6{padding-top:1.5rem}.pb-10{padding-bottom:2.5rem}.pt-12{padding-top:3rem}.pb-12{padding-bottom:3rem}.pb-16{padding-bottom:4rem}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{right:0;left:0}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.left-1\/2{left:50%}.right-full{right:100%}.left-full{left:100%}.shadow-sm{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-xl{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(118,169,250,.45)}.focus\:shadow-outline-blue:focus{box-shadow:0 0 0 3px rgba(164,202,254,.45)}.focus\:shadow-outline-red:focus{box-shadow:0 0 0 3px rgba(248,180,180,.45)}.focus\:shadow-outline-indigo:focus{box-shadow:0 0 0 3px rgba(180,198,252,.45)}.text-center{text-align:center}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.text-gray-200{--text-opacity:1;color:#e5e7eb;color:rgba(229,231,235,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#d2d6dc;color:rgba(210,214,220,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#4b5563;color:rgba(75,85,99,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.text-red-600{--text-opacity:1;color:#e02424;color:rgba(224,36,36,var(--text-opacity))}.text-orange-300{--text-opacity:1;color:#fdba8c;color:rgba(253,186,140,var(--text-opacity))}.text-green-400{--text-opacity:1;color:#31c48d;color:rgba(49,196,141,var(--text-opacity))}.text-indigo-200{--text-opacity:1;color:#cddbfe;color:rgba(205,219,254,var(--text-opacity))}.text-indigo-300{--text-opacity:1;color:#b4c6fc;color:rgba(180,198,252,var(--text-opacity))}.text-indigo-600{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.text-indigo-800{--text-opacity:1;color:#42389d;color:rgba(66,56,157,var(--text-opacity))}.hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.hover\:text-gray-500:hover{--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity))}.hover\:text-red-500:hover{--text-opacity:1;color:#f05252;color:rgba(240,82,82,var(--text-opacity))}.active\:text-gray-800:active{--text-opacity:1;color:#252f3f;color:rgba(37,47,63,var(--text-opacity))}.active\:text-red-700:active{--text-opacity:1;color:#c81e1e;color:rgba(200,30,30,var(--text-opacity))}.uppercase{text-transform:uppercase}.underline{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.w-0{width:0}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-12{width:3rem}.w-24{width:6rem}.w-32{width:8rem}.w-auto{width:auto}.w-full{width:100%}.z-0{z-index:0}.z-10{z-index:10}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.translate-x-1\/2{--transform-translate-x:50%}.-translate-x-1\/2{--transform-translate-x:-50%}.translate-y-12{--transform-translate-y:3rem}.translate-y-16{--transform-translate-y:4rem}.translate-y-px{--transform-translate-y:1px}.-translate-y-1\/2{--transform-translate-y:-50%}.-translate-y-1\/4{--transform-translate-y:-25%}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-100{transition-duration:.1s}.duration-150{transition-duration:150ms}@keyframes spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes ping{0%{transform:scale(1);opacity:1}100%,75%{transform:scale(2);opacity:0}}@keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}@keyframes bounce{0%,100%{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);animation-timing-function:cubic-bezier(0,0,.2,1)}}.group:hover .group-hover\:animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@media (min-width:640px){.sm\:container{width:100%}@media (min-width:640px){.sm\:container{max-width:640px}}@media (min-width:768px){.sm\:container{max-width:768px}}@media (min-width:1024px){.sm\:container{max-width:1024px}}@media (min-width:1280px){.sm\:container{max-width:1280px}}.sm\:prose{color:#374151;max-width:65ch}.sm\:prose [class~=lead]{color:#4b5563;font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.sm\:prose a{color:#5850ec;text-decoration:none;font-weight:600}.sm\:prose strong{color:#161e2e;font-weight:600}.sm\:prose ol{counter-reset:list-counter;margin-top:1.25em;margin-bottom:1.25em}.sm\:prose ol>li{position:relative;counter-increment:list-counter;padding-left:1.75em}.sm\:prose ol>li::before{content:counter(list-counter) ".";position:absolute;font-weight:400;color:#6b7280}.sm\:prose ul>li{position:relative;padding-left:1.75em}.sm\:prose ul>li::before{content:"";position:absolute;background-color:#d2d6dc;border-radius:50%;width:.375em;height:.375em;top:calc(.875em - .1875em);left:.25em}.sm\:prose hr{border-color:#e5e7eb;border-top-width:1px;margin-top:3em;margin-bottom:3em}.sm\:prose blockquote{font-weight:500;font-style:italic;color:#161e2e;border-left-width:.25rem;border-left-color:#e5e7eb;quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.sm\:prose blockquote p:first-of-type::before{content:open-quote}.sm\:prose blockquote p:last-of-type::after{content:close-quote}.sm\:prose h1{color:#1a202c;font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.sm\:prose h2{color:#1a202c;font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.sm\:prose h3{color:#1a202c;font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.sm\:prose h4{color:#1a202c;font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.sm\:prose figure figcaption{color:#6b7280;font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.sm\:prose code{color:#161e2e;font-weight:600;font-size:.875em}.sm\:prose code::before{content:"`"}.sm\:prose code::after{content:"`"}.sm\:prose pre{color:#e5e7eb;background-color:#252f3f;overflow-x:auto;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-right:1.1428571em;padding-bottom:.8571429em;padding-left:1.1428571em}.sm\:prose pre code{background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:400;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.sm\:prose pre code::before{content:""}.sm\:prose pre code::after{content:""}.sm\:prose table{width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.sm\:prose thead{color:#161e2e;font-weight:600;border-bottom-width:1px;border-bottom-color:#d2d6dc}.sm\:prose thead th{vertical-align:bottom;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.sm\:prose tbody tr{border-bottom-width:1px;border-bottom-color:#e5e7eb}.sm\:prose tbody tr:last-child{border-bottom-width:0}.sm\:prose tbody td{vertical-align:top;padding-top:.5714286em;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.sm\:prose{font-size:1rem;line-height:1.75}.sm\:prose p{margin-top:1.25em;margin-bottom:1.25em}.sm\:prose img{margin-top:2em;margin-bottom:2em}.sm\:prose video{margin-top:2em;margin-bottom:2em}.sm\:prose figure{margin-top:2em;margin-bottom:2em}.sm\:prose figure>*{margin-top:0;margin-bottom:0}.sm\:prose h2 code{font-size:.875em}.sm\:prose h3 code{font-size:.9em}.sm\:prose ul{margin-top:1.25em;margin-bottom:1.25em}.sm\:prose li{margin-top:.5em;margin-bottom:.5em}.sm\:prose ol>li:before{left:0}.sm\:prose>ul>li p{margin-top:.75em;margin-bottom:.75em}.sm\:prose>ul>li>:first-child{margin-top:1.25em}.sm\:prose>ul>li>:last-child{margin-bottom:1.25em}.sm\:prose>ol>li>:first-child{margin-top:1.25em}.sm\:prose>ol>li>:last-child{margin-bottom:1.25em}.sm\:prose ol ol,.sm\:prose ol ul,.sm\:prose ul ol,.sm\:prose ul ul{margin-top:.75em;margin-bottom:.75em}.sm\:prose hr+*{margin-top:0}.sm\:prose h2+*{margin-top:0}.sm\:prose h3+*{margin-top:0}.sm\:prose h4+*{margin-top:0}.sm\:prose thead th:first-child{padding-left:0}.sm\:prose thead th:last-child{padding-right:0}.sm\:prose tbody td:first-child{padding-left:0}.sm\:prose tbody td:last-child{padding-right:0}.sm\:prose>:first-child{margin-top:0}.sm\:prose>:last-child{margin-bottom:0}.sm\:prose h1,.sm\:prose h2,.sm\:prose h3,.sm\:prose h4{color:#161e2e}.sm\:prose-sm{font-size:.875rem;line-height:1.7142857}.sm\:prose-sm p{margin-top:1.1428571em;margin-bottom:1.1428571em}.sm\:prose-sm [class~=lead]{font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.sm\:prose-sm blockquote{margin-top:1.3333333em;margin-bottom:1.3333333em;padding-left:1.1111111em}.sm\:prose-sm h1{font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.sm\:prose-sm h2{font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.sm\:prose-sm h3{font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.sm\:prose-sm h4{margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.sm\:prose-sm img{margin-top:1.7142857em;margin-bottom:1.7142857em}.sm\:prose-sm video{margin-top:1.7142857em;margin-bottom:1.7142857em}.sm\:prose-sm figure{margin-top:1.7142857em;margin-bottom:1.7142857em}.sm\:prose-sm figure>*{margin-top:0;margin-bottom:0}.sm\:prose-sm figure figcaption{font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.sm\:prose-sm code{font-size:.8571429em}.sm\:prose-sm h2 code{font-size:.9em}.sm\:prose-sm h3 code{font-size:.8888889em}.sm\:prose-sm pre{font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.sm\:prose-sm ol{margin-top:1.1428571em;margin-bottom:1.1428571em}.sm\:prose-sm ul{margin-top:1.1428571em;margin-bottom:1.1428571em}.sm\:prose-sm li{margin-top:.2857143em;margin-bottom:.2857143em}.sm\:prose-sm ol>li{padding-left:1.5714286em}.sm\:prose-sm ol>li:before{left:0}.sm\:prose-sm ul>li{padding-left:1.5714286em}.sm\:prose-sm ul>li::before{height:.3571429em;width:.3571429em;top:calc(.8571429em - .1785714em);left:.2142857em}.sm\:prose-sm>ul>li p{margin-top:.5714286em;margin-bottom:.5714286em}.sm\:prose-sm>ul>li>:first-child{margin-top:1.1428571em}.sm\:prose-sm>ul>li>:last-child{margin-bottom:1.1428571em}.sm\:prose-sm>ol>li>:first-child{margin-top:1.1428571em}.sm\:prose-sm>ol>li>:last-child{margin-bottom:1.1428571em}.sm\:prose-sm ol ol,.sm\:prose-sm ol ul,.sm\:prose-sm ul ol,.sm\:prose-sm ul ul{margin-top:.5714286em;margin-bottom:.5714286em}.sm\:prose-sm hr{margin-top:2.8571429em;margin-bottom:2.8571429em}.sm\:prose-sm hr+*{margin-top:0}.sm\:prose-sm h2+*{margin-top:0}.sm\:prose-sm h3+*{margin-top:0}.sm\:prose-sm h4+*{margin-top:0}.sm\:prose-sm table{font-size:.8571429em;line-height:1.5}.sm\:prose-sm thead th{padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.sm\:prose-sm thead th:first-child{padding-left:0}.sm\:prose-sm thead th:last-child{padding-right:0}.sm\:prose-sm tbody td{padding-top:.6666667em;padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.sm\:prose-sm tbody td:first-child{padding-left:0}.sm\:prose-sm tbody td:last-child{padding-right:0}.sm\:prose-sm>:first-child{margin-top:0}.sm\:prose-sm>:last-child{margin-bottom:0}.sm\:prose-lg{font-size:1.125rem;line-height:1.7777778}.sm\:prose-lg p{margin-top:1.3333333em;margin-bottom:1.3333333em}.sm\:prose-lg [class~=lead]{font-size:1.2222222em;line-height:1.4545455;margin-top:1.0909091em;margin-bottom:1.0909091em}.sm\:prose-lg blockquote{margin-top:1.6666667em;margin-bottom:1.6666667em;padding-left:1em}.sm\:prose-lg h1{font-size:2.6666667em;margin-top:0;margin-bottom:.8333333em;line-height:1}.sm\:prose-lg h2{font-size:1.6666667em;margin-top:1.8666667em;margin-bottom:1.0666667em;line-height:1.3333333}.sm\:prose-lg h3{font-size:1.3333333em;margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.sm\:prose-lg h4{margin-top:1.7777778em;margin-bottom:.4444444em;line-height:1.5555556}.sm\:prose-lg img{margin-top:1.7777778em;margin-bottom:1.7777778em}.sm\:prose-lg video{margin-top:1.7777778em;margin-bottom:1.7777778em}.sm\:prose-lg figure{margin-top:1.7777778em;margin-bottom:1.7777778em}.sm\:prose-lg figure>*{margin-top:0;margin-bottom:0}.sm\:prose-lg figure figcaption{font-size:.8888889em;line-height:1.5;margin-top:1em}.sm\:prose-lg code{font-size:.8888889em}.sm\:prose-lg h2 code{font-size:.8666667em}.sm\:prose-lg h3 code{font-size:.875em}.sm\:prose-lg pre{font-size:.8888889em;line-height:1.75;margin-top:2em;margin-bottom:2em;border-radius:.375rem;padding-top:1em;padding-right:1.5em;padding-bottom:1em;padding-left:1.5em}.sm\:prose-lg ol{margin-top:1.3333333em;margin-bottom:1.3333333em}.sm\:prose-lg ul{margin-top:1.3333333em;margin-bottom:1.3333333em}.sm\:prose-lg li{margin-top:.6666667em;margin-bottom:.6666667em}.sm\:prose-lg ol>li{padding-left:1.6666667em}.sm\:prose-lg ol>li:before{left:0}.sm\:prose-lg ul>li{padding-left:1.6666667em}.sm\:prose-lg ul>li::before{width:.3333333em;height:.3333333em;top:calc(.8888889em - .1666667em);left:.2222222em}.sm\:prose-lg>ul>li p{margin-top:.8888889em;margin-bottom:.8888889em}.sm\:prose-lg>ul>li>:first-child{margin-top:1.3333333em}.sm\:prose-lg>ul>li>:last-child{margin-bottom:1.3333333em}.sm\:prose-lg>ol>li>:first-child{margin-top:1.3333333em}.sm\:prose-lg>ol>li>:last-child{margin-bottom:1.3333333em}.sm\:prose-lg ol ol,.sm\:prose-lg ol ul,.sm\:prose-lg ul ol,.sm\:prose-lg ul ul{margin-top:.8888889em;margin-bottom:.8888889em}.sm\:prose-lg hr{margin-top:3.1111111em;margin-bottom:3.1111111em}.sm\:prose-lg hr+*{margin-top:0}.sm\:prose-lg h2+*{margin-top:0}.sm\:prose-lg h3+*{margin-top:0}.sm\:prose-lg h4+*{margin-top:0}.sm\:prose-lg table{font-size:.8888889em;line-height:1.5}.sm\:prose-lg thead th{padding-right:.75em;padding-bottom:.75em;padding-left:.75em}.sm\:prose-lg thead th:first-child{padding-left:0}.sm\:prose-lg thead th:last-child{padding-right:0}.sm\:prose-lg tbody td{padding-top:.75em;padding-right:.75em;padding-bottom:.75em;padding-left:.75em}.sm\:prose-lg tbody td:first-child{padding-left:0}.sm\:prose-lg tbody td:last-child{padding-right:0}.sm\:prose-lg>:first-child{margin-top:0}.sm\:prose-lg>:last-child{margin-bottom:0}.sm\:prose-xl{font-size:1.25rem;line-height:1.8}.sm\:prose-xl p{margin-top:1.2em;margin-bottom:1.2em}.sm\:prose-xl [class~=lead]{font-size:1.2em;line-height:1.5;margin-top:1em;margin-bottom:1em}.sm\:prose-xl blockquote{margin-top:1.6em;margin-bottom:1.6em;padding-left:1.0666667em}.sm\:prose-xl h1{font-size:2.8em;margin-top:0;margin-bottom:.8571429em;line-height:1}.sm\:prose-xl h2{font-size:1.8em;margin-top:1.5555556em;margin-bottom:.8888889em;line-height:1.1111111}.sm\:prose-xl h3{font-size:1.5em;margin-top:1.6em;margin-bottom:.6666667em;line-height:1.3333333}.sm\:prose-xl h4{margin-top:1.8em;margin-bottom:.6em;line-height:1.6}.sm\:prose-xl img{margin-top:2em;margin-bottom:2em}.sm\:prose-xl video{margin-top:2em;margin-bottom:2em}.sm\:prose-xl figure{margin-top:2em;margin-bottom:2em}.sm\:prose-xl figure>*{margin-top:0;margin-bottom:0}.sm\:prose-xl figure figcaption{font-size:.9em;line-height:1.5555556;margin-top:1em}.sm\:prose-xl code{font-size:.9em}.sm\:prose-xl h2 code{font-size:.8611111em}.sm\:prose-xl h3 code{font-size:.9em}.sm\:prose-xl pre{font-size:.9em;line-height:1.7777778;margin-top:2em;margin-bottom:2em;border-radius:.5rem;padding-top:1.1111111em;padding-right:1.3333333em;padding-bottom:1.1111111em;padding-left:1.3333333em}.sm\:prose-xl ol{margin-top:1.2em;margin-bottom:1.2em}.sm\:prose-xl ul{margin-top:1.2em;margin-bottom:1.2em}.sm\:prose-xl li{margin-top:.6em;margin-bottom:.6em}.sm\:prose-xl ol>li{padding-left:1.8em}.sm\:prose-xl ol>li:before{left:0}.sm\:prose-xl ul>li{padding-left:1.8em}.sm\:prose-xl ul>li::before{width:.35em;height:.35em;top:calc(.9em - .175em);left:.25em}.sm\:prose-xl>ul>li p{margin-top:.8em;margin-bottom:.8em}.sm\:prose-xl>ul>li>:first-child{margin-top:1.2em}.sm\:prose-xl>ul>li>:last-child{margin-bottom:1.2em}.sm\:prose-xl>ol>li>:first-child{margin-top:1.2em}.sm\:prose-xl>ol>li>:last-child{margin-bottom:1.2em}.sm\:prose-xl ol ol,.sm\:prose-xl ol ul,.sm\:prose-xl ul ol,.sm\:prose-xl ul ul{margin-top:.8em;margin-bottom:.8em}.sm\:prose-xl hr{margin-top:2.8em;margin-bottom:2.8em}.sm\:prose-xl hr+*{margin-top:0}.sm\:prose-xl h2+*{margin-top:0}.sm\:prose-xl h3+*{margin-top:0}.sm\:prose-xl h4+*{margin-top:0}.sm\:prose-xl table{font-size:.9em;line-height:1.5555556}.sm\:prose-xl thead th{padding-right:.6666667em;padding-bottom:.8888889em;padding-left:.6666667em}.sm\:prose-xl thead th:first-child{padding-left:0}.sm\:prose-xl thead th:last-child{padding-right:0}.sm\:prose-xl tbody td{padding-top:.8888889em;padding-right:.6666667em;padding-bottom:.8888889em;padding-left:.6666667em}.sm\:prose-xl tbody td:first-child{padding-left:0}.sm\:prose-xl tbody td:last-child{padding-right:0}.sm\:prose-xl>:first-child{margin-top:0}.sm\:prose-xl>:last-child{margin-bottom:0}.sm\:prose-2xl{font-size:1.5rem;line-height:1.6666667}.sm\:prose-2xl p{margin-top:1.3333333em;margin-bottom:1.3333333em}.sm\:prose-2xl [class~=lead]{font-size:1.25em;line-height:1.4666667;margin-top:1.0666667em;margin-bottom:1.0666667em}.sm\:prose-2xl blockquote{margin-top:1.7777778em;margin-bottom:1.7777778em;padding-left:1.1111111em}.sm\:prose-2xl h1{font-size:2.6666667em;margin-top:0;margin-bottom:.875em;line-height:1}.sm\:prose-2xl h2{font-size:2em;margin-top:1.5em;margin-bottom:.8333333em;line-height:1.0833333}.sm\:prose-2xl h3{font-size:1.5em;margin-top:1.5555556em;margin-bottom:.6666667em;line-height:1.2222222}.sm\:prose-2xl h4{margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.sm\:prose-2xl img{margin-top:2em;margin-bottom:2em}.sm\:prose-2xl video{margin-top:2em;margin-bottom:2em}.sm\:prose-2xl figure{margin-top:2em;margin-bottom:2em}.sm\:prose-2xl figure>*{margin-top:0;margin-bottom:0}.sm\:prose-2xl figure figcaption{font-size:.8333333em;line-height:1.6;margin-top:1em}.sm\:prose-2xl code{font-size:.8333333em}.sm\:prose-2xl h2 code{font-size:.875em}.sm\:prose-2xl h3 code{font-size:.8888889em}.sm\:prose-2xl pre{font-size:.8333333em;line-height:1.8;margin-top:2em;margin-bottom:2em;border-radius:.5rem;padding-top:1.2em;padding-right:1.6em;padding-bottom:1.2em;padding-left:1.6em}.sm\:prose-2xl ol{margin-top:1.3333333em;margin-bottom:1.3333333em}.sm\:prose-2xl ul{margin-top:1.3333333em;margin-bottom:1.3333333em}.sm\:prose-2xl li{margin-top:.5em;margin-bottom:.5em}.sm\:prose-2xl ol>li{padding-left:1.6666667em}.sm\:prose-2xl ol>li:before{left:0}.sm\:prose-2xl ul>li{padding-left:1.6666667em}.sm\:prose-2xl ul>li::before{width:.3333333em;height:.3333333em;top:calc(.8333333em - .1666667em);left:.25em}.sm\:prose-2xl>ul>li p{margin-top:.8333333em;margin-bottom:.8333333em}.sm\:prose-2xl>ul>li>:first-child{margin-top:1.3333333em}.sm\:prose-2xl>ul>li>:last-child{margin-bottom:1.3333333em}.sm\:prose-2xl>ol>li>:first-child{margin-top:1.3333333em}.sm\:prose-2xl>ol>li>:last-child{margin-bottom:1.3333333em}.sm\:prose-2xl ol ol,.sm\:prose-2xl ol ul,.sm\:prose-2xl ul ol,.sm\:prose-2xl ul ul{margin-top:.6666667em;margin-bottom:.6666667em}.sm\:prose-2xl hr{margin-top:3em;margin-bottom:3em}.sm\:prose-2xl hr+*{margin-top:0}.sm\:prose-2xl h2+*{margin-top:0}.sm\:prose-2xl h3+*{margin-top:0}.sm\:prose-2xl h4+*{margin-top:0}.sm\:prose-2xl table{font-size:.8333333em;line-height:1.4}.sm\:prose-2xl thead th{padding-right:.6em;padding-bottom:.8em;padding-left:.6em}.sm\:prose-2xl thead th:first-child{padding-left:0}.sm\:prose-2xl thead th:last-child{padding-right:0}.sm\:prose-2xl tbody td{padding-top:.8em;padding-right:.6em;padding-bottom:.8em;padding-left:.6em}.sm\:prose-2xl tbody td:first-child{padding-left:0}.sm\:prose-2xl tbody td:last-child{padding-right:0}.sm\:prose-2xl>:first-child{margin-top:0}.sm\:prose-2xl>:last-child{margin-bottom:0}.sm\:space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(0px * var(--space-y-reverse))}.sm\:space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(3rem * var(--space-y-reverse))}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:flex{display:flex}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:flex-1{flex:1 1 0%}.sm\:h-8{height:2rem}.sm\:h-10{height:2.5rem}.sm\:text-lg{font-size:1.125rem}.sm\:text-2xl{font-size:1.5rem}.sm\:text-3xl{font-size:1.875rem}.sm\:text-4xl{font-size:2.25rem}.sm\:leading-9{line-height:2.25rem}.sm\:leading-10{line-height:2.5rem}.sm\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.sm\:ml-1{margin-left:.25rem}.sm\:mt-2{margin-top:.5rem}.sm\:ml-8{margin-left:2rem}.sm\:mt-12{margin-top:3rem}.sm\:mt-16{margin-top:4rem}.sm\:p-6{padding:1.5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-12{padding-top:3rem;padding-bottom:3rem}.sm\:pt-16{padding-top:4rem}.sm\:w-0{width:0}.sm\:w-8{width:2rem}}@media (min-width:768px){.md\:container{width:100%}@media (min-width:640px){.md\:container{max-width:640px}}@media (min-width:768px){.md\:container{max-width:768px}}@media (min-width:1024px){.md\:container{max-width:1024px}}@media (min-width:1280px){.md\:container{max-width:1280px}}.md\:prose{color:#374151;max-width:65ch}.md\:prose [class~=lead]{color:#4b5563;font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.md\:prose a{color:#5850ec;text-decoration:none;font-weight:600}.md\:prose strong{color:#161e2e;font-weight:600}.md\:prose ol{counter-reset:list-counter;margin-top:1.25em;margin-bottom:1.25em}.md\:prose ol>li{position:relative;counter-increment:list-counter;padding-left:1.75em}.md\:prose ol>li::before{content:counter(list-counter) ".";position:absolute;font-weight:400;color:#6b7280}.md\:prose ul>li{position:relative;padding-left:1.75em}.md\:prose ul>li::before{content:"";position:absolute;background-color:#d2d6dc;border-radius:50%;width:.375em;height:.375em;top:calc(.875em - .1875em);left:.25em}.md\:prose hr{border-color:#e5e7eb;border-top-width:1px;margin-top:3em;margin-bottom:3em}.md\:prose blockquote{font-weight:500;font-style:italic;color:#161e2e;border-left-width:.25rem;border-left-color:#e5e7eb;quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.md\:prose blockquote p:first-of-type::before{content:open-quote}.md\:prose blockquote p:last-of-type::after{content:close-quote}.md\:prose h1{color:#1a202c;font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.md\:prose h2{color:#1a202c;font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.md\:prose h3{color:#1a202c;font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.md\:prose h4{color:#1a202c;font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.md\:prose figure figcaption{color:#6b7280;font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.md\:prose code{color:#161e2e;font-weight:600;font-size:.875em}.md\:prose code::before{content:"`"}.md\:prose code::after{content:"`"}.md\:prose pre{color:#e5e7eb;background-color:#252f3f;overflow-x:auto;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-right:1.1428571em;padding-bottom:.8571429em;padding-left:1.1428571em}.md\:prose pre code{background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:400;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.md\:prose pre code::before{content:""}.md\:prose pre code::after{content:""}.md\:prose table{width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.md\:prose thead{color:#161e2e;font-weight:600;border-bottom-width:1px;border-bottom-color:#d2d6dc}.md\:prose thead th{vertical-align:bottom;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.md\:prose tbody tr{border-bottom-width:1px;border-bottom-color:#e5e7eb}.md\:prose tbody tr:last-child{border-bottom-width:0}.md\:prose tbody td{vertical-align:top;padding-top:.5714286em;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.md\:prose{font-size:1rem;line-height:1.75}.md\:prose p{margin-top:1.25em;margin-bottom:1.25em}.md\:prose img{margin-top:2em;margin-bottom:2em}.md\:prose video{margin-top:2em;margin-bottom:2em}.md\:prose figure{margin-top:2em;margin-bottom:2em}.md\:prose figure>*{margin-top:0;margin-bottom:0}.md\:prose h2 code{font-size:.875em}.md\:prose h3 code{font-size:.9em}.md\:prose ul{margin-top:1.25em;margin-bottom:1.25em}.md\:prose li{margin-top:.5em;margin-bottom:.5em}.md\:prose ol>li:before{left:0}.md\:prose>ul>li p{margin-top:.75em;margin-bottom:.75em}.md\:prose>ul>li>:first-child{margin-top:1.25em}.md\:prose>ul>li>:last-child{margin-bottom:1.25em}.md\:prose>ol>li>:first-child{margin-top:1.25em}.md\:prose>ol>li>:last-child{margin-bottom:1.25em}.md\:prose ol ol,.md\:prose ol ul,.md\:prose ul ol,.md\:prose ul ul{margin-top:.75em;margin-bottom:.75em}.md\:prose hr+*{margin-top:0}.md\:prose h2+*{margin-top:0}.md\:prose h3+*{margin-top:0}.md\:prose h4+*{margin-top:0}.md\:prose thead th:first-child{padding-left:0}.md\:prose thead th:last-child{padding-right:0}.md\:prose tbody td:first-child{padding-left:0}.md\:prose tbody td:last-child{padding-right:0}.md\:prose>:first-child{margin-top:0}.md\:prose>:last-child{margin-bottom:0}.md\:prose h1,.md\:prose h2,.md\:prose h3,.md\:prose h4{color:#161e2e}.md\:prose-sm{font-size:.875rem;line-height:1.7142857}.md\:prose-sm p{margin-top:1.1428571em;margin-bottom:1.1428571em}.md\:prose-sm [class~=lead]{font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.md\:prose-sm blockquote{margin-top:1.3333333em;margin-bottom:1.3333333em;padding-left:1.1111111em}.md\:prose-sm h1{font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.md\:prose-sm h2{font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.md\:prose-sm h3{font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.md\:prose-sm h4{margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.md\:prose-sm img{margin-top:1.7142857em;margin-bottom:1.7142857em}.md\:prose-sm video{margin-top:1.7142857em;margin-bottom:1.7142857em}.md\:prose-sm figure{margin-top:1.7142857em;margin-bottom:1.7142857em}.md\:prose-sm figure>*{margin-top:0;margin-bottom:0}.md\:prose-sm figure figcaption{font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.md\:prose-sm code{font-size:.8571429em}.md\:prose-sm h2 code{font-size:.9em}.md\:prose-sm h3 code{font-size:.8888889em}.md\:prose-sm pre{font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.md\:prose-sm ol{margin-top:1.1428571em;margin-bottom:1.1428571em}.md\:prose-sm ul{margin-top:1.1428571em;margin-bottom:1.1428571em}.md\:prose-sm li{margin-top:.2857143em;margin-bottom:.2857143em}.md\:prose-sm ol>li{padding-left:1.5714286em}.md\:prose-sm ol>li:before{left:0}.md\:prose-sm ul>li{padding-left:1.5714286em}.md\:prose-sm ul>li::before{height:.3571429em;width:.3571429em;top:calc(.8571429em - .1785714em);left:.2142857em}.md\:prose-sm>ul>li p{margin-top:.5714286em;margin-bottom:.5714286em}.md\:prose-sm>ul>li>:first-child{margin-top:1.1428571em}.md\:prose-sm>ul>li>:last-child{margin-bottom:1.1428571em}.md\:prose-sm>ol>li>:first-child{margin-top:1.1428571em}.md\:prose-sm>ol>li>:last-child{margin-bottom:1.1428571em}.md\:prose-sm ol ol,.md\:prose-sm ol ul,.md\:prose-sm ul ol,.md\:prose-sm ul ul{margin-top:.5714286em;margin-bottom:.5714286em}.md\:prose-sm hr{margin-top:2.8571429em;margin-bottom:2.8571429em}.md\:prose-sm hr+*{margin-top:0}.md\:prose-sm h2+*{margin-top:0}.md\:prose-sm h3+*{margin-top:0}.md\:prose-sm h4+*{margin-top:0}.md\:prose-sm table{font-size:.8571429em;line-height:1.5}.md\:prose-sm thead th{padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.md\:prose-sm thead th:first-child{padding-left:0}.md\:prose-sm thead th:last-child{padding-right:0}.md\:prose-sm tbody td{padding-top:.6666667em;padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.md\:prose-sm tbody td:first-child{padding-left:0}.md\:prose-sm tbody td:last-child{padding-right:0}.md\:prose-sm>:first-child{margin-top:0}.md\:prose-sm>:last-child{margin-bottom:0}.md\:prose-lg{font-size:1.125rem;line-height:1.7777778}.md\:prose-lg p{margin-top:1.3333333em;margin-bottom:1.3333333em}.md\:prose-lg [class~=lead]{font-size:1.2222222em;line-height:1.4545455;margin-top:1.0909091em;margin-bottom:1.0909091em}.md\:prose-lg blockquote{margin-top:1.6666667em;margin-bottom:1.6666667em;padding-left:1em}.md\:prose-lg h1{font-size:2.6666667em;margin-top:0;margin-bottom:.8333333em;line-height:1}.md\:prose-lg h2{font-size:1.6666667em;margin-top:1.8666667em;margin-bottom:1.0666667em;line-height:1.3333333}.md\:prose-lg h3{font-size:1.3333333em;margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.md\:prose-lg h4{margin-top:1.7777778em;margin-bottom:.4444444em;line-height:1.5555556}.md\:prose-lg img{margin-top:1.7777778em;margin-bottom:1.7777778em}.md\:prose-lg video{margin-top:1.7777778em;margin-bottom:1.7777778em}.md\:prose-lg figure{margin-top:1.7777778em;margin-bottom:1.7777778em}.md\:prose-lg figure>*{margin-top:0;margin-bottom:0}.md\:prose-lg figure figcaption{font-size:.8888889em;line-height:1.5;margin-top:1em}.md\:prose-lg code{font-size:.8888889em}.md\:prose-lg h2 code{font-size:.8666667em}.md\:prose-lg h3 code{font-size:.875em}.md\:prose-lg pre{font-size:.8888889em;line-height:1.75;margin-top:2em;margin-bottom:2em;border-radius:.375rem;padding-top:1em;padding-right:1.5em;padding-bottom:1em;padding-left:1.5em}.md\:prose-lg ol{margin-top:1.3333333em;margin-bottom:1.3333333em}.md\:prose-lg ul{margin-top:1.3333333em;margin-bottom:1.3333333em}.md\:prose-lg li{margin-top:.6666667em;margin-bottom:.6666667em}.md\:prose-lg ol>li{padding-left:1.6666667em}.md\:prose-lg ol>li:before{left:0}.md\:prose-lg ul>li{padding-left:1.6666667em}.md\:prose-lg ul>li::before{width:.3333333em;height:.3333333em;top:calc(.8888889em - .1666667em);left:.2222222em}.md\:prose-lg>ul>li p{margin-top:.8888889em;margin-bottom:.8888889em}.md\:prose-lg>ul>li>:first-child{margin-top:1.3333333em}.md\:prose-lg>ul>li>:last-child{margin-bottom:1.3333333em}.md\:prose-lg>ol>li>:first-child{margin-top:1.3333333em}.md\:prose-lg>ol>li>:last-child{margin-bottom:1.3333333em}.md\:prose-lg ol ol,.md\:prose-lg ol ul,.md\:prose-lg ul ol,.md\:prose-lg ul ul{margin-top:.8888889em;margin-bottom:.8888889em}.md\:prose-lg hr{margin-top:3.1111111em;margin-bottom:3.1111111em}.md\:prose-lg hr+*{margin-top:0}.md\:prose-lg h2+*{margin-top:0}.md\:prose-lg h3+*{margin-top:0}.md\:prose-lg h4+*{margin-top:0}.md\:prose-lg table{font-size:.8888889em;line-height:1.5}.md\:prose-lg thead th{padding-right:.75em;padding-bottom:.75em;padding-left:.75em}.md\:prose-lg thead th:first-child{padding-left:0}.md\:prose-lg thead th:last-child{padding-right:0}.md\:prose-lg tbody td{padding-top:.75em;padding-right:.75em;padding-bottom:.75em;padding-left:.75em}.md\:prose-lg tbody td:first-child{padding-left:0}.md\:prose-lg tbody td:last-child{padding-right:0}.md\:prose-lg>:first-child{margin-top:0}.md\:prose-lg>:last-child{margin-bottom:0}.md\:prose-xl{font-size:1.25rem;line-height:1.8}.md\:prose-xl p{margin-top:1.2em;margin-bottom:1.2em}.md\:prose-xl [class~=lead]{font-size:1.2em;line-height:1.5;margin-top:1em;margin-bottom:1em}.md\:prose-xl blockquote{margin-top:1.6em;margin-bottom:1.6em;padding-left:1.0666667em}.md\:prose-xl h1{font-size:2.8em;margin-top:0;margin-bottom:.8571429em;line-height:1}.md\:prose-xl h2{font-size:1.8em;margin-top:1.5555556em;margin-bottom:.8888889em;line-height:1.1111111}.md\:prose-xl h3{font-size:1.5em;margin-top:1.6em;margin-bottom:.6666667em;line-height:1.3333333}.md\:prose-xl h4{margin-top:1.8em;margin-bottom:.6em;line-height:1.6}.md\:prose-xl img{margin-top:2em;margin-bottom:2em}.md\:prose-xl video{margin-top:2em;margin-bottom:2em}.md\:prose-xl figure{margin-top:2em;margin-bottom:2em}.md\:prose-xl figure>*{margin-top:0;margin-bottom:0}.md\:prose-xl figure figcaption{font-size:.9em;line-height:1.5555556;margin-top:1em}.md\:prose-xl code{font-size:.9em}.md\:prose-xl h2 code{font-size:.8611111em}.md\:prose-xl h3 code{font-size:.9em}.md\:prose-xl pre{font-size:.9em;line-height:1.7777778;margin-top:2em;margin-bottom:2em;border-radius:.5rem;padding-top:1.1111111em;padding-right:1.3333333em;padding-bottom:1.1111111em;padding-left:1.3333333em}.md\:prose-xl ol{margin-top:1.2em;margin-bottom:1.2em}.md\:prose-xl ul{margin-top:1.2em;margin-bottom:1.2em}.md\:prose-xl li{margin-top:.6em;margin-bottom:.6em}.md\:prose-xl ol>li{padding-left:1.8em}.md\:prose-xl ol>li:before{left:0}.md\:prose-xl ul>li{padding-left:1.8em}.md\:prose-xl ul>li::before{width:.35em;height:.35em;top:calc(.9em - .175em);left:.25em}.md\:prose-xl>ul>li p{margin-top:.8em;margin-bottom:.8em}.md\:prose-xl>ul>li>:first-child{margin-top:1.2em}.md\:prose-xl>ul>li>:last-child{margin-bottom:1.2em}.md\:prose-xl>ol>li>:first-child{margin-top:1.2em}.md\:prose-xl>ol>li>:last-child{margin-bottom:1.2em}.md\:prose-xl ol ol,.md\:prose-xl ol ul,.md\:prose-xl ul ol,.md\:prose-xl ul ul{margin-top:.8em;margin-bottom:.8em}.md\:prose-xl hr{margin-top:2.8em;margin-bottom:2.8em}.md\:prose-xl hr+*{margin-top:0}.md\:prose-xl h2+*{margin-top:0}.md\:prose-xl h3+*{margin-top:0}.md\:prose-xl h4+*{margin-top:0}.md\:prose-xl table{font-size:.9em;line-height:1.5555556}.md\:prose-xl thead th{padding-right:.6666667em;padding-bottom:.8888889em;padding-left:.6666667em}.md\:prose-xl thead th:first-child{padding-left:0}.md\:prose-xl thead th:last-child{padding-right:0}.md\:prose-xl tbody td{padding-top:.8888889em;padding-right:.6666667em;padding-bottom:.8888889em;padding-left:.6666667em}.md\:prose-xl tbody td:first-child{padding-left:0}.md\:prose-xl tbody td:last-child{padding-right:0}.md\:prose-xl>:first-child{margin-top:0}.md\:prose-xl>:last-child{margin-bottom:0}.md\:prose-2xl{font-size:1.5rem;line-height:1.6666667}.md\:prose-2xl p{margin-top:1.3333333em;margin-bottom:1.3333333em}.md\:prose-2xl [class~=lead]{font-size:1.25em;line-height:1.4666667;margin-top:1.0666667em;margin-bottom:1.0666667em}.md\:prose-2xl blockquote{margin-top:1.7777778em;margin-bottom:1.7777778em;padding-left:1.1111111em}.md\:prose-2xl h1{font-size:2.6666667em;margin-top:0;margin-bottom:.875em;line-height:1}.md\:prose-2xl h2{font-size:2em;margin-top:1.5em;margin-bottom:.8333333em;line-height:1.0833333}.md\:prose-2xl h3{font-size:1.5em;margin-top:1.5555556em;margin-bottom:.6666667em;line-height:1.2222222}.md\:prose-2xl h4{margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.md\:prose-2xl img{margin-top:2em;margin-bottom:2em}.md\:prose-2xl video{margin-top:2em;margin-bottom:2em}.md\:prose-2xl figure{margin-top:2em;margin-bottom:2em}.md\:prose-2xl figure>*{margin-top:0;margin-bottom:0}.md\:prose-2xl figure figcaption{font-size:.8333333em;line-height:1.6;margin-top:1em}.md\:prose-2xl code{font-size:.8333333em}.md\:prose-2xl h2 code{font-size:.875em}.md\:prose-2xl h3 code{font-size:.8888889em}.md\:prose-2xl pre{font-size:.8333333em;line-height:1.8;margin-top:2em;margin-bottom:2em;border-radius:.5rem;padding-top:1.2em;padding-right:1.6em;padding-bottom:1.2em;padding-left:1.6em}.md\:prose-2xl ol{margin-top:1.3333333em;margin-bottom:1.3333333em}.md\:prose-2xl ul{margin-top:1.3333333em;margin-bottom:1.3333333em}.md\:prose-2xl li{margin-top:.5em;margin-bottom:.5em}.md\:prose-2xl ol>li{padding-left:1.6666667em}.md\:prose-2xl ol>li:before{left:0}.md\:prose-2xl ul>li{padding-left:1.6666667em}.md\:prose-2xl ul>li::before{width:.3333333em;height:.3333333em;top:calc(.8333333em - .1666667em);left:.25em}.md\:prose-2xl>ul>li p{margin-top:.8333333em;margin-bottom:.8333333em}.md\:prose-2xl>ul>li>:first-child{margin-top:1.3333333em}.md\:prose-2xl>ul>li>:last-child{margin-bottom:1.3333333em}.md\:prose-2xl>ol>li>:first-child{margin-top:1.3333333em}.md\:prose-2xl>ol>li>:last-child{margin-bottom:1.3333333em}.md\:prose-2xl ol ol,.md\:prose-2xl ol ul,.md\:prose-2xl ul ol,.md\:prose-2xl ul ul{margin-top:.6666667em;margin-bottom:.6666667em}.md\:prose-2xl hr{margin-top:3em;margin-bottom:3em}.md\:prose-2xl hr+*{margin-top:0}.md\:prose-2xl h2+*{margin-top:0}.md\:prose-2xl h3+*{margin-top:0}.md\:prose-2xl h4+*{margin-top:0}.md\:prose-2xl table{font-size:.8333333em;line-height:1.4}.md\:prose-2xl thead th{padding-right:.6em;padding-bottom:.8em;padding-left:.6em}.md\:prose-2xl thead th:first-child{padding-left:0}.md\:prose-2xl thead th:last-child{padding-right:0}.md\:prose-2xl tbody td{padding-top:.8em;padding-right:.6em;padding-bottom:.8em;padding-left:.6em}.md\:prose-2xl tbody td:first-child{padding-left:0}.md\:prose-2xl tbody td:last-child{padding-right:0}.md\:prose-2xl>:first-child{margin-top:0}.md\:prose-2xl>:last-child{margin-bottom:0}.md\:justify-center{justify-content:center}.md\:text-6xl{font-size:4rem}.md\:leading-relaxed{line-height:1.625}.md\:mt-16{margin-top:4rem}}@media (min-width:1024px){.lg\:container{width:100%}@media (min-width:640px){.lg\:container{max-width:640px}}@media (min-width:768px){.lg\:container{max-width:768px}}@media (min-width:1024px){.lg\:container{max-width:1024px}}@media (min-width:1280px){.lg\:container{max-width:1280px}}.lg\:prose{color:#374151;max-width:65ch}.lg\:prose [class~=lead]{color:#4b5563;font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.lg\:prose a{color:#5850ec;text-decoration:none;font-weight:600}.lg\:prose strong{color:#161e2e;font-weight:600}.lg\:prose ol{counter-reset:list-counter;margin-top:1.25em;margin-bottom:1.25em}.lg\:prose ol>li{position:relative;counter-increment:list-counter;padding-left:1.75em}.lg\:prose ol>li::before{content:counter(list-counter) ".";position:absolute;font-weight:400;color:#6b7280}.lg\:prose ul>li{position:relative;padding-left:1.75em}.lg\:prose ul>li::before{content:"";position:absolute;background-color:#d2d6dc;border-radius:50%;width:.375em;height:.375em;top:calc(.875em - .1875em);left:.25em}.lg\:prose hr{border-color:#e5e7eb;border-top-width:1px;margin-top:3em;margin-bottom:3em}.lg\:prose blockquote{font-weight:500;font-style:italic;color:#161e2e;border-left-width:.25rem;border-left-color:#e5e7eb;quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.lg\:prose blockquote p:first-of-type::before{content:open-quote}.lg\:prose blockquote p:last-of-type::after{content:close-quote}.lg\:prose h1{color:#1a202c;font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.lg\:prose h2{color:#1a202c;font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.lg\:prose h3{color:#1a202c;font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.lg\:prose h4{color:#1a202c;font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.lg\:prose figure figcaption{color:#6b7280;font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.lg\:prose code{color:#161e2e;font-weight:600;font-size:.875em}.lg\:prose code::before{content:"`"}.lg\:prose code::after{content:"`"}.lg\:prose pre{color:#e5e7eb;background-color:#252f3f;overflow-x:auto;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-right:1.1428571em;padding-bottom:.8571429em;padding-left:1.1428571em}.lg\:prose pre code{background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:400;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.lg\:prose pre code::before{content:""}.lg\:prose pre code::after{content:""}.lg\:prose table{width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.lg\:prose thead{color:#161e2e;font-weight:600;border-bottom-width:1px;border-bottom-color:#d2d6dc}.lg\:prose thead th{vertical-align:bottom;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.lg\:prose tbody tr{border-bottom-width:1px;border-bottom-color:#e5e7eb}.lg\:prose tbody tr:last-child{border-bottom-width:0}.lg\:prose tbody td{vertical-align:top;padding-top:.5714286em;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.lg\:prose{font-size:1rem;line-height:1.75}.lg\:prose p{margin-top:1.25em;margin-bottom:1.25em}.lg\:prose img{margin-top:2em;margin-bottom:2em}.lg\:prose video{margin-top:2em;margin-bottom:2em}.lg\:prose figure{margin-top:2em;margin-bottom:2em}.lg\:prose figure>*{margin-top:0;margin-bottom:0}.lg\:prose h2 code{font-size:.875em}.lg\:prose h3 code{font-size:.9em}.lg\:prose ul{margin-top:1.25em;margin-bottom:1.25em}.lg\:prose li{margin-top:.5em;margin-bottom:.5em}.lg\:prose ol>li:before{left:0}.lg\:prose>ul>li p{margin-top:.75em;margin-bottom:.75em}.lg\:prose>ul>li>:first-child{margin-top:1.25em}.lg\:prose>ul>li>:last-child{margin-bottom:1.25em}.lg\:prose>ol>li>:first-child{margin-top:1.25em}.lg\:prose>ol>li>:last-child{margin-bottom:1.25em}.lg\:prose ol ol,.lg\:prose ol ul,.lg\:prose ul ol,.lg\:prose ul ul{margin-top:.75em;margin-bottom:.75em}.lg\:prose hr+*{margin-top:0}.lg\:prose h2+*{margin-top:0}.lg\:prose h3+*{margin-top:0}.lg\:prose h4+*{margin-top:0}.lg\:prose thead th:first-child{padding-left:0}.lg\:prose thead th:last-child{padding-right:0}.lg\:prose tbody td:first-child{padding-left:0}.lg\:prose tbody td:last-child{padding-right:0}.lg\:prose>:first-child{margin-top:0}.lg\:prose>:last-child{margin-bottom:0}.lg\:prose h1,.lg\:prose h2,.lg\:prose h3,.lg\:prose h4{color:#161e2e}.lg\:prose-sm{font-size:.875rem;line-height:1.7142857}.lg\:prose-sm p{margin-top:1.1428571em;margin-bottom:1.1428571em}.lg\:prose-sm [class~=lead]{font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.lg\:prose-sm blockquote{margin-top:1.3333333em;margin-bottom:1.3333333em;padding-left:1.1111111em}.lg\:prose-sm h1{font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.lg\:prose-sm h2{font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.lg\:prose-sm h3{font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.lg\:prose-sm h4{margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.lg\:prose-sm img{margin-top:1.7142857em;margin-bottom:1.7142857em}.lg\:prose-sm video{margin-top:1.7142857em;margin-bottom:1.7142857em}.lg\:prose-sm figure{margin-top:1.7142857em;margin-bottom:1.7142857em}.lg\:prose-sm figure>*{margin-top:0;margin-bottom:0}.lg\:prose-sm figure figcaption{font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.lg\:prose-sm code{font-size:.8571429em}.lg\:prose-sm h2 code{font-size:.9em}.lg\:prose-sm h3 code{font-size:.8888889em}.lg\:prose-sm pre{font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.lg\:prose-sm ol{margin-top:1.1428571em;margin-bottom:1.1428571em}.lg\:prose-sm ul{margin-top:1.1428571em;margin-bottom:1.1428571em}.lg\:prose-sm li{margin-top:.2857143em;margin-bottom:.2857143em}.lg\:prose-sm ol>li{padding-left:1.5714286em}.lg\:prose-sm ol>li:before{left:0}.lg\:prose-sm ul>li{padding-left:1.5714286em}.lg\:prose-sm ul>li::before{height:.3571429em;width:.3571429em;top:calc(.8571429em - .1785714em);left:.2142857em}.lg\:prose-sm>ul>li p{margin-top:.5714286em;margin-bottom:.5714286em}.lg\:prose-sm>ul>li>:first-child{margin-top:1.1428571em}.lg\:prose-sm>ul>li>:last-child{margin-bottom:1.1428571em}.lg\:prose-sm>ol>li>:first-child{margin-top:1.1428571em}.lg\:prose-sm>ol>li>:last-child{margin-bottom:1.1428571em}.lg\:prose-sm ol ol,.lg\:prose-sm ol ul,.lg\:prose-sm ul ol,.lg\:prose-sm ul ul{margin-top:.5714286em;margin-bottom:.5714286em}.lg\:prose-sm hr{margin-top:2.8571429em;margin-bottom:2.8571429em}.lg\:prose-sm hr+*{margin-top:0}.lg\:prose-sm h2+*{margin-top:0}.lg\:prose-sm h3+*{margin-top:0}.lg\:prose-sm h4+*{margin-top:0}.lg\:prose-sm table{font-size:.8571429em;line-height:1.5}.lg\:prose-sm thead th{padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.lg\:prose-sm thead th:first-child{padding-left:0}.lg\:prose-sm thead th:last-child{padding-right:0}.lg\:prose-sm tbody td{padding-top:.6666667em;padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.lg\:prose-sm tbody td:first-child{padding-left:0}.lg\:prose-sm tbody td:last-child{padding-right:0}.lg\:prose-sm>:first-child{margin-top:0}.lg\:prose-sm>:last-child{margin-bottom:0}.lg\:prose-lg{font-size:1.125rem;line-height:1.7777778}.lg\:prose-lg p{margin-top:1.3333333em;margin-bottom:1.3333333em}.lg\:prose-lg [class~=lead]{font-size:1.2222222em;line-height:1.4545455;margin-top:1.0909091em;margin-bottom:1.0909091em}.lg\:prose-lg blockquote{margin-top:1.6666667em;margin-bottom:1.6666667em;padding-left:1em}.lg\:prose-lg h1{font-size:2.6666667em;margin-top:0;margin-bottom:.8333333em;line-height:1}.lg\:prose-lg h2{font-size:1.6666667em;margin-top:1.8666667em;margin-bottom:1.0666667em;line-height:1.3333333}.lg\:prose-lg h3{font-size:1.3333333em;margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.lg\:prose-lg h4{margin-top:1.7777778em;margin-bottom:.4444444em;line-height:1.5555556}.lg\:prose-lg img{margin-top:1.7777778em;margin-bottom:1.7777778em}.lg\:prose-lg video{margin-top:1.7777778em;margin-bottom:1.7777778em}.lg\:prose-lg figure{margin-top:1.7777778em;margin-bottom:1.7777778em}.lg\:prose-lg figure>*{margin-top:0;margin-bottom:0}.lg\:prose-lg figure figcaption{font-size:.8888889em;line-height:1.5;margin-top:1em}.lg\:prose-lg code{font-size:.8888889em}.lg\:prose-lg h2 code{font-size:.8666667em}.lg\:prose-lg h3 code{font-size:.875em}.lg\:prose-lg pre{font-size:.8888889em;line-height:1.75;margin-top:2em;margin-bottom:2em;border-radius:.375rem;padding-top:1em;padding-right:1.5em;padding-bottom:1em;padding-left:1.5em}.lg\:prose-lg ol{margin-top:1.3333333em;margin-bottom:1.3333333em}.lg\:prose-lg ul{margin-top:1.3333333em;margin-bottom:1.3333333em}.lg\:prose-lg li{margin-top:.6666667em;margin-bottom:.6666667em}.lg\:prose-lg ol>li{padding-left:1.6666667em}.lg\:prose-lg ol>li:before{left:0}.lg\:prose-lg ul>li{padding-left:1.6666667em}.lg\:prose-lg ul>li::before{width:.3333333em;height:.3333333em;top:calc(.8888889em - .1666667em);left:.2222222em}.lg\:prose-lg>ul>li p{margin-top:.8888889em;margin-bottom:.8888889em}.lg\:prose-lg>ul>li>:first-child{margin-top:1.3333333em}.lg\:prose-lg>ul>li>:last-child{margin-bottom:1.3333333em}.lg\:prose-lg>ol>li>:first-child{margin-top:1.3333333em}.lg\:prose-lg>ol>li>:last-child{margin-bottom:1.3333333em}.lg\:prose-lg ol ol,.lg\:prose-lg ol ul,.lg\:prose-lg ul ol,.lg\:prose-lg ul ul{margin-top:.8888889em;margin-bottom:.8888889em}.lg\:prose-lg hr{margin-top:3.1111111em;margin-bottom:3.1111111em}.lg\:prose-lg hr+*{margin-top:0}.lg\:prose-lg h2+*{margin-top:0}.lg\:prose-lg h3+*{margin-top:0}.lg\:prose-lg h4+*{margin-top:0}.lg\:prose-lg table{font-size:.8888889em;line-height:1.5}.lg\:prose-lg thead th{padding-right:.75em;padding-bottom:.75em;padding-left:.75em}.lg\:prose-lg thead th:first-child{padding-left:0}.lg\:prose-lg thead th:last-child{padding-right:0}.lg\:prose-lg tbody td{padding-top:.75em;padding-right:.75em;padding-bottom:.75em;padding-left:.75em}.lg\:prose-lg tbody td:first-child{padding-left:0}.lg\:prose-lg tbody td:last-child{padding-right:0}.lg\:prose-lg>:first-child{margin-top:0}.lg\:prose-lg>:last-child{margin-bottom:0}.lg\:prose-xl{font-size:1.25rem;line-height:1.8}.lg\:prose-xl p{margin-top:1.2em;margin-bottom:1.2em}.lg\:prose-xl [class~=lead]{font-size:1.2em;line-height:1.5;margin-top:1em;margin-bottom:1em}.lg\:prose-xl blockquote{margin-top:1.6em;margin-bottom:1.6em;padding-left:1.0666667em}.lg\:prose-xl h1{font-size:2.8em;margin-top:0;margin-bottom:.8571429em;line-height:1}.lg\:prose-xl h2{font-size:1.8em;margin-top:1.5555556em;margin-bottom:.8888889em;line-height:1.1111111}.lg\:prose-xl h3{font-size:1.5em;margin-top:1.6em;margin-bottom:.6666667em;line-height:1.3333333}.lg\:prose-xl h4{margin-top:1.8em;margin-bottom:.6em;line-height:1.6}.lg\:prose-xl img{margin-top:2em;margin-bottom:2em}.lg\:prose-xl video{margin-top:2em;margin-bottom:2em}.lg\:prose-xl figure{margin-top:2em;margin-bottom:2em}.lg\:prose-xl figure>*{margin-top:0;margin-bottom:0}.lg\:prose-xl figure figcaption{font-size:.9em;line-height:1.5555556;margin-top:1em}.lg\:prose-xl code{font-size:.9em}.lg\:prose-xl h2 code{font-size:.8611111em}.lg\:prose-xl h3 code{font-size:.9em}.lg\:prose-xl pre{font-size:.9em;line-height:1.7777778;margin-top:2em;margin-bottom:2em;border-radius:.5rem;padding-top:1.1111111em;padding-right:1.3333333em;padding-bottom:1.1111111em;padding-left:1.3333333em}.lg\:prose-xl ol{margin-top:1.2em;margin-bottom:1.2em}.lg\:prose-xl ul{margin-top:1.2em;margin-bottom:1.2em}.lg\:prose-xl li{margin-top:.6em;margin-bottom:.6em}.lg\:prose-xl ol>li{padding-left:1.8em}.lg\:prose-xl ol>li:before{left:0}.lg\:prose-xl ul>li{padding-left:1.8em}.lg\:prose-xl ul>li::before{width:.35em;height:.35em;top:calc(.9em - .175em);left:.25em}.lg\:prose-xl>ul>li p{margin-top:.8em;margin-bottom:.8em}.lg\:prose-xl>ul>li>:first-child{margin-top:1.2em}.lg\:prose-xl>ul>li>:last-child{margin-bottom:1.2em}.lg\:prose-xl>ol>li>:first-child{margin-top:1.2em}.lg\:prose-xl>ol>li>:last-child{margin-bottom:1.2em}.lg\:prose-xl ol ol,.lg\:prose-xl ol ul,.lg\:prose-xl ul ol,.lg\:prose-xl ul ul{margin-top:.8em;margin-bottom:.8em}.lg\:prose-xl hr{margin-top:2.8em;margin-bottom:2.8em}.lg\:prose-xl hr+*{margin-top:0}.lg\:prose-xl h2+*{margin-top:0}.lg\:prose-xl h3+*{margin-top:0}.lg\:prose-xl h4+*{margin-top:0}.lg\:prose-xl table{font-size:.9em;line-height:1.5555556}.lg\:prose-xl thead th{padding-right:.6666667em;padding-bottom:.8888889em;padding-left:.6666667em}.lg\:prose-xl thead th:first-child{padding-left:0}.lg\:prose-xl thead th:last-child{padding-right:0}.lg\:prose-xl tbody td{padding-top:.8888889em;padding-right:.6666667em;padding-bottom:.8888889em;padding-left:.6666667em}.lg\:prose-xl tbody td:first-child{padding-left:0}.lg\:prose-xl tbody td:last-child{padding-right:0}.lg\:prose-xl>:first-child{margin-top:0}.lg\:prose-xl>:last-child{margin-bottom:0}.lg\:prose-2xl{font-size:1.5rem;line-height:1.6666667}.lg\:prose-2xl p{margin-top:1.3333333em;margin-bottom:1.3333333em}.lg\:prose-2xl [class~=lead]{font-size:1.25em;line-height:1.4666667;margin-top:1.0666667em;margin-bottom:1.0666667em}.lg\:prose-2xl blockquote{margin-top:1.7777778em;margin-bottom:1.7777778em;padding-left:1.1111111em}.lg\:prose-2xl h1{font-size:2.6666667em;margin-top:0;margin-bottom:.875em;line-height:1}.lg\:prose-2xl h2{font-size:2em;margin-top:1.5em;margin-bottom:.8333333em;line-height:1.0833333}.lg\:prose-2xl h3{font-size:1.5em;margin-top:1.5555556em;margin-bottom:.6666667em;line-height:1.2222222}.lg\:prose-2xl h4{margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.lg\:prose-2xl img{margin-top:2em;margin-bottom:2em}.lg\:prose-2xl video{margin-top:2em;margin-bottom:2em}.lg\:prose-2xl figure{margin-top:2em;margin-bottom:2em}.lg\:prose-2xl figure>*{margin-top:0;margin-bottom:0}.lg\:prose-2xl figure figcaption{font-size:.8333333em;line-height:1.6;margin-top:1em}.lg\:prose-2xl code{font-size:.8333333em}.lg\:prose-2xl h2 code{font-size:.875em}.lg\:prose-2xl h3 code{font-size:.8888889em}.lg\:prose-2xl pre{font-size:.8333333em;line-height:1.8;margin-top:2em;margin-bottom:2em;border-radius:.5rem;padding-top:1.2em;padding-right:1.6em;padding-bottom:1.2em;padding-left:1.6em}.lg\:prose-2xl ol{margin-top:1.3333333em;margin-bottom:1.3333333em}.lg\:prose-2xl ul{margin-top:1.3333333em;margin-bottom:1.3333333em}.lg\:prose-2xl li{margin-top:.5em;margin-bottom:.5em}.lg\:prose-2xl ol>li{padding-left:1.6666667em}.lg\:prose-2xl ol>li:before{left:0}.lg\:prose-2xl ul>li{padding-left:1.6666667em}.lg\:prose-2xl ul>li::before{width:.3333333em;height:.3333333em;top:calc(.8333333em - .1666667em);left:.25em}.lg\:prose-2xl>ul>li p{margin-top:.8333333em;margin-bottom:.8333333em}.lg\:prose-2xl>ul>li>:first-child{margin-top:1.3333333em}.lg\:prose-2xl>ul>li>:last-child{margin-bottom:1.3333333em}.lg\:prose-2xl>ol>li>:first-child{margin-top:1.3333333em}.lg\:prose-2xl>ol>li>:last-child{margin-bottom:1.3333333em}.lg\:prose-2xl ol ol,.lg\:prose-2xl ol ul,.lg\:prose-2xl ul ol,.lg\:prose-2xl ul ul{margin-top:.6666667em;margin-bottom:.6666667em}.lg\:prose-2xl hr{margin-top:3em;margin-bottom:3em}.lg\:prose-2xl hr+*{margin-top:0}.lg\:prose-2xl h2+*{margin-top:0}.lg\:prose-2xl h3+*{margin-top:0}.lg\:prose-2xl h4+*{margin-top:0}.lg\:prose-2xl table{font-size:.8333333em;line-height:1.4}.lg\:prose-2xl thead th{padding-right:.6em;padding-bottom:.8em;padding-left:.6em}.lg\:prose-2xl thead th:first-child{padding-left:0}.lg\:prose-2xl thead th:last-child{padding-right:0}.lg\:prose-2xl tbody td{padding-top:.8em;padding-right:.6em;padding-bottom:.8em;padding-left:.6em}.lg\:prose-2xl tbody td:first-child{padding-left:0}.lg\:prose-2xl tbody td:last-child{padding-right:0}.lg\:prose-2xl>:first-child{margin-top:0}.lg\:prose-2xl>:last-child{margin-bottom:0}.lg\:space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(0px * var(--space-y-reverse))}.lg\:space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.5rem * var(--space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--space-x-reverse)))}.lg\:space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem * var(--space-x-reverse));margin-left:calc(1rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(5rem * var(--space-y-reverse))}.lg\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.lg\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:flex-row{flex-direction:row}.lg\:flex-col{flex-direction:column}.lg\:items-end{align-items:flex-end}.lg\:items-center{align-items:center}.lg\:justify-center{justify-content:center}.lg\:flex-1{flex:1 1 0%}.lg\:flex-grow{flex-grow:1}.lg\:flex-shrink{flex-shrink:1}.lg\:h-10{height:2.5rem}.lg\:h-1\/2{height:50%}.lg\:text-xl{font-size:1.25rem}.lg\:text-3xl{font-size:1.875rem}.lg\:text-5xl{font-size:3rem}.lg\:leading-none{line-height:1}.lg\:m-0{margin:0}.lg\:mx-0{margin-left:0;margin-right:0}.lg\:mt-0{margin-top:0}.lg\:mt-2{margin-top:.5rem}.lg\:mt-4{margin-top:1rem}.lg\:mt-20{margin-top:5rem}.lg\:mt-24{margin-top:6rem}.lg\:max-w-none{max-width:none}.lg\:max-w-4xl{max-width:56rem}.lg\:max-w-screen-xl{max-width:1280px}.lg\:p-12{padding:3rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-16{padding-top:4rem;padding-bottom:4rem}.lg\:pb-20{padding-bottom:5rem}.lg\:pt-24{padding-top:6rem}.lg\:w-10{width:2.5rem}.lg\:gap-8{grid-gap:2rem;gap:2rem}.lg\:grid-flow-row-dense{grid-auto-flow:row dense}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:col-start-1{grid-column-start:1}.lg\:col-start-2{grid-column-start:2}.lg\:col-start-3{grid-column-start:3}.lg\:col-start-6{grid-column-start:6}.lg\:col-end-3{grid-column-end:3}.lg\:col-end-6{grid-column-end:6}.lg\:col-end-8{grid-column-end:8}.lg\:row-start-1{grid-row-start:1}.lg\:row-start-2{grid-row-start:2}.lg\:row-end-3{grid-row-end:3}.lg\:row-end-4{grid-row-end:4}}@media (min-width:1280px){.xl\:container{width:100%}@media (min-width:640px){.xl\:container{max-width:640px}}@media (min-width:768px){.xl\:container{max-width:768px}}@media (min-width:1024px){.xl\:container{max-width:1024px}}@media (min-width:1280px){.xl\:container{max-width:1280px}}.xl\:prose{color:#374151;max-width:65ch}.xl\:prose [class~=lead]{color:#4b5563;font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.xl\:prose a{color:#5850ec;text-decoration:none;font-weight:600}.xl\:prose strong{color:#161e2e;font-weight:600}.xl\:prose ol{counter-reset:list-counter;margin-top:1.25em;margin-bottom:1.25em}.xl\:prose ol>li{position:relative;counter-increment:list-counter;padding-left:1.75em}.xl\:prose ol>li::before{content:counter(list-counter) ".";position:absolute;font-weight:400;color:#6b7280}.xl\:prose ul>li{position:relative;padding-left:1.75em}.xl\:prose ul>li::before{content:"";position:absolute;background-color:#d2d6dc;border-radius:50%;width:.375em;height:.375em;top:calc(.875em - .1875em);left:.25em}.xl\:prose hr{border-color:#e5e7eb;border-top-width:1px;margin-top:3em;margin-bottom:3em}.xl\:prose blockquote{font-weight:500;font-style:italic;color:#161e2e;border-left-width:.25rem;border-left-color:#e5e7eb;quotes:"\201C""\201D""\2018""\2019";margin-top:1.6em;margin-bottom:1.6em;padding-left:1em}.xl\:prose blockquote p:first-of-type::before{content:open-quote}.xl\:prose blockquote p:last-of-type::after{content:close-quote}.xl\:prose h1{color:#1a202c;font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.xl\:prose h2{color:#1a202c;font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.xl\:prose h3{color:#1a202c;font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.xl\:prose h4{color:#1a202c;font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.xl\:prose figure figcaption{color:#6b7280;font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.xl\:prose code{color:#161e2e;font-weight:600;font-size:.875em}.xl\:prose code::before{content:"`"}.xl\:prose code::after{content:"`"}.xl\:prose pre{color:#e5e7eb;background-color:#252f3f;overflow-x:auto;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-right:1.1428571em;padding-bottom:.8571429em;padding-left:1.1428571em}.xl\:prose pre code{background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:400;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.xl\:prose pre code::before{content:""}.xl\:prose pre code::after{content:""}.xl\:prose table{width:100%;table-layout:auto;text-align:left;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.xl\:prose thead{color:#161e2e;font-weight:600;border-bottom-width:1px;border-bottom-color:#d2d6dc}.xl\:prose thead th{vertical-align:bottom;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.xl\:prose tbody tr{border-bottom-width:1px;border-bottom-color:#e5e7eb}.xl\:prose tbody tr:last-child{border-bottom-width:0}.xl\:prose tbody td{vertical-align:top;padding-top:.5714286em;padding-right:.5714286em;padding-bottom:.5714286em;padding-left:.5714286em}.xl\:prose{font-size:1rem;line-height:1.75}.xl\:prose p{margin-top:1.25em;margin-bottom:1.25em}.xl\:prose img{margin-top:2em;margin-bottom:2em}.xl\:prose video{margin-top:2em;margin-bottom:2em}.xl\:prose figure{margin-top:2em;margin-bottom:2em}.xl\:prose figure>*{margin-top:0;margin-bottom:0}.xl\:prose h2 code{font-size:.875em}.xl\:prose h3 code{font-size:.9em}.xl\:prose ul{margin-top:1.25em;margin-bottom:1.25em}.xl\:prose li{margin-top:.5em;margin-bottom:.5em}.xl\:prose ol>li:before{left:0}.xl\:prose>ul>li p{margin-top:.75em;margin-bottom:.75em}.xl\:prose>ul>li>:first-child{margin-top:1.25em}.xl\:prose>ul>li>:last-child{margin-bottom:1.25em}.xl\:prose>ol>li>:first-child{margin-top:1.25em}.xl\:prose>ol>li>:last-child{margin-bottom:1.25em}.xl\:prose ol ol,.xl\:prose ol ul,.xl\:prose ul ol,.xl\:prose ul ul{margin-top:.75em;margin-bottom:.75em}.xl\:prose hr+*{margin-top:0}.xl\:prose h2+*{margin-top:0}.xl\:prose h3+*{margin-top:0}.xl\:prose h4+*{margin-top:0}.xl\:prose thead th:first-child{padding-left:0}.xl\:prose thead th:last-child{padding-right:0}.xl\:prose tbody td:first-child{padding-left:0}.xl\:prose tbody td:last-child{padding-right:0}.xl\:prose>:first-child{margin-top:0}.xl\:prose>:last-child{margin-bottom:0}.xl\:prose h1,.xl\:prose h2,.xl\:prose h3,.xl\:prose h4{color:#161e2e}.xl\:prose-sm{font-size:.875rem;line-height:1.7142857}.xl\:prose-sm p{margin-top:1.1428571em;margin-bottom:1.1428571em}.xl\:prose-sm [class~=lead]{font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.xl\:prose-sm blockquote{margin-top:1.3333333em;margin-bottom:1.3333333em;padding-left:1.1111111em}.xl\:prose-sm h1{font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.xl\:prose-sm h2{font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.xl\:prose-sm h3{font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.xl\:prose-sm h4{margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.xl\:prose-sm img{margin-top:1.7142857em;margin-bottom:1.7142857em}.xl\:prose-sm video{margin-top:1.7142857em;margin-bottom:1.7142857em}.xl\:prose-sm figure{margin-top:1.7142857em;margin-bottom:1.7142857em}.xl\:prose-sm figure>*{margin-top:0;margin-bottom:0}.xl\:prose-sm figure figcaption{font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.xl\:prose-sm code{font-size:.8571429em}.xl\:prose-sm h2 code{font-size:.9em}.xl\:prose-sm h3 code{font-size:.8888889em}.xl\:prose-sm pre{font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.xl\:prose-sm ol{margin-top:1.1428571em;margin-bottom:1.1428571em}.xl\:prose-sm ul{margin-top:1.1428571em;margin-bottom:1.1428571em}.xl\:prose-sm li{margin-top:.2857143em;margin-bottom:.2857143em}.xl\:prose-sm ol>li{padding-left:1.5714286em}.xl\:prose-sm ol>li:before{left:0}.xl\:prose-sm ul>li{padding-left:1.5714286em}.xl\:prose-sm ul>li::before{height:.3571429em;width:.3571429em;top:calc(.8571429em - .1785714em);left:.2142857em}.xl\:prose-sm>ul>li p{margin-top:.5714286em;margin-bottom:.5714286em}.xl\:prose-sm>ul>li>:first-child{margin-top:1.1428571em}.xl\:prose-sm>ul>li>:last-child{margin-bottom:1.1428571em}.xl\:prose-sm>ol>li>:first-child{margin-top:1.1428571em}.xl\:prose-sm>ol>li>:last-child{margin-bottom:1.1428571em}.xl\:prose-sm ol ol,.xl\:prose-sm ol ul,.xl\:prose-sm ul ol,.xl\:prose-sm ul ul{margin-top:.5714286em;margin-bottom:.5714286em}.xl\:prose-sm hr{margin-top:2.8571429em;margin-bottom:2.8571429em}.xl\:prose-sm hr+*{margin-top:0}.xl\:prose-sm h2+*{margin-top:0}.xl\:prose-sm h3+*{margin-top:0}.xl\:prose-sm h4+*{margin-top:0}.xl\:prose-sm table{font-size:.8571429em;line-height:1.5}.xl\:prose-sm thead th{padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.xl\:prose-sm thead th:first-child{padding-left:0}.xl\:prose-sm thead th:last-child{padding-right:0}.xl\:prose-sm tbody td{padding-top:.6666667em;padding-right:1em;padding-bottom:.6666667em;padding-left:1em}.xl\:prose-sm tbody td:first-child{padding-left:0}.xl\:prose-sm tbody td:last-child{padding-right:0}.xl\:prose-sm>:first-child{margin-top:0}.xl\:prose-sm>:last-child{margin-bottom:0}.xl\:prose-lg{font-size:1.125rem;line-height:1.7777778}.xl\:prose-lg p{margin-top:1.3333333em;margin-bottom:1.3333333em}.xl\:prose-lg [class~=lead]{font-size:1.2222222em;line-height:1.4545455;margin-top:1.0909091em;margin-bottom:1.0909091em}.xl\:prose-lg blockquote{margin-top:1.6666667em;margin-bottom:1.6666667em;padding-left:1em}.xl\:prose-lg h1{font-size:2.6666667em;margin-top:0;margin-bottom:.8333333em;line-height:1}.xl\:prose-lg h2{font-size:1.6666667em;margin-top:1.8666667em;margin-bottom:1.0666667em;line-height:1.3333333}.xl\:prose-lg h3{font-size:1.3333333em;margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.xl\:prose-lg h4{margin-top:1.7777778em;margin-bottom:.4444444em;line-height:1.5555556}.xl\:prose-lg img{margin-top:1.7777778em;margin-bottom:1.7777778em}.xl\:prose-lg video{margin-top:1.7777778em;margin-bottom:1.7777778em}.xl\:prose-lg figure{margin-top:1.7777778em;margin-bottom:1.7777778em}.xl\:prose-lg figure>*{margin-top:0;margin-bottom:0}.xl\:prose-lg figure figcaption{font-size:.8888889em;line-height:1.5;margin-top:1em}.xl\:prose-lg code{font-size:.8888889em}.xl\:prose-lg h2 code{font-size:.8666667em}.xl\:prose-lg h3 code{font-size:.875em}.xl\:prose-lg pre{font-size:.8888889em;line-height:1.75;margin-top:2em;margin-bottom:2em;border-radius:.375rem;padding-top:1em;padding-right:1.5em;padding-bottom:1em;padding-left:1.5em}.xl\:prose-lg ol{margin-top:1.3333333em;margin-bottom:1.3333333em}.xl\:prose-lg ul{margin-top:1.3333333em;margin-bottom:1.3333333em}.xl\:prose-lg li{margin-top:.6666667em;margin-bottom:.6666667em}.xl\:prose-lg ol>li{padding-left:1.6666667em}.xl\:prose-lg ol>li:before{left:0}.xl\:prose-lg ul>li{padding-left:1.6666667em}.xl\:prose-lg ul>li::before{width:.3333333em;height:.3333333em;top:calc(.8888889em - .1666667em);left:.2222222em}.xl\:prose-lg>ul>li p{margin-top:.8888889em;margin-bottom:.8888889em}.xl\:prose-lg>ul>li>:first-child{margin-top:1.3333333em}.xl\:prose-lg>ul>li>:last-child{margin-bottom:1.3333333em}.xl\:prose-lg>ol>li>:first-child{margin-top:1.3333333em}.xl\:prose-lg>ol>li>:last-child{margin-bottom:1.3333333em}.xl\:prose-lg ol ol,.xl\:prose-lg ol ul,.xl\:prose-lg ul ol,.xl\:prose-lg ul ul{margin-top:.8888889em;margin-bottom:.8888889em}.xl\:prose-lg hr{margin-top:3.1111111em;margin-bottom:3.1111111em}.xl\:prose-lg hr+*{margin-top:0}.xl\:prose-lg h2+*{margin-top:0}.xl\:prose-lg h3+*{margin-top:0}.xl\:prose-lg h4+*{margin-top:0}.xl\:prose-lg table{font-size:.8888889em;line-height:1.5}.xl\:prose-lg thead th{padding-right:.75em;padding-bottom:.75em;padding-left:.75em}.xl\:prose-lg thead th:first-child{padding-left:0}.xl\:prose-lg thead th:last-child{padding-right:0}.xl\:prose-lg tbody td{padding-top:.75em;padding-right:.75em;padding-bottom:.75em;padding-left:.75em}.xl\:prose-lg tbody td:first-child{padding-left:0}.xl\:prose-lg tbody td:last-child{padding-right:0}.xl\:prose-lg>:first-child{margin-top:0}.xl\:prose-lg>:last-child{margin-bottom:0}.xl\:prose-xl{font-size:1.25rem;line-height:1.8}.xl\:prose-xl p{margin-top:1.2em;margin-bottom:1.2em}.xl\:prose-xl [class~=lead]{font-size:1.2em;line-height:1.5;margin-top:1em;margin-bottom:1em}.xl\:prose-xl blockquote{margin-top:1.6em;margin-bottom:1.6em;padding-left:1.0666667em}.xl\:prose-xl h1{font-size:2.8em;margin-top:0;margin-bottom:.8571429em;line-height:1}.xl\:prose-xl h2{font-size:1.8em;margin-top:1.5555556em;margin-bottom:.8888889em;line-height:1.1111111}.xl\:prose-xl h3{font-size:1.5em;margin-top:1.6em;margin-bottom:.6666667em;line-height:1.3333333}.xl\:prose-xl h4{margin-top:1.8em;margin-bottom:.6em;line-height:1.6}.xl\:prose-xl img{margin-top:2em;margin-bottom:2em}.xl\:prose-xl video{margin-top:2em;margin-bottom:2em}.xl\:prose-xl figure{margin-top:2em;margin-bottom:2em}.xl\:prose-xl figure>*{margin-top:0;margin-bottom:0}.xl\:prose-xl figure figcaption{font-size:.9em;line-height:1.5555556;margin-top:1em}.xl\:prose-xl code{font-size:.9em}.xl\:prose-xl h2 code{font-size:.8611111em}.xl\:prose-xl h3 code{font-size:.9em}.xl\:prose-xl pre{font-size:.9em;line-height:1.7777778;margin-top:2em;margin-bottom:2em;border-radius:.5rem;padding-top:1.1111111em;padding-right:1.3333333em;padding-bottom:1.1111111em;padding-left:1.3333333em}.xl\:prose-xl ol{margin-top:1.2em;margin-bottom:1.2em}.xl\:prose-xl ul{margin-top:1.2em;margin-bottom:1.2em}.xl\:prose-xl li{margin-top:.6em;margin-bottom:.6em}.xl\:prose-xl ol>li{padding-left:1.8em}.xl\:prose-xl ol>li:before{left:0}.xl\:prose-xl ul>li{padding-left:1.8em}.xl\:prose-xl ul>li::before{width:.35em;height:.35em;top:calc(.9em - .175em);left:.25em}.xl\:prose-xl>ul>li p{margin-top:.8em;margin-bottom:.8em}.xl\:prose-xl>ul>li>:first-child{margin-top:1.2em}.xl\:prose-xl>ul>li>:last-child{margin-bottom:1.2em}.xl\:prose-xl>ol>li>:first-child{margin-top:1.2em}.xl\:prose-xl>ol>li>:last-child{margin-bottom:1.2em}.xl\:prose-xl ol ol,.xl\:prose-xl ol ul,.xl\:prose-xl ul ol,.xl\:prose-xl ul ul{margin-top:.8em;margin-bottom:.8em}.xl\:prose-xl hr{margin-top:2.8em;margin-bottom:2.8em}.xl\:prose-xl hr+*{margin-top:0}.xl\:prose-xl h2+*{margin-top:0}.xl\:prose-xl h3+*{margin-top:0}.xl\:prose-xl h4+*{margin-top:0}.xl\:prose-xl table{font-size:.9em;line-height:1.5555556}.xl\:prose-xl thead th{padding-right:.6666667em;padding-bottom:.8888889em;padding-left:.6666667em}.xl\:prose-xl thead th:first-child{padding-left:0}.xl\:prose-xl thead th:last-child{padding-right:0}.xl\:prose-xl tbody td{padding-top:.8888889em;padding-right:.6666667em;padding-bottom:.8888889em;padding-left:.6666667em}.xl\:prose-xl tbody td:first-child{padding-left:0}.xl\:prose-xl tbody td:last-child{padding-right:0}.xl\:prose-xl>:first-child{margin-top:0}.xl\:prose-xl>:last-child{margin-bottom:0}.xl\:prose-2xl{font-size:1.5rem;line-height:1.6666667}.xl\:prose-2xl p{margin-top:1.3333333em;margin-bottom:1.3333333em}.xl\:prose-2xl [class~=lead]{font-size:1.25em;line-height:1.4666667;margin-top:1.0666667em;margin-bottom:1.0666667em}.xl\:prose-2xl blockquote{margin-top:1.7777778em;margin-bottom:1.7777778em;padding-left:1.1111111em}.xl\:prose-2xl h1{font-size:2.6666667em;margin-top:0;margin-bottom:.875em;line-height:1}.xl\:prose-2xl h2{font-size:2em;margin-top:1.5em;margin-bottom:.8333333em;line-height:1.0833333}.xl\:prose-2xl h3{font-size:1.5em;margin-top:1.5555556em;margin-bottom:.6666667em;line-height:1.2222222}.xl\:prose-2xl h4{margin-top:1.6666667em;margin-bottom:.6666667em;line-height:1.5}.xl\:prose-2xl img{margin-top:2em;margin-bottom:2em}.xl\:prose-2xl video{margin-top:2em;margin-bottom:2em}.xl\:prose-2xl figure{margin-top:2em;margin-bottom:2em}.xl\:prose-2xl figure>*{margin-top:0;margin-bottom:0}.xl\:prose-2xl figure figcaption{font-size:.8333333em;line-height:1.6;margin-top:1em}.xl\:prose-2xl code{font-size:.8333333em}.xl\:prose-2xl h2 code{font-size:.875em}.xl\:prose-2xl h3 code{font-size:.8888889em}.xl\:prose-2xl pre{font-size:.8333333em;line-height:1.8;margin-top:2em;margin-bottom:2em;border-radius:.5rem;padding-top:1.2em;padding-right:1.6em;padding-bottom:1.2em;padding-left:1.6em}.xl\:prose-2xl ol{margin-top:1.3333333em;margin-bottom:1.3333333em}.xl\:prose-2xl ul{margin-top:1.3333333em;margin-bottom:1.3333333em}.xl\:prose-2xl li{margin-top:.5em;margin-bottom:.5em}.xl\:prose-2xl ol>li{padding-left:1.6666667em}.xl\:prose-2xl ol>li:before{left:0}.xl\:prose-2xl ul>li{padding-left:1.6666667em}.xl\:prose-2xl ul>li::before{width:.3333333em;height:.3333333em;top:calc(.8333333em - .1666667em);left:.25em}.xl\:prose-2xl>ul>li p{margin-top:.8333333em;margin-bottom:.8333333em}.xl\:prose-2xl>ul>li>:first-child{margin-top:1.3333333em}.xl\:prose-2xl>ul>li>:last-child{margin-bottom:1.3333333em}.xl\:prose-2xl>ol>li>:first-child{margin-top:1.3333333em}.xl\:prose-2xl>ol>li>:last-child{margin-bottom:1.3333333em}.xl\:prose-2xl ol ol,.xl\:prose-2xl ol ul,.xl\:prose-2xl ul ol,.xl\:prose-2xl ul ul{margin-top:.6666667em;margin-bottom:.6666667em}.xl\:prose-2xl hr{margin-top:3em;margin-bottom:3em}.xl\:prose-2xl hr+*{margin-top:0}.xl\:prose-2xl h2+*{margin-top:0}.xl\:prose-2xl h3+*{margin-top:0}.xl\:prose-2xl h4+*{margin-top:0}.xl\:prose-2xl table{font-size:.8333333em;line-height:1.4}.xl\:prose-2xl thead th{padding-right:.6em;padding-bottom:.8em;padding-left:.6em}.xl\:prose-2xl thead th:first-child{padding-left:0}.xl\:prose-2xl thead th:last-child{padding-right:0}.xl\:prose-2xl tbody td{padding-top:.8em;padding-right:.6em;padding-bottom:.8em;padding-left:.6em}.xl\:prose-2xl tbody td:first-child{padding-left:0}.xl\:prose-2xl tbody td:last-child{padding-right:0}.xl\:prose-2xl>:first-child{margin-top:0}.xl\:prose-2xl>:last-child{margin-bottom:0}.xl\:space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(6rem * var(--space-y-reverse))}.xl\:max-w-6xl{max-width:72rem}} \ No newline at end of file diff --git a/webviews/1.0.0/i/code.jpg b/webviews/1.0.0/i/code.jpg new file mode 100644 index 0000000000000000000000000000000000000000..20dc40a9a152dbe60bc1c8259471064881e0b259 GIT binary patch literal 15049 zcmc(G2OyR0`|v}Q$jqMED@2H7WQLH#Av-JCTV%csWIO1TnZ3y-BxEOv>>WZVWUucz z$7t}rzkdJ!`+eViU+227bwAJjT=%%H<2-hIc1Hj_IcZsG00jjAP{0c8_5%_C=BZPs zPo2a(jd2}_yIVMK>bM$m99D)~E*!bD$=y@c0_=SYU#Kf2` zNXtu!$O(#y2_r6of`x^Ji;YW#hesvMO3y0%Uzgn)03QS8HLB4G6np>`ALRr-%I+J0 z0vzNC6tDn?joL%> z(rWB35d5)m@1atIsz^R6* zCKn!Ji>zjlXV;iE04MygU=~X~KV(R-32U^Rizh$<;q3PkmO}*qpi{|hcpdWBu0s#$ zV~A2yCd?nkM+{JC1%DpG?|RhU=TH6hzZT>sff{y`$-eK-g_W8BibNZwn=4hta{xF& z56}4Awqmtji0q3}=XR-mqTUP1000L`2bqbh$*XVR(W2{oes%HAJqG|49w%bAWVXBn z8l8FP;V(j?){VW_!`7t1wQTA6e(%%%(k@?;f<`c6HOg*Vhyj4=T;|PUd$AK2bKH)u z8UV{1b}PGo#p=r(a6QXIZ(8J1Tl?Y&0MKx(2)V=I?d6m20T0XNGNXGu`#1QhL3>#D zPmVxb`=55x*(Yz08PVbOu^7i2Ac0DzOk1vp;6^#Xv9=rocpFY1dkj^}8d;T`Xtfh)%j z2(cc9s_Z2^ol#;tMi$Q8nx7;=zQbFvba|Itv#lRLkXq_aU zBZ(gf`NVaVh#eGfk~}Sj)SxjbUH3v#hX_}(@%15dlt3K%#krj&xf!62&1AxA&BL=} z?fcJ$Yz}d;?z&$piodU`-B-;1XxD!(Tj3dhhM!!^<5Ke{kZl9U31c z(2`-kN2P}n^n$D0B&o90UI40KZBz3tfVQKe9DKBsUWX-$73vy)<|xB0}Tb=B2wU zUWB&aRz0|?!L5(77-!z@nX4oQkoFzt8gSPS zv&yq!e@&w(#pwksy8m`+pa@#D3dI<|dJX_MlnE{lFKwnnkk?1Sxho^=_3N$BVT(rR zdvAhMh%9KtSCilBdI5kGv}j+n-yo;FLJJ1!kR{z%xK;5kXoN;=GQThTg9c^lpNwe0 z^oauxKskYiih_0mKtbP2qQLA41)Y$HfEfQQ3Ga=Qc(=q(ouj?LO~(UfR2ZNM3I?!q zIXv5ZESgBpC3nH83Jy`PySr@d`j4ehNAdIo+Cdo~D-$Q%m+q_=y7h@z((ngI$+Uuk zg?09j3}`(=8Ff*nD^jv=BFfQ3m`u5O=RBRn7V&o3lOD|v++*X*1pXHu@;*BP`z znS_wZX72m|i$n^Rad_I+BhHY|#r=eqt>K2oq`lJo%7F*O<9t@e9n(j`#ZMEh5Z3j3 z-3W%09%Jf=w0b{Tiq_N?ye1x=JGOuMh0r9mixpE7tycU=>TBg@kTPgOQvM*lpeA;4 z33Qay`sq(Kh^M&1Uc%f~TlvAc>X2KF7mP@G&>62mAt{M3m)X_6f$SNwlV={Byt=1n zm-|qZ>`^l?Mji&`lq`l)y-6y0)vpRshc*3NFH4x4+~>%RheKzKUmR2=7u=@tfz#Jh zc(l~CPX1ESN+91OvT5`QMC1ofSvpuI=YIF@nsB4XUqaS}J1S;l#XXLFYT2XLE+mmc z&ak4Js&*A-7>E?M%hrVG?+Z^7-Y?8%AFHx7Uw345Q}_l` z!D;+%vUga!0B5%*1nSldF((@CBnuC0V(-hh)ZovGQd7ue`WR-`RAht@FkerKWtAi= z43uJY{Z(_s^v?vc`T5bwraM|^I3=R-%I#a@<<$?)oVCWU8A8$TCz`q`AnaQ@MW?kh z+94WNq0!kGd3IO2UcMneQV9~egiSRyEh#w7)zyt=W@B{1GV>js6myy!^UZq`vwP1+ z84Dyk^n6wbIu7a1YDUuD*)m^H_`)gjwL}@$DuH@XQuw8>t0UgZ4DDQ}M1Pvk--=IF zb)-16zjsM~vDjz7Wp3|lrl49z@J#hC0gN|UCfm)T^;rS`?YF&A7jJ_k6C_D3))H>Q zQKZA#XXX?clagwhjv(Od9dP2Q-aC~-rkZQ3d{nJ6_R0gDcYh|NhSui#??Z2GC2wL` z@hRDMxds&sIL3a;TBR~6{UY3;F@L%3Z-hcSiC0o0q@!&WOOtcA?&K}%jtH42T5@W_n9#Jr+WQJOn>1T46`dHi4=zStBngh$yQG8T0Wq>7F;tR=xEM1&D z=gV~?UoQP+nVm}LBl50$aYk+}XD9nB{~&S1IIj`1%4uqc6eTp+`uf|E>(-Oyd0Xg5 zk={Naj8{}3^L$z~zIq&4J$(W5i(S?nw~=V2%R~9HaQ)Wif=H|1OZb%+B}`Dvgk8YD zXzL~H6?;{^M99-NdzEhf0pmNV3pQjDAJ}|o9#G*AK;$4rxqkP|h52G5+Z0Sv3OY2V zv$EMD*D_R~Y>ySsB%V}$z)~H4tC?MiXhD-vZWmaZF1=?(9p#fUdO%d=7j=b4=Fzbz={5@OxiBM8~wpvww0NeCQ=Z;f8!%gU&?~1 zx^(?8r9p#7*M^14c91^#*3q-5hD%Z&n(JV5u>9{esJABs` zCc%~MXq8iTymJ0q!TlgifvmCI()|a{w8q`p+6D3_Y9p_BaNpc`s2sO9D6Ba{tC&oT z3;`9NP0x{MwX7a-{TDVqm9^q%>)IC4>gDoX>0DB2^;FF^1@GBquhDA4w^PyO!xo)k zm)@Mp7Hhsr3`Tn>D;NMF6)5J=-AxCzX&g{>Sl9>NB3Ew=S)`d?e`l;A`@FRD`dk*HSg)t{TI8eyGxBL&} zI!7o!djy&F&J-@~W6A*!S1kQE3o@ef?(Pq?CvuSo~n888l%c;B`pfeh@1!K1vV-!<-p97BBz;N%KkzG zU-*PM_USywvRdGmW7J1GL{8Jc7&4~pURK-B>#V}PSqcT?NZSHT>MwpGTL@UIcQX{> zMhLWxX?HNJ23d<)l8!ex(nB`3)i9f7BZ<{iJsjGd5!tR+*SDi1s|SV@mNZWo+^hO% z_v@0@>PbrdJJ;U& zkY<|&`q$TeGFZrS?y0cQ<>#UxK?p{taYQwtPX4nk?Eb2XyMU9>cF)&U!>Ylc|9f=I zddvqmsTWm?@fRNBe$(oj)Y3P<_U0}FTcNf3xsQ!}cGyOLnL>zE(|xTPl^D#%$;(dW zT+IyGC$d5W`ucQk6w{W|UJ3n4%7F=<*gJ>k@?tx+pF|XCeLZ(xfQ2DJY~mu}ONrPH z+Ydhc+<^gxhNM09hXhmOb)WSV!j-6CNkN1)#a=gg4;TaMo9!sh9Uv{1Py{f2bS zl0Cs*f_V~Qp{W+Jp!cFgz&q)qd?;&#j4dn2*Z7yL?0f0s0gj<9DyZh~e&3Rj`0P5_ zemy%R@xkR1stRjBI6LcuU+R6W$4+ux!7u!27>7<2S1Ewm?n92|HEH&GWUYCh#O~MQ zLkDG7<2xHD`AJ!z^Br=KVMG%teu|V2aIX5Cs}0d_yf6%=cHxfD+o=62s% z?h|$j)=3zdp@gvbQ`OLMq?x*6c-PRr@U<`?F+Jb(GP_HK^$}ADQ){K0R^(%ZY|&L1M3 zEIh|Hfwqr71=Q#L?=I?bd=@eJtqL-BtJE3lg$zVmvM3q9qkm6R2q5&nM{nU-!XZOYlR{U<6_D?Rd1@5cI1zloM`^(ea4cj-EYt zL0sS9ul?`+r$vEn%BY<;x}wsq8nYfGg*sWj!fzi8G#-Om`gGNd`xKk#aP7~n^87$w z-nCv@cJ23WAetbCKUiK?YL7mJ^4f-S4*_4TB`fi^-BrE|;GFOp5x_yoT+8;b1A89<0FiLY{r>~;U04vKRRQ65SJ5mdbih0Q~sm7N?)7dx5}ii4hnNdLtRM3 z&OD{dDJrBpzR&;AD9jlYLh{R;OE-9P?X1n2R`T}|5jjJ+eFq-cK_`ya!6!7kwakWZ0OErZLDJx76{)|phgxYx;L0qJm!}pQ6X|8Ic zAmbA2m4vY7UlCE{y1TR-`=iYKBrRK0u9FGFkrtVh5r(iVJ7|zxUXz+2TLVLQ)ZN8( zoB{c!2z^)<57b-kMUxuYl@DrF1Cb9Czj!`VBV(&&ylIqq=7)YOw__LZNaUnpAL?c+ zsfjAVeW?9RQA&_-TqTr*WW|UQww@5~2VuRIOskQr+H7YUo&*V%lVT-If`nvsf85Sm z5k-zA9lP-m%(O+a&jv8ks1D|+d5`Y_)O(!0j#u@5RZ}@peAzFcUq;hBCP<@q6!%6n^b~mIord=&p$XWWKA_GVy8axqQ^9UKd-|^Z8>4ncsp9p=&aE ze{R6YB6>3^V&Qw~piPMZu^C71rBNezrt!^@OiCid`&l;7Ak4gKH37B;bcBf5bc2@{ zwhT`CG0Ok3h#Fx=%b{p*(z{P*;Fy*sO;?|d2g0pdnrxz-}h!knF-lM}zVxAlutZ1d1^n7rwENJcLCFHAKSK5{{>+rhPcNxbnIq64dLWK(r|0l^hE81Yu|+Yx0Jcs zQ4*%T(_#ExxQQ~C8ay;P&D4xs)B8#MAwfdM#S~c}{UrNNLsMx(3)B6)=UI2y$uaBi zmyw*V>#dh-70o~d5p1a{-d+fWU&w%}_gE6oJ)R_1MUpXy)A~kahERJ(VkP-;4Yoi% z8>jB1da`&C)7sj2V%=TWls4aKm%Mp58Tr;=`?1Tq7OrvlAC?RU)`H+M)SqLR!ksHy z+4W|kwbgckjH-}~9|sV4o-=*S5|?e}@CXR(#xgqJsikXOtrPMDLmrLsK0)>ATMu7| z-#jaBStSWiPswh%9a+K=X*N)7nrYVyvL|aU!&Z{)x=_APtHNx7jugUidDM^hMEWm9sXt(uvCb%Zo2xb$s;h z&0gN@*6$uF$9c8f>hE)}6BK@PsU$xA^G-Jk#gt`qhW4`2ZC@%Lr zNxe5KuTts6m_Afa(D_y8vDw|6H~(m`@F5*XK+vF#W~rQ$`0-#f2N(0`?YImh+RlfU zLwq23GvZX&B+@Y)X>pQhJLOn6`X`0>rW%!_R(UtWS@c&~Zq&}-i1!(Ym%uF(_olIX zbVg(XlhnPL@WQ{WuEvlWl%|GnhAF30@~zyCl7CFD!^vRkP#T*2VN4qSU$8n&%=}s5 z&~Wu$&v$)lWr8K7C7-P^7PLC=5BPF49*2UlJmNN_SC-F}&|%sADWcsH<&W8c&za<{ ziBK~;G-sa4cySzRsH>gqS+kmd2Gx&HBl}atDJZMK?#|I9x+B|Zx-nSQ9t-ZP2TrZnQDVrHXV{#YxI5cpH@+)a^&KAAvy^=)%JDc&*#>7xC z?~}6G?$4_Y^I^tOq>L8aQ)DwBq)57{HdKbL5T3D-S`^zb>Hucee!=E!!dYpEWSJ=J zJB5Gnj_!m^Q3Q3Ds;h?bobeA5kz7~3wL;|HzZ&?pw7WyL)T+YrJP32Z*KWR>fY;vO zVbfJBU`>9L?b#j*(dKH(3?GT~FHqLSw=?EfIe@G6;O{A%O0&qcl@82a&nnzYx!S}P z31+bfcE2Ht+z1F)$67MJRy_7W{hJxbdP;Lh6NHRSg7KPB`k4q?SQ3w{Y>6jV$eJ@e z%=o4iTdl1ch2M(-sQ0H~_TpuLu>EYVxf{?F9Sa^cg} zO>!Jtuau@ui_GyN?fmt)PHT>D(7EG__{K>pB`~+2oqGITa)a)!o;9|-tzZ6_pEU>h zqn2R98)de$W+a@#f#MSld1>0ED|}dR>iT%QPd%NS+OGeNiMpLnkrexjU%MrAl={U*P9N8q&|410E*Xk_CT@`u#*j~2b>e;XKt|2Cp zZoqg_+L`_eek?{Cn#ui()np?9-~L%ZoDkFRfe$B8b2{3MYi!wiIY}3z0^fN*_}}M3 z`~S{@e@$QnU(y6$9ROb*IC%RKpAd!MEC9YiaDzzfmJQwouXD&h9-yM2paL8Bj9{`1 zPoKeLnV8>t?Y)?A>KQ{=f-K_0-0~JcGrI-8{zG>QK=Z@}_1FZm?F=y4#VD|!PzoqT zs;{I09;cZlVX{kFMzFirUjx!!01A!79C$?(Zt@_?n|TIx{>0}Gnlgb3)1qv1&91yo zyUErlev96M+Xqc~SpD0+E`+xIB0tjTH}rV512Im?>j->MFoH*J`XPID8Rm9fMZ>#_ z)1dDE*!YPC0?M4rso=3LpAR9i^6b2UB{+bhY|~hrhO~P=dmw5a9J<%#iHo4i#?-m{ z7>6JuO+N^nELqHNIS;~{ujBgOqz23_mN3~Er?m^Wsvn#@LwecGJ%>`jX0*1uck2oO z;MRS09d5JSrYIWp0;sOVbx>OXBIqSs^WCS`C%5sx5y-9)N+CyKVj=0+t#b^lJD08h zEWfukRL_Kb(2jED9&iXpVYsEK-j5~W01_J-W*>u7wnZQdVg{I-#cR-O_-FTBC+YUZ zLJjHS^2DMZ+Xl+x;ho6m%Ex;%k>cVE*}K$HEN`Md1VgTnc80KtNdT4a0=NY5F94{b zKHzP6Wf6;nxfygC!~C=N07fS$M02?TbnU2V7(WH2>)H9TLa8OyJ~)(AI$i(}9KQmZ z08ayDa1NKx-eS^@*5%*##O0u$R}f-7mDoA=Mj@sb>0Ja$a6ry?f}1MhdWeF8{~Uo< z5N|AVAa@PoZ*b@b+Xe+y`2@Z`9>gG?fc8e{*$doaHs^S*-twZ`-#sTpfi01G?f^s5 zhB^>!+hU00J*36*1JS)Pyhn8imXk#suhKZca13EbL(CoEId&4H$Wqa0F|=a`jyMgTY=!>s73D{+k6zuGIpAWn)Xj#Z-MDk7CR~eI5lI0Oz0^zSD zE|z&mA;R8}bog{GhitD9v(ao!SiX~D(=Q|=W1>e)YD;Iw`=ZTl4_)t9k5bnt^x*Le zMV3>(y%h9D7J;D!qcU$|(-!>d4DxPfsj(CJ)tNkayQU;r(WK1AD47;Pkf18}_$Ttl z@{+hYbXC)>QdYmaMb%;TvTKa+yV%c4_Nis(GZlCx{>nQjFD7NUVqad&%=_3gGwbMd zxtvNTD5pW)@TlNL(NbtayL&%rLk-?`n*=Vm&(qqs`jZ!yNL>Q1)Kly8Wzgadyw$Gf zG$i5ne_HpJd9qR;L;T9yV0M^hit&U;y{`J~v5h=62ZNCdCF~=aphj54vwg&3D5p2J z?|@xEW|3i}aKj`0yyx;ZQGnqNtb$rE*?B1L!7_3#NU(Judcx2!@Xm?-g?gkRBu-nq zu|Vd;Gi%(_k_R{Btk(%B|Ba;~Ca=oxm@uz7#+^TT_6O++5u_gt4eG@*;s_}gKiWK< z3vHk|fs%EYCk3|p57;Ki;W97o>{cq z{&ObmP57%g_vd>THIrc51rn(zh2Oe9UFDuP9B3#Dw*RkLn|s?E|Ga-_2>)sOfGgtr zg(Z4i9wa)enFIO&xtY!!vnu3B!;P1>X!bnuC_eKX{Qc2wwZGY@iMvzp?0N6iS-qye z*;~v;;y6OC5@EBiXfVuYocR(rlS^3`1Fa@5S-I6e+HCKNhn&5^{ z3u{}RTzX=F2xual>Ni{ZDM;W`tWt>rfox7X7~SJc8{XWUD}hX|f%cwZgNHCJx_99#^23cfhIENYy8BF_kGGRoH;Y*o+7__>q|2-|?SqX9pM z<;2$yNr<7TrXz#Te#FRKqeyJ8)ql}r!B2thU8`R{NL6kDM%4nRp$7fcVRr;IF%iX!+evr59Rfu4SDpB7Ol9M7-mLi1qKL@BcYv&nYO7Ovg z#o-LsJ_tBAXm+>G-6>u2q_9c$fvtPP@q>=tZosK2UC~6}HwN6K0n+sNzVps6yDC5b z9I+4Rp%N2IMCNb+mn=7gbtg?OK6^W9FBtvKByYS(7xp7;AI9&5U|ijZ!v_M1Y!AfC ztOs7k)dHuKAxuX_a?d7isN$|Xcvv5t+Ka**Q3%%_59K0X^@`vv6N~F^uk^U!Eh|E* zgFn3Y^IbtYVtCc-gc$hm1|z_!l9b2Hh&feol!M9c0=Tvd$V7>5ElJQN| zt;`J9ArS^;DXJ|;a0Wo{F~8_g;G1w+MR>kfX>^DyZExy)T;nyn3x65r72!Co+P1K! z@kN&_u}aKglk;YkP{jNkLT~r->;08>3PDh3L>>&@TnFKm?GxZ$;|60p$_c~|Y$w6p zgtP~LZc~P!;p>NjvAum1kNZ~M*>hr7Z+Km_siq6r-*;eq-vuV#!m6;b>{WbvI!9Od z1l$7^X$%jU$NIYfqmVlmp^+w6<#FJ(hkjU8f<7l?U zj;|jV5npB0xmL$RpnH-5#dWXp{GO%4mJw=QGHd!xIu7j!k|eB#I%G%kYr#rhjXxtW zk_}~&{M+V}Y~||C zu@NR$T55H)avv(pw`2QSNElGy^?1MGr_KAFk&zgR*v`Ed)9=b46Gq<@I^MWw*8M8gbY(2`IYRh z939kD+de*?`lG`=&UaUiVGJr&w6bCRTbq8WCF}m2H7zglXU~^o{Y>Ot*Q#8--Eiu+ zLX(xFUWDbeKMUYg@U9r>@kE6Wq)c35EmLT=Qt^BM21wCKI{!Ka>)VYNb*>$N9Aj+8 z)H<$vgMN<_l@9`W!=Dy|QI?`=YRTG2)_>|KTy~3G1H;9R2j5uB4&n*vM5{Hd$2oQZ zp5gV$9VsVcWHpo?=GImxs`GsQX&30yTUu=Rl*%=bxuClXaJ8t9a*@2Z`cyhEv~}Yl z*YoMluTbkIJp0ZEu}PH6=RT*O622xlbF~eEb1%fcGe{uDwq(NIxQuD%8vMTQX=lcf zKX2@yqiKV_h{ORo85E-JvMJWpn_&j!8~^d6B=grSoCc$R*h%JpSd~d4`G2G)mv#ZS z_OzjloogNaWvM0hN>-DxgRR2lk*;@nSLRLU29RRAK#`Biiw2(D$N~S3v^-ww2wC|o zF@H)e6QvSvTAQ9%YEZKCxa=CX&@m7f6g$4J917N#4Hu6T`L0*_&Se*cWDJ-L?QyLDF1jg;$Ylja=7rYApo{WsV)rORXk% z!#{%XRIqX$6-c+(sjUvc>9il)F*g2fbH()1t6iW$7HjBI9(WjlXMuDoXCrtLfCmA+ n3fu@h2Ec1w<1^@tfsw#?l&lvt6!bE@W`(-|iJ_EXyy0YRk zKDT>?j<9FI@=!7L1^{qK{zE`OUct*}CI(nl6NIsiMTbib6upmn{mh~SgG|5*?yj!3 zZeW0dm+c3ztqp^pBiMmKSyfZVI0Byn0H7#RReWRMzkE^{;Q!7z z805%1zYO$3ngUvF%@V(w=Yg2V9Ofl&uLwAQB)P7p3OBOuhCb!zO5XnR9=}E21mVBr zx9kZAqN3yeuR)G3;Y=6m_4T!y+lSR!gI6LJB&G70V^IUl(SIEDNU@-1k;>sAJAC)y zC?9kS;sI4K-%Fwd;ObmPpjkkY!`uA zXQ)*>kTaXvBo^vqv#W*SfT_j23xtT5sGNLKVW{thKTZ&%19>@rQ2!Lo?lcmBd{S}k zQgk6q5$m6ICG{uZv@q83U5Y+X}676W*%!t_ped%`im&;wit& z?RXT_}e zI?vHRBPIZ0ST@v`U#(4;-W#wy?QdeZFY`pF%%lO5UDtO-RcF>CkY<)e0(IN+O)1Fy zY6nTWe_KjV%?v%Q-K{l?F2ojq^If9iztv?Q_PwD7*Nxo^yynV>wIfv;(Tr#lB@mu` zu{j?NRTQbmDDz7)!(duQ861MD5VCci|R^_g}BJGgezO97A&va1aQ=X~J<8}A? zVj6@xPl%`lG2I-e3K@&{o@(Jlbw4}6QPM?&MW!8=61!lYzh-59JVKlVg>vvzxrd%S znqjbc^?PC%9UUKMvbUVxyJWHD%OSOM0@DdL&W>rWZ-b2m>_(ftmAF+zA<YV1}ZRYVW3A+$&`RPWwz}mQ=v%JGXCxr2o>bz-t1hu^7rp zwO!XQ14u4tE$6^58HseOfF~`}v z8fy2C8?p26C(5!}da~$$zs267&JA7+4HK)%2m~REeptH`Cxd>Fq7LI?NwAsk1{21u z{jGx_|K*#(*X!^85$wsfJCBHg&>N$yiJnA*M2nHL3fV{=x@2PP>zSqbVZ^rkF|n#) zI@qU$zs^fwN+rj`;flB;-|e5b+9t30HE+Z^ zQ|cS^sL(uZdg#eVc<--;pjdzI$T1n%%UDyAi!ea3gmO50%UKm!S`ZA(@MHHCyf!Eu z$3MYN;CUYr^@a2NCuDZw6%u1=Wp$);WYF>JkA&Aae2rVO2a#Be{<{kkAKlD%#g%@o zPOWfr^L7VYT;g!>7OKycW(pSuC&#W!i&aZZ39DLYQW?;m(aOMn_KgR>TTDAl1BG@e^GHpVy)vJj9d~yRw;7m`jWKT@l2QiUr zCi)j`T{JJ#;68xsJloVUp&tMet02eQZ&tn!A+)zh1{u>QaFhbk(z#@Ktp*9h#u>;k zy*(wp;RRXNVVI6oo4#1 zW>EATg&WT^9p#-QC)y;|z~b*En|JWD z+~Jjo?7GnAYvQzW?BNkaDxk2PuE%6@ZVDRoX~n!klJbx$JgQe_77EAKPxnNR3XxFy zZSr@yv`i0e9GA3F&7=eX)6j-js3O;3AN>LSx9U^AEuLUeoS3x6`*u3HcJz{oh0It# zy~v4$m+qI{K z-ErBWZBYj*;ror~sZA*()y^|&!=x3efZ`-IOMHZI?b&5RN#JYmS8?fPYq%i5wN%b6UQc*84yW=u^T&@|;bi&ekrTpgcN61iP2Pjed+TXrXRz?a;IDw& ze>pt;r#cc?x!~th7*C+;c(f^4PHZ-j*vPGF(mCBId_)BTuKn~nz^gecW1ixC3_o{M;)lSO_^?P~y=t|v z68Gtcyfbc_ex6&+@gHQw7PABRFF7#-c2Za3ik92=gY^EKK&Zk)-S-AdrMcn;M@8%X z4+CqnRU>U)y`cHybEuYv;wJzM6U)mQ@wYI4G01Hef|F^;CD?s5!4ulj*`2!ER$w*2 z(qiX$;U00n-F3bZo~$S(+P-OIk~DdkO&D4G`(1+io{rIbkgn<=tHppgecr6n-1*_o zBCvES1@=|vorLkiHh=zCahxkuIkt34Wmw{LV?f3jtnZN9Ds9RpfwfphY<~agV&K+q zoq_b6Dm&nVBEeWCe*NFf;*Up9Pjma-gBm@~9brn_4Pwe7zuej`h4fDv454?!dzwD` zbjV2C>u-FkjRgKKNOVhOrBaU>U|>jL9<}zcd$H_21reafaqKU7d|~<~O1rd>l@Pix z52#z~YqGLQ_h{1q{v%-0(7 z&sOs|j;j{B+AkDKJXEGG9L#ja=_h{uI#0bmxkF{-=y!UPS9kiSl~1D6suQt_Grx;ZAs4 zgM;#WCo0MXE7VI@Dr|&sgNCT(6qb>&7`+p!AYvmotNyqeeKXLXFG@FYHO4L?csVbdR3yyXUmi1Wd(2OO3O|#d$G2r8qra)|U8&IfpS` z)=i_QV)tBRmUv(m0e4$T)pyJIL?Y!ITK>r|XF;Y<~g<>{K2l7D)8>6hT3x^czM}P8IAHGCE22z4j_XhGKB-0Q(>tCwhGM5V{NL5@^lQX%A<|mtRXW2(&#}H;~ zik5dAA_WZ%pUx?|?*{V5KgtSH!B{`?J|U z+UmZ}yS%dUiKqx&Jm3QQ1qOQ$w;D_kDI;Q7^^Po1P*9jJDx$Ntsl*Bl417sN)!658 zYF&!P&yOe2xRl9{Y1zXN4vYezS1ID)s(`rFH%YF)dqMe2KYT8Y^pCh{FT*s+x#pbRKkS+pR|HQ9!t6d|3}y|M z;`!+{mfTb~yN`>PMfV*AaOp-zstQbPxt4P+YU;W%W`Z&?V{b=gmpyT{VR0jU_cX^; zq1&9Jc_2ew*2=(q6-Q3;iR#_jZajNmnM)~e)rvIXYY~!GKz-ST<1mMZ%%aoo>%2R8! zIu&#wr~Ygb&q}8LN1V6ICxT}PD8C`OqH)|Sroy(x{Vq(ht%%s_Gq8GoO+INx!8a86 z&4-?uGI{gN0my0UHOfBB_lmikt?Fw>qKiGSDZ7@ju0CT}PImVjmq+H9-R6Vj@Q4pF z4j#YX(%Xwf`%RAkll$}T9+z*=3$PO7Za6#ltxu_~=cZp3$f$9X4j8`etp$xX*zNMW z4@%UUCLJ;Z0qE9@Z##L=m{Eg+m)^PTZO%rB?d&T0F+(o3NO3?M1#~90z=aI z9^4xI)7oLeDj$k4v|$+bMlxilUcbqy*HV%lnA9wW6J==_R`SM5r(@8V-=tNs(8cA` znBl|!3@X?A(8-3|-=L7YekWnvI4H6p!NHqc367jc{hQNeBk~&d;UYS?tC>C^-+?23 zHB~ujbZlyskN7~Uzo6WC*oT6-JoeUw#8r8%wA7ci+%S=|&Qwc$gLOe)K2(@PITm)%b-(B(wBwJ zXag1^&6KKvrgE{V%D$Cb3q1u{uIzz+P(*YS$L3HY)+0%>OX_hSULMyL3J)1Qc z%VPzZ2A~;eu@A53yc2}rO*y19tnBobC9UZSb&m!9{wc^UQ__qH1r9cDUrDLc zDtX;_f|zkvY))X6>Q5tTwnQ>c5oi_)TFY-54RWr8rN}HjER4E>d1mQplAad<)f z`OVHM78q=GGGDVe=h8Y!_M4K95l9B}`fViHW{UrlO~_M3i$g|n ztQPd;ZJN=#=`t$qPu~f)g;O~-@#TPm$Kk=CCyMco*y$tIo$pdCr3zmlFK>QH?QwS$ zZQYAFR7*4lCZ;0KbJH6zQP+53rhe2@Iw^1538L2MqDyt&nJOfWM&-rNcp@3*xiOl^ zdHOeb<@F86X#y|PtV_xbtTx}+@tG<}5m$7a6E;i&p2eKpA4u>!ujpq+G0`w_uV7^+3`2)@^>v9VliGq*n>+AA3KyY#y>wyt4KbOz zk@W;ZLBLFfHC-`Mrd^9prjopZ3`mR+*X+^+6CecwNE2eP26?rZ+4ZpSztO`tIw}ZE z&I~K6`b=zUI!$uPl6HA@;2Y4lyt;^3drLX37P{R4-a15+i%z)f#@FwafFeEHAcEdM&#&9 zA{^5^ID8AjCk@*}$?G9k2UG714Pyj;>QmS?nex8x6gSY + + + + + + + Codestin Search App + + + + + +
+
+
+
+ +
+ +
+
+

+ Manage your +
+ + PHP + class + properties + +

+
+
+ +
+
+
+ + + +
+
+

+ The first stable release is finally here! +

+
+

+ It's been a long road, but I'm super excited to finally have a stable version +

+
+
+ +
+
+
+
+
+
+
+ + +
+

+ What's New in v1.0.0 +

+

+ This release is a rewrite of the extension to use a PHP parser and reduce the usage of RegExp, + but does include some exciting changes too. +

+
+ +
+
+

+ New code +

+

+ Over time, working on new features was giving me a hard time. +
+ Using RegExp was okay at the beginning, but adding more complex behaviors was introducing more + and more edge cases. +

+ +
    +
  • +
    +
    +
    + + + + +
    +
    +
    +
    PHP parser +
    +

    + Rewritten from scratch to use a PHP parser instead of RegExp +

    +
    +
    +
  • +
  • +
    +
    +
    + + + +
    +
    +
    +
    Typed JavaScript
    +

    + Less bugs, faster development +

    +
    +
    +
  • +
+
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+

+ New features +

+

+ With the confidence that the PHP parser gives me, I was able to implement all the new + features that I had been thinking about for a long time. +

+ +
    +
  • +
    +
    +
    + + + + +
    +
    +
    +
    Remove properties
    +

    + Delete the properties you no longer use +

    +
    +
    +
  • +
  • +
    +
    +
    + + + + +
    +
    +
    +
    Edit properties
    +
    +
      +
    • Rename
    • +
    • Change type
    • +
    +
    +
    +
    +
  • +
  • +
    +
    +
    + + + +
    +
    +
    +
    Multiline contructor + command
    +

    + Break contructors into multiple lines using the command palette +

    +
    +
    +
  • +
+
+ +
+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+

+ Support my work +

+

+ Do you find my extension useful? +

+

+ This extension is free and open source, available to all, and will always stay that way. +
+ If you'd like to help support me, thank you! +

+
+
+
+
+
+
+
+
+
+
+
+
+

+ Buy me a tea +

+ +
+ +
+
+
+
+
+
+
+
+
+ + Preferred + +
+
+
+
+

+ Sponsor via Github +

+

+ From + $ + 6 + /month +

+ +
+
+
+
+
+
+
+
+

+ Buy the world a tree +

+ +
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+

+ Corporate Sponsorship +

+

+ You are a company (or an individual on behalf of a company/team) that benefits + from this extension and would like to support me. +

+
+
+

+ What's included +

+
+
+
    +
  • +
    + + + +
    +

    + Your name, company name or logo and a link on this page or github + readme +

    +
  • +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ Interested in sponsoring, or partnering and have a different proposal? + + partnership@gustavoreal.com + +
+
+
+
+
+
+
+
+ +
+
+

+ Please consider help me reach out to wider audiences +

+ +
+
+
+
+ + + From db7cd1e56ad1796b4dd90e4563e55b7d8f1341cb Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 29 Aug 2020 08:39:07 +0200 Subject: [PATCH 31/41] Add a debug mode --- out/constants.js | 1 + out/constants.js.map | 2 +- out/extension.js | 8 ++++++-- out/extension.js.map | 2 +- out/utils.js | 5 +++++ out/utils.js.map | 2 +- src/constants.ts | 1 + src/extension.ts | 10 +++++++--- src/utils.ts | 5 +++++ 9 files changed, 28 insertions(+), 8 deletions(-) diff --git a/out/constants.js b/out/constants.js index 41b8268..413a0c9 100644 --- a/out/constants.js +++ b/out/constants.js @@ -2,6 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.extensionId = 'php-add-property'; exports.extensionQualifiedId = `kotfire.${exports.extensionId}`; +exports.debugEnvName = 'PHP_ADD_PROPERTY_DEBUG_MODE'; var GlobalState; (function (GlobalState) { GlobalState["version"] = "phpAddPropertyVersion"; diff --git a/out/constants.js.map b/out/constants.js.map index 0ed30d3..ad7e4f4 100644 --- a/out/constants.js.map +++ b/out/constants.js.map @@ -1 +1 @@ -{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;AAAa,QAAA,WAAW,GAAG,kBAAkB,CAAC;AACjC,QAAA,oBAAoB,GAAG,WAAW,mBAAW,EAAE,CAAC;AAE7D,IAAY,WAEX;AAFD,WAAY,WAAW;IACtB,gDAAiC,CAAA;AAClC,CAAC,EAFW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAEtB"} \ No newline at end of file +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;AAAa,QAAA,WAAW,GAAG,kBAAkB,CAAC;AACjC,QAAA,oBAAoB,GAAG,WAAW,mBAAW,EAAE,CAAC;AAChD,QAAA,YAAY,GAAG,6BAA6B,CAAC;AAE1D,IAAY,WAEX;AAFD,WAAY,WAAW;IACtB,gDAAiC,CAAA;AAClC,CAAC,EAFW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAEtB"} \ No newline at end of file diff --git a/out/extension.js b/out/extension.js index cdcca08..1b17a7d 100644 --- a/out/extension.js +++ b/out/extension.js @@ -26,7 +26,7 @@ function activate(context) { const previousVersion = context.globalState.get(constants_1.GlobalState.version); const versionAsInt = parseInt(version.replace(/\./g, '')); const previousVersionAsInt = previousVersion ? parseInt(previousVersion.replace(/\./g, '')) : 0; - if (previousVersionAsInt < versionAsInt) { + if (utils_1.isDebugMode() || previousVersionAsInt < versionAsInt) { try { const extensionRoot = context.asAbsolutePath(`webviews/${version}`); const filename = `${extensionRoot}/index.html`; @@ -41,7 +41,11 @@ function activate(context) { panel.iconPath = vscode.Uri.file(context.asAbsolutePath('images/icon.png')); panel.webview.html = html; } - catch (error) { } + catch (error) { + if (utils_1.isDebugMode()) { + console.error(error); + } + } } context.globalState.update(constants_1.GlobalState.version, version); context.subscriptions.push(vscode.commands.registerCommand('phpAddProperty.add', () => __awaiter(this, void 0, void 0, function* () { diff --git a/out/extension.js.map b/out/extension.js.map index 6f7d628..402071b 100644 --- a/out/extension.js.map +++ b/out/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/utils.js b/out/utils.js index df6d91f..27470f3 100644 --- a/out/utils.js +++ b/out/utils.js @@ -1,6 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const vscode = require("vscode"); +const constants_1 = require("./constants"); function getVisibilityChoice(defaultValue) { let visibilityChoices = ['public', 'protected', 'private']; if (visibilityChoices.indexOf(defaultValue) !== -1) { @@ -146,4 +147,8 @@ function replaceWithSnippet(snippet, range) { }); } exports.replaceWithSnippet = replaceWithSnippet; +function isDebugMode() { + return process.env[constants_1.debugEnvName] === "true"; +} +exports.isDebugMode = isDebugMode; //# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/out/utils.js.map b/out/utils.js.map index 7157513..7e8196b 100644 --- a/out/utils.js.map +++ b/out/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;AAAA,iCAAiC;AAEjC,2CAA2C;AAE3C,SAAgB,mBAAmB,CAAC,YAAoB;IACpD,IAAI,iBAAiB,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC3D,IAAI,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE;QAChD,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;KACxE;IACD,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACjE,CAAC;AAND,kDAMC;AAED,SAAS,uBAAuB,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,kDAAkD,CAAC;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/B,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,2BAA2B,CAAC,IAAY,EAAE,kBAA0B,EAAE,cAAsB;IACjG,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/F,MAAM,wBAAwB,GAAG,kBAAkB;UAC7C,KAAK;UACL,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;UAC7B,UAAU,CAAC,KAAK,CAAC,CAAC;IAExB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,6BAA6B,CAAC,IAAY;IACtD,IAAI,MAAM,CAAC,uEAAuE,CAAC,KAAK,IAAI,EAAE;QAC1F,OAAO,IAAI,CAAC;KACf;IAED,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAE5C,IAAI,CAAC,KAAK,EAAE;QACR,OAAO,IAAI,CAAC;KACf;IAED,MAAM,mBAAmB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,MAAM,CAAC,6EAA6E,CAAW,CAAC;IAEtH,IAAI,mBAAmB,CAAC,MAAM,IAAI,aAAa,EAAE;QAC7C,OAAO,IAAI,CAAC;KACf;IAED,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnH,CAAC;AAnBD,sEAmBC;AAED,SAAgB,kCAAkC,CAAC,IAAY;IAC3D,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAE5C,IAAI,CAAC,KAAK,EAAE;QACR,OAAO,IAAI,CAAC;KACf;IAED,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,2BAA2B,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7F,CAAC;AARD,gFAQC;AAED,SAAgB,2BAA2B,CACvC,QAAgB,EAChB,QAA6B,EAC7B,SAAoB,EACpB,cAA+B;;IAE/B,MAAM,UAAU,GAAG,+BAA+B,CAAC;IAEnD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE7C,IAAI,UAAU,EAAE;QACZ,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;KACxB;SAAM;QACH,MAAM,OAAO,GAAI,SAAS,CAAC,SAAS,CAAC,aAAa,QAAQ,IAAI,CAAS,CAAC;QAExE,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAE1G,IAAI,aAAA,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,0CAAE,IAAI,CAAC,CAAC,2CAAG,IAAI,MAAK,mBAAmB,EAAE;YAC5D,MAAM,UAAU,GAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAoB,CAAC;YAErE,MAAM,WAAW,SAAG,UAAU,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,WAAC,OAAA,OAAA,WAAW,CAAC,IAAI,0CAAE,IAAI,MAAK,YAAY,CAAA,EAAA,CAAC,mCAAI,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/G,IAAI,YAAY,SAAG,WAAW,CAAC,IAAI,0CAAE,IAAI,CAAC;YAE1C,IAAI,YAAY,KAAK,MAAM,EAAE;gBACzB,MAAM,aAAa,GAAI,SAAS,CAAC,SAAS,CAAC,6CAA6C,QAAQ,MAAM,CAAS,CAAC;gBAEhH,IAAI,yBAAA,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,0CAAE,IAAI,CAAC,CAAC,2CAAG,IAAI,0CAAE,QAAQ,CAAC,CAAC,2CAAG,IAAI,MAAK,qBAAqB,EAAE;oBACvF,YAAY,SAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,0CAAE,IAAI,CAAC;iBAC5F;aACJ;YAED,OAAO,YAAY,CAAC;SACvB;aAAM,IAAI,aAAA,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,0CAAE,IAAI,CAAC,CAAC,2CAAG,IAAI,MAAK,QAAQ,EAAE;YACxD,MAAM,eAAe,GAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAmB,CAAC;YAEzE,MAAM,WAAW,SAAG,eAAe,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,WAAC,OAAA,OAAA,WAAW,CAAC,IAAI,0CAAE,IAAI,MAAK,YAAY,CAAA,EAAA,CAAC,mCAAI,eAAe,CAAC,CAAC,CAAC,CAAC;YACzH,aAAO,WAAW,CAAC,IAAI,0CAAE,IAAI,CAAC;SACjC;KACJ;AACL,CAAC;AAvCD,kEAuCC;AAED,SAAgB,yBAAyB,CAAC,KAAa;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACrE,CAAC;AAFD,8DAEC;AAED,SAAgB,wCAAwC,CAAC,QAAgB;IACrE,MAAM,OAAO,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAEtD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEzB,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACtB,KAAK,EAAE,CAAC;YACR,MAAM;SACT;QAED,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;KACxC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAhBD,4FAgBC;AAED,SAAgB,UAAU,CAAC,IAAY,EAAE,QAAgB,CAAC;IACtD;;;;OAIG;IACH,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,IAAI,mBAAmB,CAAC,qBAAqB,CAAC,EAAE;QAC5C,MAAM,OAAO,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QACtD,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC7B;IACD,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;AACpC,CAAC;AAZD,gCAYC;AAED,SAAgB,mBAAmB,CAAC,GAAW;;IAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CACnD,KAAK,CAAC,CAAC,CAAC,QACR,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,GAAG,CAC/C,CAAC;IAEF,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AAClE,CAAC;AARD,kDAQC;AAED,SAAgB,MAAM,CAAC,GAAW;IAC9B,OAAO,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACxD,CAAC;AAFD,wBAEC;AAED,SAAgB,eAAe,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;AACzD,CAAC;AAFD,0CAEC;AAED,SAAgB,gBAAgB,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC;AAFD,4CAEC;AAED,SAAgB,kBAAkB,CAAC,OAAe,EAAE,KAAmB;;IACnE,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;IAErD,MAAA,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,IAAI,CAChC,WAAW,CAAC,EAAE;QACV,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACxD,CAAC,EACD;QACI,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,KAAK;KACvB,EACH,IAAI,CAAC,GAAG,EAAE;QACR,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAE9C,IAAI,MAAM,EAAE;YACR,MAAM,CAAC,aAAa,CAChB,IAAI,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EACjC,KAAK,EACL;gBACI,cAAc,EAAE,KAAK;gBACrB,aAAa,EAAE,KAAK;aACvB,CACJ,CAAC;SACL;IACL,CAAC,EAAE;AACP,CAAC;AAzBD,gDAyBC;AAED,SAAgB,WAAW;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAY,CAAC,KAAK,MAAM,CAAC;AAChD,CAAC;AAFD,kCAEC"} \ No newline at end of file diff --git a/src/constants.ts b/src/constants.ts index f211901..81ad256 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,5 +1,6 @@ export const extensionId = 'php-add-property'; export const extensionQualifiedId = `kotfire.${extensionId}`; +export const debugEnvName = 'PHP_ADD_PROPERTY_DEBUG_MODE'; export enum GlobalState { version = 'phpAddPropertyVersion' diff --git a/src/extension.ts b/src/extension.ts index b3ed9b6..0b2d99b 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -4,7 +4,7 @@ import Locator from './locator'; import Property from './property'; import insertProperty from './insertProperty'; import { removeProperty } from './removeProperty'; -import { forceBreakConstructorIntoMultiline, getPropertyNameFromLineText } from './utils'; +import { forceBreakConstructorIntoMultiline, getPropertyNameFromLineText, isDebugMode } from './utils'; import { renameProperty } from './renameProperty'; import { changePropertyType } from './changePropertyType'; import { extensionQualifiedId, GlobalState } from './constants'; @@ -17,7 +17,7 @@ export async function activate(context: vscode.ExtensionContext) { const versionAsInt = parseInt((version as string).replace(/\./g, '')); const previousVersionAsInt = previousVersion ? parseInt((previousVersion as string).replace(/\./g, '')) : 0; - if (previousVersionAsInt < versionAsInt) { + if (isDebugMode() || previousVersionAsInt < versionAsInt) { try { const extensionRoot = context.asAbsolutePath(`webviews/${version}`); const filename = `${extensionRoot}/index.html`; @@ -42,7 +42,11 @@ export async function activate(context: vscode.ExtensionContext) { panel.iconPath = vscode.Uri.file(context.asAbsolutePath('images/icon.png')); panel.webview.html = html; - } catch (error) {} + } catch (error) { + if (isDebugMode()) { + console.error(error); + } + } } context.globalState.update(GlobalState.version, version); diff --git a/src/utils.ts b/src/utils.ts index 663a62c..ba7c6b9 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,5 +1,6 @@ import * as vscode from 'vscode'; import PhpEngine from 'php-parser'; +import { debugEnvName } from './constants'; export function getVisibilityChoice(defaultValue: string): string { let visibilityChoices = ['public', 'protected', 'private']; @@ -183,3 +184,7 @@ export function replaceWithSnippet(snippet: string, range: vscode.Range) { } }); } + +export function isDebugMode() { + return process.env[debugEnvName] === "true"; +} From 03b9518b9027aa6ca2ac22ab01992ca7bd843e0d Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 29 Aug 2020 08:48:21 +0200 Subject: [PATCH 32/41] Update readme and add funding --- FUNDING.yml | 3 +++ README.md | 26 +++++++++++++++++++++++--- images/add.gif | Bin 58544 -> 36736 bytes images/constructor.gif | Bin 46960 -> 30168 bytes images/customizable.gif | Bin 82357 -> 53046 bytes images/existing.gif | Bin 78055 -> 44848 bytes images/multiline.gif | Bin 58790 -> 37641 bytes images/remove.gif | Bin 0 -> 48724 bytes images/rename.gif | Bin 0 -> 156216 bytes images/type.gif | Bin 0 -> 187334 bytes 10 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 FUNDING.yml create mode 100644 images/remove.gif create mode 100644 images/rename.gif create mode 100644 images/type.gif diff --git a/FUNDING.yml b/FUNDING.yml new file mode 100644 index 0000000..707be5d --- /dev/null +++ b/FUNDING.yml @@ -0,0 +1,3 @@ +github: kotfire +ko_fi: kotfire +custom: ["https://plant.treeware.earth/kotfire/vscode-php-add-property"] diff --git a/README.md b/README.md index 2b73d5e..a31036d 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,17 @@ -[![Version](https://vsmarketplacebadge.apphb.com/version-short/kotfire.php-add-property.svg)](https://marketplace.visualstudio.com/items?itemName=kotfire.php-add-property) -[![Rating](https://vsmarketplacebadge.apphb.com/rating-short/kotfire.php-add-property.svg)](https://marketplace.visualstudio.com/items?itemName=kotfire.php-add-property) -[![Installs](https://vsmarketplacebadge.apphb.com/installs/kotfire.php-add-property.svg)](https://marketplace.visualstudio.com/items?itemName=kotfire.php-add-property) +[![Version](https://vsmarketplacebadge.apphb.com/version-short/kotfire.php-add-property.svg?style=for-the-badge)](https://marketplace.visualstudio.com/items?itemName=kotfire.php-add-property) +[![Rating](https://vsmarketplacebadge.apphb.com/rating-short/kotfire.php-add-property.svg?style=for-the-badge)](https://marketplace.visualstudio.com/items?itemName=kotfire.php-add-property) +[![Installs](https://vsmarketplacebadge.apphb.com/installs/kotfire.php-add-property.svg?style=for-the-badge)](https://marketplace.visualstudio.com/items?itemName=kotfire.php-add-property) # PHP Add Property Visual Code Studio extension to manage PHP class properties +## Support my work + +[![Github sponsors](https://img.shields.io/badge/Sponsor%20now-181717?style=for-the-badge&logo=github)](https://github.com/sponsors/kotfire) +[![Buy me a tea](https://img.shields.io/badge/Buy%20me%20a%20tea-555555?style=for-the-badge&logo=Ko-fi)](https://ko-fi.com/M4M71TVH1) +[![Buy the world a tree](https://img.shields.io/badge/Buy%20the%20world%20a%20tree-%F0%9F%8C%B3-242424?labelColor=276749&style=for-the-badge)](https://plant.treeware.earth/kotfire/vscode-php-add-property) + ## Features ### Add a property @@ -18,6 +24,18 @@ Visual Code Studio extension to manage PHP class properties ![Add existing properties demo](images/existing.gif) +### Remove a property + +![Remove a property demo](images/remove.gif) + +### Rename a property + +![Remove a property demo](images/rename.gif) + +### Change property type + +![Remove a property demo](images/type.gif) + ### Insert constructor Automatically insert a constructor if it does not exist. @@ -56,5 +74,7 @@ This extension contributes the following settings: * `phpAddProperty.contextMenuOptions.enable`: Specifies whether to show the context menu options * `phpAddProperty.contextMenuOptions.addProperty`: Specifies whether to show the add property command in the context menu options * `phpAddProperty.contextMenuOptions.appendProperty`: Specifies whether to show the append property command in the context menu options +* `phpAddProperty.contextMenuOptions.renameProperty`: Specifies whether to show the rename property command in the context menu options +* `phpAddProperty.contextMenuOptions.changePropertyType`: Specifies whether to show the change property type command in the context menu options * `phpAddProperty.contextMenuOptions.removeProperty`: Specifies whether to show the remove property command in the context menu options * `phpAddProperty.contextMenuOptions.breakConstructorIntoMultiline`: Specifies whether to show the break constructor into multiline command in the context menu options diff --git a/images/add.gif b/images/add.gif index 8e9a3ae93edfa5f14a8b3aa7677027d286a6a880..5199b5384a70e0823fd706f1784c8014203d5c2f 100644 GIT binary patch literal 36736 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 Jw|~DL`#TZi`_BLX literal 58544 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

B)i51GX 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 B*H8ce diff --git a/images/constructor.gif b/images/constructor.gif index 50ccde6643610c361d0fbb5d84968b21dcafaab4..610e0c717f23f1d01c4863c990d15000c2c4f82c 100644 GIT binary patch literal 30168 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 literal 82357 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 diff --git a/images/existing.gif b/images/existing.gif index 81466c823511834be402383d81ac03c5b19aa07f..4ae221a35bdef787eb88696a8c738cb6926b02eb 100644 GIT binary patch literal 44848 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 Y8btK|_Gpk!=szn`44(d9{f^}S042T3pa1{> literal 78055 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 HcboEG`x@&B diff --git a/images/multiline.gif b/images/multiline.gif index cb6add3bec5b7dc62b1a25d2cd79d12f8a9c8b46..62aebdea80d49da96dbe1553a8d76ec6eb026c5b 100644 GIT binary patch delta 35420 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 literal 58790 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 PA@E;*GXK)|dB?v2xKC&* diff --git a/images/remove.gif b/images/remove.gif new file mode 100644 index 0000000000000000000000000000000000000000..75f8460a7b52abe1189b77c6bddbf2bfb7cabc9b GIT binary patch literal 48724 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 literal 0 HcmV?d00001 diff --git a/images/rename.gif b/images/rename.gif new file mode 100644 index 0000000000000000000000000000000000000000..b47a124b38c553e0584daad44c0c4d1b0c86b609 GIT binary patch literal 156216 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

VbZ`sy`F(2ih;Bme$_j*h#rJ?f^ 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�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 G_SOKDA0zqz literal 0 HcmV?d00001 diff --git a/images/type.gif b/images/type.gif new file mode 100644 index 0000000000000000000000000000000000000000..930ad7f151af896512199d89950a7621acb0c315 GIT binary patch literal 187334 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 z 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 afB%;L!v+2ye(|rB|F1LuKg|o7_WuE$QqXDu literal 0 HcmV?d00001 From ab1d2eca47a740059d81d68b158d56e6f185e3df Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 30 Aug 2020 08:12:09 +0200 Subject: [PATCH 33/41] Allow to disable version update page --- README.md | 1 + out/extension.js | 3 ++- out/extension.js.map | 2 +- package.json | 5 +++++ src/extension.ts | 6 ++++-- 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a31036d..90103d6 100644 --- a/README.md +++ b/README.md @@ -78,3 +78,4 @@ This extension contributes the following settings: * `phpAddProperty.contextMenuOptions.changePropertyType`: Specifies whether to show the change property type command in the context menu options * `phpAddProperty.contextMenuOptions.removeProperty`: Specifies whether to show the remove property command in the context menu options * `phpAddProperty.contextMenuOptions.breakConstructorIntoMultiline`: Specifies whether to show the break constructor into multiline command in the context menu options +* `phpAddProperty.showVersionUpdates`: Specifies whether to show What's New after upgrading to a new version diff --git a/out/extension.js b/out/extension.js index 1b17a7d..010635f 100644 --- a/out/extension.js +++ b/out/extension.js @@ -26,7 +26,8 @@ function activate(context) { const previousVersion = context.globalState.get(constants_1.GlobalState.version); const versionAsInt = parseInt(version.replace(/\./g, '')); const previousVersionAsInt = previousVersion ? parseInt(previousVersion.replace(/\./g, '')) : 0; - if (utils_1.isDebugMode() || previousVersionAsInt < versionAsInt) { + const showUpdatesEnabled = utils_1.config('phpAddProperty.showVersionUpdates') === true; + if (utils_1.isDebugMode() || (showUpdatesEnabled && previousVersionAsInt < versionAsInt)) { try { const extensionRoot = context.asAbsolutePath(`webviews/${version}`); const filename = `${extensionRoot}/index.html`; diff --git a/out/extension.js.map b/out/extension.js.map index 402071b..3d29abf 100644 --- a/out/extension.js.map +++ b/out/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 56067b2..1e785ac 100644 --- a/package.json +++ b/package.json @@ -253,6 +253,11 @@ "type": "boolean", "default": true, "description": "Specifies whether to show the break constructor into multiline command in the context menu options" + }, + "phpAddProperty.showVersionUpdates": { + "type": "boolean", + "default": true, + "description": "Specifies whether to show What's New after upgrading to a new version" } } } diff --git a/src/extension.ts b/src/extension.ts index 0b2d99b..66e73ff 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -4,7 +4,7 @@ import Locator from './locator'; import Property from './property'; import insertProperty from './insertProperty'; import { removeProperty } from './removeProperty'; -import { forceBreakConstructorIntoMultiline, getPropertyNameFromLineText, isDebugMode } from './utils'; +import { forceBreakConstructorIntoMultiline, getPropertyNameFromLineText, isDebugMode, config } from './utils'; import { renameProperty } from './renameProperty'; import { changePropertyType } from './changePropertyType'; import { extensionQualifiedId, GlobalState } from './constants'; @@ -17,7 +17,9 @@ export async function activate(context: vscode.ExtensionContext) { const versionAsInt = parseInt((version as string).replace(/\./g, '')); const previousVersionAsInt = previousVersion ? parseInt((previousVersion as string).replace(/\./g, '')) : 0; - if (isDebugMode() || previousVersionAsInt < versionAsInt) { + const showUpdatesEnabled = config('phpAddProperty.showVersionUpdates') === true; + + if (isDebugMode() || (showUpdatesEnabled && previousVersionAsInt < versionAsInt)) { try { const extensionRoot = context.asAbsolutePath(`webviews/${version}`); const filename = `${extensionRoot}/index.html`; From 644f6e72beadaf7fd95b65eb5db9c26d1cc2b6be Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 31 Aug 2020 17:46:51 +0200 Subject: [PATCH 34/41] Release 1.0.0 --- CHANGELOG.md | 15 +++++++++++++++ package-lock.json | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3bab7f3..cd510ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +## 1.0.0 (2020-08-31) + +### Added +- Rewrite to use a PHP parser to reduce usage of RegExp +- Rewrite to use typescript +- Add a new command to remove properties +- Add a new command to rename properties +- Add a new command to change properties type +- Add a new command to transform a constructor into multiline +- Allow to configure the context menu commands via settings + +### Fixed +- [#22](https://github.com/kotfire/vscode-php-add-property/issues/22) Add existing properties does not work with typed properties +- [#23](https://github.com/kotfire/vscode-php-add-property/issues/23) Decrease the minimum vscode version to 1.31.0 + ## 0.5.0 (2020-02-07) ### Added diff --git a/package-lock.json b/package-lock.json index eb78d32..a5e8784 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "php-add-property", - "version": "0.4.1", + "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { From bd92ba7c14c6d814457acdae39720326efef85b3 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 31 Aug 2020 18:10:33 +0200 Subject: [PATCH 35/41] Update dependencies to match min vscode version --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index a5e8784..206c71e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -84,9 +84,9 @@ "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==", + "version": "1.31.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.31.0.tgz", + "integrity": "sha512-uUpjvtrQ14ZEqqRE/EGuBvGbm9GuxDp76mtsnw3goMogsWmEEYS/y4eL2Zwf0rbFMh/hg3hEs+E3CvuuNEs+GA==", "dev": true }, "@typescript-eslint/eslint-plugin": { diff --git a/package.json b/package.json index 1e785ac..1331cb3 100644 --- a/package.json +++ b/package.json @@ -274,7 +274,7 @@ "@types/glob": "^7.1.1", "@types/mocha": "^7.0.2", "@types/node": "^13.11.0", - "@types/vscode": "^1.44.0", + "@types/vscode": "1.31.0", "@typescript-eslint/eslint-plugin": "^2.30.0", "@typescript-eslint/parser": "^2.30.0", "eslint": "^6.8.0", From 5675d8b135c9de3c8cdfd24be1b9819d98bd25c5 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 31 Aug 2020 18:38:12 +0200 Subject: [PATCH 36/41] Release 1.0.1 --- package-lock.json | 3 +-- package.json | 6 ++++-- webviews/{1.0.0 => 1.0.1}/css/main.css | 0 webviews/{1.0.0 => 1.0.1}/i/code.jpg | Bin webviews/{1.0.0 => 1.0.1}/i/icon.png | Bin webviews/{1.0.0 => 1.0.1}/index.html | 0 6 files changed, 5 insertions(+), 4 deletions(-) rename webviews/{1.0.0 => 1.0.1}/css/main.css (100%) rename webviews/{1.0.0 => 1.0.1}/i/code.jpg (100%) rename webviews/{1.0.0 => 1.0.1}/i/icon.png (100%) rename webviews/{1.0.0 => 1.0.1}/index.html (100%) diff --git a/package-lock.json b/package-lock.json index 206c71e..f1d0165 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1442,8 +1442,7 @@ "php-parser": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.0.1.tgz", - "integrity": "sha512-m6CBPHOoMkzEHoXG0rhEg/VegSNemUNQepHnYtrRgTAh8rsqoO65KqQ32KJ5xe2iplhO0jdwd1UJ9Ea0yHsgYQ==", - "dev": true + "integrity": "sha512-m6CBPHOoMkzEHoXG0rhEg/VegSNemUNQepHnYtrRgTAh8rsqoO65KqQ32KJ5xe2iplhO0jdwd1UJ9Ea0yHsgYQ==" }, "picomatch": { "version": "2.2.2", diff --git a/package.json b/package.json index 1331cb3..147868e 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Manage PHP class properties", "publisher": "kotfire", "license": "SEE LICENSE IN LICENSE", - "version": "1.0.0", + "version": "1.0.1", "engines": { "vscode": "^1.31.0" }, @@ -270,6 +270,9 @@ "pretest": "npm run compile", "test": "node ./out/test/runTest.js" }, + "dependencies": { + "php-parser": "^3.0.1" + }, "devDependencies": { "@types/glob": "^7.1.1", "@types/mocha": "^7.0.2", @@ -280,7 +283,6 @@ "eslint": "^6.8.0", "glob": "^7.1.6", "mocha": "^7.1.2", - "php-parser": "^3.0.1", "typescript": "^3.8.3", "vscode-test": "^1.3.0" }, diff --git a/webviews/1.0.0/css/main.css b/webviews/1.0.1/css/main.css similarity index 100% rename from webviews/1.0.0/css/main.css rename to webviews/1.0.1/css/main.css diff --git a/webviews/1.0.0/i/code.jpg b/webviews/1.0.1/i/code.jpg similarity index 100% rename from webviews/1.0.0/i/code.jpg rename to webviews/1.0.1/i/code.jpg diff --git a/webviews/1.0.0/i/icon.png b/webviews/1.0.1/i/icon.png similarity index 100% rename from webviews/1.0.0/i/icon.png rename to webviews/1.0.1/i/icon.png diff --git a/webviews/1.0.0/index.html b/webviews/1.0.1/index.html similarity index 100% rename from webviews/1.0.0/index.html rename to webviews/1.0.1/index.html From b91adeafca4443cd110d65e09e2907582048e5d9 Mon Sep 17 00:00:00 2001 From: Gustavo Real Date: Sat, 5 Sep 2020 09:40:39 +0200 Subject: [PATCH 37/41] [Bugfix] Use workaround to unblock tests on 1.31.0 (#29) --- out/test/runTest.js | 5 ++++- out/test/runTest.js.map | 2 +- out/test/suite/index.js | 3 +++ out/test/suite/index.js.map | 2 +- src/test/runTest.ts | 5 ++++- src/test/suite/index.ts | 4 ++++ 6 files changed, 17 insertions(+), 4 deletions(-) diff --git a/out/test/runTest.js b/out/test/runTest.js index c7cd78c..f068209 100644 --- a/out/test/runTest.js +++ b/out/test/runTest.js @@ -30,7 +30,10 @@ function main() { launchArgs: [ `--user-data-dir=${testUserDir}`, '--disable-extensions' - ] + ], + extensionTestsEnv: { + 'VSCODE_VERSION': vscodeMinimumVersion, + } }); yield vscode_test_1.runTests({ extensionDevelopmentPath, diff --git a/out/test/runTest.js.map b/out/test/runTest.js.map index fde9dae..c8efd61 100644 --- a/out/test/runTest.js.map +++ b/out/test/runTest.js.map @@ -1 +1 @@ -{"version":3,"file":"runTest.js","sourceRoot":"","sources":["../../src/test/runTest.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,6BAA6B;AAE7B,6CAAuC;AAEvC,SAAe,IAAI;;QAClB,IAAI;YACH,4DAA4D;YAC5D,yCAAyC;YACzC,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEnE,0BAA0B;YAC1B,iCAAiC;YACjC,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YAEpE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEtD,MAAM,yBAAyB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;YAC/E,MAAM,oBAAoB,GAAG,yBAAyB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAE/E,MAAM,sBAAQ,CACb;gBACC,OAAO,EAAE,oBAAoB;gBAC7B,wBAAwB;gBACxB,kBAAkB;gBAClB,UAAU,EAAE;oBACX,mBAAmB,WAAW,EAAE;oBAChC,sBAAsB;iBACtB;aACD,CACD,CAAC;YAEF,MAAM,sBAAQ,CACb;gBACC,wBAAwB;gBACxB,kBAAkB;gBAClB,UAAU,EAAE;oBACX,mBAAmB,WAAW,EAAE;oBAChC,sBAAsB;iBACtB;aACD,CACD,CAAC;SACF;QAAC,OAAO,GAAG,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAChB;IACF,CAAC;CAAA;AAED,IAAI,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"runTest.js","sourceRoot":"","sources":["../../src/test/runTest.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,6BAA6B;AAE7B,6CAAuC;AAEvC,SAAe,IAAI;;QAClB,IAAI;YACH,4DAA4D;YAC5D,yCAAyC;YACzC,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEnE,0BAA0B;YAC1B,iCAAiC;YACjC,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YAEpE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEtD,MAAM,yBAAyB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;YAC/E,MAAM,oBAAoB,GAAG,yBAAyB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAE/E,MAAM,sBAAQ,CACb;gBACC,OAAO,EAAE,oBAAoB;gBAC7B,wBAAwB;gBACxB,kBAAkB;gBAClB,UAAU,EAAE;oBACX,mBAAmB,WAAW,EAAE;oBAChC,sBAAsB;iBACtB;gBACD,iBAAiB,EAAE;oBAClB,gBAAgB,EAAE,oBAAoB;iBACtC;aACD,CACD,CAAC;YAEF,MAAM,sBAAQ,CACb;gBACC,wBAAwB;gBACxB,kBAAkB;gBAClB,UAAU,EAAE;oBACX,mBAAmB,WAAW,EAAE;oBAChC,sBAAsB;iBACtB;aACD,CACD,CAAC;SACF;QAAC,OAAO,GAAG,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAChB;IACF,CAAC;CAAA;AAED,IAAI,EAAE,CAAC"} \ No newline at end of file diff --git a/out/test/suite/index.js b/out/test/suite/index.js index e8e1d1f..d298297 100644 --- a/out/test/suite/index.js +++ b/out/test/suite/index.js @@ -20,6 +20,9 @@ function run() { try { // Run the mocha test mocha.run(failures => { + if (process.env.VSCODE_VERSION === '1.31.0') { + process.exit(failures > 0 ? 1 : 0); + } if (failures > 0) { e(new Error(`${failures} tests failed.`)); } diff --git a/out/test/suite/index.js.map b/out/test/suite/index.js.map index 1ebdc6c..0673f51 100644 --- a/out/test/suite/index.js.map +++ b/out/test/suite/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/test/suite/index.ts"],"names":[],"mappings":";;AAAA,6BAA6B;AAC7B,+BAA+B;AAC/B,6BAA6B;AAE7B,SAAgB,GAAG;IAClB,wBAAwB;IACxB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACvB,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,IAAI;KACX,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAEhD,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACxD,IAAI,GAAG,EAAE;gBACR,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;aACd;YAED,8BAA8B;YAC9B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAE9D,IAAI;gBACH,qBAAqB;gBACrB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;oBACpB,IAAI,QAAQ,GAAG,CAAC,EAAE;wBACjB,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,QAAQ,gBAAgB,CAAC,CAAC,CAAC;qBAC1C;yBAAM;wBACN,CAAC,EAAE,CAAC;qBACJ;gBACF,CAAC,CAAC,CAAC;aACH;YAAC,OAAO,GAAG,EAAE;gBACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC,CAAC,GAAG,CAAC,CAAC;aACP;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAjCD,kBAiCC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/test/suite/index.ts"],"names":[],"mappings":";;AAAA,6BAA6B;AAC7B,+BAA+B;AAC/B,6BAA6B;AAE7B,SAAgB,GAAG;IAClB,wBAAwB;IACxB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACvB,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,IAAI;KACX,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAEhD,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACxD,IAAI,GAAG,EAAE;gBACR,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;aACd;YAED,8BAA8B;YAC9B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAE9D,IAAI;gBACH,qBAAqB;gBACrB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;oBACpB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,QAAQ,EAAE;wBAC5C,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;qBACnC;oBAED,IAAI,QAAQ,GAAG,CAAC,EAAE;wBACjB,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,QAAQ,gBAAgB,CAAC,CAAC,CAAC;qBAC1C;yBAAM;wBACN,CAAC,EAAE,CAAC;qBACJ;gBACF,CAAC,CAAC,CAAC;aACH;YAAC,OAAO,GAAG,EAAE;gBACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC,CAAC,GAAG,CAAC,CAAC;aACP;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AArCD,kBAqCC"} \ No newline at end of file diff --git a/src/test/runTest.ts b/src/test/runTest.ts index 8286fa9..0752773 100644 --- a/src/test/runTest.ts +++ b/src/test/runTest.ts @@ -25,7 +25,10 @@ async function main() { launchArgs: [ `--user-data-dir=${testUserDir}`, '--disable-extensions' - ] + ], + extensionTestsEnv: { + 'VSCODE_VERSION': vscodeMinimumVersion, + } } ); diff --git a/src/test/suite/index.ts b/src/test/suite/index.ts index 7029e38..6ce2a57 100644 --- a/src/test/suite/index.ts +++ b/src/test/suite/index.ts @@ -23,6 +23,10 @@ export function run(): Promise { try { // Run the mocha test mocha.run(failures => { + if (process.env.VSCODE_VERSION === '1.31.0') { + process.exit(failures > 0 ? 1 : 0); + } + if (failures > 0) { e(new Error(`${failures} tests failed.`)); } else { From b3e94d7b91a9c6ec120930b8b5a7cc901050f6c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 5 Sep 2020 09:45:24 +0200 Subject: [PATCH 38/41] [Dependencies] Bump lodash from 4.17.15 to 4.17.20 (#25) - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.20) --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index f1d0165..9ddd45d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "php-add-property", - "version": "1.0.0", + "version": "1.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1146,9 +1146,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, "log-symbols": { From a2a14e4508615e78558d5c7b5ffcb931604d76ad Mon Sep 17 00:00:00 2001 From: Gustavo Real Date: Sat, 5 Sep 2020 09:52:16 +0200 Subject: [PATCH 39/41] [Bugfix] Do not add extra space using docblock with param (#30) --- out/property.js | 2 +- .../inputs/DocblockTypeWithParameter.php | 12 +++++++++++ .../outputs/DocblockTypeWithParameter.php | 21 +++++++++++++++++++ out/test/suite/addExistingProperty.test.js | 5 +++++ .../suite/addExistingProperty.test.js.map | 2 +- src/property.ts | 2 +- src/test/suite/addExistingProperty.test.ts | 6 ++++++ 7 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 out/test/fixtures/existing/inputs/DocblockTypeWithParameter.php create mode 100644 out/test/fixtures/existing/outputs/DocblockTypeWithParameter.php diff --git a/out/property.js b/out/property.js index 833face..80fb174 100644 --- a/out/property.js +++ b/out/property.js @@ -72,7 +72,7 @@ class Property { } let constructorParamDocblockText = `\${${docblockTypeStop}}`; if (this.getType()) { - constructorParamDocblockText = `\${${docblockTypeStop}:${this.getType()} }`; + constructorParamDocblockText = `\${${docblockTypeStop}:${this.getType()}} `; } if (utils_1.config('phpAddProperty.constructor.docblock.stopToImport') === true) { constructorParamDocblockText += `\$${dockblockImportStop}`; diff --git a/out/test/fixtures/existing/inputs/DocblockTypeWithParameter.php b/out/test/fixtures/existing/inputs/DocblockTypeWithParameter.php new file mode 100644 index 0000000..f41691d --- /dev/null +++ b/out/test/fixtures/existing/inputs/DocblockTypeWithParameter.php @@ -0,0 +1,12 @@ +name = $name; + } +} diff --git a/out/test/suite/addExistingProperty.test.js b/out/test/suite/addExistingProperty.test.js index db8a3be..0e876b5 100644 --- a/out/test/suite/addExistingProperty.test.js +++ b/out/test/suite/addExistingProperty.test.js @@ -41,6 +41,11 @@ suite('Add Existing Property', function () { yield vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.enable', true, true); yield runFixture('ConstructorDocblockUsingDocblock.php', new vscode.Position(8, 0)); })); + test('Should NOT add an extra space when adding property type and docblock type at the same type', () => __awaiter(this, void 0, void 0, function* () { + yield vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.enable', true, true); + yield vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.withParameter', true, true); + yield runFixture('DocblockTypeWithParameter.php', new vscode.Position(10, 22)); + })); }); function runFixture(fileName, cursorPosition) { return __awaiter(this, void 0, void 0, function* () { diff --git a/out/test/suite/addExistingProperty.test.js.map b/out/test/suite/addExistingProperty.test.js.map index 8386337..b1c0c9b 100644 --- a/out/test/suite/addExistingProperty.test.js.map +++ b/out/test/suite/addExistingProperty.test.js.map @@ -1 +1 @@ -{"version":3,"file":"addExistingProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/addExistingProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"addExistingProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/addExistingProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/property.ts b/src/property.ts index d126a6d..7a9c00c 100644 --- a/src/property.ts +++ b/src/property.ts @@ -96,7 +96,7 @@ export default class Property { let constructorParamDocblockText = `\${${docblockTypeStop}}`; if (this.getType()) { - constructorParamDocblockText = `\${${docblockTypeStop}:${this.getType()} }`; + constructorParamDocblockText = `\${${docblockTypeStop}:${this.getType()}} `; } if (config('phpAddProperty.constructor.docblock.stopToImport') === true) { diff --git a/src/test/suite/addExistingProperty.test.ts b/src/test/suite/addExistingProperty.test.ts index a92bdb9..e58fd5b 100644 --- a/src/test/suite/addExistingProperty.test.ts +++ b/src/test/suite/addExistingProperty.test.ts @@ -39,6 +39,12 @@ suite('Add Existing Property', function () { await vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.enable', true, true); await runFixture('ConstructorDocblockUsingDocblock.php', new vscode.Position(8, 0)); }); + + test('Should NOT add an extra space when adding property type and docblock type at the same type', async () => { + await vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.enable', true, true); + await vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.withParameter', true, true); + await runFixture('DocblockTypeWithParameter.php', new vscode.Position(10, 22)); + }); }); async function runFixture(fileName: string, cursorPosition: vscode.Position) { From ee8ba4e6608856502945aa70168fdbc3c7f47c9b Mon Sep 17 00:00:00 2001 From: Gustavo Real Date: Sat, 5 Sep 2020 10:20:03 +0200 Subject: [PATCH 40/41] [Feature] Nullable property types (#31) * Add support for nullable property types * Extract nullable types from multiple type docblock --- out/extension.js | 8 ++++++- out/extension.js.map | 2 +- out/property.js | 18 +++++++++++--- out/property.js.map | 2 +- .../fixtures/existing/inputs/NullableType.php | 12 ++++++++++ .../existing/inputs/UseNullableDocblock.php | 10 ++++++++ .../existing/outputs/NullableType.php | 21 ++++++++++++++++ .../existing/outputs/UseNullableDocblock.php | 15 ++++++++++++ out/test/suite/addExistingProperty.test.js | 7 ++++++ .../suite/addExistingProperty.test.js.map | 2 +- src/extension.ts | 11 ++++++++- src/property.ts | 24 ++++++++++++++++--- src/test/suite/addExistingProperty.test.ts | 9 +++++++ 13 files changed, 130 insertions(+), 11 deletions(-) create mode 100644 out/test/fixtures/existing/inputs/NullableType.php create mode 100644 out/test/fixtures/existing/inputs/UseNullableDocblock.php create mode 100644 out/test/fixtures/existing/outputs/NullableType.php create mode 100644 out/test/fixtures/existing/outputs/UseNullableDocblock.php diff --git a/out/extension.js b/out/extension.js index 010635f..1ad1368 100644 --- a/out/extension.js +++ b/out/extension.js @@ -149,9 +149,15 @@ function activate(context) { const typeMatch = /@var\s(\S*)/g.exec(node.value); if (typeMatch) { docblockType = typeMatch[1]; + let types = docblockType.split('|').map(type => type.trim()); + const nullableTypeIndex = types.indexOf('null'); + if (nullableTypeIndex !== -1) { + types.splice(nullableTypeIndex, 1); + docblockType = `?${types.join('|')}`; + } } } - const property = new property_1.default(propertyName, (_g = (_f = propertyAst.type) === null || _f === void 0 ? void 0 : _f.name) !== null && _g !== void 0 ? _g : docblockType); + const property = new property_1.default(propertyName, propertyAst.nullable, (_g = (_f = propertyAst.type) === null || _f === void 0 ? void 0 : _f.name) !== null && _g !== void 0 ? _g : docblockType); insertProperty_1.default(vscode.window.activeTextEditor, property, phpClass, line.text); })), vscode.commands.registerCommand('phpAddProperty.rename', () => __awaiter(this, void 0, void 0, function* () { if (vscode.window.activeTextEditor === undefined) { diff --git a/out/extension.js.map b/out/extension.js.map index 3d29abf..a4da07b 100644 --- a/out/extension.js.map +++ b/out/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/property.js b/out/property.js index 80fb174..82558f9 100644 --- a/out/property.js +++ b/out/property.js @@ -2,13 +2,17 @@ Object.defineProperty(exports, "__esModule", { value: true }); const utils_1 = require("./utils"); class Property { - constructor(name, type) { + constructor(name, nullable = false, type) { this.name = name; + this.nullable = nullable; this.type = type; } getName() { return this.name; } + isNullable() { + return this.nullable === true; + } getType() { return this.type; } @@ -50,7 +54,11 @@ class Property { getParameterText(tabStops) { let tabStopsText = `$${tabStops.constructorParameterType}`; if (this.getType()) { - tabStopsText = `\${${tabStops.constructorParameterType}:${this.getType()}}`; + let typeText = this.getType(); + if (this.isNullable()) { + typeText = `?${typeText}`; + } + tabStopsText = `\${${tabStops.constructorParameterType}:${typeText}}`; } if (utils_1.config('phpAddProperty.property.stopToImport') === true) { tabStopsText += `$${tabStops.constructorParameterStop}`; @@ -72,7 +80,11 @@ class Property { } let constructorParamDocblockText = `\${${docblockTypeStop}}`; if (this.getType()) { - constructorParamDocblockText = `\${${docblockTypeStop}:${this.getType()}} `; + let typeText = this.getType(); + if (this.isNullable()) { + typeText = `${typeText}|null`; + } + constructorParamDocblockText = `\${${docblockTypeStop}:${typeText}} `; } if (utils_1.config('phpAddProperty.constructor.docblock.stopToImport') === true) { constructorParamDocblockText += `\$${dockblockImportStop}`; diff --git a/out/property.js.map b/out/property.js.map index ccb2721..927e838 100644 --- a/out/property.js.map +++ b/out/property.js.map @@ -1 +1 @@ -{"version":3,"file":"property.js","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"property.js","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/out/test/fixtures/existing/inputs/NullableType.php b/out/test/fixtures/existing/inputs/NullableType.php new file mode 100644 index 0000000..4e7ea0a --- /dev/null +++ b/out/test/fixtures/existing/inputs/NullableType.php @@ -0,0 +1,12 @@ +name = $name; + } +} diff --git a/out/test/fixtures/existing/outputs/UseNullableDocblock.php b/out/test/fixtures/existing/outputs/UseNullableDocblock.php new file mode 100644 index 0000000..09fbfc9 --- /dev/null +++ b/out/test/fixtures/existing/outputs/UseNullableDocblock.php @@ -0,0 +1,15 @@ +name = $name; + } +} diff --git a/out/test/suite/addExistingProperty.test.js b/out/test/suite/addExistingProperty.test.js index 0e876b5..af6430b 100644 --- a/out/test/suite/addExistingProperty.test.js +++ b/out/test/suite/addExistingProperty.test.js @@ -46,6 +46,13 @@ suite('Add Existing Property', function () { yield vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.withParameter', true, true); yield runFixture('DocblockTypeWithParameter.php', new vscode.Position(10, 22)); })); + test('Should add an existing property with a nullable type', () => __awaiter(this, void 0, void 0, function* () { + yield vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.enable', true, true); + yield runFixture('NullableType.php', new vscode.Position(10, 0)); + })); + test('Should add a nullable property using type from property docblock', () => __awaiter(this, void 0, void 0, function* () { + yield runFixture('UseNullableDocblock.php', new vscode.Position(8, 0)); + })); }); function runFixture(fileName, cursorPosition) { return __awaiter(this, void 0, void 0, function* () { diff --git a/out/test/suite/addExistingProperty.test.js.map b/out/test/suite/addExistingProperty.test.js.map index b1c0c9b..251b2fc 100644 --- a/out/test/suite/addExistingProperty.test.js.map +++ b/out/test/suite/addExistingProperty.test.js.map @@ -1 +1 @@ -{"version":3,"file":"addExistingProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/addExistingProperty.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,iCAAiC;AACjC,6BAA6B;AAC7B,iCAAiC;AACjC,yBAAyB;AACzB,mCAA6E;AAE7E,MAAM,0BAA0B,GAAG,wBAAwB,CAAC;AAE5D,KAAK,CAAC,uBAAuB,EAAE;IAC3B,KAAK,CAAC,GAAS,EAAE;QACb,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAS,EAAE;QAChB,MAAM,4BAAoB,EAAE,CAAC;IACjC,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,mEAAmE,EAAE,GAAS,EAAE;QACjF,MAAM,UAAU,CAAC,gBAAgB,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,GAAS,EAAE;QACvE,MAAM,UAAU,CAAC,sBAAsB,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,4DAA4D,EAAE,GAAS,EAAE;QAC1E,MAAM,UAAU,CAAC,yBAAyB,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,0DAA0D,EAAE,GAAS,EAAE;QACxE,MAAM,UAAU,CAAC,iBAAiB,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,wDAAwD,EAAE,GAAS,EAAE;QACtE,MAAM,UAAU,CAAC,aAAa,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,qEAAqE,EAAE,GAAS,EAAE;QACnF,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,6BAA6B,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5G,MAAM,UAAU,CAAC,sCAAsC,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,CAAC,4FAA4F,EAAE,GAAS,EAAE;QAC1G,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,6BAA6B,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5G,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,oCAAoC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACnH,MAAM,UAAU,CAAC,+BAA+B,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACnF,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,SAAe,UAAU,CAAC,QAAgB,EAAE,cAA+B;;QACvE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CACvB,gBAAgB,CAAC,QAAQ,CAAC,CAC7B,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE;YACjC,OAAO;SACV;QAED,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;QAEnG,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;QAE9D,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE7E,MAAM,aAAK,CAAC,6BAAqB,EAAE,GAAG,EAAE;;YACpC,MAAM,CAAC,WAAW,OAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,0CAAE,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;IACP,CAAC;CAAA;AAED,SAAS,gBAAgB,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,UAAU,IAAI,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,0BAA0B,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC"} \ No newline at end of file +{"version":3,"file":"addExistingProperty.test.js","sourceRoot":"","sources":["../../../src/test/suite/addExistingProperty.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index 66e73ff..0e769a4 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -188,10 +188,19 @@ export async function activate(context: vscode.ExtensionContext) { if (typeMatch) { docblockType = typeMatch[1]; + + let types = docblockType.split('|').map(type => type.trim()); + const nullableTypeIndex = types.indexOf('null'); + + if (nullableTypeIndex !== -1) { + types.splice(nullableTypeIndex, 1); + + docblockType = `?${types.join('|')}`; + } } } - const property = new Property(propertyName, propertyAst.type?.name ?? docblockType); + const property = new Property(propertyName, propertyAst.nullable, propertyAst.type?.name ?? docblockType); insertProperty(vscode.window.activeTextEditor, property, phpClass, line.text); }), diff --git a/src/property.ts b/src/property.ts index 7a9c00c..dfa7f9f 100644 --- a/src/property.ts +++ b/src/property.ts @@ -2,10 +2,12 @@ import { config, indentText, getVisibilityChoice } from "./utils"; export default class Property { private name: string; + private nullable: Boolean; private type?: string; - constructor(name: string, type?: string) { + constructor(name: string, nullable: Boolean = false, type?: string) { this.name = name; + this.nullable = nullable; this.type = type; } @@ -13,6 +15,10 @@ export default class Property { return this.name; } + public isNullable() { + return this.nullable === true; + } + public getType() { return this.type; } @@ -65,7 +71,13 @@ export default class Property { let tabStopsText = `$${tabStops.constructorParameterType}`; if (this.getType()) { - tabStopsText = `\${${tabStops.constructorParameterType}:${this.getType()}}`; + let typeText = this.getType(); + + if (this.isNullable()) { + typeText = `?${typeText}`; + } + + tabStopsText = `\${${tabStops.constructorParameterType}:${typeText}}`; } if (config('phpAddProperty.property.stopToImport') === true) { @@ -96,7 +108,13 @@ export default class Property { let constructorParamDocblockText = `\${${docblockTypeStop}}`; if (this.getType()) { - constructorParamDocblockText = `\${${docblockTypeStop}:${this.getType()}} `; + let typeText = this.getType(); + + if (this.isNullable()) { + typeText = `${typeText}|null`; + } + + constructorParamDocblockText = `\${${docblockTypeStop}:${typeText}} `; } if (config('phpAddProperty.constructor.docblock.stopToImport') === true) { diff --git a/src/test/suite/addExistingProperty.test.ts b/src/test/suite/addExistingProperty.test.ts index e58fd5b..0b8b900 100644 --- a/src/test/suite/addExistingProperty.test.ts +++ b/src/test/suite/addExistingProperty.test.ts @@ -45,6 +45,15 @@ suite('Add Existing Property', function () { await vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.withParameter', true, true); await runFixture('DocblockTypeWithParameter.php', new vscode.Position(10, 22)); }); + + test('Should add an existing property with a nullable type', async() => { + await vscode.workspace.getConfiguration('phpAddProperty').update('constructor.docblock.enable', true, true); + await runFixture('NullableType.php', new vscode.Position(10, 0)); + }); + + test('Should add a nullable property using type from property docblock', async() => { + await runFixture('UseNullableDocblock.php', new vscode.Position(8, 0)); + }); }); async function runFixture(fileName: string, cursorPosition: vscode.Position) { From 7eef6578ea265db9188ff3494efaa3f4d39d62ca Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 5 Sep 2020 10:31:11 +0200 Subject: [PATCH 41/41] Release 1.1.0 --- CHANGELOG.md | 8 ++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd510ff..5e8c98d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## 1.1.0 (2020-09-05) + +### Added +- [#28](https://github.com/kotfire/vscode-php-add-property/issues/28) Add support for nullable property types + +### Fixed +- [#26](https://github.com/kotfire/vscode-php-add-property/issues/26) Do not add extra space using docblock with param + ## 1.0.0 (2020-08-31) ### Added diff --git a/package-lock.json b/package-lock.json index 9ddd45d..463652d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "php-add-property", - "version": "1.0.1", + "version": "1.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 147868e..0cce785 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Manage PHP class properties", "publisher": "kotfire", "license": "SEE LICENSE IN LICENSE", - "version": "1.0.1", + "version": "1.1.0", "engines": { "vscode": "^1.31.0" },