*/ public function register(): array { return [ T_NAMESPACE, ]; } /** * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint * @param int $namespacePointer */ public function process(File $phpcsFile, $namespacePointer): void { $this->linesCountBeforeNamespace = SniffSettingsHelper::normalizeInteger($this->linesCountBeforeNamespace); $this->linesCountAfterNamespace = SniffSettingsHelper::normalizeInteger($this->linesCountAfterNamespace); $this->checkLinesBeforeNamespace($phpcsFile, $namespacePointer); $this->checkLinesAfterNamespace($phpcsFile, $namespacePointer); } private function checkLinesBeforeNamespace(File $phpcsFile, int $namespacePointer): void { $tokens = $phpcsFile->getTokens(); /** @var int $pointerBeforeNamespace */ $pointerBeforeNamespace = TokenHelper::findPreviousNonWhitespace($phpcsFile, $namespacePointer - 1); $whitespaceBeforeNamespace = ''; $isInlineCommentBefore = (bool) preg_match('~^(?://|#)(.*)~', $tokens[$pointerBeforeNamespace]['content']); if ($tokens[$pointerBeforeNamespace]['code'] === T_OPEN_TAG) { $whitespaceBeforeNamespace .= substr($tokens[$pointerBeforeNamespace]['content'], strlen('eolChar; } if ($pointerBeforeNamespace + 1 !== $namespacePointer) { $whitespaceBeforeNamespace .= TokenHelper::getContent($phpcsFile, $pointerBeforeNamespace + 1, $namespacePointer - 1); } $actualLinesCountBeforeNamespace = substr_count($whitespaceBeforeNamespace, $phpcsFile->eolChar) - 1; if ($actualLinesCountBeforeNamespace === $this->linesCountBeforeNamespace) { return; } $fix = $phpcsFile->addFixableError( sprintf( 'Expected %d line%s before namespace statement, found %d.', $this->linesCountBeforeNamespace, $this->linesCountBeforeNamespace === 1 ? '' : 's', $actualLinesCountBeforeNamespace, ), $namespacePointer, self::CODE_INCORRECT_LINES_COUNT_BEFORE_NAMESPACE, ); if (!$fix) { return; } $phpcsFile->fixer->beginChangeset(); if ($tokens[$pointerBeforeNamespace]['code'] === T_OPEN_TAG) { FixerHelper::replace($phpcsFile, $pointerBeforeNamespace, 'eolChar), ); } FixerHelper::removeBetween($phpcsFile, $pointerBeforeNamespace, $namespacePointer); for ($i = 0; $i <= $this->linesCountBeforeNamespace; $i++) { $phpcsFile->fixer->addNewline($pointerBeforeNamespace); } $phpcsFile->fixer->endChangeset(); } private function checkLinesAfterNamespace(File $phpcsFile, int $namespacePointer): void { if (array_key_exists('scope_opener', $phpcsFile->getTokens()[$namespacePointer])) { return; } /** @var int $namespaceSemicolonPointer */ $namespaceSemicolonPointer = TokenHelper::findNextLocal($phpcsFile, T_SEMICOLON, $namespacePointer + 1); $pointerAfterWhitespaceEnd = TokenHelper::findNextNonWhitespace($phpcsFile, $namespaceSemicolonPointer + 1); if ($pointerAfterWhitespaceEnd === null) { return; } $whitespaceAfterNamespace = TokenHelper::getContent($phpcsFile, $namespaceSemicolonPointer + 1, $pointerAfterWhitespaceEnd - 1); $actualLinesCountAfterNamespace = substr_count($whitespaceAfterNamespace, $phpcsFile->eolChar) - 1; if ($actualLinesCountAfterNamespace === $this->linesCountAfterNamespace) { return; } $fix = $phpcsFile->addFixableError( sprintf( 'Expected %d line%s after namespace statement, found %d.', $this->linesCountAfterNamespace, $this->linesCountAfterNamespace === 1 ? '' : 's', $actualLinesCountAfterNamespace, ), $namespacePointer, self::CODE_INCORRECT_LINES_COUNT_AFTER_NAMESPACE, ); if (!$fix) { return; } $phpcsFile->fixer->beginChangeset(); FixerHelper::removeBetween($phpcsFile, $namespaceSemicolonPointer, $pointerAfterWhitespaceEnd); for ($i = 0; $i <= $this->linesCountAfterNamespace; $i++) { $phpcsFile->fixer->addNewline($namespaceSemicolonPointer); } $phpcsFile->fixer->endChangeset(); } }