From 0ca563d8ac00f75b0bed2062c5b26ffb9ee780d7 Mon Sep 17 00:00:00 2001 From: Neil Brayfield Date: Tue, 7 Sep 2021 22:18:52 +0100 Subject: [PATCH 1/4] Add a script to facilitate adding tags to the README.md --- README.md | 8 +- package-lock.json | 6 + package.json | 1 + scripts/generateTagTable.ts | 18 +++ scripts/updateChangelog.ts | 2 - src/completions.ts | 277 ++---------------------------------- src/tags.ts | 271 +++++++++++++++++++++++++++++++++++ 7 files changed, 314 insertions(+), 269 deletions(-) create mode 100644 scripts/generateTagTable.ts create mode 100644 src/tags.ts diff --git a/README.md b/README.md index fb062d4..7b78a5d 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ and can be triggered by typing @ then another characted (Provided your vscode se | @abstract | @abstract | | @after | @after | | @afterClass | @afterClass | -| @author | @author \${1:name} <${2:email}> | +| @author | @author ${1:name} <${2:email}> | | @backupGlobals | @backupGlobals ${1:switch} | | @backupStaticAttributes | @backupStaticAttributes ${1:switch} | | @before | @before | @@ -131,7 +131,7 @@ and can be triggered by typing @ then another characted (Provided your vscode se | @codeCoverageIgnore | @codeCoverageIgnore | | @codeCoverageIgnoreEnd | @codeCoverageIgnoreEnd | | @codeCoverageIgnoreStart | @codeCoverageIgnoreStart | -| @copyright | @copyright ${1:2018} ${2:Name} | +| @copyright | @copyright ${1:2021} ${2:Name} | | @covers | @covers ${1:fqcn} | | @coversDefaultClass | @coversDefaultClass ${1:fqcn} | | @coversNothing | @coversNothing | @@ -152,10 +152,10 @@ and can be triggered by typing @ then another characted (Provided your vscode se | @link | @link ${1:http://url.com} | | @medium | @medium | | @method | @method ${1:mixed} ${2:methodName()} | -| @mixin | @mixin ${1:\Class} | +| @mixin | @mixin ${1:\MyClass} | | @package | @package ${1:category} | | @param | @param ${1:mixed} $${2:name} | -| @preserveGlobalState | @preserveGlobalState | +| @preserveGlobalState | @preserveGlobalState ${1:switch} | | @property | @property ${1:mixed} $${2:name} | | @property-read | @property-read ${1:mixed} $${2:name} | | @property-write | @property-write ${1:mixed} $${2:name} | diff --git a/package-lock.json b/package-lock.json index 7175206..bc0d197 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2164,6 +2164,12 @@ } } }, + "markdown-table-ts": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/markdown-table-ts/-/markdown-table-ts-1.0.3.tgz", + "integrity": "sha512-lYrp7FXmBqpmGmsEF92WnSukdgYvLm15FPIODZOx9+3nobkxJxjBYcszqZf5VqTjBtISPSNC7zjU9o3zwpL6AQ==", + "dev": true + }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", diff --git a/package.json b/package.json index 0a1902e..a975dd1 100644 --- a/package.json +++ b/package.json @@ -130,6 +130,7 @@ "@vscode/test-web": "^0.0.7", "coveralls": "^3.1.1", "esbuild": "^0.12.19", + "markdown-table-ts": "^1.0.3", "mocha": "^9.0.3", "nyc": "^14.0.0", "typescript": "^3.9.10", diff --git a/scripts/generateTagTable.ts b/scripts/generateTagTable.ts new file mode 100644 index 0000000..853cec6 --- /dev/null +++ b/scripts/generateTagTable.ts @@ -0,0 +1,18 @@ +import Tags from "../src/tags"; +import { getMarkdownTable } from 'markdown-table-ts'; + +let tags = new Tags(); + +let formatted: string[][] = []; +tags.list.forEach(tag => { + formatted.push([tag.tag, tag.snippet]); +}); + +let table = getMarkdownTable({ + table: { + head: ['Tag', 'Snippet'], + body: formatted + }, +}); + +console.log(table); \ No newline at end of file diff --git a/scripts/updateChangelog.ts b/scripts/updateChangelog.ts index fa76958..dd2881c 100644 --- a/scripts/updateChangelog.ts +++ b/scripts/updateChangelog.ts @@ -1,5 +1,3 @@ -'use strict'; - import * as fs from 'fs'; const version = process.env.npm_package_version diff --git a/src/completions.ts b/src/completions.ts index af218ea..54d9d62 100644 --- a/src/completions.ts +++ b/src/completions.ts @@ -1,5 +1,6 @@ import {workspace, TextDocument, Position, CancellationToken, ProviderResult, CompletionItem, CompletionItemProvider, Range, SnippetString, CompletionItemKind, window} from "vscode"; import Documenter from "./documenter"; +import Tags, { Tag } from "./tags"; import Config from "./util/config"; /** @@ -8,259 +9,11 @@ import Config from "./util/config"; export default class Completions implements CompletionItemProvider { /** - * List of tags and snippets that are filled in docblocks + * Tags object * - * @type {Array} + * @type {Tags} */ - protected tags = [ - { - tag: '@api', - snippet: '@api' - }, - { - tag: '@abstract', - snippet: '@abstract' - }, - { - tag: '@after', - snippet: '@after' - }, - { - tag: '@afterClass', - snippet: '@afterClass' - }, - { - tag: '@author', - snippet: '@author ${1:{{name}}} <${2:{{email}}}>' - }, - { - tag: '@backupGlobals', - snippet: '@backupGlobals ${1:switch}' - }, - { - tag: '@backupStaticAttributes', - snippet: '@backupStaticAttributes ${1:switch}' - }, - { - tag: '@before', - snippet: '@before' - }, - { - tag: '@beforeClass', - snippet: '@beforeClass' - }, - { - tag: '@category', - snippet: '@category ${1:description}' - }, - { - tag: '@codeCoverageIgnore', - snippet: '@codeCoverageIgnore' - }, - { - tag: '@codeCoverageIgnoreEnd', - snippet: '@codeCoverageIgnoreEnd' - }, - { - tag: '@codeCoverageIgnoreStart', - snippet: '@codeCoverageIgnoreStart' - }, - { - tag: '@copyright', - snippet: '@copyright ${1:' + (new Date()).getFullYear() + '} ${2:Name}' - }, - { - tag: '@covers', - snippet: '@covers ${1:fqcn}' - }, - { - tag: '@coversDefaultClass', - snippet: '@coversDefaultClass ${1:fqcn}' - }, - { - tag: '@coversNothing', - snippet: '@coversNothing' - }, - { - tag: '@dataProvider', - snippet: '@dataProvider ${1:methodName}' - }, - { - tag: '@depends', - snippet: '@depends ${1:methodName}' - }, - { - tag: '@deprecated', - snippet: '@deprecated ${1:version}' - }, - { - tag: '@doesNotPerformAssertions', - snippet: '@doesNotPerformAssertions' - }, - { - tag: '@example', - snippet: '@example ${1:location} ${2:description}' - }, - { - tag: '@filesource', - snippet: '@filesource' - }, - { - tag: '@final', - snippet: '@final' - }, - { - tag: '@group', - snippet: '@group ${1:group}' - }, - { - tag: '@global', - snippet: '@global' - }, - { - tag: '@ignore', - snippet: '@ignore ${1:description}' - }, - { - tag: '@inheritDoc', - snippet: '@inheritDoc' - }, - { - tag: '@internal', - snippet: '@internal ${1:description}' - }, - { - tag: '@large', - snippet: '@large' - }, - { - tag: '@license', - snippet: '@license ${1:MIT}' - }, - { - tag: '@link', - snippet: '@link ${1:http://url.com}' - }, - { - tag: '@medium', - snippet: '@medium' - }, - { - tag: '@method', - snippet: '@method ${1:mixed} ${2:methodName()}' - }, - { - tag: '@mixin', - snippet: '@mixin ${1:\\MyClass}' - }, - { - tag: '@package', - snippet: '@package ${1:category}' - }, - { - tag: '@param', - snippet: '@param ${1:mixed} \$${2:name}' - }, - { - tag: '@preserveGlobalState', - snippet: '@preserveGlobalState ${1:switch}' - }, - { - tag: '@property', - snippet: '@property ${1:mixed} \$${2:name}' - }, - { - tag: '@property-read', - snippet: '@property-read ${1:mixed} \$${2:name}' - }, - { - tag: '@property-write', - snippet: '@property-write ${1:mixed} \$${2:name}' - }, - { - tag: '@requires', - snippet: '@requires ${1:mixed}' - }, - { - tag: '@return', - snippet: '@return ${1:mixed}' - }, - { - tag: '@runInSeparateProcess', - snippet: '@runInSeparateProcess' - }, - { - tag: '@runTestsInSeparateProcesses', - snippet: '@runTestsInSeparateProcesses' - }, - { - tag: '@see', - snippet: '@see ${1:http://url.com}' - }, - { - tag: '@since', - snippet: '@since ${1:1.0.0}' - }, - { - tag: '@small', - snippet: '@small' - }, - { - tag: '@source', - snippet: '@source ${1:location} ${2:description}' - }, - { - tag: '@static', - snippet: '@static' - }, - { - tag: '@subpackage', - snippet: '@subpackage ${1:category}' - }, - { - tag: '@test', - snippet: '@test' - }, - { - tag: '@testdox', - snippet: '@testdox ${1:description}' - }, - { - tag: '@testWith', - snippet: '@testWith ${1:elements}' - }, - { - tag: '@throws', - snippet: '@throws ${1:Exception}' - }, - { - tag: '@ticket', - snippet: '@ticket ${1:ticket}' - }, - { - tag: '@todo', - snippet: '@todo ${1:Something}' - }, - { - tag: '@uses', - snippet: '@uses ${1:MyClass::function} ${2:Name}' - }, - { - tag: '@var', - snippet: '@var ${1:mixed}' - }, - { - tag: '@version', - snippet: '@version ${1:1.0.0}' - } - ]; - - /** - * Have we injected in tag data yet - * - * @type {{}} - */ - protected formatted = false; + protected tags: Tags = new Tags(); /** * Implemented function to find and return completions either from @@ -316,20 +69,18 @@ export default class Completions implements CompletionItemProvider * * @returns {Array<{tag:string, snippet:string}>} */ - protected getTags():Array<{tag:string, snippet:string}> + protected getTags(): Tag[] { - if (!this.formatted) { - this.tags.forEach((tag, index) => { - if (tag.tag == '@author') { - tag.snippet = tag.snippet.replace("{{name}}", Config.instance.get('author').name); - tag.snippet = tag.snippet.replace("{{email}}", Config.instance.get('author').email); - this.tags[index] = tag; - } - }); + let tags: Tag[] = this.tags.list; - this.formatted = true; - } + tags.forEach((tag, index) => { + if (tag.tag == '@author') { + tag.snippet = tag.snippet.replace("{{name}}", Config.instance.get('author').name); + tag.snippet = tag.snippet.replace("{{email}}", Config.instance.get('author').email); + tags[index] = tag; + } + }); - return this.tags; + return tags; } } diff --git a/src/tags.ts b/src/tags.ts new file mode 100644 index 0000000..35fcaf6 --- /dev/null +++ b/src/tags.ts @@ -0,0 +1,271 @@ +/** + * Simple interface for a tag + */ +export interface Tag { + tag: string, + snippet: string +} + +/** + * Simple class to contain all the tags + */ +export default class Tags +{ + /** + * List of tags + * + * @type {Tag[]} + */ + protected tagList: Tag[] = [ + { + tag: '@api', + snippet: '@api' + }, + { + tag: '@abstract', + snippet: '@abstract' + }, + { + tag: '@after', + snippet: '@after' + }, + { + tag: '@afterClass', + snippet: '@afterClass' + }, + { + tag: '@author', + snippet: '@author ${1:{{name}}} <${2:{{email}}}>' + }, + { + tag: '@backupGlobals', + snippet: '@backupGlobals ${1:switch}' + }, + { + tag: '@backupStaticAttributes', + snippet: '@backupStaticAttributes ${1:switch}' + }, + { + tag: '@before', + snippet: '@before' + }, + { + tag: '@beforeClass', + snippet: '@beforeClass' + }, + { + tag: '@category', + snippet: '@category ${1:description}' + }, + { + tag: '@codeCoverageIgnore', + snippet: '@codeCoverageIgnore' + }, + { + tag: '@codeCoverageIgnoreEnd', + snippet: '@codeCoverageIgnoreEnd' + }, + { + tag: '@codeCoverageIgnoreStart', + snippet: '@codeCoverageIgnoreStart' + }, + { + tag: '@copyright', + snippet: '@copyright ${1:' + (new Date()).getFullYear() + '} ${2:Name}' + }, + { + tag: '@covers', + snippet: '@covers ${1:fqcn}' + }, + { + tag: '@coversDefaultClass', + snippet: '@coversDefaultClass ${1:fqcn}' + }, + { + tag: '@coversNothing', + snippet: '@coversNothing' + }, + { + tag: '@dataProvider', + snippet: '@dataProvider ${1:methodName}' + }, + { + tag: '@depends', + snippet: '@depends ${1:methodName}' + }, + { + tag: '@deprecated', + snippet: '@deprecated ${1:version}' + }, + { + tag: '@doesNotPerformAssertions', + snippet: '@doesNotPerformAssertions' + }, + { + tag: '@example', + snippet: '@example ${1:location} ${2:description}' + }, + { + tag: '@filesource', + snippet: '@filesource' + }, + { + tag: '@final', + snippet: '@final' + }, + { + tag: '@group', + snippet: '@group ${1:group}' + }, + { + tag: '@global', + snippet: '@global' + }, + { + tag: '@ignore', + snippet: '@ignore ${1:description}' + }, + { + tag: '@inheritDoc', + snippet: '@inheritDoc' + }, + { + tag: '@internal', + snippet: '@internal ${1:description}' + }, + { + tag: '@large', + snippet: '@large' + }, + { + tag: '@license', + snippet: '@license ${1:MIT}' + }, + { + tag: '@link', + snippet: '@link ${1:http://url.com}' + }, + { + tag: '@medium', + snippet: '@medium' + }, + { + tag: '@method', + snippet: '@method ${1:mixed} ${2:methodName()}' + }, + { + tag: '@mixin', + snippet: '@mixin ${1:\\MyClass}' + }, + { + tag: '@package', + snippet: '@package ${1:category}' + }, + { + tag: '@param', + snippet: '@param ${1:mixed} \$${2:name}' + }, + { + tag: '@preserveGlobalState', + snippet: '@preserveGlobalState ${1:switch}' + }, + { + tag: '@property', + snippet: '@property ${1:mixed} \$${2:name}' + }, + { + tag: '@property-read', + snippet: '@property-read ${1:mixed} \$${2:name}' + }, + { + tag: '@property-write', + snippet: '@property-write ${1:mixed} \$${2:name}' + }, + { + tag: '@requires', + snippet: '@requires ${1:mixed}' + }, + { + tag: '@return', + snippet: '@return ${1:mixed}' + }, + { + tag: '@runInSeparateProcess', + snippet: '@runInSeparateProcess' + }, + { + tag: '@runTestsInSeparateProcesses', + snippet: '@runTestsInSeparateProcesses' + }, + { + tag: '@see', + snippet: '@see ${1:http://url.com}' + }, + { + tag: '@since', + snippet: '@since ${1:1.0.0}' + }, + { + tag: '@small', + snippet: '@small' + }, + { + tag: '@source', + snippet: '@source ${1:location} ${2:description}' + }, + { + tag: '@static', + snippet: '@static' + }, + { + tag: '@subpackage', + snippet: '@subpackage ${1:category}' + }, + { + tag: '@test', + snippet: '@test' + }, + { + tag: '@testdox', + snippet: '@testdox ${1:description}' + }, + { + tag: '@testWith', + snippet: '@testWith ${1:elements}' + }, + { + tag: '@throws', + snippet: '@throws ${1:Exception}' + }, + { + tag: '@ticket', + snippet: '@ticket ${1:ticket}' + }, + { + tag: '@todo', + snippet: '@todo ${1:Something}' + }, + { + tag: '@uses', + snippet: '@uses ${1:MyClass::function} ${2:Name}' + }, + { + tag: '@var', + snippet: '@var ${1:mixed}' + }, + { + tag: '@version', + snippet: '@version ${1:1.0.0}' + } + ]; + + /** + * Get the tag list for completions + * + * @returns {Tag[]} + */ + get list(): Tag[] + { + return this.tagList; + } +} \ No newline at end of file From dd41e0f04fe096a39948347dda2de7cd8d91e06a Mon Sep 17 00:00:00 2001 From: Neil Brayfield Date: Tue, 7 Sep 2021 22:22:43 +0100 Subject: [PATCH 2/4] Update changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 964e25e..131f478 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,13 @@ All notable changes to the "php-docblocker" extension will be documented in this file. ## [Unreleased] + +### Operational - Add auto-merge to release workflow - Create release using bot token - Make tests run on push only -- Convert `updateChangelog.js` script to use typescript +- Convert `updateChangelog.js` script to use typescript +- Add script to generate the table of tags for the README.md ## [2.4.0] - 2021-09-05 - Add support for params which have a trailing comma From d195bdf557dfa6cbea7a73b81105c9ea5665686e Mon Sep 17 00:00:00 2001 From: Neil Brayfield Date: Tue, 7 Sep 2021 22:27:15 +0100 Subject: [PATCH 3/4] Add output file as well --- scripts/generateTagTable.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts/generateTagTable.ts b/scripts/generateTagTable.ts index 853cec6..d7d88b5 100644 --- a/scripts/generateTagTable.ts +++ b/scripts/generateTagTable.ts @@ -1,3 +1,4 @@ +import * as fs from 'fs'; import Tags from "../src/tags"; import { getMarkdownTable } from 'markdown-table-ts'; @@ -15,4 +16,12 @@ let table = getMarkdownTable({ }, }); -console.log(table); \ No newline at end of file +console.log(''); +console.log(table); +console.log(''); + +fs.writeFile('./out/TAGS.md', table, 'utf8', function (err) { + if (err) { + throw err; + } +}); From d5e71a45bbd4b89c8388b22381cf522abf088b6b Mon Sep 17 00:00:00 2001 From: Neil Brayfield Date: Tue, 7 Sep 2021 22:27:53 +0100 Subject: [PATCH 4/4] Add scripts to vscode ignore --- .vscodeignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.vscodeignore b/.vscodeignore index 862071a..96fe2c4 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -9,6 +9,7 @@ out/src/** !out/src/extension.js.map test/** src/** +scripts/** **/*.map .travis.yml .gitignore