padawan-php / padawan.php

php intelligent code completion http server
http://mkusher.name/padawan/
MIT License
253 stars 30 forks source link

Inline @var syntax #73

Open kokx opened 7 years ago

kokx commented 7 years ago

Implement inline @var syntax.

Sometimes, you know for a fact that some function returns a certain type. However, type hinting won't work because the function is too generic for that. For example, with the ZF2 ServiceManager:

<?php
use My\Job;

$job = $sm->get(Job::class);
/* @var $job Job */

$job->...

In this case, it would be great to have autocompletion for $job as well. However, padawan.php just marks it as a generic object.

This syntax has been implemented by many IDE's, for example NetBeans.

mkusher commented 7 years ago

@kokx now @var works only before assignment, like this

<?php
use My\Job;

/* @var $job Job */
$job = $sm->get(Job::class);

$job->... // type of $job is Job here
kokx commented 7 years ago

Thanks for the comment @mkusher. Unfortunately however, I cannot reproduce that. Even after a re-index and restart of padawan.php it doesn't work. It still tells me that $job is an object.

pbogut commented 7 years ago

Shouldn't it be /** @var $job Job */ instead of /* @var $job Job */ ? Note two asterisks.

mkusher commented 7 years ago

oh, @pbogut is right :)

kokx commented 7 years ago

@pbogut That gives a little different result. It now assigns the current namespace (without class) to the variable. See this screenshot:

var-inline-mistake (the current namespace here is Debtor\Service).

Using /** @var Job $job */ does work correctly. So thanks for the hint!

Still, I think it is a good idea to implement the same syntax as NetBeans and PhpStorm, for teams in which different editors are used (such as my team).

mkusher commented 7 years ago

@kokx now padawan partially supports doc-comments, which are using double asterisk(and phpstorm understands this syntax too).

kokx commented 7 years ago

@mkusher Yeah, I completely get that. I'm just saying that it would be a nice feature to have (imo not top priority). Since a lot of code bases already use that syntax.

halftan commented 7 years ago

will implement in #80, @kokx @pbogut please checkout my development branch to test the feature. The inline type hinting formats are:

// Eclipse's approach of type hint
/** @var $inst Class */
$inst = new $className();

// phpdoc-like approach
for ($items as $item) {
    /** @var Class $item */
}

// also works in closure
array_map($array, function($a, $b) {
    /** @var Class $a */
    /** @var Class $b */
    // or maybe in block ( not available now)
    /**
     * @var Class $a
     * @var Class $b
     **/
});