Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. EmptyLinesAroundClassBracesSniff.php

class EmptyLinesAroundClassBracesSniff

Hierarchy

  • class \SlevomatCodingStandard\Sniffs\Classes\EmptyLinesAroundClassBracesSniff implements \PHP_CodeSniffer\Sniffs\Sniff

Expanded class hierarchy of EmptyLinesAroundClassBracesSniff

File

vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/EmptyLinesAroundClassBracesSniff.php, line 14

Namespace

SlevomatCodingStandard\Sniffs\Classes
View source
class EmptyLinesAroundClassBracesSniff implements Sniff {
    public const CODE_NO_EMPTY_LINE_AFTER_OPENING_BRACE = 'NoEmptyLineAfterOpeningBrace';
    public const CODE_MULTIPLE_EMPTY_LINES_AFTER_OPENING_BRACE = 'MultipleEmptyLinesAfterOpeningBrace';
    public const CODE_INCORRECT_EMPTY_LINES_AFTER_OPENING_BRACE = 'IncorrectEmptyLinesAfterOpeningBrace';
    public const CODE_NO_EMPTY_LINE_BEFORE_CLOSING_BRACE = 'NoEmptyLineBeforeClosingBrace';
    public const CODE_MULTIPLE_EMPTY_LINES_BEFORE_CLOSING_BRACE = 'MultipleEmptyLinesBeforeClosingBrace';
    public const CODE_INCORRECT_EMPTY_LINES_BEFORE_CLOSING_BRACE = 'IncorrectEmptyLinesBeforeClosingBrace';
    
    /** @var int */
    public $linesCountAfterOpeningBrace = 1;
    
    /** @var int */
    public $linesCountBeforeClosingBrace = 1;
    
    /**
     * @return array<int, (int|string)>
     */
    public function register() : array {
        return array_values(Tokens::$ooScopeTokens);
    }
    
