diff --git a/.dockerignore b/.dockerignore index a839c69..29f27b6 100644 --- a/.dockerignore +++ b/.dockerignore @@ -7,3 +7,4 @@ fixtures/ coverage/ coverage.xml images/ +node_modules/ diff --git a/.editorconfig b/.editorconfig index d162066..2954e68 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,7 +7,7 @@ trim_trailing_whitespace = true indent_style = space indent_size = 4 -[*.json,*.yml] +[*.{json,yml}] indent_size = 2 [composer.json] diff --git a/.gitignore b/.gitignore index f6b089b..6476dbe 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ vendor/ .phpls/ composer.lock stubs -*.ast \ No newline at end of file +*.ast +node_modules/ diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..43c97e7 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/.travis.yml b/.travis.yml index 05ebb2a..16dcb76 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,10 +11,10 @@ services: cache: directories: - $HOME/.composer/cache + - $HOME/.npm install: - composer install --prefer-dist --no-interaction - - composer run-script parse-stubs script: - vendor/bin/phpcs -n @@ -22,9 +22,12 @@ script: after_success: - bash <(curl -s https://codecov.io/bash) - - | - if [[ $TRAVIS_TAG == v* ]]; then - docker build -t felixfbecker/php-language-server:${TRAVIS_TAG:1} . - docker login -e="$DOCKER_EMAIL" -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" - docker push felixfbecker/php-language-server:${TRAVIS_TAG:1} - fi + - git config --replace-all remote.origin.fetch +refs/heads/*:refs/remotes/origin/* + - git fetch --tags + - nvm install 8 && nvm use 8 + - npm install + - npm run semantic-release + +branches: + except: + - /^v\d+\.\d+\.\d+$/ diff --git a/README.md b/README.md index 3745ff6..0aad4e5 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ [![Build Status](https://travis-ci.org/felixfbecker/php-language-server.svg?branch=master)](https://travis-ci.org/felixfbecker/php-language-server) [![Coverage](https://codecov.io/gh/felixfbecker/php-language-server/branch/master/graph/badge.svg)](https://codecov.io/gh/felixfbecker/php-language-server) [![Dependency Status](https://gemnasium.com/badges/github.com/felixfbecker/php-language-server.svg)](https://gemnasium.com/github.com/felixfbecker/php-language-server) +[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%207.0-8892BF.svg)](https://php.net/) [![License](https://img.shields.io/packagist/l/felixfbecker/language-server.svg)](https://github.com/felixfbecker/php-language-server/blob/master/LICENSE.txt) [![Gitter](https://badges.gitter.im/felixfbecker/php-language-server.svg)](https://gitter.im/felixfbecker/php-language-server?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) diff --git a/composer.json b/composer.json index 225de3b..0504c00 100644 --- a/composer.json +++ b/composer.json @@ -23,11 +23,11 @@ "require": { "php": "^7.0", "composer/composer": "^1.3", - "felixfbecker/advanced-json-rpc": "^2.0", + "felixfbecker/advanced-json-rpc": "^3.0.0", "jetbrains/phpstorm-stubs": "dev-master", "microsoft/tolerant-php-parser": "^0.0.6", "netresearch/jsonmapper": "^1.0", - "phpdocumentor/reflection-docblock": "~3.1.1", + "phpdocumentor/reflection-docblock": "^4.0.0", "sabre/event": "^5.0", "sabre/uri": "^2.0", "squizlabs/php_codesniffer": "3.0.0RC3", diff --git a/dependencies.yml b/dependencies.yml new file mode 100644 index 0000000..320ae87 --- /dev/null +++ b/dependencies.yml @@ -0,0 +1,10 @@ +collectors: + +- type: php-composer + path: / + actors: + # pull requests for new major versions + - type: php-composer + versions: "Y.0.0" + settings: + commit_message_prefix: "chore: " diff --git a/package.json b/package.json new file mode 100644 index 0000000..d67062f --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "php-language-server", + "version": "0.0.0-development", + "private": true, + "scripts": { + "commitmsg": "validate-commit-msg", + "semantic-release": "semantic-release pre && ./release-docker.sh && semantic-release post" + }, + "devDependencies": { + "cz-conventional-changelog": "^2.0.0", + "husky": "^0.14.3", + "last-release-git": "0.0.3", + "semantic-release": "^8.2.0", + "validate-commit-msg": "^2.14.0" + }, + "config": { + "commitizen": { + "path": "./node_modules/cz-conventional-changelog" + } + }, + "release": { + "getLastRelease": "last-release-git" + }, + "repository": { + "type": "git", + "url": "https://github.com/felixfbecker/php-language-server.git" + } +} diff --git a/release-docker.sh b/release-docker.sh new file mode 100644 index 0000000..35e89d9 --- /dev/null +++ b/release-docker.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -e + +docker build -t felixfbecker/php-language-server:${TRAVIS_TAG:1} . +docker login -e="$DOCKER_EMAIL" -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" +docker push felixfbecker/php-language-server:${TRAVIS_TAG:1} diff --git a/src/Definition.php b/src/Definition.php index c03e852..9a485c4 100644 --- a/src/Definition.php +++ b/src/Definition.php @@ -78,7 +78,7 @@ class Definition * For functions and methods, this is the return type. * For any other declaration it will be null. * Can also be a compound type. - * If it is unknown, will be Types\Mixed. + * If it is unknown, will be Types\Mixed_. * * @var \phpDocumentor\Type|null */ diff --git a/src/DefinitionResolver.php b/src/DefinitionResolver.php index 51c5955..dd1040e 100644 --- a/src/DefinitionResolver.php +++ b/src/DefinitionResolver.php @@ -551,7 +551,7 @@ class DefinitionResolver /** * Given an expression node, resolves that expression recursively to a type. - * If the type could not be resolved, returns Types\Mixed. + * If the type could not be resolved, returns Types\Mixed_. * * @param Node\Expression $expr * @return \phpDocumentor\Reflection\Type|null @@ -567,7 +567,7 @@ class DefinitionResolver if ($expr == null || $expr instanceof PhpParser\MissingToken || $expr instanceof PhpParser\SkippedToken) { // TODO some members are null or Missing/SkippedToken // How do we handle this more generally? - return new Types\Mixed; + return new Types\Mixed_; } // VARIABLE @@ -597,7 +597,7 @@ class DefinitionResolver // Find the function definition if ($expr->callableExpression instanceof Node\Expression) { // Cannot get type for dynamic function call - return new Types\Mixed; + return new Types\Mixed_; } if ($expr->callableExpression instanceof Node\QualifiedName) { @@ -646,7 +646,7 @@ class DefinitionResolver // MEMBER ACCESS EXPRESSION if ($expr instanceof Node\Expression\MemberAccessExpression) { if ($expr->memberName instanceof Node\Expression) { - return new Types\Mixed; + return new Types\Mixed_; } $var = $expr->dereferencableExpression; @@ -659,10 +659,10 @@ class DefinitionResolver if ($t instanceof Types\This) { $classFqn = self::getContainingClassFqn($expr); if ($classFqn === null) { - return new Types\Mixed; + return new Types\Mixed_; } } else if (!($t instanceof Types\Object_) || $t->getFqsen() === null) { - return new Types\Mixed; + return new Types\Mixed_; } else { $classFqn = substr((string)$t->getFqsen(), 1); } @@ -689,7 +689,7 @@ class DefinitionResolver if ($expr instanceof Node\Expression\ScopedPropertyAccessExpression) { $classType = $this->resolveClassNameToType($expr->scopeResolutionQualifier); if (!($classType instanceof Types\Object_) || $classType->getFqsen() === null) { - return new Types\Mixed; + return new Types\Mixed_; } $fqn = substr((string)$classType->getFqsen(), 1) . '::'; @@ -701,7 +701,7 @@ class DefinitionResolver $def = $this->index->getDefinition($fqn); if ($def === null) { - return new Types\Mixed; + return new Types\Mixed_; } return $def->type; } @@ -888,7 +888,7 @@ class DefinitionResolver if ($expr instanceof Node\Expression\SubscriptExpression) { $varType = $this->resolveExpressionNodeToType($expr->postfixExpression); if (!($varType instanceof Types\Array_)) { - return new Types\Mixed; + return new Types\Mixed_; } return $varType->getValueType(); } @@ -897,14 +897,14 @@ class DefinitionResolver // include, require, include_once, require_once if ($expr instanceof Node\Expression\ScriptInclusionExpression) { // TODO: resolve path to PhpDocument and find return statement - return new Types\Mixed; + return new Types\Mixed_; } if ($expr instanceof Node\QualifiedName) { return $this->resolveClassNameToType($expr); } - return new Types\Mixed; + return new Types\Mixed_; } @@ -918,7 +918,7 @@ class DefinitionResolver public function resolveClassNameToType($class): Type { if ($class instanceof Node\Expression) { - return new Types\Mixed; + return new Types\Mixed_; } if ($class instanceof PhpParser\Token && $class->kind === PhpParser\TokenKind::ClassKeyword) { // Anonymous class @@ -958,7 +958,7 @@ class DefinitionResolver * For classes and interfaces, this is the class type (object). * For variables / assignments, this is the documented type or type the assignment resolves to. * Can also be a compound type. - * If it is unknown, will be Types\Mixed. + * If it is unknown, will be Types\Mixed_. * Returns null if the node does not have a type. * * @param Node $node @@ -1012,7 +1012,7 @@ class DefinitionResolver } $type = $defaultType; } - return $type ?? new Types\Mixed; + return $type ?? new Types\Mixed_; } // FUNCTIONS AND METHODS @@ -1040,7 +1040,7 @@ class DefinitionResolver return new Types\Object_(new Fqsen('\\' . (string)$node->returnType->getResolvedName())); } // Unknown return type - return new Types\Mixed; + return new Types\Mixed_; } // PROPERTIES, CONSTS, CLASS CONSTS, ASSIGNMENT EXPRESSIONS @@ -1077,7 +1077,7 @@ class DefinitionResolver // TODO: read @property tags of class // TODO: Try to infer the type from default value / constant value // Unknown - return new Types\Mixed; + return new Types\Mixed_; } // The node does not have a type