Skip to content

Commit 6b3b7a5

Browse files
committed
Merge remote-tracking branch 'upstream/develop' into deprecated-version-range
2 parents a957d87 + d1711ba commit 6b3b7a5

15 files changed

+784
-20
lines changed

Diff for: Magento2/Sniffs/Commenting/ClassAndInterfacePHPDocFormattingSniff.php

+40-2
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,29 @@ public function process(File $phpcsFile, $stackPtr)
6363
return;
6464
}
6565

66+
$commentCloserPtr = $tokens[$commentStartPtr]['comment_closer'];
67+
6668
if ($this->PHPDocFormattingValidator->providesMeaning($namePtr, $commentStartPtr, $tokens) !== true) {
67-
$phpcsFile->addWarning(
69+
$fix = $phpcsFile->addFixableWarning(
6870
sprintf(
6971
'%s description must contain meaningful information beyond what its name provides or be removed.',
7072
ucfirst($tokens[$stackPtr]['content'])
7173
),
7274
$stackPtr,
7375
'InvalidDescription'
7476
);
77+
78+
if ($fix) {
79+
for ($i = $commentStartPtr; $i <= $commentCloserPtr; $i++) {
80+
$phpcsFile->fixer->replaceToken($i, '');
81+
}
82+
83+
if ($tokens[$commentStartPtr - 1]['code'] === T_WHITESPACE
84+
&& $tokens[$commentCloserPtr + 1]['code'] === T_WHITESPACE
85+
) {
86+
$phpcsFile->fixer->replaceToken($commentCloserPtr + 1, '');
87+
}
88+
}
7589
}
7690

7791
if ($this->PHPDocFormattingValidator->hasDeprecatedWellFormatted($commentStartPtr, $tokens) !== true) {
@@ -105,11 +119,35 @@ private function validateTags(File $phpcsFile, $commentStartPtr, $tokens)
105119
}
106120

107121
if (in_array($tokens[$i]['content'], $this->forbiddenTags) === true) {
108-
$phpcsFile->addWarning(
122+
$fix = $phpcsFile->addFixableWarning(
109123
sprintf('Tag %s MUST NOT be used.', $tokens[$i]['content']),
110124
$i,
111125
'ForbiddenTags'
112126
);
127+
128+
if ($fix) {
129+
for ($j = $i - 1; $j > $commentStartPtr; $j--) {
130+
if (!in_array($tokens[$j]['code'], [T_DOC_COMMENT_STAR, T_DOC_COMMENT_WHITESPACE], true)) {
131+
break;
132+
}
133+
134+
if ($tokens[$j]['code'] === T_DOC_COMMENT_WHITESPACE && $tokens[$j]['content'] === "\n") {
135+
break;
136+
}
137+
138+
$phpcsFile->fixer->replaceToken($j, '');
139+
}
140+
141+
$phpcsFile->fixer->replaceToken($i, '');
142+
143+
for ($j = $i + 1; $j < $commentCloserPtr; $j++) {
144+
$phpcsFile->fixer->replaceToken($j, '');
145+
146+
if ($tokens[$j]['code'] === T_DOC_COMMENT_WHITESPACE && $tokens[$j]['content'] === "\n") {
147+
break;
148+
}
149+
}
150+
}
113151
}
114152
}
115153

+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
<?php
2+
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace Magento2\Sniffs\Legacy;
11+
12+
use PHP_CodeSniffer\Files\File;
13+
use PHP_CodeSniffer\Sniffs\Sniff;
14+
use PHP_CodeSniffer\Util\Tokens;
15+
16+
class EscapeMethodsOnBlockClassSniff implements Sniff
17+
{
18+
private const ESCAPER_METHODS = [
19+
'escapeCss' => true,
20+
'escapeHtml' => true,
21+
'escapeHtmlAttr' => true,
22+
'escapeJs' => true,
23+
'escapeJsQuote' => true,
24+
'escapeQuote' => true,
25+
'escapeUrl' => true,
26+
'escapeXssInUrl' => true,
27+
];
28+
29+
/**
30+
* @inheritDoc
31+
*/
32+
public function register()
33+
{
34+
return [
35+
T_OBJECT_OPERATOR,
36+
];
37+
}
38+
39+
/**
40+
* @inheritDoc
41+
*/
42+
public function process(File $phpcsFile, $stackPtr)
43+
{
44+
$tokens = $phpcsFile->getTokens();
45+
46+
if ($stackPtr <= 1 || !isset($tokens[$stackPtr + 2])) {
47+
return;
48+
}
49+
50+
$objectPtr = $stackPtr - 1;
51+
if ($tokens[$objectPtr]['code'] !== T_VARIABLE) {
52+
$objectPtr = $phpcsFile->findPrevious(Tokens::$emptyTokens, $objectPtr, null, true);
53+
54+
if (!$objectPtr) {
55+
return;
56+
}
57+
}
58+
59+
if ($tokens[$objectPtr]['code'] !== T_VARIABLE
60+
|| $tokens[$objectPtr]['content'] !== '$block'
61+
) {
62+
return;
63+
}
64+
65+
$methodPtr = $stackPtr + 1;
66+
if ($tokens[$methodPtr]['code'] !== T_STRING) {
67+
$methodPtr = $phpcsFile->findNext(Tokens::$emptyTokens, $methodPtr, null, true);
68+
69+
if (!$methodPtr) {
70+
return;
71+
}
72+
}
73+
74+
if ($tokens[$methodPtr]['code'] !== T_STRING
75+
|| !isset(self::ESCAPER_METHODS[$tokens[$methodPtr]['content']])
76+
) {
77+
return;
78+
}
79+
80+
$openParenPtr = $methodPtr + 1;
81+
if ($tokens[$openParenPtr]['code'] !== T_OPEN_PARENTHESIS) {
82+
$openParenPtr = $phpcsFile->findNext(Tokens::$emptyTokens, $openParenPtr, null, true);
83+
84+
if (!$openParenPtr) {
85+
return;
86+
}
87+
}
88+
89+
if ($tokens[$openParenPtr]['code'] !== T_OPEN_PARENTHESIS) {
90+
return;
91+
}
92+
93+
$fix = $phpcsFile->addFixableWarning(
94+
'Using %s on $block is deprecated. Please use equivalent method on $escaper',
95+
$methodPtr,
96+
'Found',
97+
[
98+
$tokens[$methodPtr]['content'], // method name
99+
]
100+
);
101+
102+
if ($fix) {
103+
$phpcsFile->fixer->replaceToken($objectPtr, '$escaper');
104+
}
105+
}
106+
}

Diff for: Magento2/Sniffs/Security/XssTemplateSniff.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,11 @@ public function process(File $phpcsFile, $stackPtr)
147147
private function findSpecialAnnotation($stackPtr)
148148
{
149149
if ($this->tokens[$stackPtr]['code'] === T_ECHO) {
150-
$startOfStatement = $this->file->findPrevious(T_OPEN_TAG, $stackPtr);
150+
$startOfStatement = $this->file->findPrevious([T_OPEN_TAG, T_SEMICOLON], $stackPtr);
151151
return $this->file->findPrevious(T_COMMENT, $stackPtr, $startOfStatement);
152152
}
153153
if ($this->tokens[$stackPtr]['code'] === T_OPEN_TAG_WITH_ECHO) {
154-
$endOfStatement = $this->file->findNext(T_CLOSE_TAG, $stackPtr);
154+
$endOfStatement = $this->file->findNext([T_CLOSE_TAG, T_SEMICOLON], $stackPtr);
155155
return $this->file->findNext(T_COMMENT, $stackPtr, $endOfStatement);
156156
}
157157
return false;

Diff for: Magento2/Tests/Commenting/ClassAndInterfacePHPDocFormattingUnitTest.1.inc

+8
Original file line numberDiff line numberDiff line change
@@ -194,3 +194,11 @@ class AlsoDeprecatedButHandlerLongVersion
194194
{
195195

196196
}
197+
198+
/**
199+
* @package this tag should not be used
200+
*/
201+
class OnlyUselessCommentContent
202+
{
203+
204+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
<?php
2+
3+
/**
4+
* Handler for PHP errors/warnings/notices that converts them to exceptions.
5+
*/
6+
class ErrorHandler
7+
{
8+
9+
}
10+
11+
class NotAnErrorHandler
12+
{
13+
14+
}
15+
16+
class FaultyHandler
17+
{
18+
19+
}
20+
21+
class SomeHandler
22+
{
23+
24+
}
25+
26+
class YetAnotherHandler
27+
{
28+
29+
}
30+
31+
class GreenHandler
32+
{
33+
34+
}
35+
36+
class EmptyHandler
37+
{
38+
39+
}
40+
41+
/**
42+
* Handler for PHP errors/warnings/notices that converts them to exceptions.
43+
*
44+
* @api is ok here
45+
* @deprecated can be used in this context
46+
* @see is ok here
47+
*/
48+
class ExampleHandler
49+
{
50+
51+
}
52+
53+
/**
54+
* @api
55+
* @since 100.0.2
56+
*/
57+
class ApiHandler
58+
{
59+
60+
}
61+
62+
/**
63+
* @api
64+
*/
65+
class AsyncApiHandler
66+
{
67+
68+
}
69+
70+
/**
71+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
72+
*/
73+
class GroupRepositoryHandler
74+
{
75+
76+
}
77+
78+
/**
79+
* @deprecated
80+
*/
81+
class DeprecatedHandler
82+
{
83+
84+
}
85+
86+
/**
87+
* @deprecated Should not be used
88+
*/
89+
class AncientHandler
90+
{
91+
92+
}
93+
94+
/**
95+
* @deprecated
96+
* @see
97+
*/
98+
class AgedHandler
99+
{
100+
101+
}
102+
103+
/**
104+
* @deprecated Should not be used
105+
* @see
106+
*/
107+
class ArhaicHandler
108+
{
109+
110+
}
111+
112+
/**
113+
* @deprecated Should not be used
114+
* @see Magento\Framework\NewHandler
115+
*/
116+
class OldHandler
117+
{
118+
119+
}
120+
121+
/**
122+
* @see Magento\Framework\NewHandler
123+
*/
124+
class SomethingHandler
125+
{
126+
127+
}
128+
129+
/**
130+
* @see
131+
*/
132+
class DoNotCareHandler
133+
{
134+
135+
}
136+
137+
/**
138+
* @deprecated
139+
* @see Magento\Framework\NewHandler
140+
*/
141+
class OldHandler
142+
{
143+
144+
}
145+
146+
/**
147+
* @deprecated This class will be removed in version 1.0.0 without replacement
148+
*/
149+
class DeprecatedButHandler
150+
{
151+
152+
}
153+
154+
/**
155+
* @deprecated This class will be removed in version 123.45.6789 without replacement
156+
*/
157+
class DeprecatedButHandlerLongVersion
158+
{
159+
160+
}
161+
162+
/**
163+
* @deprecated It's also deprecated - This class will be removed in version 1.0.0 without replacement
164+
*/
165+
class AlsoDeprecatedButHandler
166+
{
167+
168+
}
169+
170+
/**
171+
* @deprecated It's also deprecated - This class will be removed in version 123.45.6789 without replacement
172+
*/
173+
class AlsoDeprecatedButHandlerLongVersion
174+
{
175+
176+
}
177+
178+
class OnlyUselessCommentContent
179+
{
180+
181+
}

0 commit comments

Comments
 (0)