    /**
     * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
     * @param int $stackPointer
     */
    public function process(File $phpcsFile, $stackPointer) : void {
        $this->linesCountAfterOpeningBrace = SniffSettingsHelper::normalizeInteger($this->linesCountAfterOpeningBrace);
        $this->linesCountBeforeClosingBrace = SniffSettingsHelper::normalizeInteger($this->linesCountBeforeClosingBrace);
        $this->processOpeningBrace($phpcsFile, $stackPointer);
        $this->processClosingBrace($phpcsFile, $stackPointer);
    }
    private function processOpeningBrace(File $phpcsFile, int $stackPointer) : void {
        $tokens = $phpcsFile->getTokens();
        $typeToken = $tokens[$stackPointer];
        $openerPointer = $typeToken['scope_opener'];
        $openerToken = $tokens[$openerPointer];
        $nextPointerAfterOpeningBrace = TokenHelper::findNextNonWhitespace($phpcsFile, $openerPointer + 1);
        $nextTokenAfterOpeningBrace = $tokens[$nextPointerAfterOpeningBrace];
        $lines = $nextTokenAfterOpeningBrace['line'] - $openerToken['line'] - 1;
        if ($lines === $this->linesCountAfterOpeningBrace) {
            return;
        }
        if ($this->linesCountAfterOpeningBrace === 1) {
            $fix = $phpcsFile->addFixableError(sprintf('There must be one empty line after %s opening brace.', $typeToken['content']), $openerPointer, $lines === 0 ? self::CODE_NO_EMPTY_LINE_AFTER_OPENING_BRACE : self::CODE_MULTIPLE_EMPTY_LINES_AFTER_OPENING_BRACE);
        }
        else {
            $fix = $phpcsFile->addFixableError(sprintf('There must be exactly %d empty lines after %s opening brace.', $this->linesCountAfterOpeningBrace, $typeToken['content']), $openerPointer, self::CODE_INCORRECT_EMPTY_LINES_AFTER_OPENING_BRACE);
        }
        if (!$fix) {
            return;
        }
        $phpcsFile->fixer
            ->beginChangeset();
        if ($lines < $this->linesCountAfterOpeningBrace) {
            for ($i = $lines; $i < $this->linesCountAfterOpeningBrace; $i++) {
                $phpcsFile->fixer
                    ->addNewline($openerPointer);
            }
        }
        else {
            for ($i = $openerPointer + $this->linesCountAfterOpeningBrace + 2; $i < $nextPointerAfterOpeningBrace; $i++) {
                if ($phpcsFile->fixer
                    ->getTokenContent($i) !== $phpcsFile->eolChar) {
                    break;
                }
                $phpcsFile->fixer
                    ->replaceToken($i, '');
            }
        }
        $phpcsFile->fixer
            ->endChangeset();
    }
    private function processClosingBrace(File $phpcsFile, int $stackPointer) : void {
        $tokens = $phpcsFile->getTokens();
        $typeToken = $tokens[$stackPointer];
        $closerPointer = $typeToken['scope_closer'];
        $closerToken = $tokens[$closerPointer];
        $previousPointerBeforeClosingBrace = TokenHelper::findPreviousNonWhitespace($phpcsFile, $closerPointer - 1);
        $previousTokenBeforeClosingBrace = $tokens[$previousPointerBeforeClosingBrace];
        $lines = $closerToken['line'] - $previousTokenBeforeClosingBrace['line'] - 1;
        if ($lines === $this->linesCountBeforeClosingBrace) {
            return;
        }
        if ($this->linesCountBeforeClosingBrace === 1) {
            $fix = $phpcsFile->addFixableError(sprintf('There must be one empty line before %s closing brace.', $typeToken['content']), $closerPointer, $lines === 0 ? self::CODE_NO_EMPTY_LINE_BEFORE_CLOSING_BRACE : self::CODE_MULTIPLE_EMPTY_LINES_BEFORE_CLOSING_BRACE);
        }
        else {
            $fix = $phpcsFile->addFixableError(sprintf('There must be exactly %d empty lines before %s closing brace.', $this->linesCountBeforeClosingBrace, $typeToken['content']), $closerPointer, self::CODE_INCORRECT_EMPTY_LINES_BEFORE_CLOSING_BRACE);
        }
        if (!$fix) {
            return;
        }
        $phpcsFile->fixer
            ->beginChangeset();
        if ($lines < $this->linesCountBeforeClosingBrace) {
            for ($i = $lines; $i < $this->linesCountBeforeClosingBrace; $i++) {
                $phpcsFile->fixer
                    ->addNewlineBefore($closerPointer);
            }
        }
        else {
            FixerHelper::removeBetween($phpcsFile, $previousPointerBeforeClosingBrace + $this->linesCountBeforeClosingBrace + 1, $closerPointer);
        }
        $phpcsFile->fixer
            ->endChangeset();
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
EmptyLinesAroundClassBracesSniff::$linesCountAfterOpeningBrace public property @var int
EmptyLinesAroundClassBracesSniff::$linesCountBeforeClosingBrace public property @var int
EmptyLinesAroundClassBracesSniff::CODE_INCORRECT_EMPTY_LINES_AFTER_OPENING_BRACE public constant
EmptyLinesAroundClassBracesSniff::CODE_INCORRECT_EMPTY_LINES_BEFORE_CLOSING_BRACE public constant
EmptyLinesAroundClassBracesSniff::CODE_MULTIPLE_EMPTY_LINES_AFTER_OPENING_BRACE public constant
EmptyLinesAroundClassBracesSniff::CODE_MULTIPLE_EMPTY_LINES_BEFORE_CLOSING_BRACE public constant
EmptyLinesAroundClassBracesSniff::CODE_NO_EMPTY_LINE_AFTER_OPENING_BRACE public constant
EmptyLinesAroundClassBracesSniff::CODE_NO_EMPTY_LINE_BEFORE_CLOSING_BRACE public constant
EmptyLinesAroundClassBracesSniff::process public function * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
*
Overrides Sniff::process
EmptyLinesAroundClassBracesSniff::processClosingBrace private function
EmptyLinesAroundClassBracesSniff::processOpeningBrace private function
EmptyLinesAroundClassBracesSniff::register public function * Overrides Sniff::register

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal