@@ -51,10 +51,11 @@ public function tokenizeString($string, $eolChar, $stackPtr)
5151 }
5252
5353 $ tokens [$ stackPtr ] = [
54- 'content ' => $ openTag ,
55- 'code ' => T_DOC_COMMENT_OPEN_TAG ,
56- 'type ' => 'T_DOC_COMMENT_OPEN_TAG ' ,
57- 'comment_tags ' => [],
54+ 'content ' => $ openTag ,
55+ 'code ' => T_DOC_COMMENT_OPEN_TAG ,
56+ 'type ' => 'T_DOC_COMMENT_OPEN_TAG ' ,
57+ 'comment_opener ' => $ stackPtr ,
58+ 'comment_tags ' => [],
5859 ];
5960
6061 $ openPtr = $ stackPtr ;
@@ -103,6 +104,7 @@ public function tokenizeString($string, $eolChar, $stackPtr)
103104 $ space = $ this ->collectWhitespace ($ string , $ char , $ numChars );
104105 if ($ space !== null ) {
105106 $ tokens [$ stackPtr ] = $ space ;
107+ $ tokens [$ stackPtr ]['comment_opener ' ] = $ openPtr ;
106108 $ stackPtr ++;
107109 if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
108110 $ content = Common::prepareForOutput ($ space ['content ' ]);
@@ -123,9 +125,10 @@ public function tokenizeString($string, $eolChar, $stackPtr)
123125 // This is a function or class doc block line.
124126 $ char ++;
125127 $ tokens [$ stackPtr ] = [
126- 'content ' => '* ' ,
127- 'code ' => T_DOC_COMMENT_STAR ,
128- 'type ' => 'T_DOC_COMMENT_STAR ' ,
128+ 'content ' => '* ' ,
129+ 'code ' => T_DOC_COMMENT_STAR ,
130+ 'type ' => 'T_DOC_COMMENT_STAR ' ,
131+ 'comment_opener ' => $ openPtr ,
129132 ];
130133
131134 $ stackPtr ++;
@@ -139,6 +142,7 @@ public function tokenizeString($string, $eolChar, $stackPtr)
139142 $ lineTokens = $ this ->processLine ($ string , $ eolChar , $ char , $ numChars );
140143 foreach ($ lineTokens as $ lineToken ) {
141144 $ tokens [$ stackPtr ] = $ lineToken ;
145+ $ tokens [$ stackPtr ]['comment_opener ' ] = $ openPtr ;
142146 if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
143147 $ content = Common::prepareForOutput ($ lineToken ['content ' ]);
144148 $ type = $ lineToken ['type ' ];
@@ -154,12 +158,17 @@ public function tokenizeString($string, $eolChar, $stackPtr)
154158 }//end foreach
155159
156160 $ tokens [$ stackPtr ] = $ closeTag ;
157- $ tokens [$ openPtr ]['comment_closer ' ] = $ stackPtr ;
158161 if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
159162 $ content = Common::prepareForOutput ($ closeTag ['content ' ]);
160163 StatusWriter::write ("Create comment token: T_DOC_COMMENT_CLOSE_TAG => $ content " , 2 );
161164 }
162165
166+ // Only now do we know the stack pointer to the docblock closer,
167+ // so add it to all previously created comment tokens.
168+ foreach ($ tokens as $ ptr => $ token ) {
169+ $ tokens [$ ptr ]['comment_closer ' ] = $ stackPtr ;
170+ }
171+
163172 if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
164173 StatusWriter::write ('*** END COMMENT TOKENIZING *** ' , 2 );
165174 }
0 commit comments