/** * @param array $properties */ public function __construct($properties) { if (isset($properties['_context'])) { $this->_context = $properties['_context']; unset($properties['_context']); } elseif (Analyser::$context) { $this->_context = Analyser::$context; } else { $this->_context = Context::detect(1); } if ($this->_context->is('annotations') === false) { $this->_context->annotations = []; } $this->_context->annotations[] = $this; $nestedContext = new Context(['nested' => $this], $this->_context); foreach ($properties as $property => $value) { if (property_exists($this, $property)) { $this->{$property} = $value; if (is_array($value)) { foreach ($value as $key => $annotation) { if (is_object($annotation) && $annotation instanceof AbstractAnnotation) { $this->{$property}[$key] = $this->nested($annotation, $nestedContext); } } } } elseif ($property !== 'value') { $this->{$property} = $value; } elseif (is_array($value)) { $annotations = []; foreach ($value as $annotation) { if (is_object($annotation) && $annotation instanceof AbstractAnnotation) { $annotations[] = $annotation; } else { Logger::notice('Unexpected field in ' . $this->identity() . ' in ' . $this->_context); } } $this->merge($annotations); } elseif (is_object($value)) { $this->merge([$value]); } else { Logger::notice('Unexpected parameter in ' . $this->identity()); } } }
/** * 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($comment, $context = null) { if ($context === null) { $context = new Context(['comment' => $comment]); } else { $context->comment = $comment; } try { self::$context = $context; if ($context->is('annotations') === false) { $context->annotations = []; } $comment = preg_replace_callback('/^[\\t ]*\\*[\\t ]+/m', function ($match) { // Replace leading tabs with spaces. // Workaround for http://www.doctrine-project.org/jira/browse/DCOM-255 return str_replace("\t", ' ', $match[0]); }, $comment); $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($context, '/') . '\\.$/', $e->getMessage(), $matches)) { $errorMessage = $matches[1]; $errorPos = $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 []; } }