Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
AnnotationScanner.php
001 <?php
002 /**
003 * Zend Framework (http://framework.zend.com/)
004 *
005 * @link http://github.com/zendframework/zf2 for the canonical source repository
006 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
007 * @license http://framework.zend.com/license/new-bsd New BSD License
008 */
009
010 namespace Zend\Code\Scanner;
011
012 use Zend\Code\Annotation\AnnotationCollection;
013 use Zend\Code\Annotation\AnnotationManager;
014 use Zend\Code\NameInformation;
015
016 class AnnotationScanner extends AnnotationCollection implements ScannerInterface
017 {
018 /**
019 * @var bool
020 */
021 protected $isScanned = false;
022
023 /**
024 * @var string
025 */
026 protected $docComment = null;
027
028 /**
029 * @var NameInformation
030 */
031 protected $nameInformation = null;
032
033 /**
034 * @var AnnotationManager
035 */
036 protected $annotationManager = null;
037
038 /**
039 * @var array
040 */
041 protected $annotations = array();
042
043 /**
044 * @param AnnotationManager $annotationManager
045 * @param string $docComment
046 * @param NameInformation $nameInformation
047 * @return AnnotationScanner
048 */
049 public function __construct(
050 AnnotationManager $annotationManager,
051 $docComment,
052 NameInformation $nameInformation = null
053 ) {
054 $this->annotationManager = $annotationManager;
055 $this->docComment = $docComment;
056 $this->nameInformation = $nameInformation;
057 $this->scan($this->tokenize());
058 }
059
060 /**
061 * @param NameInformation $nameInformation
062 */
063 public function setNameInformation(NameInformation $nameInformation)
064 {
065 $this->nameInformation = $nameInformation;
066 }
067
068 /**
069 * @param array $tokens
070 */
071 protected function scan(array $tokens)
072 {
073 $annotations = array();
074 $annotationIndex = -1;
075 $contentEnd = false;
076
077 reset($tokens);
078
079 SCANNER_TOP:
080 $token = current($tokens);
081
082 switch ($token[0]) {
083
084 case 'ANNOTATION_CLASS':
085
086 $contentEnd = false;
087 $annotationIndex++;
088 $class = substr($token[1], 1);
089 $class = $this->nameInformation->resolveName($class);
090 $annotations[$annotationIndex] = array($class, null);
091 goto SCANNER_CONTINUE;
092 // goto no break needed
093
094 case 'ANNOTATION_CONTENT_START':
095
096 $annotations[$annotationIndex][1] = '';
097 //fall-through
098
099 case 'ANNOTATION_CONTENT_END':
100 case 'ANNOTATION_CONTENT':
101 case 'ANNOTATION_WHITESPACE':
102 case 'ANNOTATION_NEWLINE':
103
104 if (!$contentEnd && isset($annotations[$annotationIndex]) && is_string($annotations[$annotationIndex][1])) {
105 $annotations[$annotationIndex][1] .= $token[1];
106 }
107
108 if ($token[0] === 'ANNOTATION_CONTENT_END') {
109 $contentEnd = true;
110 }
111
112 goto SCANNER_CONTINUE;
113 }
114
115 SCANNER_CONTINUE:
116 if (next($tokens) === false) {
117 goto SCANNER_END;
118 }
119 goto SCANNER_TOP;
120
121 SCANNER_END:
122
123 foreach ($annotations as $annotation) {
124 $annotation[] = '@' . $annotation[0] . $annotation[1];
125 $annotationObject = $this->annotationManager->createAnnotation($annotation);
126 if ($annotationObject) {
127 $this->append($annotationObject);
128 }
129 }
130 }
131
132 /**
133 * @return array
134 */
135 protected function tokenize()
136 {
137 static $CONTEXT_DOCBLOCK = 0x01;
138 static $CONTEXT_ASTERISK = 0x02;
139 static $CONTEXT_CLASS = 0x04;
140 static $CONTEXT_CONTENT = 0x08;
141
142 $context = 0x00;
143 $stream = $this->docComment;
144 $streamIndex = null;
145 $tokens = array();
146 $tokenIndex = null;
147 $currentChar = null;
148 $currentWord = null;
149 $currentLine = null;
150
151 $annotationParentCount = 0;
152
153 $MACRO_STREAM_ADVANCE_CHAR = function ($positionsForward = 1) use (&$stream, &$streamIndex, &$currentChar, &$currentWord, &$currentLine) {
154 $positionsForward = ($positionsForward > 0) ? $positionsForward : 1;
155 $streamIndex = ($streamIndex === null) ? 0 : $streamIndex + $positionsForward;
156 if (!isset($stream[$streamIndex])) {
157 $currentChar = false;
158
159 return false;
160 }
161 $currentChar = $stream[$streamIndex];
162 $matches = array();
163 $currentLine = (preg_match('#(.*?)(?:\n|\r\n?)#', $stream, $matches, null, $streamIndex) === 1) ? $matches[1] : substr($stream, $streamIndex);
164 if ($currentChar === ' ') {
165 $currentWord = (preg_match('#( +)#', $currentLine, $matches) === 1) ? $matches[1] : $currentLine;
166 } else {
167 $currentWord = (($matches = strpos($currentLine, ' ')) !== false) ? substr($currentLine, 0, $matches) : $currentLine;
168 }
169
170 return $currentChar;
171 };
172 $MACRO_STREAM_ADVANCE_WORD = function () use (&$currentWord, &$MACRO_STREAM_ADVANCE_CHAR) {
173 return $MACRO_STREAM_ADVANCE_CHAR(strlen($currentWord));
174 };
175 $MACRO_STREAM_ADVANCE_LINE = function () use (&$currentLine, &$MACRO_STREAM_ADVANCE_CHAR) {
176 return $MACRO_STREAM_ADVANCE_CHAR(strlen($currentLine));
177 };
178 $MACRO_TOKEN_ADVANCE = function () use (&$tokenIndex, &$tokens) {
179 $tokenIndex = ($tokenIndex === null) ? 0 : $tokenIndex + 1;
180 $tokens[$tokenIndex] = array('ANNOTATION_UNKNOWN', '');
181 };
182 $MACRO_TOKEN_SET_TYPE = function ($type) use (&$tokenIndex, &$tokens) {
183 $tokens[$tokenIndex][0] = $type;
184 };
185 $MACRO_TOKEN_APPEND_CHAR = function () use (&$currentChar, &$tokens, &$tokenIndex) {
186 $tokens[$tokenIndex][1] .= $currentChar;
187 };
188 $MACRO_TOKEN_APPEND_WORD = function () use (&$currentWord, &$tokens, &$tokenIndex) {
189 $tokens[$tokenIndex][1] .= $currentWord;
190 };
191 $MACRO_TOKEN_APPEND_LINE = function () use (&$currentLine, &$tokens, &$tokenIndex) {
192 $tokens[$tokenIndex][1] .= $currentLine;
193 };
194 $MACRO_HAS_CONTEXT = function ($which) use (&$context) {
195 return (($context & $which) === $which);
196 };
197
198 $MACRO_STREAM_ADVANCE_CHAR();
199 $MACRO_TOKEN_ADVANCE();
200
201 TOKENIZER_TOP:
202
203 if ($context === 0x00 && $currentChar === '/' && $currentWord === '/**') {
204 $MACRO_TOKEN_SET_TYPE('ANNOTATION_COMMENTSTART');
205 $MACRO_TOKEN_APPEND_WORD();
206 $MACRO_TOKEN_ADVANCE();
207 $context |= $CONTEXT_DOCBLOCK;
208 $context |= $CONTEXT_ASTERISK;
209 if ($MACRO_STREAM_ADVANCE_WORD() === false) {
210 goto TOKENIZER_END;
211 }
212 goto TOKENIZER_TOP;
213 }
214
215 if ($MACRO_HAS_CONTEXT($CONTEXT_CLASS)) {
216 if (in_array($currentChar, array(' ', '(', "\n", "\r"))) {
217 $context &= ~$CONTEXT_CLASS;
218 $MACRO_TOKEN_ADVANCE();
219 } else {
220 $MACRO_TOKEN_APPEND_CHAR();
221 if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
222 goto TOKENIZER_END;
223 }
224 goto TOKENIZER_TOP;
225 }
226 }
227
228 // Since we don't know what line endings are used in the file, we check for all scenarios. If we find a
229 // cariage return (\r), we check the next character for a line feed (\n). If so we consume it and act as
230 // if the cariage return was a line feed.
231 $lineEnded = $currentChar === "\n";
232 if ($currentChar === "\r") {
233 $lineEnded = true;
234
235 $nextChar = $MACRO_STREAM_ADVANCE_CHAR();
236 if ($nextChar !== "\n") {
237 $streamIndex--;
238 }
239
240 $currentChar = "\n";
241 }
242
243 if ($lineEnded) {
244 $MACRO_TOKEN_SET_TYPE('ANNOTATION_NEWLINE');
245 $MACRO_TOKEN_APPEND_CHAR();
246 $MACRO_TOKEN_ADVANCE();
247 $context &= ~$CONTEXT_ASTERISK;
248 $context &= ~$CONTEXT_CLASS;
249 if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
250 goto TOKENIZER_END;
251 }
252 goto TOKENIZER_TOP;
253 }
254
255 if ($currentChar === ' ') {
256 $MACRO_TOKEN_SET_TYPE(($MACRO_HAS_CONTEXT($CONTEXT_ASTERISK)) ? 'ANNOTATION_WHITESPACE' : 'ANNOTATION_WHITESPACE_INDENT');
257 $MACRO_TOKEN_APPEND_WORD();
258 $MACRO_TOKEN_ADVANCE();
259 if ($MACRO_STREAM_ADVANCE_WORD() === false) {
260 goto TOKENIZER_END;
261 }
262 goto TOKENIZER_TOP;
263 }
264
265 if ($MACRO_HAS_CONTEXT($CONTEXT_CONTENT) && $MACRO_HAS_CONTEXT($CONTEXT_ASTERISK)) {
266 $MACRO_TOKEN_SET_TYPE('ANNOTATION_CONTENT');
267 $annotationParentCount += substr_count($currentWord, '(');
268 $annotationParentCount -= substr_count($currentWord, ')');
269
270 if ($annotationParentCount === 0) {
271 $context &= ~$CONTEXT_CONTENT;
272 $MACRO_TOKEN_SET_TYPE('ANNOTATION_CONTENT_END');
273 }
274 $MACRO_TOKEN_APPEND_WORD();
275 $MACRO_TOKEN_ADVANCE();
276 if ($MACRO_STREAM_ADVANCE_WORD() === false) {
277 goto TOKENIZER_END;
278 }
279 goto TOKENIZER_TOP;
280 }
281
282 if ($currentChar === '(' && $tokens[$tokenIndex - 1][0] === 'ANNOTATION_CLASS') {
283 $context |= $CONTEXT_CONTENT;
284 $annotationParentCount = 1;
285 $MACRO_TOKEN_SET_TYPE('ANNOTATION_CONTENT_START');
286 $MACRO_TOKEN_APPEND_CHAR();
287 $MACRO_TOKEN_ADVANCE();
288 if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
289 goto TOKENIZER_END;
290 }
291 goto TOKENIZER_TOP;
292 }
293
294 if ($MACRO_HAS_CONTEXT($CONTEXT_DOCBLOCK) && $currentWord === '*/') {
295 $MACRO_TOKEN_SET_TYPE('ANNOTATION_COMMENTEND');
296 $MACRO_TOKEN_APPEND_WORD();
297 $MACRO_TOKEN_ADVANCE();
298 $context &= ~$CONTEXT_DOCBLOCK;
299 if ($MACRO_STREAM_ADVANCE_WORD() === false) {
300 goto TOKENIZER_END;
301 }
302 goto TOKENIZER_TOP;
303 }
304
305 if ($currentChar === '*') {
306 if ($MACRO_HAS_CONTEXT($CONTEXT_DOCBLOCK) && ($MACRO_HAS_CONTEXT($CONTEXT_ASTERISK))) {
307 $MACRO_TOKEN_SET_TYPE('ANNOTATION_IGNORE');
308 } else {
309 $MACRO_TOKEN_SET_TYPE('ANNOTATION_ASTERISK');
310 $context |= $CONTEXT_ASTERISK;
311 }
312 $MACRO_TOKEN_APPEND_CHAR();
313 $MACRO_TOKEN_ADVANCE();
314 if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
315 goto TOKENIZER_END;
316 }
317 goto TOKENIZER_TOP;
318 }
319
320 if ($currentChar === '@') {
321 $MACRO_TOKEN_SET_TYPE('ANNOTATION_CLASS');
322 $context |= $CONTEXT_CLASS;
323 $MACRO_TOKEN_APPEND_CHAR();
324 if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
325 goto TOKENIZER_END;
326 }
327 goto TOKENIZER_TOP;
328 }
329
330 TOKENIZER_CONTINUE:
331
332 if ($context && $CONTEXT_CONTENT) {
333 $MACRO_TOKEN_APPEND_CHAR();
334 if ($MACRO_STREAM_ADVANCE_CHAR() === false) {
335 goto TOKENIZER_END;
336 }
337 } else {
338 $MACRO_TOKEN_SET_TYPE('ANNOTATION_IGNORE');
339 $MACRO_TOKEN_APPEND_LINE();
340 $MACRO_TOKEN_ADVANCE();
341 if ($MACRO_STREAM_ADVANCE_LINE() === false) {
342 goto TOKENIZER_END;
343 }
344 }
345 goto TOKENIZER_TOP;
346
347 TOKENIZER_END:
348
349 array_pop($tokens);
350
351 return $tokens;
352 }
353 }
354