refactor: susun semula struktur folder — Laravel source ke src/

This commit is contained in:
Saufi
2026-05-19 15:58:35 +08:00
parent f052251b94
commit bf53c71b45
10806 changed files with 1385379 additions and 121 deletions

View File

@@ -0,0 +1,217 @@
<?php
require __DIR__ . '/tools/php-cs-fixer.d/PhpdocSingleLineVarFixer.php';
return (new PhpCsFixer\Config())
->registerCustomFixers([
new \PharIo\CSFixer\PhpdocSingleLineVarFixer()
])
->setRiskyAllowed(true)
->setRules(
[
'PharIo/phpdoc_single_line_var_fixer' => true,
'align_multiline_comment' => true,
'array_indentation' => true,
'array_syntax' => ['syntax' => 'short'],
'binary_operator_spaces' => [
'operators' => [
'=' => 'align_single_space_minimal',
'=>' => 'align',
],
],
'blank_line_after_namespace' => true,
'blank_line_after_opening_tag' => false,
'blank_line_before_statement' => [
'statements' => [
'break',
'continue',
'declare',
'do',
'for',
'foreach',
'if',
'include',
'include_once',
'require',
'require_once',
'return',
'switch',
'throw',
'try',
'while',
'yield',
],
],
// deprecated fixer removed: "braces"; use dedicated rules provided by PHP-CS-Fixer instead
'cast_spaces' => ['space' => 'none'],
// This fixer removes the blank line at class start, no way to disable that, so we disable the fixer :(
//'class_attributes_separation' => ['elements' => ['const', 'method', 'property']],
'combine_consecutive_issets' => true,
'combine_consecutive_unsets' => true,
'compact_nullable_type_declaration' => true,
'concat_space' => ['spacing' => 'one'],
'date_time_immutable' => true,
'declare_equal_normalize' => ['space' => 'single'],
'declare_strict_types' => true,
'dir_constant' => true,
'elseif' => true,
'encoding' => true,
'full_opening_tag' => true,
'fully_qualified_strict_types' => true,
'function_declaration' => [
'closure_function_spacing' => 'one'
],
'header_comment' => false,
'indentation_type' => true,
'is_null' => true,
'line_ending' => true,
'list_syntax' => ['syntax' => 'short'],
'logical_operators' => true,
'lowercase_cast' => true,
'constant_case' => ['case' => 'lower'],
'lowercase_keywords' => true,
'lowercase_static_reference' => true,
'magic_constant_casing' => true,
'method_argument_space' => ['on_multiline' => 'ensure_fully_multiline'],
'modernize_types_casting' => true,
'multiline_comment_opening_closing' => true,
'multiline_whitespace_before_semicolons' => true,
'native_constant_invocation' => true,
'native_function_casing' => true,
'global_namespace_import' => [
'import_classes' => true,
'import_constants' => true,
'import_functions' => true,
],
'native_function_invocation' => false,
// "new_with_braces" is deprecated → use "new_with_parentheses"
'new_with_parentheses' => false,
'no_alias_functions' => true,
'no_alternative_syntax' => true,
'no_blank_lines_after_class_opening' => false,
'no_blank_lines_after_phpdoc' => true,
'blank_lines_before_namespace' => false,
'no_closing_tag' => true,
'no_empty_comment' => true,
'no_empty_phpdoc' => true,
'no_empty_statement' => true,
'no_extra_blank_lines' => true,
'no_homoglyph_names' => true,
'no_leading_import_slash' => true,
'no_leading_namespace_whitespace' => true,
'no_mixed_echo_print' => ['use' => 'print'],
'no_multiline_whitespace_around_double_arrow' => true,
'no_null_property_initialization' => true,
'no_php4_constructor' => true,
'no_short_bool_cast' => true,
'echo_tag_syntax' => ['format' => 'long'],
'no_singleline_whitespace_before_semicolons' => true,
'no_spaces_after_function_name' => true,
// deprecated: no_spaces_inside_parenthesis → use spaces_inside_parentheses
'spaces_inside_parentheses' => ['space' => 'none'],
'no_superfluous_elseif' => true,
'no_superfluous_phpdoc_tags' => true,
// deprecated: no_trailing_comma_in_list_call (covered by no_trailing_comma_in_singleline)
'no_trailing_comma_in_singleline' => true,
'no_trailing_whitespace' => true,
'no_trailing_whitespace_in_comment' => true,
'no_unneeded_control_parentheses' => false,
// deprecated: no_unneeded_curly_braces → use no_unneeded_braces
'no_unneeded_braces' => false,
'no_unneeded_final_method' => true,
'no_unreachable_default_argument_value' => true,
'no_unset_on_property' => true,
'no_unused_imports' => true,
'no_useless_else' => true,
'no_useless_return' => true,
'no_whitespace_before_comma_in_array' => true,
'no_whitespace_in_blank_line' => true,
'non_printable_character' => true,
'normalize_index_brace' => true,
'object_operator_without_whitespace' => true,
'ordered_class_elements' => [
'order' => [
'use_trait',
'constant_public',
'constant_protected',
'constant_private',
'property_public_static',
'property_protected_static',
'property_private_static',
'property_public',
'property_protected',
'property_private',
'method_public_static',
'construct',
'destruct',
'magic',
'phpunit',
'method_public',
'method_protected',
'method_private',
'method_protected_static',
'method_private_static',
],
],
// Group and order use-statements by type: classes/interfaces/traits, then functions, then constants
'ordered_imports' => [
'imports_order' => ['class', 'function', 'const'],
// keep alphabetical ordering within each group (default)
'sort_algorithm' => 'alpha',
],
'phpdoc_add_missing_param_annotation' => true,
'phpdoc_align' => true,
'phpdoc_annotation_without_dot' => true,
'phpdoc_indent' => true,
'phpdoc_no_access' => true,
'phpdoc_no_empty_return' => true,
'phpdoc_no_package' => true,
'phpdoc_order' => true,
'phpdoc_return_self_reference' => true,
'phpdoc_scalar' => true,
'phpdoc_separation' => true,
'phpdoc_single_line_var_spacing' => true,
'phpdoc_to_comment' => false,
'phpdoc_trim' => true,
'phpdoc_trim_consecutive_blank_line_separation' => true,
'phpdoc_types' => ['groups' => ['simple', 'meta']],
'phpdoc_types_order' => true,
'phpdoc_to_return_type' => true,
'phpdoc_var_without_name' => true,
'pow_to_exponentiation' => true,
'protected_to_private' => true,
'return_assignment' => true,
'return_type_declaration' => ['space_before' => 'none'],
'self_accessor' => false,
'semicolon_after_instruction' => true,
'set_type_to_cast' => true,
'short_scalar_cast' => true,
'simplified_null_return' => true,
'single_blank_line_at_eof' => true,
'single_import_per_statement' => true,
'single_line_after_imports' => true,
'single_quote' => true,
'standardize_not_equals' => true,
'ternary_to_null_coalescing' => true,
'trailing_comma_in_multiline' => false,
'trim_array_spaces' => true,
'unary_operator_spaces' => true,
// deprecated: visibility_required → use modifier_keywords
'modifier_keywords' => true,
'void_return' => true,
'whitespace_after_comma_in_array' => true,
'yoda_style' => false
]
)
->setFinder(
PhpCsFixer\Finder::create()
->files()
->in(__DIR__ . '/src')
->in(__DIR__ . '/tests')
->exclude('_files')
->notName('*.phpt')
->notName('autoload.php')
);

