Browse Source
build(psalm): Configure unstable namespace
build(psalm): Configure unstable namespace
Signed-off-by: provokateurin <kate@provokateurin.de>pull/49224/head
Failed to extract signature
6 changed files with 171 additions and 1 deletions
-
26.github/workflows/static-code-analysis.yml
-
1build/files-checker.php
-
122build/psalm/NcuExperimentalChecker.php
-
1composer.json
-
21psalm-ncu.xml
-
1psalm-ocp.xml
@ -0,0 +1,122 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
/** |
|||
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors |
|||
* SPDX-License-Identifier: AGPL-3.0-only |
|||
*/ |
|||
|
|||
use PhpParser\Node\Stmt; |
|||
use PhpParser\Node\Stmt\ClassLike; |
|||
use Psalm\CodeLocation; |
|||
use Psalm\DocComment; |
|||
use Psalm\Exception\DocblockParseException; |
|||
use Psalm\FileSource; |
|||
use Psalm\Issue\InvalidDocblock; |
|||
use Psalm\IssueBuffer; |
|||
use Psalm\Plugin\EventHandler\Event\AfterClassLikeVisitEvent; |
|||
|
|||
class NcuExperimentalChecker implements Psalm\Plugin\EventHandler\AfterClassLikeVisitInterface { |
|||
public static function afterClassLikeVisit(AfterClassLikeVisitEvent $event): void { |
|||
$stmt = $event->getStmt(); |
|||
$statementsSource = $event->getStatementsSource(); |
|||
|
|||
self::checkClassComment($stmt, $statementsSource); |
|||
|
|||
foreach ($stmt->getMethods() as $method) { |
|||
self::checkMethodOrConstantComment($method, $statementsSource, 'method'); |
|||
} |
|||
|
|||
foreach ($stmt->getConstants() as $constant) { |
|||
self::checkMethodOrConstantComment($constant, $statementsSource, 'constant'); |
|||
} |
|||
} |
|||
|
|||
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 NCU.', |
|||
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['experimental'])) { |
|||
IssueBuffer::maybeAdd( |
|||
new InvalidDocblock( |
|||
'@experimental is required for classes/interfaces in NCU.', |
|||
new CodeLocation($statementsSource, $stmt) |
|||
) |
|||
); |
|||
} |
|||
|
|||
if (isset($parsedDocblock->tags['depreacted'])) { |
|||
IssueBuffer::maybeAdd( |
|||
new InvalidDocblock( |
|||
'Typo in @deprecated for classes/interfaces in NCU.', |
|||
new CodeLocation($statementsSource, $stmt) |
|||
) |
|||
); |
|||
} |
|||
} |
|||
|
|||
private static function checkMethodOrConstantComment(Stmt $stmt, FileSource $statementsSource, string $type): void { |
|||
$docblock = $stmt->getDocComment(); |
|||
|
|||
if ($docblock === null) { |
|||
IssueBuffer::maybeAdd( |
|||
new InvalidDocblock( |
|||
'PHPDoc is required for ' . $type . 's in NCU.', |
|||
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['experimental'])) { |
|||
IssueBuffer::maybeAdd( |
|||
new InvalidDocblock( |
|||
'@experimental is required for ' . $type . 's in NCU.', |
|||
new CodeLocation($statementsSource, $stmt) |
|||
) |
|||
); |
|||
} |
|||
|
|||
if (isset($parsedDocblock->tags['depreacted'])) { |
|||
IssueBuffer::maybeAdd( |
|||
new InvalidDocblock( |
|||
'Typo in @deprecated for ' . $type . ' in NCU.', |
|||
new CodeLocation($statementsSource, $stmt) |
|||
) |
|||
); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
<?xml version="1.0"?> |
|||
<!-- |
|||
- SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors |
|||
- SPDX-License-Identifier: AGPL-3.0-or-later |
|||
--> |
|||
<psalm |
|||
errorLevel="1" |
|||
resolveFromConfigFile="true" |
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
|||
xmlns="https://getpsalm.org/schema/config" |
|||
xsi:schemaLocation="https://getpsalm.org/schema/config" |
|||
findUnusedBaselineEntry="false" |
|||
findUnusedCode="false" |
|||
> |
|||
<plugins> |
|||
<plugin filename="build/psalm/NcuExperimentalChecker.php"/> |
|||
</plugins> |
|||
<projectFiles> |
|||
<directory name="lib/unstable"/> |
|||
</projectFiles> |
|||
</psalm> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue