build(psalm): Configure unstable namespace
Signed-off-by: provokateurin <kate@provokateurin.de>pull/49224/head
parent
17659d327a
commit
72571a19dd
@ -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>
|
||||
Loading…
Reference in New Issue