122
vendor/theseer/tokenizer/CHANGELOG.md vendored Normal file
View File

@@ -0,0 +1,122 @@
# Changelog
All notable changes to Tokenizer are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
## [2.0.1] - 2025-12-08
### Fixed
- Removed the custom token `T_AMPERSAND` as PHP 8.1+ provides tokens for it already and our 2.0.0 release overwrote it. See [#44](https://github.com/theseer/tokenizer/issues/44) for details.
## [2.0.0] - 2025-12-06
This release bumps the minimum version required to PHP 8.1.
### Added
- New API `XMLSerializer::appendToWriter` to allow easier integration and better performance when writing fragments (Thanks @staabm)
### Changed
- Internal change: Now uses `PHPToken::tokenize` in favor of `token_get_all` (requires PHP 8+) (Thanks @staabm)
## [1.3.1] - 2025-111-17
### Fixed
* [#37](https://github.com/theseer/tokenizer/issues/37): v1.3.0 introduced a breaking change on the token collection (ArrayAccess interface removed)
## [1.3.0] - 2025-11-13
### Changed
* Require at least PHP 7.3 for building, code should still be PHP 7.2 compliant
* Merge various performance improvements provided by @staabm
* Merge some code cleanups provided by @staabm
## [1.2.3] - 2024-03-03
### Changed
* Do not use implicitly nullable parameters
## [1.2.2] - 2023-11-20
### Fixed
* [#18](https://github.com/theseer/tokenizer/issues/18): Tokenizer fails on protobuf metadata files
## [1.2.1] - 2021-07-28
### Fixed
* [#13](https://github.com/theseer/tokenizer/issues/13): Fatal error when tokenizing files that contain only a single empty line
## [1.2.0] - 2020-07-13
This release is now PHP 8.0 compliant.
### Fixed
* Whitespace handling in general (only noticeable in the intermediate `TokenCollection`) is now consistent
### Changed
* Updated `Tokenizer` to deal with changed whitespace handling in PHP 8.0
The XMLSerializer was unaffected.
## [1.1.3] - 2019-06-14
### Changed
* Ensure XMLSerializer can deal with empty token collections
### Fixed
* [#2](https://github.com/theseer/tokenizer/issues/2): Fatal error in infection / phpunit
## [1.1.2] - 2019-04-04
### Changed
* Reverted PHPUnit 8 test update to stay PHP 7.0 compliant
## [1.1.1] - 2019-04-03
### Fixed
* [#1](https://github.com/theseer/tokenizer/issues/1): Empty file causes invalid array read
### Changed
* Tests should now be PHPUnit 8 compliant
## [1.1.0] - 2017-04-07
### Added
* Allow use of custom namespace for XML serialization
## [1.0.0] - 2017-04-05
Initial Release
[1.3.1]: https://github.com/theseer/tokenizer/compare/1.3.0...1.3.1
[1.3.0]: https://github.com/theseer/tokenizer/compare/1.2.3...1.3.0
[1.2.3]: https://github.com/theseer/tokenizer/compare/1.2.2...1.2.3
[1.2.2]: https://github.com/theseer/tokenizer/compare/1.2.1...1.2.2
[1.2.1]: https://github.com/theseer/tokenizer/compare/1.2.0...1.2.1
[1.2.0]: https://github.com/theseer/tokenizer/compare/1.1.3...1.2.0
[1.1.3]: https://github.com/theseer/tokenizer/compare/1.1.2...1.1.3
[1.1.2]: https://github.com/theseer/tokenizer/compare/1.1.1...1.1.2
[1.1.1]: https://github.com/theseer/tokenizer/compare/1.1.0...1.1.1
[1.1.0]: https://github.com/theseer/tokenizer/compare/1.0.0...1.1.0
[1.0.0]: https://github.com/theseer/tokenizer/compare/b2493e57de80c1b7414219b28503fa5c6b4d0a98...1.0.0

30
vendor/theseer/tokenizer/LICENSE vendored Normal file
View File

@@ -0,0 +1,30 @@
Tokenizer
Copyright (c) 2017 Arne Blankerts <arne@blankerts.de> and contributors
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of Arne Blankerts nor the names of contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

47
vendor/theseer/tokenizer/README.md vendored Normal file
View File

@@ -0,0 +1,47 @@
# Tokenizer
A small library for converting tokenized PHP source code into XML.
[![Test](https://github.com/theseer/tokenizer/actions/workflows/ci.yml/badge.svg)](https://github.com/theseer/tokenizer/actions/workflows/ci.yml)
## Installation
You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/):
composer require theseer/tokenizer
If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency:
composer require --dev theseer/tokenizer
## Usage examples
```php
$tokenizer = new TheSeer\Tokenizer\Tokenizer();
$tokens = $tokenizer->parse(file_get_contents(__DIR__ . '/src/XMLSerializer.php'));
$serializer = new TheSeer\Tokenizer\XMLSerializer();
$xml = $serializer->toXML($tokens);
echo $xml;
```
The generated XML structure looks something like this:
```xml
<?xml version="1.0"?>
<source xmlns="https://github.com/theseer/tokenizer">
<line no="1">
<token name="T_OPEN_TAG">&lt;?php </token>
<token name="T_DECLARE">declare</token>
<token name="T_OPEN_BRACKET">(</token>
<token name="T_STRING">strict_types</token>
<token name="T_WHITESPACE"> </token>
<token name="T_EQUAL">=</token>
<token name="T_WHITESPACE"> </token>
<token name="T_LNUMBER">1</token>
<token name="T_CLOSE_BRACKET">)</token>
<token name="T_SEMICOLON">;</token>
</line>
</source>
```

27
vendor/theseer/tokenizer/composer.json vendored Normal file
View File

@@ -0,0 +1,27 @@
{
"name": "theseer/tokenizer",
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"license": "BSD-3-Clause",
"authors": [
{
"name": "Arne Blankerts",
"email": "arne@blankerts.de",
"role": "Developer"
}
],
"support": {
"issues": "https://github.com/theseer/tokenizer/issues"
},
"require": {
"php": "^8.1",
"ext-xmlwriter": "*",
"ext-dom": "*",
"ext-tokenizer": "*"
},
"autoload": {
"classmap": [
"src/"
]
}
}

22
vendor/theseer/tokenizer/composer.lock generated vendored Normal file
View File

@@ -0,0 +1,22 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "b010f1b3d9d47d431ee1cb54ac1de755",
"packages": [],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": "^7.2 || ^8.0",
"ext-xmlwriter": "*",
"ext-dom": "*",
"ext-tokenizer": "*"
},
"platform-dev": []
}

View File

@@ -0,0 +1,5 @@
<?php declare(strict_types = 1);
namespace TheSeer\Tokenizer;
class Exception extends \Exception {
}

View File

@@ -0,0 +1,27 @@
<?php declare(strict_types = 1);
namespace TheSeer\Tokenizer;
use function sprintf;
use function strpos;
class NamespaceUri {
/** @var string */
private $value;
public function __construct(string $value) {
$this->ensureValidUri($value);
$this->value = $value;
}
public function asString(): string {
return $this->value;
}
private function ensureValidUri($value): void {
if (strpos($value, ':') === false) {
throw new NamespaceUriException(
sprintf("Namespace URI '%s' must contain at least one colon", $value)
);
}
}
}

View File

@@ -0,0 +1,5 @@
<?php declare(strict_types = 1);
namespace TheSeer\Tokenizer;
class NamespaceUriException extends Exception {
}

34
vendor/theseer/tokenizer/src/Token.php vendored Normal file
View File

@@ -0,0 +1,34 @@
<?php declare(strict_types = 1);
namespace TheSeer\Tokenizer;
class Token {
/** @var int */
private $line;
/** @var string */
private $name;
/** @var string */
private $value;
/**
* Token constructor.
*/
public function __construct(int $line, string $name, string $value) {
$this->line = $line;
$this->name = $name;
$this->value = $value;
}
public function getLine(): int {
return $this->line;
}
public function getName(): string {
return $this->name;
}
public function getValue(): string {
return $this->value;
}
}

View File

@@ -0,0 +1,85 @@
<?php declare(strict_types = 1);
namespace TheSeer\Tokenizer;
use ArrayAccess;
use ArrayIterator;
use Countable;
use Iterator;
use IteratorAggregate;
use function count;
use function get_class;
use function gettype;
use function is_int;
use function sprintf;
/**
* @implements IteratorAggregate<int, Token>
*/
class TokenCollection implements IteratorAggregate, ArrayAccess, Countable {
/** @var Token[] */
private $tokens = [];
public function addToken(Token $token): void {
$this->tokens[] = $token;
}
public function getIterator(): Iterator {
return new ArrayIterator($this->tokens);
}
public function count(): int {
return count($this->tokens);
}
public function offsetExists($offset): bool {
return isset($this->tokens[$offset]);
}
/**
* @throws TokenCollectionException
*/
public function offsetGet($offset): Token {
if (!$this->offsetExists($offset)) {
throw new TokenCollectionException(
sprintf('No Token at offest %s', $offset)
);
}
return $this->tokens[$offset];
}
/**
* @param Token $value
*
* @throws TokenCollectionException
*/
public function offsetSet($offset, $value): void {
if (!is_int($offset)) {
$type = gettype($offset);
throw new TokenCollectionException(
sprintf(
'Offset must be of type integer, %s given',
$type === 'object' ? get_class($value) : $type
)
);
}
if (!$value instanceof Token) {
$type = gettype($value);
throw new TokenCollectionException(
sprintf(
'Value must be of type %s, %s given',
Token::class,
$type === 'object' ? get_class($value) : $type
)
);
}
$this->tokens[$offset] = $value;
}
public function offsetUnset($offset): void {
unset($this->tokens[$offset]);
}
}

View File

@@ -0,0 +1,5 @@
<?php declare(strict_types = 1);
namespace TheSeer\Tokenizer;
class TokenCollectionException extends Exception {
}

View File

@@ -0,0 +1,150 @@
<?php declare(strict_types = 1);
namespace TheSeer\Tokenizer;
use PhpToken;
use function preg_split;
class Tokenizer {
/**
* Token Map for "non-tokens"
*
* @var array
*/
private const MAP = [
'(' => 'T_OPEN_BRACKET',
')' => 'T_CLOSE_BRACKET',
'[' => 'T_OPEN_SQUARE',
']' => 'T_CLOSE_SQUARE',
'{' => 'T_OPEN_CURLY',
'}' => 'T_CLOSE_CURLY',
';' => 'T_SEMICOLON',
'.' => 'T_DOT',
',' => 'T_COMMA',
'=' => 'T_EQUAL',
'<' => 'T_LT',
'>' => 'T_GT',
'+' => 'T_PLUS',
'-' => 'T_MINUS',
'*' => 'T_MULT',
'/' => 'T_DIV',
'?' => 'T_QUESTION_MARK',
'!' => 'T_EXCLAMATION_MARK',
':' => 'T_COLON',
'"' => 'T_DOUBLE_QUOTES',
'@' => 'T_AT',
'%' => 'T_PERCENT',
'|' => 'T_PIPE',
'$' => 'T_DOLLAR',
'^' => 'T_CARET',
'~' => 'T_TILDE',
'`' => 'T_BACKTICK'
];
public function parse(string $source): TokenCollection {
$result = new TokenCollection();
if ($source === '') {
return $result;
}
$tokens = PhpToken::tokenize($source);
$lastToken = new Token(
$tokens[0]->line,
'Placeholder',
''
);
foreach ($tokens as $tok) {
if (isset(self::MAP[$tok->text])) {
$token = new Token(
$lastToken->getLine(),
self::MAP[$tok->text],
$tok->text,
);
$result->addToken($token);
$lastToken = $token;
continue;
}
$line = $tok->line;
$values = preg_split('/\R+/Uu', $tok->text);
if (!$values) {
$result->addToken(
new Token(
$line,
$tok->getTokenName(),
'{binary data}'
)
);
continue;
}
foreach ($values as $v) {
$token = new Token(
$line,
$tok->getTokenName(),
$v
);
$lastToken = $token;
$line++;
if ($v === '') {
continue;
}
$result->addToken($token);
}
}
return $this->fillBlanks($result, $lastToken->getLine());
}
private function fillBlanks(TokenCollection $tokens, int $maxLine): TokenCollection {
$prev = new Token(
0,
'Placeholder',
''
);
$final = new TokenCollection();
$prevLine = $prev->getLine();
foreach ($tokens as $token) {
$line = $token->getLine();
$gap = $line - $prevLine;
while ($gap > 1) {
$linebreak = new Token(
$prevLine + 1,
'T_WHITESPACE',
''
);
$final->addToken($linebreak);
$prevLine = $linebreak->getLine();
$gap--;
}
$final->addToken($token);
$prevLine = $line;
}
$gap = $maxLine - $prevLine;
while ($gap > 0) {
$linebreak = new Token(
$prevLine + 1,
'T_WHITESPACE',
''
);
$final->addToken($linebreak);
$prevLine = $linebreak->getLine();
$gap--;
}
return $final;
}
}

View File

@@ -0,0 +1,83 @@
<?php declare(strict_types = 1);
namespace TheSeer\Tokenizer;
use DOMDocument;
use XMLWriter;
use function count;
use const ENT_DISALLOWED;
use const ENT_NOQUOTES;
use const ENT_XML1;
class XMLSerializer {
/** @var NamespaceUri */
private $xmlns;
/**
* XMLSerializer constructor.
*/
public function __construct(?NamespaceUri $xmlns = null) {
if ($xmlns === null) {
$xmlns = new NamespaceUri('https://github.com/theseer/tokenizer');
}
$this->xmlns = $xmlns;
}
public function toDom(TokenCollection $tokens): DOMDocument {
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->loadXML($this->toXML($tokens));
return $dom;
}
public function toXML(TokenCollection $tokens): string {
$writer = new XMLWriter();
$writer->openMemory();
$writer->setIndent(true);
$writer->startDocument();
$this->appendToWriter($writer, $tokens);
$writer->endDocument();
return $writer->outputMemory();
}
public function appendToWriter(XMLWriter $writer, TokenCollection $tokens): void {
$writer->startElement('source');
$writer->writeAttribute('xmlns', $this->xmlns->asString());
if (count($tokens) > 0) {
$writer->startElement('line');
$writer->writeAttribute('no', '1');
$iterator = $tokens->getIterator();
$previousToken = $iterator->current();
$previousLine = $previousToken->getLine();
foreach ($iterator as $token) {
$line = $token->getLine();
if ($previousLine < $line) {
$writer->endElement();
$writer->startElement('line');
$writer->writeAttribute('no', (string)$line);
$previousLine = $line;
}
$value = $token->getValue();
if ($value !== '') {
$writer->startElement('token');
$writer->writeAttribute('name', $token->getName());
$writer->writeRaw(htmlspecialchars($value, ENT_NOQUOTES | ENT_DISALLOWED | ENT_XML1));
$writer->endElement();
}
}
$writer->endElement();
}
$writer->endElement();
}
}

View File

@@ -0,0 +1,74 @@
<?php
namespace PharIo\CSFixer;
use PhpCsFixer\Fixer\FixerInterface;
use PhpCsFixer\FixerDefinition\CodeSample;
use PhpCsFixer\FixerDefinition\FixerDefinition;
use PhpCsFixer\FixerDefinition\FixerDefinitionInterface;
use PhpCsFixer\Tokenizer\Tokens;
use PhpCsFixer\Tokenizer\Token;
/**
* Main implementation taken from kubawerlos/php-cs-fixer-customere-fixers
* Copyright (c) 2018 Kuba Werłos
*
* Slightly modified to work without the gazillion of composer dependencies
*
* Original:
* https://github.com/kubawerlos/php-cs-fixer-custom-fixers/blob/master/src/Fixer/PhpdocSingleLineVarFixer.php
*
*/
class PhpdocSingleLineVarFixer implements FixerInterface {
public function getDefinition(): FixerDefinitionInterface {
return new FixerDefinition(
'`@var` annotation must be in single line when is the only content.',
[new CodeSample('<?php
/**
* @var string
*/
')]
);
}
public function isCandidate(Tokens $tokens): bool {
return $tokens->isTokenKindFound(T_DOC_COMMENT);
}
public function isRisky(): bool {
return false;
}
public function fix(\SplFileInfo $file, Tokens $tokens): void {
foreach($tokens as $index => $token) {
if (!$token->isGivenKind(T_DOC_COMMENT)) {
continue;
}
if (\stripos($token->getContent(), '@var') === false) {
continue;
}
if (preg_match('#^/\*\*[\s\*]+(@var[^\r\n]+)[\s\*]*\*\/$#u', $token->getContent(), $matches) !== 1) {
continue;
}
$newContent = '/** ' . \rtrim($matches[1]) . ' */';
if ($newContent === $token->getContent()) {
continue;
}
$tokens[$index] = new Token([T_DOC_COMMENT, $newContent]);
}
}
public function getPriority(): int {
return 0;
}
public function getName(): string {
return 'PharIo/phpdoc_single_line_var_fixer';
}
public function supports(\SplFileInfo $file): bool {
return true;
}
}