Skip to content

Commit

Permalink
Merge pull request #39 from mkusher/class-repository
Browse files Browse the repository at this point in the history
Class Repository
  • Loading branch information
mkusher committed May 19, 2016
2 parents 81db43d + 26ad481 commit f030bea
Show file tree
Hide file tree
Showing 24 changed files with 562 additions and 364 deletions.
4 changes: 3 additions & 1 deletion bin/padawan-server
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,9 @@ function onClient(Amp\Socket\Client $client, App $app) {
try {
$request = (yield Amp\resolve(loadRequest($client)));
$output = new SocketOutput($client);
yield Amp\resolve($app->handle($request, $output));
if ($client->alive()) {
yield Amp\resolve($app->handle($request, $output));
}
} catch (\Throwable $e) {
yield $output->write(json_encode([
"error" => $e->getMessage()
Expand Down
11 changes: 7 additions & 4 deletions features/bootstrap/FeatureContext.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
use Behat\Gherkin\Node\TableNode;
use Padawan\Framework\Application\Socket;
use Padawan\Domain\Project;
use Padawan\Domain\Project\File;
use Padawan\Domain\Project\Index;
use Padawan\Framework\Domain\Project\InMemoryIndex;
use Fake\Output;
use DI\Container;
use Psr\Log\LoggerInterface;
Expand Down Expand Up @@ -43,24 +45,25 @@ public function createApplication()

public function createProject()
{
$this->project = new Project(new Index);
$this->project = new Project(new InMemoryIndex);
}

/**
* @Given there is a file with:
*/
public function thereIsAFileWith(PyStringNode $string)
{
$file = uniqid() . ".php";
$filePath = uniqid() . ".php";
$file = new File($filePath);
$container = $this->app->getContainer();
$generator = $container->get(IndexGenerator::class);
$walker = $generator->getWalker();
$parser = $generator->getClassUtils()->getParser();
$parser->addWalker($walker);
$parser->setIndex($this->project->getIndex());
$this->content = $string->getRaw();
$scope = $parser->parseContent($file, $this->content, null, false);
$generator->processFileScope($this->project->getIndex(), $scope);
$scope = $parser->parseContent($filePath, $this->content, null, false);
$generator->processFileScope($file, $this->project->getIndex(), $scope, sha1($this->content));
$this->scope = $scope;
}

Expand Down
17 changes: 9 additions & 8 deletions specs/completer/resolver/ContextResolver.spec.php
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
<?php

use Padawan\Framework\Complete\Resolver\ContextResolver;
use Padawan\Framework\Complete\Resolver\NodeTypeResolver;
use Padawan\Parser\ErrorFreePhpParser;
use Padawan\Parser\UseParser;
use PhpParser\Lexer;
use Padawan\Domain\Completion\Context;
use Padawan\Domain\Project\Index;
use Monolog\Logger;
use PhpParser\Lexer;
use Padawan\Parser\UseParser;
use Monolog\Handler\NullHandler;
use Padawan\Domain\Project\Index;
use Padawan\Domain\Completion\Context;
use Padawan\Parser\ErrorFreePhpParser;
use Padawan\Framework\Domain\Project\InMemoryIndex;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Padawan\Framework\Complete\Resolver\ContextResolver;
use Padawan\Framework\Complete\Resolver\NodeTypeResolver;

describe('ContextResolver', function() {
beforeEach(function() {
$logger = new Logger('spec');
$logger->pushHandler(new NullHandler);
$this->index = new Index;
$this->index = new InMemoryIndex;
$this->parser = new ErrorFreePhpParser(new Lexer);
$this->useParser = new UseParser;
$this->typeResolver = new NodeTypeResolver($logger, $this->useParser, new EventDispatcher);
Expand Down
21 changes: 11 additions & 10 deletions specs/completer/resolver/NodeTypeResolver.spec.php
Original file line number Diff line number Diff line change
@@ -1,25 +1,26 @@
<?php

use Padawan\Framework\Complete\Resolver\NodeTypeResolver;
use Padawan\Domain\Scope;
use Padawan\Domain\Scope\FileScope;
use Padawan\Domain\Project\FQCN;
use Padawan\Parser\UseParser;
use Padawan\Domain\Project\FQN;
use Padawan\Domain\Project\FQCN;
use Padawan\Domain\Project\Index;
use PhpParser\Node\Expr\MethodCall;
use Padawan\Domain\Scope\FileScope;
use PhpParser\Node\Expr\PropertyFetch;
use Padawan\Domain\Project\Node\Variable;
use Padawan\Domain\Project\Node\ClassData;
use Padawan\Domain\Project\Node\ClassProperty;
use Padawan\Domain\Project\Node\MethodData;
use Padawan\Domain\Project\Node\Variable;
use Padawan\Domain\Project\Node\FunctionData;
use PhpParser\Node\Expr\Variable as NodeVar;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\MethodCall;
use Padawan\Domain\Project\Node\FunctionData;
use Padawan\Domain\Project\Node\ClassProperty;
use Padawan\Framework\Domain\Project\InMemoryIndex;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Name;
use Monolog\Logger;
use Monolog\Handler\NullHandler;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Padawan\Parser\UseParser;
use Padawan\Framework\Complete\Resolver\NodeTypeResolver;

function createClass($classFQN, $fqcn) {
$class = new ClassData($classFQN, 'dummy/path/class.php');
Expand All @@ -39,7 +40,7 @@ function createClass($classFQN, $fqcn) {
$logger->pushHandler(new NullHandler);
$this->resolver = new NodeTypeResolver($logger, new UseParser, new EventDispatcher);
$this->scope = new FileScope(new FQN);
$this->index = new Index;
$this->index = new InMemoryIndex;
$this->var = new Variable('test');
$fqcn = new FQCN('ClassName', 'Some\\Path');
$fqcn2 = new FQCN('AnotherClassName', 'Another\\Path\\To\\It');
Expand Down
9 changes: 5 additions & 4 deletions specs/generator/filesfinder.spec.php
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
<?php

use Padawan\Framework\Generator\FilesFinder;
use Padawan\Framework\Utils\PathResolver;
use Prophecy\Argument;
use Padawan\Domain\Project;
use Padawan\Domain\Project\Index;
use Prophecy\Argument;
use Padawan\Framework\Utils\PathResolver;
use Padawan\Framework\Generator\FilesFinder;
use Padawan\Framework\Domain\Project\InMemoryIndex;

describe('FilesFinder', function() {
beforeEach(function() {
Expand All @@ -20,7 +21,7 @@
return $args[1];
});
$this->files = new FilesFinder($this->mock->reveal());
$this->project = new Project(new Index, "/project");
$this->project = new Project(new InMemoryIndex, "/project");
});
describe('->findProjectFiles()', function() {
it('returns all php files from project', function() {
Expand Down
2 changes: 1 addition & 1 deletion src/Padawan/Command/CompleteCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use Symfony\Component\Console\Input\InputArgument;
use Padawan\Framework\Application\Socket\SocketOutput;
use Padawan\Domain\ProjectRepository;
use Padawan\Framework\Project\Persister;
use Padawan\Framework\Domain\Project\Persister;

class CompleteCommand extends AsyncCommand
{
Expand Down
48 changes: 0 additions & 48 deletions src/Padawan/Command/GenerateCommand.php

This file was deleted.

40 changes: 40 additions & 0 deletions src/Padawan/Command/UpdateCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace Padawan\Command;

use Padawan\Domain\Project;
use Padawan\Domain\ProjectRepository;
use Padawan\Domain\Generator\IndexGenerator;
use Padawan\Framework\Domain\Project\Persister;
use Padawan\Framework\Domain\Project\InMemoryIndex;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Padawan\Framework\Application\Socket\SocketOutput;

class UpdateCommand extends AsyncCommand
{
protected function configure()
{
$this->setName("update")
->setDescription("Updates index for the project")
->addArgument(
"path",
InputArgument::REQUIRED,
"Path to the project root. Default: current directory"
);
}
protected function executeAsync(InputInterface $input, SocketOutput $output)
{
$path = $input->getArgument("path");

$projectRepository = $this->getContainer()->get(ProjectRepository::class);
$project = $projectRepository->findByPath($path);
$generator = $this->getContainer()->get(IndexGenerator::class);

$generator->generateProjectIndex($project, false);
$persister = $this->getContainer()->get(Persister::class);

yield $output->disconnect();
yield $persister->save($project);
}
}
13 changes: 12 additions & 1 deletion src/Padawan/Domain/Completer/GlobalFunctionsCompleter.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,23 @@
namespace Padawan\Domain\Completer;

use Padawan\Domain\Project;
use Padawan\Domain\Completion\Context;
use Padawan\Domain\Completion\Entry;
use Padawan\Domain\Completion\Context;
use Padawan\Domain\Project\ClassRepository;
use Padawan\Domain\Project\Node\FunctionData;

class GlobalFunctionsCompleter extends AbstractInCodeBodyCompleter
{

/** @property ClassRepository */
private $classRepository;

public function __construct(
ClassRepository $classRepository
) {
$this->classRepository = $classRepository;
}

public function getEntries(Project $project, Context $context)
{
$entries = [];
Expand Down
23 changes: 14 additions & 9 deletions src/Padawan/Domain/Completer/ObjectCompleter.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Padawan\Domain\Project;
use Padawan\Domain\Project\FQCN;
use Padawan\Domain\Project\ClassRepository;
use Padawan\Domain\Project\Node\MethodData;
use Padawan\Domain\Project\Node\ClassProperty;
use Padawan\Domain\Project\Node\InterfaceData;
Expand All @@ -14,9 +15,19 @@

class ObjectCompleter extends AbstractInCodeBodyCompleter
{
public function __construct(LoggerInterface $logger)
{

/** @property LoggerInterface */
private $logger;

/** @property ClassRepository */
private $classRepository;

public function __construct(
LoggerInterface $logger,
ClassRepository $classRepository
) {
$this->logger = $logger;
$this->classRepository = $classRepository;
}
public function getEntries(Project $project, Context $context)
{
Expand All @@ -28,10 +39,7 @@ public function getEntries(Project $project, Context $context)
}
$index = $project->getIndex();
$this->logger->debug('Creating completion for ' . $fqcn->toString());
$class = $index->findClassByFQCN($fqcn);
if (empty($class)) {
$class = $index->findInterfaceByFQCN($fqcn);
}
$class = $this->classRepository->findByName($project, $fqcn);
if (empty($class)) {
return [];
}
Expand Down Expand Up @@ -83,7 +91,4 @@ protected function createEntryForProperty(ClassProperty $prop)
$type
);
}

/** @property LoggerInterface */
private $logger;
}
13 changes: 7 additions & 6 deletions src/Padawan/Domain/Generator/IndexGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@

namespace Padawan\Domain\Generator;

use Padawan\Domain\Scope\FileScope;
use Padawan\Domain\Project\Index;
use Padawan\Domain\Project;
use Padawan\Domain\Project\File;
use Padawan\Domain\Project\Index;
use Padawan\Domain\Scope\FileScope;

interface IndexGenerator
{
public function generateIndex(Project $project);

public function generateProjectIndex(Project $project);
public function generateProjectIndex(Project $project, $rewrite = true);

public function processFile(Index $index, $file, $rewrite = false, $createCache = true);
public function processFile(Index $index, $filePath, $rewrite = true);

public function createScopeForFile($file, Index $index, $createCache = true);
public function createScopeForFile(File $file, $content, Index $index, $rewrite = true);

public function processFileScope(Index $index, FileScope $scope);
public function processFileScope(File $file, Index $index, FileScope $scope);
}
15 changes: 15 additions & 0 deletions src/Padawan/Domain/Project/ClassRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace Padawan\Domain\Project;


use Padawan\Domain\Project;

/**
* Interface ClassRepository
*/
interface ClassRepository
{
public function findByName(Project $project, FQCN $name);
public function findAllByNamePart(Project $project, $name);
}
Loading

0 comments on commit f030bea

Please sign in to comment.