Skip to content

Should use imports take parts of namespace in account? #742

@einenlum

Description

@einenlum

Here is a suggestion of improvement that would help me in my everyday work (so I guess maybe it could help others).

Current behavior

For now, the vim plugin only uses the word under the cursor to use classes.
This works for most cases but I think sometimes it could have a better behavior.
For people (like me) who sometimes use a part of the namespace in the typehint, here is what happens:

<?php

namespace App\Foo\Bar;

class Baz
{
    public __construct(
        Finder\User $userFinder,
        Finder\Place $placeFinder
    ) {
        $this->userFinder = $userFinder;
        $this->placeFinder = $placeFinder;
    }
}

If my cursor is on Place, I will have the following Results:

Select class:
1) App\Infrastructure\Serializer\Factory\Place
2) App\Domain\Finder\Place
3) App\Infrastructure\Doctrine\Repository\Place
4) App\Domain\Model\Place
5) App\Infrastructure\Serializer\Proxy\Place
6) App\Domain\Repository\Place

Although it is clear that the choice number 2 is the only possible answer, I get all these different results.
Moreover, if I select the choice 2, App\Domain\Finder\Place will be added in my use statements.
The expected use statement would be App\Domain\Finder though.

On the other hand, if my cursor is on Finder (although the full typehint I am on is Finder\Place), I get the following results:

Select class:
1) Symfony\Component\Finder\Finder
2) Nette\Utils\Finder
3) PhpCsFixer\Finder
4) Doctrine\Migrations\Finder\Finder

None of them are correct: it only proposes me real Classes (and not the part of the namespace I am looking for).

Proposition of a new behavior

Considering the following PHP code example:

<?php

namespace App\Foo\Bar;

class Baz
{
    public __construct(
        Finder\User $userFinder,
        User $otherUserArgument
    ) {
        $this->userFinder = $userFinder;
        $this->otherUserArgument = $otherUserArgument;
    }
}
  • If my cursor is on Finder\User, the UseAdd command should only propose me the following result: App\Domain\Finder, since it is the only namespace having Finder\User in it. If I have a class App\Foo\Finder\User\Foo and an interface App\Bar\Baz\Something\Finder\User, only the second one should appear in the proposed results.

  • If my cursor is on User (the typehint of $otherUserArgument), it should propose me all the classes/traits/interfaces called User, but not classes like App\Domain\User\Repository (same behavior as it is right now).

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions