Skip to content

Commit

Permalink
Enhance scopeDoc for generateModelIdeVisitor. (#6250)
Browse files Browse the repository at this point in the history
  • Loading branch information
xuanyanwow committed Nov 2, 2023
1 parent 2a43741 commit e2f627a
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 19 deletions.
53 changes: 39 additions & 14 deletions src/Commands/Ast/GenerateModelIDEVisitor.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ class GenerateModelIDEVisitor extends AbstractVisitor

protected string $nsp = '';

private string $originClassName = '';

public function __construct(ModelOption $option, ModelData $data)
{
$this->factory = new BuilderFactory();
Expand All @@ -57,8 +59,9 @@ public function enterNode(Node $node)
}

if ($node instanceof Node\Stmt\Class_) {
$this->originClassName = $node->name->toString();
$this->class = new Node\Stmt\Class_(
new Node\Identifier(self::toIDEClass($this->nsp . '\\' . $node->name->toString()))
new Node\Identifier(self::toIDEClass($this->nsp . '\\' . $this->originClassName))
);
}
}
Expand All @@ -69,21 +72,15 @@ public function afterTraverse(array $nodes)
Node\Stmt\Class_::MODIFIER_PUBLIC | Node\Stmt\Class_::MODIFIER_STATIC,
[new Node\Stmt\PropertyProperty('builder')]
);
$doc = '/**' . PHP_EOL;
$doc .= ' * @var \Hyperf\Database\Model\Builder' . PHP_EOL;
$doc .= ' */';
$builder->setDocComment(new Doc($doc));
$builder->setDocComment(new Doc($this->propertyDoc()));
$this->class->stmts[] = $builder;
$doc = '/**' . PHP_EOL;
$doc .= ' * @return \Hyperf\Database\Model\Builder|static' . PHP_EOL;
$doc .= ' */';
foreach ($this->data->getColumns() as $column) {
$name = Str::camel('where_' . $column['column_name']);
$method = new Node\Stmt\ClassMethod($name, [
'flags' => Node\Stmt\Class_::MODIFIER_PUBLIC | Node\Stmt\Class_::MODIFIER_STATIC,
'params' => [new Node\Param(new Node\Expr\Variable('value'))],
]);
$method->setDocComment(new Doc($doc));
$method->setDocComment(new Doc($this->methodDoc()));
$method->stmts[] = new Node\Stmt\Return_(
new Node\Expr\MethodCall(
new Node\Expr\StaticPropertyFetch(
Expand All @@ -99,9 +96,6 @@ public function afterTraverse(array $nodes)
);
$this->class->stmts[] = $method;
}
$scopeDoc = '/**' . PHP_EOL;
$scopeDoc .= ' * @return \Hyperf\Database\Model\Builder|static' . PHP_EOL;
$scopeDoc .= ' */';
foreach ($this->methods as $name => $call) {
$params = [];
/** @var ReflectionParameter $argument */
Expand Down Expand Up @@ -135,7 +129,7 @@ public function afterTraverse(array $nodes)
'flags' => Node\Stmt\Class_::MODIFIER_PUBLIC | Node\Stmt\Class_::MODIFIER_STATIC,
'params' => $params,
]);
$method->setDocComment(new Doc($scopeDoc));
$method->setDocComment(new Doc($this->scopeDoc($name)));
$method->stmts[] = new Node\Stmt\Return_(
new Node\Expr\StaticPropertyFetch(
new Node\Name('static'),
Expand All @@ -153,6 +147,37 @@ public static function toIDEClass(string $class): string
return str_replace('\\', '_', $class);
}

protected function propertyDoc(): string
{
$propertyDoc = '/**' . PHP_EOL;
$propertyDoc .= ' * @var \Hyperf\Database\Model\Builder' . PHP_EOL;
$propertyDoc .= ' */';

return $propertyDoc;
}

protected function methodDoc(): string
{
$methodDoc = '/**' . PHP_EOL;
$methodDoc .= ' * @return \Hyperf\Database\Model\Builder|static' . PHP_EOL;
$methodDoc .= ' */';

return $methodDoc;
}

protected function scopeDoc($methodName): string
{
$scopeDoc = '/**' . PHP_EOL;
$scopeDoc .= ' * @return \Hyperf\Database\Model\Builder|static' . PHP_EOL;
$scopeDoc .= sprintf(
' * @see %s::%s',
$this->nsp . '\\' . $this->originClassName,
'scope' . Str::studly($methodName)
) . PHP_EOL;
$scopeDoc .= ' */';
return $scopeDoc;
}

protected function setMethod(string $name, array $type = [], array $arguments = [])
{
$methods = array_change_key_case($this->methods, CASE_LOWER);
Expand All @@ -168,7 +193,7 @@ protected function initPropertiesFromMethods(array $nodes)
{
$methods = PhpParser::getInstance()->getAllMethodsFromStmts($nodes);
$reflection = new ReflectionClass($this->data->getClass());
sort($methods);
sort($methods); // 8.0 与 8.1 8.2 排序结果不一致
foreach ($methods as $methodStmt) {
$method = $reflection->getMethod($methodStmt->name->name);
if (Str::startsWith($method->getName(), 'scope') && $method->getName() !== 'scopeQuery') {
Expand Down
64 changes: 59 additions & 5 deletions tests/ModelGenerateTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,64 @@ public function testGenerateScope()
$stmts = $traverser->traverse($stmts);
$code = $this->printer->prettyPrintFile($stmts);

$this->assertNotFalse(strpos($code, 'public static function optionNull(?string $test)'));
$this->assertNotFalse(strpos($code, 'public static function string(string $test)'));
$this->assertNotFalse(strpos($code, 'public static function union(int $appId, string|int $uid)'));
$this->assertNotFalse(strpos($code, 'public static function unionOrNull(int $appId, string|int|null $uid)'));
$this->assertNotFalse(strpos($code, 'public static function singleOrNull(?string $test)'));
$this->assertNotFalse(strpos($code, '
/**
* @return \Hyperf\Database\Model\Builder|static
* @see HyperfTest\Database\Stubs\Model\TestGenerateIdeModel::scopeOptionNull
*/
public static function optionNull(?string $test)
{
return static::$builder;
}'));

$this->assertNotFalse(strpos($code, '
/**
* @return \Hyperf\Database\Model\Builder|static
* @see HyperfTest\Database\Stubs\Model\TestGenerateIdeModel::scopeOptionNull
*/
public static function optionNull(?string $test)
{
return static::$builder;
}'));

$this->assertNotFalse(strpos($code, '
/**
* @return \Hyperf\Database\Model\Builder|static
* @see HyperfTest\Database\Stubs\Model\TestGenerateIdeModel::scopeString
*/
public static function string(string $test)
{
return static::$builder;
}'));

$this->assertNotFalse(strpos($code, '
/**
* @return \Hyperf\Database\Model\Builder|static
* @see HyperfTest\Database\Stubs\Model\TestGenerateIdeModel::scopeUnion
*/
public static function union(int $appId, string|int $uid)
{
return static::$builder;
}'));

$this->assertNotFalse(strpos($code, '
/**
* @return \Hyperf\Database\Model\Builder|static
* @see HyperfTest\Database\Stubs\Model\TestGenerateIdeModel::scopeUnionOrNull
*/
public static function unionOrNull(int $appId, string|int|null $uid)
{
return static::$builder;
}'));

$this->assertNotFalse(strpos($code, '
/**
* @return \Hyperf\Database\Model\Builder|static
* @see HyperfTest\Database\Stubs\Model\TestGenerateIdeModel::scopeSingleOrNull
*/
public static function singleOrNull(?string $test)
{
return static::$builder;
}'));
}
}

0 comments on commit e2f627a

Please sign in to comment.