From c626a50d94d64b79ef45f7880d27a07c32ddd04e Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 27 Sep 2019 16:25:15 +0200 Subject: [PATCH 1/3] cleanup + allow various format of imported annotations --- .../BetterPhpDocParser/config/config.yaml | 2 +- .../Ast/AttributeAwareNodeFactory.php | 2 +- .../AttributeAwareDeprecatedTagValueNode.php | 2 +- .../AttributeAwareGenericTagValueNode.php | 2 +- .../AttributeAwareInvalidTagValueNode.php | 2 +- .../AttributeAwareMethodTagValueNode.php | 2 +- .../AttributeAwareParamTagValueNode.php | 2 +- .../Ast/PhpDoc/AttributeAwarePhpDocNode.php | 2 +- .../PhpDoc/AttributeAwarePhpDocTagNode.php | 2 +- .../PhpDoc/AttributeAwarePhpDocTextNode.php | 2 +- .../AttributeAwarePropertyTagValueNode.php | 2 +- .../AttributeAwareReturnTagValueNode.php | 2 +- .../AttributeAwareThrowsTagValueNode.php | 2 +- .../PhpDoc/AttributeAwareVarTagValueNode.php | 2 +- .../Ast/PhpDoc/SpacelessPhpDocTagNode.php | 2 +- .../Type/AttributeAwareArrayTypeNode.php | 2 +- .../Type/AttributeAwareCallableTypeNode.php | 2 +- .../Type/AttributeAwareGenericTypeNode.php | 2 +- .../Type/AttributeAwareIdentifierTypeNode.php | 2 +- .../AttributeAwareIntersectionTypeNode.php | 2 +- .../Type/AttributeAwareNullableTypeNode.php | 2 +- .../Type/AttributeAwareThisTypeNode.php | 2 +- .../Type/AttributeAwareUnionTypeNode.php | 2 +- .../Doctrine/OriginalTagAwareInterface.php | 8 -- .../AttributeAwareNodeInterface.php | 2 +- .../PhpDocNode/TagAwareNodeInterface.php | 8 ++ .../PhpDocParserExtensionInterface.php | 13 --- .../src/PhpDocInfo/PhpDocInfo.php | 2 +- .../src/PhpDocInfo/PhpDocInfoFactory.php | 6 +- .../src/PhpDocInfo/TokenIteratorFactory.php | 26 ++++++ .../AbstractTagValueNode.php | 29 +++++-- .../Class_/AbstractIndexTagValueNode.php | 21 ++--- .../Doctrine/Class_/IndexTagValueNode.php | 5 ++ .../Doctrine/Class_/TableTagValueNode.php | 23 +++++- .../Class_/UniqueConstraintTagValueNode.php | 5 ++ .../Property_/JoinColumnTagValueNode.php | 17 +++- .../Property_/JoinTableTagValueNode.php | 7 +- .../PhpDocNode/JMS/JMSInjectTagValueNode.php | 2 +- .../JMS/SerializerTypeTagValueNode.php | 2 +- .../PHPDI/PHPDIInjectTagValueNode.php | 2 +- .../Sensio/SensioMethodTagValueNode.php | 2 +- .../Sensio/SensioTemplateTagValueNode.php | 2 +- .../Symfony/SymfonyRouteTagValueNode.php | 2 +- .../AbstractPhpDocNodeFactory.php | 2 +- .../Class_/IndexPhpDocNodeFactory.php | 16 ++-- .../Class_/TablePhpDocNodeFactory.php | 18 ++++- .../UniqueConstraintPhpDocNodeFactory.php | 13 ++- .../Property_/JoinColumnPhpDocNodeFactory.php | 6 +- .../Property_/JoinTablePhpDocNodeFactory.php | 10 ++- .../AnnotationContentResolver.php | 79 +++++++++++++++++++ .../src/PhpDocParser/BetterPhpDocParser.php | 52 ++++-------- .../Printer/MultilineSpaceFormatPreserver.php | 2 +- .../src/Printer/OriginalSpacingRestorer.php | 12 +-- .../src/Printer/PhpDocInfoPrinter.php | 37 +++++---- ...artEndInfo.php => StartEndValueObject.php} | 2 +- .../PhpDocInfoPrinter/DoctrineTest.php | 5 -- .../PhpDocInfoPrinter/MultilineTest.php | 3 - .../MethodCall/MigrateFilterToQueryRector.php | 25 +++--- .../PhpDoc/AbstractConstraintTagValueNode.php | 2 +- .../Doctrine/AbstractDoctrineTagValueNode.php | 2 +- 60 files changed, 329 insertions(+), 187 deletions(-) delete mode 100644 packages/BetterPhpDocParser/src/Contract/Doctrine/OriginalTagAwareInterface.php rename packages/BetterPhpDocParser/src/{Attributes/Contract/Ast => Contract/PhpDocNode}/AttributeAwareNodeInterface.php (83%) create mode 100644 packages/BetterPhpDocParser/src/Contract/PhpDocNode/TagAwareNodeInterface.php delete mode 100644 packages/BetterPhpDocParser/src/Contract/PhpDocParserExtensionInterface.php create mode 100644 packages/BetterPhpDocParser/src/PhpDocInfo/TokenIteratorFactory.php rename packages/BetterPhpDocParser/src/{PhpDocParser/Ast/PhpDoc => PhpDocNode}/AbstractTagValueNode.php (78%) rename packages/BetterPhpDocParser/src/ValueObject/{StartEndInfo.php => StartEndValueObject.php} (93%) diff --git a/packages/BetterPhpDocParser/config/config.yaml b/packages/BetterPhpDocParser/config/config.yaml index 876367b7bec..7052e96f2fe 100644 --- a/packages/BetterPhpDocParser/config/config.yaml +++ b/packages/BetterPhpDocParser/config/config.yaml @@ -5,7 +5,7 @@ services: Rector\BetterPhpDocParser\: resource: '../src' - exclude: '../src/{HttpKernel,ValueObject/*,*/*Info.php,*Info.php,Attributes/Ast/PhpDoc/*,Ast/PhpDoc/*,PhpDocNode/*}' + exclude: '../src/{ValueObject/*,*/*Info.php,*Info.php,Attributes/Ast/PhpDoc/*,PhpDocNode/*}' PHPStan\PhpDocParser\Lexer\Lexer: ~ PHPStan\PhpDocParser\Parser\TypeParser: ~ diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/AttributeAwareNodeFactory.php b/packages/BetterPhpDocParser/src/Attributes/Ast/AttributeAwareNodeFactory.php index a1e940975ef..89234cb9202 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/AttributeAwareNodeFactory.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/AttributeAwareNodeFactory.php @@ -47,7 +47,7 @@ use Rector\BetterPhpDocParser\Attributes\Ast\PhpDoc\Type\AttributeAwareNullableTypeNode; use Rector\BetterPhpDocParser\Attributes\Ast\PhpDoc\Type\AttributeAwareThisTypeNode; use Rector\BetterPhpDocParser\Attributes\Ast\PhpDoc\Type\AttributeAwareUnionTypeNode; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; use Rector\Exception\NotImplementedYetException; use Rector\Exception\ShouldNotHappenException; diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareDeprecatedTagValueNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareDeprecatedTagValueNode.php index c523844f2bc..29fbd86d3ef 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareDeprecatedTagValueNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareDeprecatedTagValueNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\DeprecatedTagValueNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareDeprecatedTagValueNode extends DeprecatedTagValueNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareGenericTagValueNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareGenericTagValueNode.php index 94a935e830b..76a9cb291b3 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareGenericTagValueNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareGenericTagValueNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareGenericTagValueNode extends GenericTagValueNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareInvalidTagValueNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareInvalidTagValueNode.php index 1e5002259ef..878971e4457 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareInvalidTagValueNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareInvalidTagValueNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\InvalidTagValueNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareInvalidTagValueNode extends InvalidTagValueNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareMethodTagValueNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareMethodTagValueNode.php index 779464974e6..dccd66f7904 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareMethodTagValueNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareMethodTagValueNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\MethodTagValueNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareMethodTagValueNode extends MethodTagValueNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareParamTagValueNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareParamTagValueNode.php index 025ae156d74..9fe8bfba30b 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareParamTagValueNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareParamTagValueNode.php @@ -5,7 +5,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareParamTagValueNode extends ParamTagValueNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePhpDocNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePhpDocNode.php index d9f82a2af52..6b8d33b1e18 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePhpDocNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePhpDocNode.php @@ -5,7 +5,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwarePhpDocNode extends PhpDocNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePhpDocTagNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePhpDocTagNode.php index 99a297d77b2..a8acb54f4de 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePhpDocTagNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePhpDocTagNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwarePhpDocTagNode extends PhpDocTagNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePhpDocTextNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePhpDocTextNode.php index 83023c70c10..6632824e38b 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePhpDocTextNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePhpDocTextNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTextNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwarePhpDocTextNode extends PhpDocTextNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePropertyTagValueNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePropertyTagValueNode.php index 644768d7f2b..f8dba4e6441 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePropertyTagValueNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwarePropertyTagValueNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\PropertyTagValueNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwarePropertyTagValueNode extends PropertyTagValueNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareReturnTagValueNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareReturnTagValueNode.php index 7007e079889..7b5d69e7fa7 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareReturnTagValueNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareReturnTagValueNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareReturnTagValueNode extends ReturnTagValueNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareThrowsTagValueNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareThrowsTagValueNode.php index abc4d4862fb..e28ec07db33 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareThrowsTagValueNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareThrowsTagValueNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\ThrowsTagValueNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareThrowsTagValueNode extends ThrowsTagValueNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareVarTagValueNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareVarTagValueNode.php index fe44d20e28c..433fce80db6 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareVarTagValueNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/AttributeAwareVarTagValueNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareVarTagValueNode extends VarTagValueNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/SpacelessPhpDocTagNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/SpacelessPhpDocTagNode.php index 80f50da4d14..33923aa60c3 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/SpacelessPhpDocTagNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/SpacelessPhpDocTagNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; /** * Useful for annotation class based annotation, e.g. @ORM\Entity to prevent space diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareArrayTypeNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareArrayTypeNode.php index d4a9d5b4301..d8d82b5d473 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareArrayTypeNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareArrayTypeNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareArrayTypeNode extends ArrayTypeNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareCallableTypeNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareCallableTypeNode.php index 648d6eb8c8e..2605703d50a 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareCallableTypeNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareCallableTypeNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareCallableTypeNode extends CallableTypeNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareGenericTypeNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareGenericTypeNode.php index e5e9bb18063..88bd34c5380 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareGenericTypeNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareGenericTypeNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareGenericTypeNode extends GenericTypeNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareIdentifierTypeNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareIdentifierTypeNode.php index f066351afa3..0a24e66aaf6 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareIdentifierTypeNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareIdentifierTypeNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareIdentifierTypeNode extends IdentifierTypeNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareIntersectionTypeNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareIntersectionTypeNode.php index 8acf608bee5..adc2c66fb84 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareIntersectionTypeNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareIntersectionTypeNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareIntersectionTypeNode extends IntersectionTypeNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareNullableTypeNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareNullableTypeNode.php index d98dcd7b121..8e131fc8652 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareNullableTypeNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareNullableTypeNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\Type\NullableTypeNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareNullableTypeNode extends NullableTypeNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareThisTypeNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareThisTypeNode.php index 3254b71bf23..b4a663f4bf1 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareThisTypeNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareThisTypeNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareThisTypeNode extends ThisTypeNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareUnionTypeNode.php b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareUnionTypeNode.php index ee3743d6daa..7cb53bbac47 100644 --- a/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareUnionTypeNode.php +++ b/packages/BetterPhpDocParser/src/Attributes/Ast/PhpDoc/Type/AttributeAwareUnionTypeNode.php @@ -4,7 +4,7 @@ use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; use Rector\BetterPhpDocParser\Attributes\Attribute\AttributeTrait; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class AttributeAwareUnionTypeNode extends UnionTypeNode implements AttributeAwareNodeInterface { diff --git a/packages/BetterPhpDocParser/src/Contract/Doctrine/OriginalTagAwareInterface.php b/packages/BetterPhpDocParser/src/Contract/Doctrine/OriginalTagAwareInterface.php deleted file mode 100644 index fd9ab01d4ab..00000000000 --- a/packages/BetterPhpDocParser/src/Contract/Doctrine/OriginalTagAwareInterface.php +++ /dev/null @@ -1,8 +0,0 @@ -phpDocInfoByObjectHash[$hash]; } - /** needed for @see OrmTagParser */ + /** needed for @see PhpDocNodeFactoryInterface */ $this->currentNodeProvider->setNode($node); $content = $node->getDocComment()->getText(); diff --git a/packages/BetterPhpDocParser/src/PhpDocInfo/TokenIteratorFactory.php b/packages/BetterPhpDocParser/src/PhpDocInfo/TokenIteratorFactory.php new file mode 100644 index 00000000000..235334cb823 --- /dev/null +++ b/packages/BetterPhpDocParser/src/PhpDocInfo/TokenIteratorFactory.php @@ -0,0 +1,26 @@ +lexer = $lexer; + } + + public function create(string $content): TokenIterator + { + $tokens = $this->lexer->tokenize($content); + + return new TokenIterator($tokens); + } +} diff --git a/packages/BetterPhpDocParser/src/PhpDocParser/Ast/PhpDoc/AbstractTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/AbstractTagValueNode.php similarity index 78% rename from packages/BetterPhpDocParser/src/PhpDocParser/Ast/PhpDoc/AbstractTagValueNode.php rename to packages/BetterPhpDocParser/src/PhpDocNode/AbstractTagValueNode.php index e47bb11232b..da4ef30aba8 100644 --- a/packages/BetterPhpDocParser/src/PhpDocParser/Ast/PhpDoc/AbstractTagValueNode.php +++ b/packages/BetterPhpDocParser/src/PhpDocNode/AbstractTagValueNode.php @@ -1,12 +1,13 @@ printTagValueNodesSeparatedByComma($tagValueNodes, $shortName); + $tagValueNodesAsString = $this->printTagValueNodesSeparatedByComma($tagValueNodes); - return sprintf('%s={%s%s%s}', $label, PHP_EOL . ' ', $tagValueNodesAsString, PHP_EOL); + return sprintf( + '%s={%s%s%s%s}', + $label, + PHP_EOL . ' ', + $tagValueNodesAsString, + $haveFinalComma ? ',' : '', + PHP_EOL + ); } /** * @param PhpDocTagValueNode[] $tagValueNodes */ - protected function printTagValueNodesSeparatedByComma(array $tagValueNodes, string $prefix = ''): string + protected function printTagValueNodesSeparatedByComma(array $tagValueNodes): string { if ($tagValueNodes === []) { return ''; @@ -89,7 +97,14 @@ protected function printTagValueNodesSeparatedByComma(array $tagValueNodes, stri $itemsAsStrings = []; foreach ($tagValueNodes as $tagValueNode) { - $itemsAsStrings[] = $prefix . (string) $tagValueNode; + $item = ''; + if ($tagValueNode instanceof TagAwareNodeInterface) { + $item .= $tagValueNode->getTag(); + } + + $item .= (string) $tagValueNode; + + $itemsAsStrings[] = $item; } return implode(', ', $itemsAsStrings); diff --git a/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/AbstractIndexTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/AbstractIndexTagValueNode.php index b74b4759e75..30af73450d9 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/AbstractIndexTagValueNode.php +++ b/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/AbstractIndexTagValueNode.php @@ -2,11 +2,16 @@ namespace Rector\BetterPhpDocParser\PhpDocNode\Doctrine\Class_; -use Rector\BetterPhpDocParser\Contract\Doctrine\OriginalTagAwareInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\TagAwareNodeInterface; use Rector\BetterPhpDocParser\PhpDocNode\Doctrine\AbstractDoctrineTagValueNode; -abstract class AbstractIndexTagValueNode extends AbstractDoctrineTagValueNode implements OriginalTagAwareInterface +abstract class AbstractIndexTagValueNode extends AbstractDoctrineTagValueNode implements TagAwareNodeInterface { + /** + * @var string|null + */ + protected $tag; + /** * @var string|null */ @@ -27,11 +32,6 @@ abstract class AbstractIndexTagValueNode extends AbstractDoctrineTagValueNode im */ private $options; - /** - * @var string|null - */ - private $originalTag; - /** * @param mixed[]|null $columns * @param mixed[]|null $flags @@ -53,7 +53,7 @@ public function __construct( if ($originalContent !== null) { $this->resolveOriginalContentSpacingAndOrder($originalContent); } - $this->originalTag = $originalTag; + $this->tag = $originalTag; } public function __toString(): string @@ -78,9 +78,4 @@ public function __toString(): string return $this->printContentItems($contentItems); } - - public function getOriginalTag(): ?string - { - return $this->originalTag; - } } diff --git a/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/IndexTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/IndexTagValueNode.php index e6f7ea17630..9c9de8921ac 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/IndexTagValueNode.php +++ b/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/IndexTagValueNode.php @@ -8,4 +8,9 @@ final class IndexTagValueNode extends AbstractIndexTagValueNode * @var string */ public const SHORT_NAME = '@ORM\Index'; + + public function getTag(): ?string + { + return $this->tag ?: self::SHORT_NAME; + } } diff --git a/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/TableTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/TableTagValueNode.php index 2849eeec791..eeefbdb9965 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/TableTagValueNode.php +++ b/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/TableTagValueNode.php @@ -36,6 +36,16 @@ final class TableTagValueNode extends AbstractDoctrineTagValueNode */ private $options = []; + /** + * @var bool + */ + private $haveIndexesFinalComma = false; + + /** + * @var bool + */ + private $haveUniqueConstraintsFinalComma = false; + /** * @param mixed[] $options * @param IndexTagValueNode[] $indexes @@ -47,7 +57,9 @@ public function __construct( array $indexes, array $uniqueConstraints, array $options, - ?string $originalContent = null + ?string $originalContent = null, + bool $haveIndexesFinalComma = false, + bool $haveUniqueConstraintsFinalComma = false ) { $this->name = $name; $this->schema = $schema; @@ -58,6 +70,9 @@ public function __construct( if ($originalContent !== null) { $this->resolveOriginalContentSpacingAndOrder($originalContent); } + + $this->haveIndexesFinalComma = $haveIndexesFinalComma; + $this->haveUniqueConstraintsFinalComma = $haveUniqueConstraintsFinalComma; } public function __toString(): string @@ -73,14 +88,14 @@ public function __toString(): string } if ($this->indexes !== []) { - $contentItems['indexes'] = $this->printNestedTag($this->indexes, IndexTagValueNode::SHORT_NAME, 'indexes'); + $contentItems['indexes'] = $this->printNestedTag($this->indexes, 'indexes', $this->haveIndexesFinalComma); } if ($this->uniqueConstraints !== []) { $contentItems['uniqueConstraints'] = $this->printNestedTag( $this->uniqueConstraints, - UniqueConstraintTagValueNode::SHORT_NAME, - 'uniqueConstraints' + 'uniqueConstraints', + $this->haveUniqueConstraintsFinalComma ); } diff --git a/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/UniqueConstraintTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/UniqueConstraintTagValueNode.php index 1dad1d95d05..2e7b1123cca 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/UniqueConstraintTagValueNode.php +++ b/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Class_/UniqueConstraintTagValueNode.php @@ -8,4 +8,9 @@ final class UniqueConstraintTagValueNode extends AbstractIndexTagValueNode * @var string */ public const SHORT_NAME = '@ORM\UniqueConstraint'; + + public function getTag(): ?string + { + return $this->tag ?: self::SHORT_NAME; + } } diff --git a/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Property_/JoinColumnTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Property_/JoinColumnTagValueNode.php index 9b2eaa6e3f6..bbaaf375881 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Property_/JoinColumnTagValueNode.php +++ b/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Property_/JoinColumnTagValueNode.php @@ -2,9 +2,10 @@ namespace Rector\BetterPhpDocParser\PhpDocNode\Doctrine\Property_; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\TagAwareNodeInterface; use Rector\BetterPhpDocParser\PhpDocNode\Doctrine\AbstractDoctrineTagValueNode; -final class JoinColumnTagValueNode extends AbstractDoctrineTagValueNode +final class JoinColumnTagValueNode extends AbstractDoctrineTagValueNode implements TagAwareNodeInterface { /** * @var string @@ -46,6 +47,11 @@ final class JoinColumnTagValueNode extends AbstractDoctrineTagValueNode */ private $fieldName; + /** + * @var string|null + */ + private $tag; + public function __construct( ?string $name, string $referencedColumnName, @@ -54,7 +60,8 @@ public function __construct( ?string $onDelete = null, ?string $columnDefinition = null, ?string $fieldName = null, - ?string $originalContent = null + ?string $originalContent = null, + ?string $originalTag = null ) { $this->nullable = $nullable; $this->name = $name; @@ -66,6 +73,7 @@ public function __construct( if ($originalContent !== null) { $this->resolveOriginalContentSpacingAndOrder($originalContent); + $this->tag = $originalTag; } } @@ -128,4 +136,9 @@ public function changeName(string $newName): void { $this->name = $newName; } + + public function getTag(): ?string + { + return $this->tag ?: self::SHORT_NAME; + } } diff --git a/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Property_/JoinTableTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Property_/JoinTableTagValueNode.php index 90e7b868ced..bcb69e7b96e 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Property_/JoinTableTagValueNode.php +++ b/packages/BetterPhpDocParser/src/PhpDocNode/Doctrine/Property_/JoinTableTagValueNode.php @@ -60,17 +60,12 @@ public function __toString(): string } if ($this->joinColumns) { - $contentItems['joinColumns'] = $this->printNestedTag( - $this->joinColumns, - JoinColumnTagValueNode::SHORT_NAME, - 'joinColumns' - ); + $contentItems['joinColumns'] = $this->printNestedTag($this->joinColumns, 'joinColumns'); } if ($this->inverseJoinColumns) { $contentItems['inverseJoinColumns'] = $this->printNestedTag( $this->inverseJoinColumns, - JoinColumnTagValueNode::SHORT_NAME, 'inverseJoinColumns' ); } diff --git a/packages/BetterPhpDocParser/src/PhpDocNode/JMS/JMSInjectTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/JMS/JMSInjectTagValueNode.php index dda372b93ba..fb45106fddd 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNode/JMS/JMSInjectTagValueNode.php +++ b/packages/BetterPhpDocParser/src/PhpDocNode/JMS/JMSInjectTagValueNode.php @@ -3,7 +3,7 @@ namespace Rector\BetterPhpDocParser\PhpDocNode\JMS; use JMS\DiExtraBundle\Annotation\Inject; -use Rector\BetterPhpDocParser\PhpDocParser\Ast\PhpDoc\AbstractTagValueNode; +use Rector\BetterPhpDocParser\PhpDocNode\AbstractTagValueNode; final class JMSInjectTagValueNode extends AbstractTagValueNode { diff --git a/packages/BetterPhpDocParser/src/PhpDocNode/JMS/SerializerTypeTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/JMS/SerializerTypeTagValueNode.php index c95b1c829a1..2b03307e486 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNode/JMS/SerializerTypeTagValueNode.php +++ b/packages/BetterPhpDocParser/src/PhpDocNode/JMS/SerializerTypeTagValueNode.php @@ -4,7 +4,7 @@ use JMS\Serializer\Annotation\Type; use Nette\Utils\Strings; -use Rector\BetterPhpDocParser\PhpDocParser\Ast\PhpDoc\AbstractTagValueNode; +use Rector\BetterPhpDocParser\PhpDocNode\AbstractTagValueNode; final class SerializerTypeTagValueNode extends AbstractTagValueNode { diff --git a/packages/BetterPhpDocParser/src/PhpDocNode/PHPDI/PHPDIInjectTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/PHPDI/PHPDIInjectTagValueNode.php index ff0a7fe894d..d09b4a55156 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNode/PHPDI/PHPDIInjectTagValueNode.php +++ b/packages/BetterPhpDocParser/src/PhpDocNode/PHPDI/PHPDIInjectTagValueNode.php @@ -3,7 +3,7 @@ namespace Rector\BetterPhpDocParser\PhpDocNode\PHPDI; use DI\Annotation\Inject; -use Rector\BetterPhpDocParser\PhpDocParser\Ast\PhpDoc\AbstractTagValueNode; +use Rector\BetterPhpDocParser\PhpDocNode\AbstractTagValueNode; final class PHPDIInjectTagValueNode extends AbstractTagValueNode { diff --git a/packages/BetterPhpDocParser/src/PhpDocNode/Sensio/SensioMethodTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/Sensio/SensioMethodTagValueNode.php index 324d397a540..139ae3e1f70 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNode/Sensio/SensioMethodTagValueNode.php +++ b/packages/BetterPhpDocParser/src/PhpDocNode/Sensio/SensioMethodTagValueNode.php @@ -2,7 +2,7 @@ namespace Rector\BetterPhpDocParser\PhpDocNode\Sensio; -use Rector\BetterPhpDocParser\PhpDocParser\Ast\PhpDoc\AbstractTagValueNode; +use Rector\BetterPhpDocParser\PhpDocNode\AbstractTagValueNode; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; final class SensioMethodTagValueNode extends AbstractTagValueNode diff --git a/packages/BetterPhpDocParser/src/PhpDocNode/Sensio/SensioTemplateTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/Sensio/SensioTemplateTagValueNode.php index ddd2f383f44..d82d5966743 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNode/Sensio/SensioTemplateTagValueNode.php +++ b/packages/BetterPhpDocParser/src/PhpDocNode/Sensio/SensioTemplateTagValueNode.php @@ -2,7 +2,7 @@ namespace Rector\BetterPhpDocParser\PhpDocNode\Sensio; -use Rector\BetterPhpDocParser\PhpDocParser\Ast\PhpDoc\AbstractTagValueNode; +use Rector\BetterPhpDocParser\PhpDocNode\AbstractTagValueNode; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; final class SensioTemplateTagValueNode extends AbstractTagValueNode diff --git a/packages/BetterPhpDocParser/src/PhpDocNode/Symfony/SymfonyRouteTagValueNode.php b/packages/BetterPhpDocParser/src/PhpDocNode/Symfony/SymfonyRouteTagValueNode.php index b69a96dd076..2eed61ec316 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNode/Symfony/SymfonyRouteTagValueNode.php +++ b/packages/BetterPhpDocParser/src/PhpDocNode/Symfony/SymfonyRouteTagValueNode.php @@ -2,7 +2,7 @@ namespace Rector\BetterPhpDocParser\PhpDocNode\Symfony; -use Rector\BetterPhpDocParser\PhpDocParser\Ast\PhpDoc\AbstractTagValueNode; +use Rector\BetterPhpDocParser\PhpDocNode\AbstractTagValueNode; use Symfony\Component\Routing\Annotation\Route; final class SymfonyRouteTagValueNode extends AbstractTagValueNode diff --git a/packages/BetterPhpDocParser/src/PhpDocNodeFactory/AbstractPhpDocNodeFactory.php b/packages/BetterPhpDocParser/src/PhpDocNodeFactory/AbstractPhpDocNodeFactory.php index b7eeb4d090c..6bf0be5074e 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNodeFactory/AbstractPhpDocNodeFactory.php +++ b/packages/BetterPhpDocParser/src/PhpDocNodeFactory/AbstractPhpDocNodeFactory.php @@ -19,7 +19,7 @@ abstract class AbstractPhpDocNodeFactory implements PhpDocNodeFactoryInterface /** * @var AnnotationContentResolver */ - private $annotationContentResolver; + protected $annotationContentResolver; /** * @required diff --git a/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Class_/IndexPhpDocNodeFactory.php b/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Class_/IndexPhpDocNodeFactory.php index f53f400b4dc..81363a36d72 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Class_/IndexPhpDocNodeFactory.php +++ b/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Class_/IndexPhpDocNodeFactory.php @@ -11,7 +11,7 @@ final class IndexPhpDocNodeFactory /** * @var string */ - private const INDEX_PATTERN = '#@ORM\\\\Index\((?.*?)\),?#si'; + private const INDEX_PATTERN = '#(?@(ORM\\\\)?Index)\((?.*?)\),?#si'; /** * @param mixed[]|null $indexes @@ -27,20 +27,26 @@ public function createIndexTagValueNodes(?array $indexes, string $annotationCont $indexTagValueNodes = []; foreach ($indexes as $key => $index) { + $currentContent = $indexContents[$key]; + $indexTagValueNodes[] = $this->createFromAnnotationAndContent( $index, - $indexContents[$key]['singleIndex'] + $currentContent['content'], + $currentContent['tag'] ); } return $indexTagValueNodes; } - private function createFromAnnotationAndContent(Index $index, string $annotationContent): IndexTagValueNode - { + private function createFromAnnotationAndContent( + Index $index, + string $annotationContent, + string $tag + ): IndexTagValueNode { // doctrine/orm compatibility between different versions $flags = property_exists($index, 'flags') ? $index->flags : []; - return new IndexTagValueNode($index->name, $index->columns, $flags, $index->options, $annotationContent); + return new IndexTagValueNode($index->name, $index->columns, $flags, $index->options, $annotationContent, $tag); } } diff --git a/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Class_/TablePhpDocNodeFactory.php b/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Class_/TablePhpDocNodeFactory.php index c1c81c8f6d7..8d9fff319f3 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Class_/TablePhpDocNodeFactory.php +++ b/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Class_/TablePhpDocNodeFactory.php @@ -3,6 +3,7 @@ namespace Rector\BetterPhpDocParser\PhpDocNodeFactory\Doctrine\Class_; use Doctrine\ORM\Mapping\Table; +use Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Stmt\Class_; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode; @@ -50,23 +51,34 @@ public function createFromNodeAndTokens(Node $node, TokenIterator $tokenIterator $annotationContent = $this->resolveContentFromTokenIterator($tokenIterator); + $indexesContent = $this->annotationContentResolver->resolveNestedKey($annotationContent, 'indexes'); $indexTagValueNodes = $this->indexPhpDocNodeFactory->createIndexTagValueNodes( $table->indexes, - $annotationContent + $indexesContent + ); + + $haveIndexesFinalComma = (bool) Strings::match($indexesContent, '#,(\s+)?}$#m'); + $uniqueConstraintsContent = $this->annotationContentResolver->resolveNestedKey( + $annotationContent, + 'uniqueConstraints' ); $uniqueConstraintTagValueNodes = $this->uniqueConstraintPhpDocNodeFactory->createUniqueConstraintTagValueNodes( $table->uniqueConstraints, - $annotationContent + $uniqueConstraintsContent ); + $haveUniqueConstraintsFinalComma = (bool) Strings::match($uniqueConstraintsContent, '#,(\s+)?}$#m'); + return new TableTagValueNode( $table->name, $table->schema, $indexTagValueNodes, $uniqueConstraintTagValueNodes, $table->options, - $annotationContent + $annotationContent, + $haveIndexesFinalComma, + $haveUniqueConstraintsFinalComma ); } } diff --git a/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Class_/UniqueConstraintPhpDocNodeFactory.php b/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Class_/UniqueConstraintPhpDocNodeFactory.php index 630e1780a13..8c01f71a8b4 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Class_/UniqueConstraintPhpDocNodeFactory.php +++ b/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Class_/UniqueConstraintPhpDocNodeFactory.php @@ -11,7 +11,7 @@ final class UniqueConstraintPhpDocNodeFactory /** * @var string */ - private const UNIQUE_CONSTRAINT_PATTERN = '#@ORM\\\\UniqueConstraint\((?.*?)\),?#si'; + private const UNIQUE_CONSTRAINT_PATTERN = '#(?@(ORM\\\\)?UniqueConstraint)\((?.*?)\),?#si'; /** * @return UniqueConstraintTagValueNode[] @@ -26,9 +26,12 @@ public function createUniqueConstraintTagValueNodes(?array $uniqueConstraints, s $uniqueConstraintTagValueNodes = []; foreach ($uniqueConstraints as $key => $uniqueConstraint) { + $subAnnotationContent = $uniqueConstraintContents[$key]; + $uniqueConstraintTagValueNodes[] = $this->createIndexOrUniqueConstantTagValueNode( $uniqueConstraint, - $uniqueConstraintContents[$key]['singleUniqueConstraint'] + $subAnnotationContent['content'], + $subAnnotationContent['tag'] ); } @@ -37,7 +40,8 @@ public function createUniqueConstraintTagValueNodes(?array $uniqueConstraints, s private function createIndexOrUniqueConstantTagValueNode( UniqueConstraint $uniqueConstraint, - string $annotationContent + string $annotationContent, + string $tag ): UniqueConstraintTagValueNode { // doctrine/orm compatibility between different versions $flags = property_exists($uniqueConstraint, 'flags') ? $uniqueConstraint->flags : []; @@ -47,7 +51,8 @@ private function createIndexOrUniqueConstantTagValueNode( $uniqueConstraint->columns, $flags, $uniqueConstraint->options, - $annotationContent + $annotationContent, + $tag ); } } diff --git a/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Property_/JoinColumnPhpDocNodeFactory.php b/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Property_/JoinColumnPhpDocNodeFactory.php index 909a9185104..0f6d76c3498 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Property_/JoinColumnPhpDocNodeFactory.php +++ b/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Property_/JoinColumnPhpDocNodeFactory.php @@ -40,7 +40,8 @@ public function createFromNodeAndTokens(Node $node, TokenIterator $tokenIterator public function createFromAnnotationAndAnnotationContent( JoinColumn $joinColumn, - string $annotationContent + string $annotationContent, + ?string $tag = null ): JoinColumnTagValueNode { return new JoinColumnTagValueNode( $joinColumn->name, @@ -50,7 +51,8 @@ public function createFromAnnotationAndAnnotationContent( $joinColumn->onDelete, $joinColumn->columnDefinition, $joinColumn->fieldName, - $annotationContent + $annotationContent, + $tag ); } } diff --git a/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Property_/JoinTablePhpDocNodeFactory.php b/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Property_/JoinTablePhpDocNodeFactory.php index 0faec2ddebe..5430b216190 100644 --- a/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Property_/JoinTablePhpDocNodeFactory.php +++ b/packages/BetterPhpDocParser/src/PhpDocNodeFactory/Doctrine/Property_/JoinTablePhpDocNodeFactory.php @@ -18,7 +18,7 @@ final class JoinTablePhpDocNodeFactory extends AbstractPhpDocNodeFactory /** * @var string */ - private const JOIN_COLUMN_PATTERN = '#@ORM\\\\JoinColumn\((?.*?)\),?#si'; + private const JOIN_COLUMN_PATTERN = '#(?@(ORM\\\\)?JoinColumn)\((?.*?)\),?#si'; /** * @var JoinColumnPhpDocNodeFactory @@ -51,8 +51,8 @@ public function createFromNodeAndTokens(Node $node, TokenIterator $tokenIterator } $annotationContent = $this->resolveContentFromTokenIterator($tokenIterator); - $joinColumnValuesTags = $this->createJoinColumnTagValues($annotationContent, $joinTable, 'joinColumns'); + $inverseJoinColumnValuesTags = $this->createJoinColumnTagValues( $annotationContent, $joinTable, @@ -77,10 +77,12 @@ private function createJoinColumnTagValues(string $annotationContent, JoinTable $joinColumnValuesTags = []; foreach ($joinTable->joinColumns as $key => $joinColumn) { - $currentJoinColumnContent = $joinColumnContents[$key]['singleJoinColumn']; + $subAnnotation = $joinColumnContents[$key]; + $joinColumnValuesTags[] = $this->joinColumnPhpDocNodeFactory->createFromAnnotationAndAnnotationContent( $joinColumn, - $currentJoinColumnContent + $subAnnotation['content'], + $subAnnotation['tag'] ); } diff --git a/packages/BetterPhpDocParser/src/PhpDocParser/AnnotationContentResolver.php b/packages/BetterPhpDocParser/src/PhpDocParser/AnnotationContentResolver.php index 0bfcdfe3c1b..bc5b79d117f 100644 --- a/packages/BetterPhpDocParser/src/PhpDocParser/AnnotationContentResolver.php +++ b/packages/BetterPhpDocParser/src/PhpDocParser/AnnotationContentResolver.php @@ -4,10 +4,22 @@ use Nette\Utils\Strings; use PHPStan\PhpDocParser\Lexer\Lexer; +use PHPStan\PhpDocParser\Parser\ParserException; use PHPStan\PhpDocParser\Parser\TokenIterator; +use Rector\BetterPhpDocParser\PhpDocInfo\TokenIteratorFactory; final class AnnotationContentResolver { + /** + * @var TokenIteratorFactory + */ + private $tokenIteratorFactory; + + public function __construct(TokenIteratorFactory $tokenIteratorFactory) + { + $this->tokenIteratorFactory = $tokenIteratorFactory; + } + /** * Skip all tokens for this annotation, so next annotation can work with tokens after this one * Inspired at @see \PHPStan\PhpDocParser\Parser\PhpDocParser::parseText() @@ -44,8 +56,75 @@ public function resolveFromTokenIterator(TokenIterator $tokenIterator): string return $this->cleanMultilineAnnotationContent($annotationContent); } + public function resolveNestedKey(string $annotationContent, string $name): string + { + try { + $start = false; + $openedCurlyBracketCount = 0; + $tokenContents = []; + + $tokenIterator = $this->tokenIteratorFactory->create($annotationContent); + + while (true) { + // the end + if (in_array($tokenIterator->currentTokenType(), [Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END], true)) { + break; + } + + $start = $this->tryStartWithKey($name, $start, $tokenIterator); + if ($start === false) { + $tokenIterator->next(); + continue; + } + + $tokenContents[] = $tokenIterator->currentTokenValue(); + + // opening bracket { + if ($tokenIterator->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET)) { + ++$openedCurlyBracketCount; + } + + // closing bracket } + if ($tokenIterator->isCurrentTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { + --$openedCurlyBracketCount; + + // the final one + if ($openedCurlyBracketCount === 0) { + break; + } + } + + $tokenIterator->next(); + } + + return implode('', $tokenContents); + } catch (ParserException $parserException) { + throw $parserException; + return ''; + } + } + private function cleanMultilineAnnotationContent(string $annotationContent): string { return Strings::replace($annotationContent, '#(\s+)\*(\s+)#m', '$1$3'); } + + private function tryStartWithKey(string $name, bool $start, TokenIterator $localTokenIterator): bool + { + if ($start === true) { + return true; + } + + if ($localTokenIterator->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { + if ($localTokenIterator->currentTokenValue() === $name) { + // consume "=" as well + $localTokenIterator->next(); + $localTokenIterator->tryConsumeTokenType(Lexer::TOKEN_EQUAL); + + return true; + } + } + + return false; + } } diff --git a/packages/BetterPhpDocParser/src/PhpDocParser/BetterPhpDocParser.php b/packages/BetterPhpDocParser/src/PhpDocParser/BetterPhpDocParser.php index 8a1bd41aeb4..62ee774fcab 100644 --- a/packages/BetterPhpDocParser/src/PhpDocParser/BetterPhpDocParser.php +++ b/packages/BetterPhpDocParser/src/PhpDocParser/BetterPhpDocParser.php @@ -18,9 +18,8 @@ use Rector\BetterPhpDocParser\Attributes\Attribute\Attribute; use Rector\BetterPhpDocParser\Contract\PhpDocNodeFactoryInterface; use Rector\BetterPhpDocParser\Contract\PhpDocParserAwareInterface; -use Rector\BetterPhpDocParser\Contract\PhpDocParserExtensionInterface; use Rector\BetterPhpDocParser\Printer\MultilineSpaceFormatPreserver; -use Rector\BetterPhpDocParser\ValueObject\StartEndInfo; +use Rector\BetterPhpDocParser\ValueObject\StartEndValueObject; use Rector\Configuration\CurrentNodeProvider; use Symplify\PackageBuilder\Reflection\PrivatesAccessor; use Symplify\PackageBuilder\Reflection\PrivatesCaller; @@ -56,11 +55,6 @@ final class BetterPhpDocParser extends PhpDocParser */ private $multilineSpaceFormatPreserver; - /** - * @var PhpDocParserExtensionInterface[] - */ - private $phpDocParserExtensions = []; - /** * @var PhpDocNodeFactoryInterface[] */ @@ -72,7 +66,6 @@ final class BetterPhpDocParser extends PhpDocParser private $currentNodeProvider; /** - * @param PhpDocParserExtensionInterface[] $phpDocParserExtensions * @param PhpDocNodeFactoryInterface[] $phpDocNodeFactories */ public function __construct( @@ -81,8 +74,7 @@ public function __construct( AttributeAwareNodeFactory $attributeAwareNodeFactory, MultilineSpaceFormatPreserver $multilineSpaceFormatPreserver, CurrentNodeProvider $currentNodeProvider, - array $phpDocNodeFactories = [], - array $phpDocParserExtensions = [] + array $phpDocNodeFactories = [] ) { parent::__construct($typeParser, $constExprParser); @@ -90,7 +82,6 @@ public function __construct( $this->privatesAccessor = new PrivatesAccessor(); $this->attributeAwareNodeFactory = $attributeAwareNodeFactory; $this->multilineSpaceFormatPreserver = $multilineSpaceFormatPreserver; - $this->phpDocParserExtensions = $phpDocParserExtensions; $this->phpDocNodeFactories = $phpDocNodeFactories; $this->currentNodeProvider = $currentNodeProvider; } @@ -147,30 +138,13 @@ public function parseTag(TokenIterator $tokenIterator): PhpDocTagNode } } - $value = $this->parseTagValue($tokenIterator, $tag); + $phpDocTagValueNode = $this->parseTagValue($tokenIterator, $tag); - return new PhpDocTagNode($tag, $value); + return new PhpDocTagNode($tag, $phpDocTagValueNode); } public function parseTagValue(TokenIterator $tokenIterator, string $tag): PhpDocTagValueNode { - $tokenIterator->pushSavePoint(); - - foreach ($this->phpDocParserExtensions as $phpDocParserExtension) { - if (! $phpDocParserExtension->matchTag($tag)) { - continue; - } - - $phpDocTagValueNode = $phpDocParserExtension->parse($tokenIterator, $tag); - if ($phpDocTagValueNode !== null) { - $tokenIterator->dropSavePoint(); - return $phpDocTagValueNode; - } - - $tokenIterator->rollback(); - break; - } - // needed for reference support in params, see https://github.com/rectorphp/rector/issues/1734 $tagValueNode = null; foreach ($this->phpDocNodeFactories as $phpDocNodeFactory) { @@ -185,7 +159,7 @@ public function parseTagValue(TokenIterator $tokenIterator, string $tag): PhpDoc } } - // fallback to orignal parser + // fallback to original parser if ($tagValueNode === null) { $tagValueNode = parent::parseTagValue($tokenIterator, $tag); } @@ -195,12 +169,13 @@ public function parseTagValue(TokenIterator $tokenIterator, string $tag): PhpDoc private function parseChildAndStoreItsPositions(TokenIterator $tokenIterator): Node { - $tokenStart = $this->privatesAccessor->getPrivateProperty($tokenIterator, 'index'); - $node = $this->privatesCaller->callPrivateMethod($this, 'parseChild', $tokenIterator); - $tokenEnd = $this->privatesAccessor->getPrivateProperty($tokenIterator, 'index'); + $tokenStart = $this->getTokenIteratorIndex($tokenIterator); + $phpDocNode = $this->privatesCaller->callPrivateMethod($this, 'parseChild', $tokenIterator); + $tokenEnd = $this->getTokenIteratorIndex($tokenIterator); + $startEndValueObject = new StartEndValueObject($tokenStart, $tokenEnd); - $attributeAwareNode = $this->attributeAwareNodeFactory->createFromNode($node); - $attributeAwareNode->setAttribute(Attribute::PHP_DOC_NODE_INFO, new StartEndInfo($tokenStart, $tokenEnd)); + $attributeAwareNode = $this->attributeAwareNodeFactory->createFromNode($phpDocNode); + $attributeAwareNode->setAttribute(Attribute::PHP_DOC_NODE_INFO, $startEndValueObject); $possibleMultilineText = $this->multilineSpaceFormatPreserver->resolveCurrentPhpDocNodeText( $attributeAwareNode @@ -249,4 +224,9 @@ private function getOriginalContentFromTokenIterator(TokenIterator $tokenIterato return trim($originalContent); } + + private function getTokenIteratorIndex(TokenIterator $tokenIterator): int + { + return (int) $this->privatesAccessor->getPrivateProperty($tokenIterator, 'index'); + } } diff --git a/packages/BetterPhpDocParser/src/Printer/MultilineSpaceFormatPreserver.php b/packages/BetterPhpDocParser/src/Printer/MultilineSpaceFormatPreserver.php index dc5a88b66c7..13eb9a45bcc 100644 --- a/packages/BetterPhpDocParser/src/Printer/MultilineSpaceFormatPreserver.php +++ b/packages/BetterPhpDocParser/src/Printer/MultilineSpaceFormatPreserver.php @@ -8,7 +8,7 @@ use Rector\BetterPhpDocParser\Attributes\Ast\PhpDoc\AttributeAwareGenericTagValueNode; use Rector\BetterPhpDocParser\Attributes\Ast\PhpDoc\AttributeAwarePhpDocTagNode; use Rector\BetterPhpDocParser\Attributes\Attribute\Attribute; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; final class MultilineSpaceFormatPreserver { diff --git a/packages/BetterPhpDocParser/src/Printer/OriginalSpacingRestorer.php b/packages/BetterPhpDocParser/src/Printer/OriginalSpacingRestorer.php index 368233298d4..a0bfe927599 100644 --- a/packages/BetterPhpDocParser/src/Printer/OriginalSpacingRestorer.php +++ b/packages/BetterPhpDocParser/src/Printer/OriginalSpacingRestorer.php @@ -7,7 +7,7 @@ use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Lexer\Lexer; use Rector\BetterPhpDocParser\Contract\Doctrine\DoctrineTagNodeInterface; -use Rector\BetterPhpDocParser\ValueObject\StartEndInfo; +use Rector\BetterPhpDocParser\ValueObject\StartEndValueObject; final class OriginalSpacingRestorer { @@ -18,9 +18,9 @@ public function restoreInOutputWithTokensStartAndEndPosition( Node $node, string $nodeOutput, array $tokens, - StartEndInfo $startEndInfo + StartEndValueObject $startEndValueObject ): string { - $oldWhitespaces = $this->detectOldWhitespaces($node, $tokens, $startEndInfo); + $oldWhitespaces = $this->detectOldWhitespaces($node, $tokens, $startEndValueObject); // no original whitespaces, return if ($oldWhitespaces === []) { @@ -50,18 +50,18 @@ public function restoreInOutputWithTokensStartAndEndPosition( * @param mixed[] $tokens * @return string[] */ - private function detectOldWhitespaces(Node $node, array $tokens, StartEndInfo $startEndInfo): array + private function detectOldWhitespaces(Node $node, array $tokens, StartEndValueObject $startEndValueObject): array { $oldWhitespaces = []; - $start = $startEndInfo->getStart(); + $start = $startEndValueObject->getStart(); // this is needed, because of 1 token taken from tokens and added annotation name: "ORM" + "\X" → "ORM\X" // todo, this might be needed to be dynamic, based on taken tokens count (some Collector?) if ($node instanceof DoctrineTagNodeInterface) { --$start; } - for ($i = $start; $i < $startEndInfo->getEnd(); ++$i) { + for ($i = $start; $i < $startEndValueObject->getEnd(); ++$i) { if ($tokens[$i][1] === Lexer::TOKEN_HORIZONTAL_WS) { $value = $tokens[$i][0]; diff --git a/packages/BetterPhpDocParser/src/Printer/PhpDocInfoPrinter.php b/packages/BetterPhpDocParser/src/Printer/PhpDocInfoPrinter.php index 4c478b2c8ce..4e8fe1975a8 100644 --- a/packages/BetterPhpDocParser/src/Printer/PhpDocInfoPrinter.php +++ b/packages/BetterPhpDocParser/src/Printer/PhpDocInfoPrinter.php @@ -10,9 +10,9 @@ use PHPStan\PhpDocParser\Lexer\Lexer; use Rector\BetterPhpDocParser\Attributes\Ast\PhpDoc\AttributeAwarePhpDocNode; use Rector\BetterPhpDocParser\Attributes\Attribute\Attribute; -use Rector\BetterPhpDocParser\Attributes\Contract\Ast\AttributeAwareNodeInterface; +use Rector\BetterPhpDocParser\Contract\PhpDocNode\AttributeAwareNodeInterface; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; -use Rector\BetterPhpDocParser\ValueObject\StartEndInfo; +use Rector\BetterPhpDocParser\ValueObject\StartEndValueObject; /** * @see \Rector\BetterPhpDocParser\Tests\PhpDocInfo\PhpDocInfoPrinter\PhpDocInfoPrinterTest @@ -35,7 +35,7 @@ final class PhpDocInfoPrinter private $tokens = []; /** - * @var StartEndInfo[] + * @var StartEndValueObject[] */ private $removedNodePositions = []; @@ -134,44 +134,44 @@ private function isPhpDocNodeEmpty(PhpDocNode $phpDocNode): bool private function printNode( AttributeAwareNodeInterface $attributeAwareNode, - ?StartEndInfo $startEndInfo = null, + ?StartEndValueObject $startEndValueObject = null, int $i = 0, int $nodeCount = 0, bool $shouldSkipEmptyLinesAbove = false ): string { $output = ''; - /** @var StartEndInfo|null $startEndInfo */ - $startEndInfo = $attributeAwareNode->getAttribute(Attribute::PHP_DOC_NODE_INFO) ?: $startEndInfo; + /** @var StartEndValueObject|null $startEndValueObject */ + $startEndValueObject = $attributeAwareNode->getAttribute(Attribute::PHP_DOC_NODE_INFO) ?: $startEndValueObject; $attributeAwareNode = $this->multilineSpaceFormatPreserver->fixMultilineDescriptions($attributeAwareNode); - if ($startEndInfo) { + if ($startEndValueObject) { $isLastToken = ($nodeCount === $i); $output = $this->addTokensFromTo( $output, $this->currentTokenPosition, - $startEndInfo->getStart(), + $startEndValueObject->getStart(), ! $shouldSkipEmptyLinesAbove && $isLastToken ); - $this->currentTokenPosition = $startEndInfo->getEnd(); + $this->currentTokenPosition = $startEndValueObject->getEnd(); } if ($attributeAwareNode instanceof PhpDocTagNode) { - if ($startEndInfo) { - return $this->printPhpDocTagNode($attributeAwareNode, $startEndInfo, $output); + if ($startEndValueObject) { + return $this->printPhpDocTagNode($attributeAwareNode, $startEndValueObject, $output); } return $output . PHP_EOL . ' * ' . $this->printAttributeWithAsterisk($attributeAwareNode); } - if (! $attributeAwareNode instanceof PhpDocTextNode && ! $attributeAwareNode instanceof GenericTagValueNode && $startEndInfo) { + if (! $attributeAwareNode instanceof PhpDocTextNode && ! $attributeAwareNode instanceof GenericTagValueNode && $startEndValueObject) { return $this->originalSpacingRestorer->restoreInOutputWithTokensStartAndEndPosition( $attributeAwareNode, (string) $attributeAwareNode, $this->tokens, - $startEndInfo + $startEndValueObject ); } @@ -222,11 +222,11 @@ private function addTokensFromTo( */ private function printPhpDocTagNode( PhpDocTagNode $phpDocTagNode, - StartEndInfo $startEndInfo, + StartEndValueObject $startEndValueObject, string $output ): string { $output .= $phpDocTagNode->name; - $nodeOutput = $this->printNode($phpDocTagNode->value, $startEndInfo); + $nodeOutput = $this->printNode($phpDocTagNode->value, $startEndValueObject); if ($nodeOutput && $this->isTagSeparatedBySpace($nodeOutput, $phpDocTagNode)) { $output .= ' '; } @@ -253,7 +253,7 @@ private function printPhpDocTagNode( } /** - * @return StartEndInfo[] + * @return StartEndValueObject[] */ private function getRemovedNodesPositions(): array { @@ -276,7 +276,10 @@ private function getRemovedNodesPositions(): array --$seekPosition; } - $this->removedNodePositions[] = new StartEndInfo($seekPosition - 1, $removedPhpDocNodeInfo->getEnd()); + $this->removedNodePositions[] = new StartEndValueObject( + $seekPosition - 1, + $removedPhpDocNodeInfo->getEnd() + ); } return $this->removedNodePositions; diff --git a/packages/BetterPhpDocParser/src/ValueObject/StartEndInfo.php b/packages/BetterPhpDocParser/src/ValueObject/StartEndValueObject.php similarity index 93% rename from packages/BetterPhpDocParser/src/ValueObject/StartEndInfo.php rename to packages/BetterPhpDocParser/src/ValueObject/StartEndValueObject.php index 0b380aa4a03..2bb378c00cc 100644 --- a/packages/BetterPhpDocParser/src/ValueObject/StartEndInfo.php +++ b/packages/BetterPhpDocParser/src/ValueObject/StartEndValueObject.php @@ -2,7 +2,7 @@ namespace Rector\BetterPhpDocParser\ValueObject; -final class StartEndInfo +final class StartEndValueObject { /** * @var int diff --git a/packages/BetterPhpDocParser/tests/PhpDocInfo/PhpDocInfoPrinter/DoctrineTest.php b/packages/BetterPhpDocParser/tests/PhpDocInfo/PhpDocInfoPrinter/DoctrineTest.php index 97f828cb5dd..d87af7683d6 100644 --- a/packages/BetterPhpDocParser/tests/PhpDocInfo/PhpDocInfoPrinter/DoctrineTest.php +++ b/packages/BetterPhpDocParser/tests/PhpDocInfo/PhpDocInfoPrinter/DoctrineTest.php @@ -27,14 +27,9 @@ public function testClass(string $docFilePath, Node $node): void ); } - /** - * @return string[]|Class_[] - */ public function provideDataForTestClass(): Iterator { yield [__DIR__ . '/Source/Doctrine/index_in_table.txt', new Class_(IndexInTable::class)]; - - $this->markTestSkipped('wip'); yield [__DIR__ . '/Source/Doctrine/case_sensitive.txt', new Class_(CaseSensitive::class)]; yield [__DIR__ . '/Source/Doctrine/short.txt', new Class_(Short::class)]; } diff --git a/packages/BetterPhpDocParser/tests/PhpDocInfo/PhpDocInfoPrinter/MultilineTest.php b/packages/BetterPhpDocParser/tests/PhpDocInfo/PhpDocInfoPrinter/MultilineTest.php index f1caaa5fb03..7ff7829e301 100644 --- a/packages/BetterPhpDocParser/tests/PhpDocInfo/PhpDocInfoPrinter/MultilineTest.php +++ b/packages/BetterPhpDocParser/tests/PhpDocInfo/PhpDocInfoPrinter/MultilineTest.php @@ -60,9 +60,6 @@ public function testChangedFormat(string $docFilePath, Node $node, string $expec $this->assertSame($expectedPhpDoc, $this->phpDocInfoPrinter->printFormatPreserving($phpDocInfo)); } - /** - * @return string[]|Property[] - */ public function provideDataForChangedFormat(): Iterator { $property = $this->createPublicPropertyUnderClass('anotherProperty', AnotherPropertyClass::class); diff --git a/packages/ElasticSearchDSL/src/Rector/MethodCall/MigrateFilterToQueryRector.php b/packages/ElasticSearchDSL/src/Rector/MethodCall/MigrateFilterToQueryRector.php index 1635a7f9a4b..2545b225ad3 100644 --- a/packages/ElasticSearchDSL/src/Rector/MethodCall/MigrateFilterToQueryRector.php +++ b/packages/ElasticSearchDSL/src/Rector/MethodCall/MigrateFilterToQueryRector.php @@ -4,10 +4,8 @@ use PhpParser\Node; use PhpParser\Node\Arg; -use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Identifier; -use PhpParser\Node\Name\FullyQualified; use Rector\Rector\AbstractRector; use Rector\RectorDefinition\CodeSample; use Rector\RectorDefinition\RectorDefinition; @@ -23,29 +21,36 @@ public function getDefinition(): RectorDefinition return new RectorDefinition('Migrates addFilter to addQuery', [ new CodeSample( <<<'PHP' +use ONGR\ElasticsearchDSL\Search; +use ONGR\ElasticsearchDSL\Query\TermsQuery; + class SomeClass { public function run() { - $search = new \ONGR\ElasticsearchDSL\Search(); + $search = new Search(); $search->addFilter( - new \ONGR\ElasticsearchDSL\Query\TermsQuery('categoryIds', [1, 2]) + new TermsQuery('categoryIds', [1, 2]) ); } } PHP , <<<'PHP' +use ONGR\ElasticsearchDSL\Search; +use ONGR\ElasticsearchDSL\Query\TermsQuery; +use ONGR\ElasticsearchDSL\Query\Compound\BoolQuery; + class SomeClass { public function run() { - $search = new \ONGR\ElasticsearchDSL\Search(); + $search = new Search(); $search->addQuery( - new \ONGR\ElasticsearchDSL\Query\TermsQuery('categoryIds', [1, 2]), - \ONGR\ElasticsearchDSL\Query\Compound\BoolQuery::FILTER + new TermsQuery('categoryIds', [1, 2]), + BoolQuery::FILTER ); } } @@ -77,9 +82,9 @@ public function refactor(Node $node): ?Node $node->name = new Identifier('addQuery'); - $node->args[1] = new Arg(new ClassConstFetch(new FullyQualified( - 'ONGR\ElasticsearchDSL\Query\Compound\BoolQuery' - ), new Identifier('FILTER'))); + $classConstFetch = $this->createClassConstant('ONGR\ElasticsearchDSL\Query\Compound\BoolQuery', 'FILTER'); + + $node->args[1] = new Arg($classConstFetch); return $node; } diff --git a/packages/Symfony/src/PhpDocParser/Ast/PhpDoc/AbstractConstraintTagValueNode.php b/packages/Symfony/src/PhpDocParser/Ast/PhpDoc/AbstractConstraintTagValueNode.php index 8edb4a2ca81..44df0124c7a 100644 --- a/packages/Symfony/src/PhpDocParser/Ast/PhpDoc/AbstractConstraintTagValueNode.php +++ b/packages/Symfony/src/PhpDocParser/Ast/PhpDoc/AbstractConstraintTagValueNode.php @@ -2,7 +2,7 @@ namespace Rector\Symfony\PhpDocParser\Ast\PhpDoc; -use Rector\BetterPhpDocParser\PhpDocParser\Ast\PhpDoc\AbstractTagValueNode; +use Rector\BetterPhpDocParser\PhpDocNode\AbstractTagValueNode; abstract class AbstractConstraintTagValueNode extends AbstractTagValueNode { diff --git a/src/BetterPhpDocParser/PhpDocNode/Doctrine/AbstractDoctrineTagValueNode.php b/src/BetterPhpDocParser/PhpDocNode/Doctrine/AbstractDoctrineTagValueNode.php index 011906b3db7..310241f91c5 100644 --- a/src/BetterPhpDocParser/PhpDocNode/Doctrine/AbstractDoctrineTagValueNode.php +++ b/src/BetterPhpDocParser/PhpDocNode/Doctrine/AbstractDoctrineTagValueNode.php @@ -3,7 +3,7 @@ namespace Rector\BetterPhpDocParser\PhpDocNode\Doctrine; use Rector\BetterPhpDocParser\Contract\Doctrine\DoctrineTagNodeInterface; -use Rector\BetterPhpDocParser\PhpDocParser\Ast\PhpDoc\AbstractTagValueNode; +use Rector\BetterPhpDocParser\PhpDocNode\AbstractTagValueNode; abstract class AbstractDoctrineTagValueNode extends AbstractTagValueNode implements DoctrineTagNodeInterface { From a1e9a529d64a52c9a7de9ecaa6598855b4931ebe Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 27 Sep 2019 21:53:34 +0200 Subject: [PATCH 2/3] make tags in-sensitivty --- .../src/AnnotationReader/AnnotationReaderFactory.php | 3 +++ .../src/PhpDocParser/BetterPhpDocParser.php | 3 ++- .../Fixture/to_one.php.inc | 8 ++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/BetterPhpDocParser/src/AnnotationReader/AnnotationReaderFactory.php b/packages/BetterPhpDocParser/src/AnnotationReader/AnnotationReaderFactory.php index e454e1caefb..eb0994bc56f 100644 --- a/packages/BetterPhpDocParser/src/AnnotationReader/AnnotationReaderFactory.php +++ b/packages/BetterPhpDocParser/src/AnnotationReader/AnnotationReaderFactory.php @@ -34,6 +34,9 @@ public function create(): AnnotationReader $annotationReader::addGlobalIgnoredName('Gedmo\SoftDeleteable'); $annotationReader::addGlobalIgnoredName('SoftDeleteable'); + // nette @inject dummy annotation + $annotationReader::addGlobalIgnoredName('inject'); + // warning: nested tags must be parse-able, e.g. @ORM\Table must include @ORM\UniqueConstraint! return $annotationReader; diff --git a/packages/BetterPhpDocParser/src/PhpDocParser/BetterPhpDocParser.php b/packages/BetterPhpDocParser/src/PhpDocParser/BetterPhpDocParser.php index 62ee774fcab..0445bf7ec67 100644 --- a/packages/BetterPhpDocParser/src/PhpDocParser/BetterPhpDocParser.php +++ b/packages/BetterPhpDocParser/src/PhpDocParser/BetterPhpDocParser.php @@ -153,7 +153,8 @@ public function parseTagValue(TokenIterator $tokenIterator, string $tag): PhpDoc $phpDocNodeFactory->setPhpDocParser($this); } - if ($phpDocNodeFactory->getName() === $tag) { + // compare regardless sensitivity + if (Strings::lower($phpDocNodeFactory->getName()) === Strings::lower($tag)) { $currentNode = $this->currentNodeProvider->getNode(); $tagValueNode = $phpDocNodeFactory->createFromNodeAndTokens($currentNode, $tokenIterator); } diff --git a/packages/Doctrine/tests/Rector/Class_/AddUuidMirrorForRelationPropertyRector/Fixture/to_one.php.inc b/packages/Doctrine/tests/Rector/Class_/AddUuidMirrorForRelationPropertyRector/Fixture/to_one.php.inc index f40ecb0eb57..db53d5d9a4d 100644 --- a/packages/Doctrine/tests/Rector/Class_/AddUuidMirrorForRelationPropertyRector/Fixture/to_one.php.inc +++ b/packages/Doctrine/tests/Rector/Class_/AddUuidMirrorForRelationPropertyRector/Fixture/to_one.php.inc @@ -5,7 +5,7 @@ namespace Rector\Doctrine\Tests\Rector\Class_\AddUuidMirrorForRelationPropertyRe use Doctrine\ORM\Mapping as ORM; /** - * @ORM\Entity + * @Orm\Entity */ class SomeEntity { @@ -17,7 +17,7 @@ class SomeEntity } /** - * @ORM\Entity + * @Orm\Entity */ class AnotherEntity { @@ -41,7 +41,7 @@ namespace Rector\Doctrine\Tests\Rector\Class_\AddUuidMirrorForRelationPropertyRe use Doctrine\ORM\Mapping as ORM; /** - * @ORM\Entity + * @Orm\Entity */ class SomeEntity { @@ -58,7 +58,7 @@ class SomeEntity } /** - * @ORM\Entity + * @Orm\Entity */ class AnotherEntity { From 1202ca26581ed9b07ee598055c576e52376045b8 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 27 Sep 2019 22:09:00 +0200 Subject: [PATCH 3/3] allow cs --- .../src/PhpDocParser/BetterPhpDocParser.php | 23 ++++++++++++++++++- .../Fixture/to_one.php.inc | 12 ++++++---- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/packages/BetterPhpDocParser/src/PhpDocParser/BetterPhpDocParser.php b/packages/BetterPhpDocParser/src/PhpDocParser/BetterPhpDocParser.php index 0445bf7ec67..c1ae0c05855 100644 --- a/packages/BetterPhpDocParser/src/PhpDocParser/BetterPhpDocParser.php +++ b/packages/BetterPhpDocParser/src/PhpDocParser/BetterPhpDocParser.php @@ -154,7 +154,7 @@ public function parseTagValue(TokenIterator $tokenIterator, string $tag): PhpDoc } // compare regardless sensitivity - if (Strings::lower($phpDocNodeFactory->getName()) === Strings::lower($tag)) { + if ($this->isTagMatchingPhpDocNodeFactory($tag, $phpDocNodeFactory)) { $currentNode = $this->currentNodeProvider->getNode(); $tagValueNode = $phpDocNodeFactory->createFromNodeAndTokens($currentNode, $tokenIterator); } @@ -230,4 +230,25 @@ private function getTokenIteratorIndex(TokenIterator $tokenIterator): int { return (int) $this->privatesAccessor->getPrivateProperty($tokenIterator, 'index'); } + + private function isTagMatchingPhpDocNodeFactory(string $tag, PhpDocNodeFactoryInterface $phpDocNodeFactory): bool + { + if (Strings::lower($phpDocNodeFactory->getName()) === Strings::lower($tag)) { + return true; + } + + if (in_array($tag, ['@param'], true)) { + return false; + } + + // possible short import + if (Strings::contains($phpDocNodeFactory->getName(), '\\')) { + $lastNamePart = Strings::after($phpDocNodeFactory->getName(), '\\', -1); + if (Strings::lower('@' . $lastNamePart) === Strings::lower($tag)) { + return true; + } + } + + return false; + } } diff --git a/packages/Doctrine/tests/Rector/Class_/AddUuidMirrorForRelationPropertyRector/Fixture/to_one.php.inc b/packages/Doctrine/tests/Rector/Class_/AddUuidMirrorForRelationPropertyRector/Fixture/to_one.php.inc index db53d5d9a4d..523dcab89e3 100644 --- a/packages/Doctrine/tests/Rector/Class_/AddUuidMirrorForRelationPropertyRector/Fixture/to_one.php.inc +++ b/packages/Doctrine/tests/Rector/Class_/AddUuidMirrorForRelationPropertyRector/Fixture/to_one.php.inc @@ -3,14 +3,15 @@ namespace Rector\Doctrine\Tests\Rector\Class_\AddUuidMirrorForRelationPropertyRector\Fixture; use Doctrine\ORM\Mapping as ORM; +use Doctrine\ORM\Mapping\Entity; /** - * @Orm\Entity + * @EntitY */ class SomeEntity { /** - * @ORM\ManyToOne(targetEntity="Rector\Doctrine\Tests\Rector\Class_\AddUuidMirrorForRelationPropertyRector\Fixture\AnotherEntity", cascade={"persist", "merge"}) + * @Orm\ManyToOne(targetEntity="Rector\Doctrine\Tests\Rector\Class_\AddUuidMirrorForRelationPropertyRector\Fixture\AnotherEntity", cascade={"persist", "merge"}) * @ORM\JoinColumn(nullable=false) */ private $amenity; @@ -39,19 +40,20 @@ class AnotherEntity namespace Rector\Doctrine\Tests\Rector\Class_\AddUuidMirrorForRelationPropertyRector\Fixture; use Doctrine\ORM\Mapping as ORM; +use Doctrine\ORM\Mapping\Entity; /** - * @Orm\Entity + * @EntitY */ class SomeEntity { /** - * @ORM\ManyToOne(targetEntity="Rector\Doctrine\Tests\Rector\Class_\AddUuidMirrorForRelationPropertyRector\Fixture\AnotherEntity", cascade={"persist", "merge"}) + * @Orm\ManyToOne(targetEntity="Rector\Doctrine\Tests\Rector\Class_\AddUuidMirrorForRelationPropertyRector\Fixture\AnotherEntity", cascade={"persist", "merge"}) * @ORM\JoinColumn(nullable=false) */ private $amenity; /** - * @ORM\ManyToOne(targetEntity="Rector\Doctrine\Tests\Rector\Class_\AddUuidMirrorForRelationPropertyRector\Fixture\AnotherEntity", cascade={"persist", "merge"}) + * @Orm\ManyToOne(targetEntity="Rector\Doctrine\Tests\Rector\Class_\AddUuidMirrorForRelationPropertyRector\Fixture\AnotherEntity", cascade={"persist", "merge"}) * @ORM\JoinColumn(nullable=true, referencedColumnName="uuid") */ private $amenityUuid;