Skip to content

Commit bb75418

Browse files
committed
fix: apply final before the class keyword, obey the suppressions
1 parent 1e3b7f0 commit bb75418

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

src/Psalm/Internal/Codebase/ClassLikes.php

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,14 @@
6262
use function preg_quote;
6363
use function preg_replace;
6464
use function strlen;
65-
use function strpos;
6665
use function strrpos;
6766
use function strtolower;
6867
use function substr;
6968

7069
use const PHP_EOL;
70+
use const PREG_OFFSET_CAPTURE;
7171

72+
const NEW_LINE_LENGTH = 1;
7273
/**
7374
* @internal
7475
*
@@ -868,27 +869,31 @@ public function consolidateAnalyzedData(Methods $methods, ?Progress $progress, b
868869
&& !$classlike_storage->is_enum
869870
&& !$classlike_storage->is_interface
870871
) {
872+
$codeIssue = new ClassMustBeFinal(
873+
'Class ' . $classlike_storage->name
874+
. ' is never extended and is not part of the public API, and thus must be made final.',
875+
$classlike_storage->location,
876+
$classlike_storage->name,
877+
);
871878
IssueBuffer::maybeAdd(
872-
new ClassMustBeFinal(
873-
'Class ' . $classlike_storage->name
874-
. ' is never extended and is not part of the public API, and thus must be made final.',
875-
$classlike_storage->location,
876-
$classlike_storage->name,
877-
),
879+
$codeIssue,
878880
$classlike_storage->suppressed_issues,
879881
true,
880882
);
881-
883+
882884
if ($codebase->alter_code
883885
&& $classlike_storage->stmt_location !== null
886+
&& !IssueBuffer::isSuppressed($codeIssue, $classlike_storage->suppressed_issues)
884887
&& isset($project_analyzer->getIssuesToFix()['ClassMustBeFinal'])
885888
) {
886889
$selection = $classlike_storage->stmt_location->getSnippet();
887-
$insert_pos = strpos($selection, "class");
888-
889-
if ($insert_pos === false) {
890-
$insert_pos = $classlike_storage->stmt_location->getSelectionBounds()[0];
891-
}
890+
$bounds = $classlike_storage->stmt_location->getSnippetBounds();
891+
892+
preg_match("/\n(?:readonly\s)?class\s/", $selection, $matches, PREG_OFFSET_CAPTURE);
893+
$insert_pos = match (true) {
894+
!empty($matches) && isset($matches[0][1]) => $matches[0][1] + $bounds[0] + NEW_LINE_LENGTH,
895+
default => $classlike_storage->stmt_location->getSelectionBounds()[0]
896+
};
892897

893898
FileManipulationBuffer::add($classlike_storage->stmt_location->file_path, [
894899
new FileManipulation($insert_pos, $insert_pos, 'final ', true),

0 commit comments

Comments
 (0)