|
62 | 62 | use function preg_quote;
|
63 | 63 | use function preg_replace;
|
64 | 64 | use function strlen;
|
65 |
| -use function strpos; |
66 | 65 | use function strrpos;
|
67 | 66 | use function strtolower;
|
68 | 67 | use function substr;
|
69 | 68 |
|
70 | 69 | use const PHP_EOL;
|
| 70 | +use const PREG_OFFSET_CAPTURE; |
71 | 71 |
|
| 72 | +const NEW_LINE_LENGTH = 1; |
72 | 73 | /**
|
73 | 74 | * @internal
|
74 | 75 | *
|
@@ -868,27 +869,31 @@ public function consolidateAnalyzedData(Methods $methods, ?Progress $progress, b
|
868 | 869 | && !$classlike_storage->is_enum
|
869 | 870 | && !$classlike_storage->is_interface
|
870 | 871 | ) {
|
| 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 | + ); |
871 | 878 | 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, |
878 | 880 | $classlike_storage->suppressed_issues,
|
879 | 881 | true,
|
880 | 882 | );
|
881 |
| - |
| 883 | + |
882 | 884 | if ($codebase->alter_code
|
883 | 885 | && $classlike_storage->stmt_location !== null
|
| 886 | + && !IssueBuffer::isSuppressed($codeIssue, $classlike_storage->suppressed_issues) |
884 | 887 | && isset($project_analyzer->getIssuesToFix()['ClassMustBeFinal'])
|
885 | 888 | ) {
|
886 | 889 | $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 | + }; |
892 | 897 |
|
893 | 898 | FileManipulationBuffer::add($classlike_storage->stmt_location->file_path, [
|
894 | 899 | new FileManipulation($insert_pos, $insert_pos, 'final ', true),
|
|
0 commit comments