getStmt(); $statementsSource = $event->getStatementsSource(); self::checkClassComment($classLike, $statementsSource); foreach ($classLike->stmts as $stmt) { if ($stmt instanceof ClassConst) { self::checkStatementComment($stmt, $statementsSource, 'constant'); } if ($stmt instanceof ClassMethod) { self::checkStatementComment($stmt, $statementsSource, 'method'); } if ($stmt instanceof EnumCase) { self::checkStatementComment($stmt, $statementsSource, 'enum'); } } } private static function checkClassComment(ClassLike $stmt, FileSource $statementsSource): void { $docblock = $stmt->getDocComment(); if ($docblock === null) { IssueBuffer::maybeAdd( new InvalidDocblock( 'PHPDoc is required for classes/interfaces in OCP.', new CodeLocation($statementsSource, $stmt) ) ); return; } try { $parsedDocblock = DocComment::parsePreservingLength($docblock); } catch (DocblockParseException $e) { IssueBuffer::maybeAdd( new InvalidDocblock( $e->getMessage(), new CodeLocation($statementsSource, $stmt) ) ); return; } if (!isset($parsedDocblock->tags['since'])) { IssueBuffer::maybeAdd( new InvalidDocblock( '@since is required for classes/interfaces in OCP.', new CodeLocation($statementsSource, $stmt) ) ); } if (isset($parsedDocblock->tags['depreacted'])) { IssueBuffer::maybeAdd( new InvalidDocblock( 'Typo in @deprecated for classes/interfaces in OCP.', new CodeLocation($statementsSource, $stmt) ) ); } } private static function checkStatementComment(Stmt $stmt, FileSource $statementsSource, string $type): void { $docblock = $stmt->getDocComment(); if ($docblock === null) { IssueBuffer::maybeAdd( new InvalidDocblock( 'PHPDoc is required for ' . $type . 's in OCP.', new CodeLocation($statementsSource, $stmt) ), ); return; } try { $parsedDocblock = DocComment::parsePreservingLength($docblock); } catch (DocblockParseException $e) { IssueBuffer::maybeAdd( new InvalidDocblock( $e->getMessage(), new CodeLocation($statementsSource, $stmt) ) ); return; } if (!isset($parsedDocblock->tags['since'])) { IssueBuffer::maybeAdd( new InvalidDocblock( '@since is required for ' . $type . 's in OCP.', new CodeLocation($statementsSource, $stmt) ) ); } if (isset($parsedDocblock->tags['depreacted'])) { IssueBuffer::maybeAdd( new InvalidDocblock( 'Typo in @deprecated for ' . $type . ' in OCP.', new CodeLocation($statementsSource, $stmt) ) ); } } }