Skip to content

Commit 8633125

Browse files
committed
Type::toPhpDocNode()
1 parent e5793df commit 8633125

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+927
-5
lines changed

phpstan-baseline.neon

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -993,6 +993,11 @@ parameters:
993993
count: 3
994994
path: src/Type/Generic/TemplateConstantIntegerType.php
995995

996+
-
997+
message: "#^Method PHPStan\\\\Type\\\\Generic\\\\TemplateConstantIntegerType\\:\\:toPhpDocNode\\(\\) should return PHPStan\\\\PhpDocParser\\\\Ast\\\\Type\\\\ConstTypeNode but returns PHPStan\\\\PhpDocParser\\\\Ast\\\\Type\\\\IdentifierTypeNode\\.$#"
998+
count: 1
999+
path: src/Type/Generic/TemplateConstantIntegerType.php
1000+
9961001
-
9971002
message: "#^Doing instanceof PHPStan\\\\Type\\\\IntersectionType is error\\-prone and deprecated\\.$#"
9981003
count: 3
@@ -1150,7 +1155,7 @@ parameters:
11501155

11511156
-
11521157
message: "#^Doing instanceof PHPStan\\\\Type\\\\Accessory\\\\AccessoryType is error\\-prone and deprecated\\. Use methods on PHPStan\\\\Type\\\\Type instead\\.$#"
1153-
count: 2
1158+
count: 3
11541159
path: src/Type/IntersectionType.php
11551160

11561161
-

src/Type/Accessory/AccessoryArrayListType.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace PHPStan\Type\Accessory;
44

55
use PHPStan\Php\PhpVersion;
6+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
7+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
68
use PHPStan\TrinaryLogic;
79
use PHPStan\Type\AcceptsResult;
810
use PHPStan\Type\BooleanType;
@@ -472,4 +474,9 @@ public function exponentiate(Type $exponent): Type
472474
return new ErrorType();
473475
}
474476

477+
public function toPhpDocNode(): TypeNode
478+
{
479+
return new IdentifierTypeNode('list');
480+
}
481+
475482
}

src/Type/Accessory/AccessoryLiteralStringType.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace PHPStan\Type\Accessory;
44

55
use PHPStan\Php\PhpVersion;
6+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
7+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
68
use PHPStan\TrinaryLogic;
79
use PHPStan\Type\AcceptsResult;
810
use PHPStan\Type\BenevolentUnionType;
@@ -333,4 +335,9 @@ public function exponentiate(Type $exponent): Type
333335
]);
334336
}
335337

338+
public function toPhpDocNode(): TypeNode
339+
{
340+
return new IdentifierTypeNode('literal-string');
341+
}
342+
336343
}

src/Type/Accessory/AccessoryNonEmptyStringType.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace PHPStan\Type\Accessory;
44

55
use PHPStan\Php\PhpVersion;
6+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
7+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
68
use PHPStan\TrinaryLogic;
79
use PHPStan\Type\AcceptsResult;
810
use PHPStan\Type\BenevolentUnionType;
@@ -338,4 +340,9 @@ public function exponentiate(Type $exponent): Type
338340
]);
339341
}
340342

343+
public function toPhpDocNode(): TypeNode
344+
{
345+
return new IdentifierTypeNode('non-empty-string');
346+
}
347+
341348
}

src/Type/Accessory/AccessoryNonFalsyStringType.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace PHPStan\Type\Accessory;
44

55
use PHPStan\Php\PhpVersion;
6+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
7+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
68
use PHPStan\TrinaryLogic;
79
use PHPStan\Type\AcceptsResult;
810
use PHPStan\Type\BenevolentUnionType;
@@ -329,4 +331,9 @@ public function exponentiate(Type $exponent): Type
329331
]);
330332
}
331333

334+
public function toPhpDocNode(): TypeNode
335+
{
336+
return new IdentifierTypeNode('non-falsy-string');
337+
}
338+
332339
}

src/Type/Accessory/AccessoryNumericStringType.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace PHPStan\Type\Accessory;
44

55
use PHPStan\Php\PhpVersion;
6+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
7+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
68
use PHPStan\TrinaryLogic;
79
use PHPStan\Type\AcceptsResult;
810
use PHPStan\Type\BenevolentUnionType;
@@ -340,4 +342,9 @@ public function exponentiate(Type $exponent): Type
340342
]);
341343
}
342344

345+
public function toPhpDocNode(): TypeNode
346+
{
347+
return new IdentifierTypeNode('numeric-string');
348+
}
349+
343350
}

src/Type/Accessory/HasMethodType.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace PHPStan\Type\Accessory;
44

5+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
6+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
57
use PHPStan\Reflection\ClassMemberAccessAnswerer;
68
use PHPStan\Reflection\Dummy\DummyMethodReflection;
79
use PHPStan\Reflection\ExtendedMethodReflection;
@@ -193,4 +195,9 @@ public static function __set_state(array $properties): Type
193195
return new self($properties['methodName']);
194196
}
195197

198+
public function toPhpDocNode(): TypeNode
199+
{
200+
return new IdentifierTypeNode(''); // no PHPDoc representation
201+
}
202+
196203
}

src/Type/Accessory/HasOffsetType.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace PHPStan\Type\Accessory;
44

55
use PHPStan\Php\PhpVersion;
6+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
7+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
68
use PHPStan\TrinaryLogic;
79
use PHPStan\Type\AcceptsResult;
810
use PHPStan\Type\BooleanType;
@@ -366,4 +368,9 @@ public static function __set_state(array $properties): Type
366368
return new self($properties['offsetType']);
367369
}
368370

371+
public function toPhpDocNode(): TypeNode
372+
{
373+
return new IdentifierTypeNode(''); // no PHPDoc representation
374+
}
375+
369376
}

src/Type/Accessory/HasOffsetValueType.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace PHPStan\Type\Accessory;
44

55
use PHPStan\Php\PhpVersion;
6+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
7+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
68
use PHPStan\ShouldNotHappenException;
79
use PHPStan\TrinaryLogic;
810
use PHPStan\Type\AcceptsResult;
@@ -422,4 +424,9 @@ public static function __set_state(array $properties): Type
422424
return new self($properties['offsetType'], $properties['valueType']);
423425
}
424426

427+
public function toPhpDocNode(): TypeNode
428+
{
429+
return new IdentifierTypeNode(''); // no PHPDoc representation
430+
}
431+
425432
}

src/Type/Accessory/HasPropertyType.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace PHPStan\Type\Accessory;
44

5+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
6+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
57
use PHPStan\Reflection\ClassMemberAccessAnswerer;
68
use PHPStan\Reflection\TrivialParametersAcceptor;
79
use PHPStan\TrinaryLogic;
@@ -155,4 +157,9 @@ public static function __set_state(array $properties): Type
155157
return new self($properties['propertyName']);
156158
}
157159

160+
public function toPhpDocNode(): TypeNode
161+
{
162+
return new IdentifierTypeNode(''); // no PHPDoc representation
163+
}
164+
158165
}

src/Type/Accessory/NonEmptyArrayType.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace PHPStan\Type\Accessory;
44

55
use PHPStan\Php\PhpVersion;
6+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
7+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
68
use PHPStan\TrinaryLogic;
79
use PHPStan\Type\AcceptsResult;
810
use PHPStan\Type\BooleanType;
@@ -432,4 +434,9 @@ public static function __set_state(array $properties): Type
432434
return new self();
433435
}
434436

437+
public function toPhpDocNode(): TypeNode
438+
{
439+
return new IdentifierTypeNode('non-empty-array');
440+
}
441+
435442
}

src/Type/Accessory/OversizedArrayType.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace PHPStan\Type\Accessory;
44

55
use PHPStan\Php\PhpVersion;
6+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
7+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
68
use PHPStan\TrinaryLogic;
79
use PHPStan\Type\AcceptsResult;
810
use PHPStan\Type\BooleanType;
@@ -418,4 +420,9 @@ public static function __set_state(array $properties): Type
418420
return new self();
419421
}
420422

423+
public function toPhpDocNode(): TypeNode
424+
{
425+
return new IdentifierTypeNode(''); // no PHPDoc representation
426+
}
427+
421428
}

src/Type/ArrayType.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
namespace PHPStan\Type;
44

55
use PHPStan\Php\PhpVersion;
6+
use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
7+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
8+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
69
use PHPStan\Reflection\ClassMemberAccessAnswerer;
710
use PHPStan\Reflection\ParametersAcceptor;
811
use PHPStan\Reflection\TrivialParametersAcceptor;
@@ -670,6 +673,33 @@ public function traverse(callable $cb): Type
670673
return $this;
671674
}
672675

676+
public function toPhpDocNode(): TypeNode
677+
{
678+
$isMixedKeyType = $this->keyType instanceof MixedType && $this->keyType->describe(VerbosityLevel::precise()) === 'mixed';
679+
$isMixedItemType = $this->itemType instanceof MixedType && $this->itemType->describe(VerbosityLevel::precise()) === 'mixed';
680+
681+
if ($isMixedKeyType) {
682+
if ($isMixedItemType) {
683+
return new IdentifierTypeNode('array');
684+
}
685+
686+
return new GenericTypeNode(
687+
new IdentifierTypeNode('array'),
688+
[
689+
$this->itemType->toPhpDocNode(),
690+
],
691+
);
692+
}
693+
694+
return new GenericTypeNode(
695+
new IdentifierTypeNode('array'),
696+
[
697+
$this->keyType->toPhpDocNode(),
698+
$this->itemType->toPhpDocNode(),
699+
],
700+
);
701+
}
702+
673703
public function traverseSimultaneously(Type $right, callable $cb): Type
674704
{
675705
$keyType = $cb($this->keyType, $right->getIterableKeyType());

src/Type/BooleanType.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace PHPStan\Type;
44

55
use PHPStan\Php\PhpVersion;
6+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
7+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
68
use PHPStan\TrinaryLogic;
79
use PHPStan\Type\Constant\ConstantArrayType;
810
use PHPStan\Type\Constant\ConstantBooleanType;
@@ -138,6 +140,11 @@ public function exponentiate(Type $exponent): Type
138140
return ExponentiateHelper::exponentiate($this, $exponent);
139141
}
140142

143+
public function toPhpDocNode(): TypeNode
144+
{
145+
return new IdentifierTypeNode('bool');
146+
}
147+
141148
/**
142149
* @param mixed[] $properties
143150
*/

src/Type/CallableType.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44

55
use PHPStan\Analyser\OutOfClassScope;
66
use PHPStan\Php\PhpVersion;
7+
use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode;
8+
use PHPStan\PhpDocParser\Ast\Type\CallableTypeParameterNode;
9+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
10+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
711
use PHPStan\Reflection\ClassMemberAccessAnswerer;
812
use PHPStan\Reflection\Native\NativeParameterReflection;
913
use PHPStan\Reflection\ParameterReflection;
@@ -515,6 +519,30 @@ public function exponentiate(Type $exponent): Type
515519
return new ErrorType();
516520
}
517521

522+
public function toPhpDocNode(): TypeNode
523+
{
524+
if ($this->isCommonCallable) {
525+
return new IdentifierTypeNode('callable');
526+
}
527+
528+
$parameters = [];
529+
foreach ($this->parameters as $parameter) {
530+
$parameters[] = new CallableTypeParameterNode(
531+
$parameter->getType()->toPhpDocNode(),
532+
!$parameter->passedByReference()->no(),
533+
$parameter->isVariadic(),
534+
$parameter->getName(),
535+
$parameter->isOptional(),
536+
);
537+
}
538+
539+
return new CallableTypeNode(
540+
new IdentifierTypeNode('callable'),
541+
$parameters,
542+
$this->returnType->toPhpDocNode(),
543+
);
544+
}
545+
518546
/**
519547
* @param mixed[] $properties
520548
*/

src/Type/ClassStringType.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace PHPStan\Type;
44

5+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
6+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
57
use PHPStan\TrinaryLogic;
68

79
/** @api */
@@ -82,6 +84,11 @@ public function getObjectTypeOrClassStringObjectType(): Type
8284
return new ObjectWithoutClassType();
8385
}
8486

87+
public function toPhpDocNode(): TypeNode
88+
{
89+
return new IdentifierTypeNode('class-string');
90+
}
91+
8592
/**
8693
* @param mixed[] $properties
8794
*/

src/Type/ClosureType.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
use Closure;
66
use PHPStan\Analyser\OutOfClassScope;
77
use PHPStan\Php\PhpVersion;
8+
use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode;
9+
use PHPStan\PhpDocParser\Ast\Type\CallableTypeParameterNode;
10+
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
11+
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
812
use PHPStan\Reflection\ClassMemberAccessAnswerer;
913
use PHPStan\Reflection\ClassReflection;
1014
use PHPStan\Reflection\ConstantReflection;
@@ -577,6 +581,26 @@ public function exponentiate(Type $exponent): Type
577581
return new ErrorType();
578582
}
579583

584+
public function toPhpDocNode(): TypeNode
585+
{
586+
$parameters = [];
587+
foreach ($this->parameters as $parameter) {
588+
$parameters[] = new CallableTypeParameterNode(
589+
$parameter->getType()->toPhpDocNode(),
590+
!$parameter->passedByReference()->no(),
591+
$parameter->isVariadic(),
592+
$parameter->getName(),
593+
$parameter->isOptional(),
594+
);
595+
}
596+
597+
return new CallableTypeNode(
598+
new IdentifierTypeNode('Closure'),
599+
$parameters,
600+
$this->returnType->toPhpDocNode(),
601+
);
602+
}
603+
580604
/**
581605
* @param mixed[] $properties
582606
*/

0 commit comments

Comments
 (0)