'OpenApi\\Annotations']; /** * Allows Annotation classes to know the context of the annotation that is being processed. * * @var null|Context */ public static $context; /** * @var DocParser */ public $docParser; public function __construct(?DocParser $docParser = null) { if ($docParser === null) { $docParser = new DocParser(); $docParser->setIgnoreNotImportedAnnotations(true); $docParser->setImports(static::$defaultImports); } $this->docParser = $docParser; } /** * Use doctrine to parse the comment block and return the detected annotations. * * @param string $comment a T_DOC_COMMENT * @param Context $context * * @return array Annotations */ public function fromComment(string $comment, ?Context $context = null): array { $context = $context ?: new Context(); $context->comment = $comment; try { self::$context = $context; if ($context->is('annotations') === false) { $context->annotations = []; } $annotations = $this->docParser->parse($comment, $context); self::$context = null; return $annotations; } catch (\Exception $e) { self::$context = null; if (preg_match('/^(.+) at position ([0-9]+) in ' . preg_quote((string) $context, '/') . '\.$/', $e->getMessage(), $matches)) { $errorMessage = $matches[1]; $errorPos = (int) $matches[2]; $atPos = strpos($comment, '@'); $context->line += substr_count($comment, "\n", 0, $atPos + $errorPos); $lines = explode("\n", substr($comment, $atPos, $errorPos)); $context->character = strlen(array_pop($lines)) + 1; // position starts at 0 character starts at 1 Logger::warning(new \Exception($errorMessage . ' in ' . $context, $e->getCode(), $e)); } else { Logger::warning($e); } return []; } } }