diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index b3153ab1..86114716 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: bug assignees: '' - --- **Describe the bug** diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 982a4dc0..a09346af 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -4,7 +4,6 @@ about: Suggest an idea for this project title: '' labels: feature-request assignees: '' - --- **Is your feature request related to a problem? Please describe.** diff --git a/.github/ISSUE_TEMPLATE/other-issue.md b/.github/ISSUE_TEMPLATE/other-issue.md index 66864b61..c5a5faf2 100644 --- a/.github/ISSUE_TEMPLATE/other-issue.md +++ b/.github/ISSUE_TEMPLATE/other-issue.md @@ -4,7 +4,6 @@ about: Any other issue not covered by the above templates title: '' labels: '' assignees: '' - --- **Describe the issue** diff --git a/.github/ISSUE_TEMPLATE/syntax-highlighting.md b/.github/ISSUE_TEMPLATE/syntax-highlighting.md index 4ab6c061..66da87a6 100644 --- a/.github/ISSUE_TEMPLATE/syntax-highlighting.md +++ b/.github/ISSUE_TEMPLATE/syntax-highlighting.md @@ -4,7 +4,6 @@ about: Create a bug report for erroneous syntax highlighting title: '' labels: syntax-highlight assignees: '' - --- **Describe the bug** diff --git a/CHANGELOG.md b/CHANGELOG.md index 47c6b010..280e55f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +## [2.6.1] + +### Fixed + +- Fixes log channel not initialising when extension fails to activate + ([#286](https://github.com/krvajal/vscode-fortran-support/issues/286)) + +## [2.6.0] + +### Added + +- Adds support for variable and path interpolation along with glob expressions + ([#231](https://github.com/krvajal/vscode-fortran-support/issues/231)) + ([#86](https://github.com/krvajal/vscode-fortran-support/issues/86)) +- Adds explicit option `linterModOutput` for module output + ([#176](https://github.com/krvajal/vscode-fortran-support/issues/176)) + ## [2.5.0] ### Added @@ -319,7 +336,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Initial release -[unreleased]: https://github.com/krvajal/vscode-fortran-support/compare/v2.5.0...HEAD +[unreleased]: https://github.com/krvajal/vscode-fortran-support/compare/v2.6.1...HEAD +[2.6.1]: https://github.com/krvajal/vscode-fortran-support/compare/v2.6.0...v2.6.1 +[2.6.0]: https://github.com/krvajal/vscode-fortran-support/compare/v2.5.0...v2.6.0 [2.5.0]: https://github.com/krvajal/vscode-fortran-support/compare/v2.4.3...v2.5.0 [2.4.3]: https://github.com/krvajal/vscode-fortran-support/compare/v2.4.2...v2.4.3 [2.4.2]: https://github.com/krvajal/vscode-fortran-support/compare/v2.4.1...v2.4.2 diff --git a/README.md b/README.md index dcdc51c8..c05b0264 100644 --- a/README.md +++ b/README.md @@ -144,9 +144,9 @@ Two formatters are supported [`findent`](https://github.com/gnikit/findent-pypi) and [`fprettify`](https://github.com/pseewald/fprettify). Both of them can be installed with `pip` automatically through the extension. -findent | fprettify -:-------------------------:|:-------------------------: -![](./images/findent-demo.gif) | ![](./images/fprettify-demo.gif) +| findent | fprettify | +| :----------------------------: | :------------------------------: | +| ![](./images/findent-demo.gif) | ![](./images/fprettify-demo.gif) | The formatter is controlled by the user option diff --git a/package-lock.json b/package-lock.json index 6c2ec454..e673f9d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,16 @@ { "name": "linter-gfortran", - "version": "2.5.0", + "version": "2.6.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "linter-gfortran", - "version": "2.5.0", + "version": "2.6.1", "license": "MIT", "dependencies": { + "fast-glob": "^3.2.7", + "glob": "^7.2.0", "vscode-languageclient": "^7.0.0", "which": "^2.0.2" }, @@ -25,7 +27,6 @@ "eslint-plugin-import": "^2.25.3", "eslint-plugin-jsdoc": "^37.0.3", "eslint-plugin-prettier": "^4.0.0", - "glob": "^7.2.0", "husky": "^7.0.0", "lint-staged": "^11.2.6", "mocha": "^9.1.3", @@ -210,7 +211,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -223,7 +223,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -232,7 +231,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -736,7 +734,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -1579,7 +1576,6 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1595,7 +1591,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -1619,7 +1614,6 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -1640,7 +1634,6 @@ "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, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1691,8 +1684,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/fsevents": { "version": "2.3.2", @@ -1808,7 +1800,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2050,7 +2041,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2059,8 +2049,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { "version": "1.0.3", @@ -2165,7 +2154,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2183,7 +2171,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -2207,7 +2194,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -2620,7 +2606,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -2629,7 +2614,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, "dependencies": { "braces": "^3.0.1", "picomatch": "^2.2.3" @@ -2932,7 +2916,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "dependencies": { "wrappy": "1" } @@ -3060,7 +3043,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3093,7 +3075,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -3183,7 +3164,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -3310,7 +3290,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -3335,7 +3314,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -3652,7 +3630,6 @@ "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, "dependencies": { "is-number": "^7.0.0" }, @@ -4015,8 +3992,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/y18n": { "version": "5.0.8", @@ -4238,7 +4214,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -4247,14 +4222,12 @@ "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -4605,7 +4578,6 @@ "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" } @@ -5253,7 +5225,6 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -5266,7 +5237,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -5289,7 +5259,6 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "requires": { "reusify": "^1.0.4" } @@ -5307,7 +5276,6 @@ "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" } @@ -5346,8 +5314,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", @@ -5434,7 +5401,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5595,7 +5561,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -5604,8 +5569,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "internal-slot": { "version": "1.0.3", @@ -5679,8 +5643,7 @@ "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 + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -5692,7 +5655,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -5706,8 +5668,7 @@ "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 + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { "version": "1.0.6", @@ -6014,14 +5975,12 @@ "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, "requires": { "braces": "^3.0.1", "picomatch": "^2.2.3" @@ -6234,7 +6193,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -6325,8 +6283,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "3.1.1", @@ -6349,8 +6306,7 @@ "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, "pkg-dir": { "version": "2.0.0", @@ -6412,8 +6368,7 @@ "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "randombytes": { "version": "2.1.0", @@ -6503,8 +6458,7 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rimraf": { "version": "3.0.2", @@ -6519,7 +6473,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -6756,7 +6709,6 @@ "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" } @@ -7046,8 +6998,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "y18n": { "version": "5.0.8", diff --git a/package.json b/package.json index 0f1c3200..98468973 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "linter-gfortran", "displayName": "Modern Fortran", "description": "Modern Fortran language support, including syntax highlighting and error detection.", - "version": "2.5.0", + "version": "2.6.1", "publisher": "krvajalm", "license": "MIT", "author": { @@ -160,6 +160,11 @@ ], "description": "Specify additional options to use when calling the gfortran compiler" }, + "fortran.linterModOutput": { + "type": "string", + "default": "", + "description": "Global output directory for .mod files `-J`" + }, "fortran.formatting.formatter": { "type": "string", "default": "findent", @@ -259,7 +264,6 @@ "eslint-plugin-import": "^2.25.3", "eslint-plugin-jsdoc": "^37.0.3", "eslint-plugin-prettier": "^4.0.0", - "glob": "^7.2.0", "husky": "^7.0.0", "lint-staged": "^11.2.6", "mocha": "^9.1.3", @@ -275,6 +279,8 @@ ] }, "dependencies": { + "fast-glob": "^3.2.7", + "glob": "^7.2.0", "vscode-languageclient": "^7.0.0", "which": "^2.0.2" } diff --git a/src/extension.ts b/src/extension.ts index df0b13c3..6bc4247c 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -14,8 +14,10 @@ import * as pkg from '../package.json'; import { LANG_SERVER_TOOL_ID } from './lib/tools'; import { FortranFormattingProvider } from './features/formatting-provider'; +// Make it global to catch errors when activation fails +const loggingService = new LoggingService(); + export function activate(context: vscode.ExtensionContext) { - const loggingService = new LoggingService(); const extensionConfig = vscode.workspace.getConfiguration(EXTENSION_ID); loggingService.logInfo(`Extension Name: ${pkg.displayName}`); diff --git a/src/features/linter-provider.ts b/src/features/linter-provider.ts index 637dfae7..30afb831 100644 --- a/src/features/linter-provider.ts +++ b/src/features/linter-provider.ts @@ -6,6 +6,9 @@ import { FORTRAN_DOCUMENT_SELECTOR, getIncludeParams } from '../lib/helper'; import * as vscode from 'vscode'; import { LoggingService } from '../services/logging-service'; +import { resolveVariables } from '../lib/tools'; +import * as fg from 'fast-glob'; +import { glob } from 'glob'; export default class FortranLintingProvider { constructor(private loggingService: LoggingService) {} @@ -95,12 +98,12 @@ export default class FortranLintingProvider { } private constructArgumentList(textDocument: vscode.TextDocument): string[] { - const options = vscode.workspace.rootPath ? { cwd: vscode.workspace.rootPath } : undefined; const args = [ '-fsyntax-only', '-cpp', '-fdiagnostics-show-option', ...this.getLinterExtraArgs(), + this.getModOutputDir(), ]; const includePaths = this.getIncludePaths(); @@ -159,12 +162,53 @@ export default class FortranLintingProvider { this.command.dispose(); } + private getModOutputDir(): string { + const config = vscode.workspace.getConfiguration('fortran'); + let modout: string = config.get('linterModOutput', ''); + if (modout) { + modout = '-J' + resolveVariables(modout); + this.loggingService.logInfo(`Linter.moduleOutput`); + } + return modout; + } + private getIncludePaths(): string[] { const config = vscode.workspace.getConfiguration('fortran'); const includePaths: string[] = config.get('includePaths', []); - - return includePaths; + // Output the original include paths + this.loggingService.logInfo(`Linter.include:\n${includePaths.join('\r\n')}`); + // Resolve internal variables and expand glob patterns + const resIncludePaths = includePaths.map(e => resolveVariables(e)); + // This needs to be after the resolvevariables since {} are used in globs + try { + const globIncPaths: string[] = fg.sync(resIncludePaths, { + onlyDirectories: true, + suppressErrors: false, + }); + return globIncPaths; + // Try to recover from fast-glob failing due to EACCES using slower more + // robust glob. + } catch (eacces) { + this.loggingService.logWarning(`You lack read permissions for an include directory + or more likely a glob match from the input 'includePaths' list. This can happen when + using overly broad root level glob patters e.g. /usr/lib/** . + No reason to worry. I will attempt to recover. + You should consider adjusting your 'includePaths' if linting performance is slow.`); + this.loggingService.logWarning(`${eacces.message}`); + try { + const globIncPaths: string[] = []; + for (const i of resIncludePaths) { + // use '/' to match only directories and not files + globIncPaths.push(...glob.sync(i + '/', { strict: false })); + } + return globIncPaths; + // if we failed again then our includes are somehow wrong. Abort + } catch (error) { + this.loggingService.logError(`Failed to recover: ${error}`); + } + } } + private getGfortranPath(): string { const config = vscode.workspace.getConfiguration('fortran'); const gfortranPath = config.get('gfortranExecutable', 'gfortran'); @@ -174,6 +218,8 @@ export default class FortranLintingProvider { private getLinterExtraArgs(): string[] { const config = vscode.workspace.getConfiguration('fortran'); - return config.get('linterExtraArgs', ['-Wall']); + const args = config.get('linterExtraArgs', ['-Wall']).map(e => resolveVariables(e)); + this.loggingService.logInfo(`Linter.arguments:\n${args.join('\r\n')}`); + return args.map(e => resolveVariables(e)); } } diff --git a/src/lib/helper.ts b/src/lib/helper.ts index 0753e793..794c0c09 100644 --- a/src/lib/helper.ts +++ b/src/lib/helper.ts @@ -157,3 +157,35 @@ export function promptForMissingTool( ); }); } + +export function isUri(input: any): input is vscode.Uri { + return input && input instanceof vscode.Uri; +} + +export function isString(input: any): input is string { + return typeof input === 'string'; +} + +export function isNumber(input: any): input is number { + return typeof input === 'number'; +} + +export function isBoolean(input: any): input is boolean { + return typeof input === 'boolean'; +} + +export function isObject(input: any): input is object { + return typeof input === 'object'; +} + +export function isArray(input: any): input is any[] { + return input instanceof Array; +} + +export function isOptionalString(input: any): input is string | undefined { + return input === undefined || isString(input); +} + +export function isArrayOfString(input: any): input is string[] { + return isArray(input) && input.every(isString); +} diff --git a/src/lib/tools.ts b/src/lib/tools.ts index 1fafdc8a..a295d96e 100644 --- a/src/lib/tools.ts +++ b/src/lib/tools.ts @@ -1,8 +1,15 @@ export const LANG_SERVER_TOOL_ID = 'fortran-language-server'; export const FORMATTERS = ['Disabled', 'findent', 'fprettify']; +import * as os from 'os'; +import * as vscode from 'vscode'; +import * as assert from 'assert'; import * as cp from 'child_process'; import { LoggingService } from '../services/logging-service'; +import { isString, isArrayOfString } from './helper'; + +// Platform-specific environment variable delimiter +export const envDelimiter: string = process.platform === 'win32' ? ';' : ':'; export function installPythonTool(pyPackage: string, logger?: LoggingService) { const installProcess = cp.spawn('pip', 'install --user --upgrade '.concat(pyPackage).split(' ')); @@ -20,3 +27,96 @@ export function installPythonTool(pyPackage: string, logger?: LoggingService) { logger.logError(`${err}`); }); } + +/** + * Resolve VSCode internal variables `workspaceFolder`, `env`, `config`, etc. + * + * @param input string for which we will substitute internal variables + * @param additionalEnvironment Additional environmental variables + * @returns + */ +export function resolveVariables( + input: string | undefined, + additionalEnvironment?: { [key: string]: string | string[] } +): string { + if (!input) { + return ''; + // return new Promise((resolve) => { resolve("") }); + } + + // Replace environment and configuration variables. + let regexp: () => RegExp = () => + /\$\{((env|config|workspaceFolder|file|fileDirname|fileBasenameNoExtension)(\.|:))?(.*?)\}/g; + let ret: string = input; + const cycleCache: Set = new Set(); + while (!cycleCache.has(ret)) { + cycleCache.add(ret); + ret = ret.replace( + regexp(), + (match: string, ignored1: string, varType: string, ignored2: string, name: string) => { + // Historically, if the variable didn't have anything before the "." or ":" + // it was assumed to be an environment variable + // We ignore that and we make it to be workspacefolder + if (!varType) { + varType = 'workspaceFolder'; + } + let newValue: string | undefined; + switch (varType) { + case 'env': { + if (additionalEnvironment) { + const v: string | string[] | undefined = additionalEnvironment[name]; + if (isString(v)) { + newValue = v; + } else if (input === match && isArrayOfString(v)) { + newValue = v.join(envDelimiter); + } + } + if (newValue === undefined) { + newValue = process.env[name]; + } + break; + } + case 'config': { + const config: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration(); + if (config) { + newValue = config.get(name); + } + break; + } + case 'workspaceFolder': { + // Only replace ${workspaceFolder:name} variables for now. + // We may consider doing replacement of ${workspaceFolder} here later, but we would have to update the language server and also + // intercept messages with paths in them and add the ${workspaceFolder} variable back in (e.g. for light bulb suggestions) + if (name && vscode.workspace && vscode.workspace.workspaceFolders) { + let folder: vscode.WorkspaceFolder | undefined = + vscode.workspace.workspaceFolders.find( + folder => folder.name.toLocaleLowerCase() === name.toLocaleLowerCase() + ); + if (folder) { + newValue = folder.uri.fsPath; + } + // If ${workspaceFolder:workspacename} fails or doesn't exist go to + // the first availbale workspaceFolder and assign its path + else { + folder = vscode.workspace.workspaceFolders[0]; + newValue = folder.uri.fsPath; + } + } + break; + } + default: { + assert.fail('unknown varType matched'); + } + } + return newValue !== undefined ? newValue : match; + } + ); + } + + // Resolve '~' at the start of the path. + regexp = () => /^~/g; + ret = ret.replace(regexp(), (match: string, name: string) => os.homedir()); + + return ret; + // return new Promise((resolve) => { resolve(ret) }); +} diff --git a/yarn.lock b/yarn.lock index 8c48b7f0..3e3c6bdb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -914,7 +914,7 @@ "resolved" "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" "version" "1.2.0" -"fast-glob@^3.1.1": +"fast-glob@^3.1.1", "fast-glob@^3.2.7": "integrity" "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==" "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz" "version" "3.2.7"