diff --git a/ale_linters/php/phpcs.vim b/ale_linters/php/phpcs.vim index ce47a13b..12ca9da9 100644 --- a/ale_linters/php/phpcs.vim +++ b/ale_linters/php/phpcs.vim @@ -7,6 +7,34 @@ call ale#Set('php_phpcs_options', '') call ale#Set('php_phpcs_executable', 'phpcs') call ale#Set('php_phpcs_use_global', get(g:, 'ale_use_global_executables', 0)) +function! ale_linters#php#phpcs#GetCwd(buffer) abort + let l:result = ale#path#Dirname(ale_linters#php#phpcs#FindProjectRoot(a:buffer)) + + return empty(l:result) ? v:null : l:result +endfunction + +function! ale_linters#php#phpcs#FindProjectRoot(buffer) abort + let l:result = ale#path#FindNearestFile(a:buffer, 'phpcs.xml') + + if empty(l:result) + let l:result = ale#path#FindNearestFile(a:buffer, 'phpcs.xml.dist') + endif + + if empty(l:result) + let l:result = ale#path#FindNearestFile(a:buffer, '.phpcs.xml') + endif + + if empty(l:result) + let l:result = ale#path#FindNearestFile(a:buffer, '.phpcs.xml.dist') + endif + + if empty(l:result) + let l:result = ale#path#FindNearestFile(a:buffer, 'composer.json') + endif + + return l:result +endfunction + function! ale_linters#php#phpcs#GetCommand(buffer) abort let l:standard = ale#Var(a:buffer, 'php_phpcs_standard') let l:standard_option = !empty(l:standard) @@ -48,7 +76,7 @@ call ale#linter#Define('php', { \ 'vendor/bin/phpcs', \ 'phpcs' \ ])}, -\ 'cwd': '%s:h', +\ 'cwd': function('ale_linters#php#phpcs#GetCwd'), \ 'command': function('ale_linters#php#phpcs#GetCommand'), \ 'callback': 'ale_linters#php#phpcs#Handle', \}) diff --git a/test/linter/test_phpcs.vader b/test/linter/test_phpcs.vader index afb88e32..e6776346 100644 --- a/test/linter/test_phpcs.vader +++ b/test/linter/test_phpcs.vader @@ -11,7 +11,7 @@ Execute(The local phpcs executable should be used): let g:executable = ale#path#Simplify(g:dir . '/../test-files/phpcs/project-with-phpcs/vendor/bin/phpcs') - AssertLinterCwd '%s:h' + AssertLinterCwd ale#path#Simplify(g:dir . '/../test-files/phpcs/project-with-phpcs') AssertLinter g:executable, ale#Escape(g:executable) \ . ' -s --report=emacs --stdin-path=%s' diff --git a/test/test-files/phpcs/project-with-phpcs/composer.json b/test/test-files/phpcs/project-with-phpcs/composer.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/test/test-files/phpcs/project-with-phpcs/composer.json @@ -0,0 +1 @@ +{} \ No newline at end of file