diff --git a/README.md b/README.md index 26383b0..1e32183 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,18 @@ And then point to that phan installation: ## Release History +### 0.0.8 (2018-02-04) + +- Bump Phan version in composer.lock from 0.10.3 to 0.10.4-dev + See [Phan's NEWS](https://raw.githubusercontent.com/phan/phan/fbb3be4fd6953fa9a56eb765e5c6d07d538640cb/NEWS) for more details + + - Phan supports analyzing `array` and `array` syntax in PHPDoc and in Phan's internal type system. + (Previously, Phan would internally represent generic arrays as `T[]` (i.e. wouldn't track key types)) + - Various improvements and bug fixes. +- Add a new VSCode configuration option `phan.analyzeOnlyOnSave` (off by default). (#6) + If you set this to true, Phan will analyze the file only when you open/save the file (And not while editing or typing). + This is useful on large projects or PHP files. + ### 0.0.8 (2018-01-20) - Bump Phan version in composer.lock from 0.10.3-dev to 0.10.3 diff --git a/composer.json b/composer.json index 54bf624..df6fd68 100644 --- a/composer.json +++ b/composer.json @@ -2,6 +2,6 @@ "minimum-stability": "dev", "prefer-stable": true, "require": { - "phan/phan": "0.10.3" + "phan/phan": "dev-master" } } diff --git a/composer.lock b/composer.lock index 2b39931..05a60d8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "b31c5c8614c1ae16b57d4f6dca596056", + "content-hash": "ad6d5f0e6384ed6a2e3aba7a53aa5140", "packages": [ { "name": "felixfbecker/advanced-json-rpc", @@ -132,16 +132,16 @@ }, { "name": "nikic/php-parser", - "version": "v3.1.3", + "version": "v3.1.4", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "579f4ce846734a1cf55d6a531d00ca07a43e3cda" + "reference": "e57b3a09784f846411aa7ed664eedb73e3399078" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/579f4ce846734a1cf55d6a531d00ca07a43e3cda", - "reference": "579f4ce846734a1cf55d6a531d00ca07a43e3cda", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/e57b3a09784f846411aa7ed664eedb73e3399078", + "reference": "e57b3a09784f846411aa7ed664eedb73e3399078", "shasum": "" }, "require": { @@ -179,20 +179,20 @@ "parser", "php" ], - "time": "2017-12-26T14:43:21+00:00" + "time": "2018-01-25T21:31:33+00:00" }, { "name": "phan/phan", - "version": "0.10.3", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/phan/phan.git", - "reference": "c39ac07622ff18ed13eb4ee0e53087c59f83ed5e" + "reference": "2cc968402081f09326369a98af4a80f2d57f07fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phan/phan/zipball/c39ac07622ff18ed13eb4ee0e53087c59f83ed5e", - "reference": "c39ac07622ff18ed13eb4ee0e53087c59f83ed5e", + "url": "https://api.github.com/repos/phan/phan/zipball/2cc968402081f09326369a98af4a80f2d57f07fb", + "reference": "2cc968402081f09326369a98af4a80f2d57f07fb", "shasum": "" }, "require": { @@ -239,7 +239,7 @@ "php", "static" ], - "time": "2018-01-20T21:28:42+00:00" + "time": "2018-02-04T23:25:38+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -297,16 +297,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "4.2.0", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "66465776cfc249844bde6d117abff1d22e06c2da" + "reference": "94fd0001232e47129dd3504189fa1c7225010d08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/66465776cfc249844bde6d117abff1d22e06c2da", - "reference": "66465776cfc249844bde6d117abff1d22e06c2da", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08", "shasum": "" }, "require": { @@ -344,7 +344,7 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-27T17:38:31+00:00" + "time": "2017-11-30T07:14:17+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -455,16 +455,16 @@ }, { "name": "symfony/console", - "version": "v4.0.3", + "version": "v4.0.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "fe0e69d7162cba0885791cf7eea5f0d7bc0f897e" + "reference": "36d5b41e7d4e1ccf0370f6babe966c08ef0a1488" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/fe0e69d7162cba0885791cf7eea5f0d7bc0f897e", - "reference": "fe0e69d7162cba0885791cf7eea5f0d7bc0f897e", + "url": "https://api.github.com/repos/symfony/console/zipball/36d5b41e7d4e1ccf0370f6babe966c08ef0a1488", + "reference": "36d5b41e7d4e1ccf0370f6babe966c08ef0a1488", "shasum": "" }, "require": { @@ -519,20 +519,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:38:00+00:00" + "time": "2018-01-29T09:06:29+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.6.0", + "version": "v1.7.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296" + "reference": "78be803ce01e55d3491c1397cf1c64beb9c1b63b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", - "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/78be803ce01e55d3491c1397cf1c64beb9c1b63b", + "reference": "78be803ce01e55d3491c1397cf1c64beb9c1b63b", "shasum": "" }, "require": { @@ -544,7 +544,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "1.7-dev" } }, "autoload": { @@ -578,20 +578,20 @@ "portable", "shim" ], - "time": "2017-10-11T12:05:26+00:00" + "time": "2018-01-30T19:27:44+00:00" }, { "name": "webmozart/assert", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" + "reference": "0df1908962e7a3071564e857d86874dad1ef204a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", + "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", + "reference": "0df1908962e7a3071564e857d86874dad1ef204a", "shasum": "" }, "require": { @@ -628,13 +628,15 @@ "check", "validate" ], - "time": "2016-11-23T20:04:58+00:00" + "time": "2018-01-29T19:49:41+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "dev", - "stability-flags": [], + "stability-flags": { + "phan/phan": 20 + }, "prefer-stable": true, "prefer-lowest": false, "platform": [], diff --git a/package-lock.json b/package-lock.json index 7f2f1ae..4561039 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,13 @@ { "name": "php-phan", - "version": "0.0.8-dev", + "version": "0.0.9", "lockfileVersion": 1, "requires": true, "dependencies": { "@types/mocha": { - "version": "2.2.46", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.46.tgz", - "integrity": "sha512-fwTTP5QLf4xHMkv7ovcKvmlLWX3GrxCa5DRQDOilVyYGCp+arZTAQJCy7/4GKezzYJjfWMpB/Cy4e8nrc9XioA==", + "version": "2.2.48", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", "dev": true }, "@types/mz": { @@ -26,9 +26,9 @@ "dev": true }, "@types/semver": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.4.0.tgz", - "integrity": "sha512-PBHCvO98hNec9A491vBbh0ZNDOVxccwKL1u2pm6fs9oDgm7SEnw0lEHqHfjsYryDxnE3zaf7LvERWEXjOp1hig==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", "dev": true }, "ajv": { @@ -351,7 +351,7 @@ "dom-serializer": "0.1.0", "entities": "1.1.1", "htmlparser2": "3.9.2", - "lodash": "4.17.4", + "lodash": "4.17.5", "parse5": "3.0.3" } }, @@ -1743,13 +1743,13 @@ "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=", "dev": true, "requires": { - "uc.micro": "1.0.3" + "uc.micro": "1.0.5" } }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", "dev": true }, "lodash._basecopy": { @@ -1893,7 +1893,7 @@ "entities": "1.1.1", "linkify-it": "2.0.3", "mdurl": "1.0.1", - "uc.micro": "1.0.3" + "uc.micro": "1.0.5" } }, "mdurl": { @@ -2220,7 +2220,7 @@ "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", "dev": true, "requires": { - "semver": "5.4.1" + "semver": "5.5.0" } }, "parse5": { @@ -2626,9 +2626,9 @@ "dev": true }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, "sntp": { "version": "1.0.9", @@ -2902,7 +2902,7 @@ "js-yaml": "3.10.0", "minimatch": "3.0.4", "resolve": "1.5.0", - "semver": "5.4.1", + "semver": "5.5.0", "tslib": "1.9.0", "tsutils": "2.19.1" } @@ -2946,15 +2946,15 @@ } }, "typescript": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", - "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.1.tgz", + "integrity": "sha512-bqB1yS6o9TNA9ZC/MJxM0FZzPnZdtHj0xWK/IZ5khzVqdpGul/R/EIiHRgFXlwTD7PSIaYVnGKq1QgMCu2mnqw==", "dev": true }, "uc.micro": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz", - "integrity": "sha1-ftUNXg+an7ClczeSWfKndFjVAZI=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz", + "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==", "dev": true }, "underscore": { @@ -3097,23 +3097,23 @@ } }, "vsce": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.35.0.tgz", - "integrity": "sha512-haTQ17f/fD46XjsdZSnDDmHtPuq9dOpQCz4ZI8DZ3gDkkyP260JFR+Brp1TTMK6Hm9pT7bi7DeH3YPkK8PJAiA==", + "version": "1.36.1", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.36.1.tgz", + "integrity": "sha512-nkKGXrnkpaWAUs4920mT271DUQ4pskMWTeUtd5pVNaQiJW4qbPata1sgAWmQPSjdbNQq1ZQe1RvVzWqmBPgtkg==", "dev": true, "requires": { "cheerio": "1.0.0-rc.2", "commander": "2.13.0", "denodeify": "1.2.1", "glob": "7.1.2", - "lodash": "4.17.4", + "lodash": "4.17.5", "markdown-it": "8.4.0", "mime": "1.6.0", "minimatch": "3.0.4", "osenv": "0.1.4", "parse-semver": "1.1.1", "read": "1.0.7", - "semver": "5.4.1", + "semver": "5.5.0", "tmp": "0.0.29", "url-join": "1.1.0", "vso-node-api": "6.1.2-preview", @@ -3137,38 +3137,38 @@ "gulp-vinyl-zip": "2.1.0", "mocha": "4.1.0", "request": "2.83.0", - "semver": "5.4.1", + "semver": "5.5.0", "source-map-support": "0.5.2", "url-parse": "1.2.0", "vinyl-source-stream": "1.1.2" } }, "vscode-jsonrpc": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-3.4.1.tgz", - "integrity": "sha1-4uC54SH3GitUSAWKNKOu+DdqXpE=" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-3.5.0.tgz", + "integrity": "sha1-hyOdnhZrLXNSJFuKgTWXgEwdY6o=" }, "vscode-languageclient": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-3.4.5.tgz", - "integrity": "sha1-YjAHKrB3IIXQm0j5m3nnxCHd+7c=", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-3.5.0.tgz", + "integrity": "sha1-NtAswYaoNlpEZ3GaKQ+yAKmuSQo=", "requires": { - "vscode-languageserver-protocol": "3.4.4" + "vscode-languageserver-protocol": "3.5.0" } }, "vscode-languageserver-protocol": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.4.4.tgz", - "integrity": "sha1-A4e7Sb0PgF6QSMaVmX29Qw1uyig=", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.5.0.tgz", + "integrity": "sha1-Bnxcvidwl5U5jRGWksl+u6FFIgk=", "requires": { - "vscode-jsonrpc": "3.4.1", - "vscode-languageserver-types": "3.4.0" + "vscode-jsonrpc": "3.5.0", + "vscode-languageserver-types": "3.5.0" } }, "vscode-languageserver-types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.4.0.tgz", - "integrity": "sha1-UEOuR+5KwWrwe7PQylYSNeDA0vo=" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.5.0.tgz", + "integrity": "sha1-5I15li8LjgLelV4/UkkI4rGcA3Q=" }, "vso-node-api": { "version": "6.1.2-preview", diff --git a/package.json b/package.json index 815f32c..1b0da97 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "license": "MIT", "private": true, "preview": false, - "version": "0.0.8", + "version": "0.0.9", "engines": { "vscode": "^1.16.0", "os": [ @@ -49,19 +49,19 @@ "lint": "tslint -c tslint.json \"src/**/*.ts\"" }, "devDependencies": { - "@types/mocha": "^2.2.42", + "@types/mocha": "^2.2.48", "@types/mz": "0.0.31", "@types/node": "^8.0.24", - "@types/semver": "^5.3.34", + "@types/semver": "^5.5.0", "tslint": "^5.7.0", - "typescript": "^2.5.2", - "vsce": "^1.8.1", + "typescript": "^2.7.1", + "vsce": "^1.36.1", "vscode": "^1.1.0" }, "dependencies": { "mz": "^2.4.0", - "semver": "^5.3.0", - "vscode-languageclient": "^3.4.0" + "semver": "^5.5.0", + "vscode-languageclient": "^3.5.0" }, "contributes": { "configuration": { @@ -107,6 +107,13 @@ "default": false, "description": "Enable this to make a best effort at analyzing the remaining valid statements of PHP files with syntax errors. (Phan will continue emitting syntax errors). (Modifying requires restart)" }, + "phan.analyzeOnlyOnSave": { + "type": [ + "boolean" + ], + "default": false, + "description": "Enable this to run Phan analysis only on file save (Not while editing the file). This greatly reduces CPU usage, but you don't learn about potential issues as promptly." + }, "phan.quick": { "type": [ "boolean" diff --git a/src/extension.ts b/src/extension.ts index 7ba06fe..2e04a99 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -175,6 +175,7 @@ export async function activate(context: vscode.ExtensionContext): Promise const analyzedProjectDirectory = conf.get('analyzedProjectDirectory') || ''; const enableDebugLog = conf.get('enableDebugLog'); const useFallbackParser = conf.get('useFallbackParser'); + const analyzeOnlyOnSave = conf.get('analyzeOnlyOnSave'); const memoryLimit = conf.get('memoryLimit') || null; const additionalCLIFlags = conf.get('additionalCLIFlags') || []; const quick = conf.get('quick'); @@ -221,10 +222,29 @@ export async function activate(context: vscode.ExtensionContext): Promise } const serverOptions = () => new Promise((resolve, reject) => { - function spawnServer(...args: string[]): ChildProcess { + // NOTE: Phan isn't going to work on win32, unless we use linux subsystem (Haven't tried) or docker + + // Use a TCP socket because of problems with blocking STDIO + // stdio locks up for large responses + // (based on https://github.com/felixfbecker/vscode-php-intellisense/commit/ddddf2a178e4e9bf3d52efb07cd05820ce109f43) + const server = net.createServer(socket => { + // 'connection' listener + console.log('PHP process connected'); + socket.on('end', () => { + console.log('PHP process disconnected'); + }); + server.close(); + resolve({ reader: socket, writer: socket }); + }); + // Listen on random port + server.listen(0, '127.0.0.1', () => { + const args = []; if (additionalCLIFlags.length > 0) { args.unshift(...additionalCLIFlags); } + // Start the language server and connect to the client listening on (e.g. 127.0.0.1:) + args.unshift('--language-server-tcp-connect=127.0.0.1:' + server.address().port); + // Aside: Max setting is 4095M if (memoryLimit && memoryLimit.length > 0) { args.unshift('--memory-limit', memoryLimit); } @@ -232,12 +252,16 @@ export async function activate(context: vscode.ExtensionContext): Promise // php phan --use-fallback-parser [args] args.unshift('--use-fallback-parser'); } + if (analyzeOnlyOnSave) { + // php phan --language-server-analyze-only-on-save [args] + args.unshift('--language-server-analyze-only-on-save'); + } if (enableDebugLog) { // php phan --language-server-verbose [args] args.unshift('--language-server-verbose'); } if (quick) { - // php phan --language-server-verbose [args] + // php phan --quick [args] args.unshift('--quick'); } @@ -255,27 +279,7 @@ export async function activate(context: vscode.ExtensionContext): Promise }); } return childProcess; - } - // Not going to work on win32, unless we use linux subsystem (Haven't tried) or docker - if (process.platform === 'win32') { - // Use a TCP socket on Windows because of blocking STDIO - const server = net.createServer(socket => { - // 'connection' listener - console.log('PHP process connected'); - socket.on('end', () => { - console.log('PHP process disconnected'); - }); - server.close(); - resolve({ reader: socket, writer: socket }); - }); - // Listen on random port - server.listen(0, '127.0.0.1', () => { - spawnServer('--language-server-tcp-server=127.0.0.1:' + server.address().port); - }); - } else { - // Use STDIO on Linux / Mac - resolve(spawnServer('--language-server-on-stdin')); - } + }); }); // Options to control the language client