/** * process element * * @param $implement * @param string $rawContent * @return array|mixed * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ public function process($implement, $rawContent = '') { $classData = $this->classConfig->getClassData($implement['id']); $implements = []; foreach ($this->getModelsToProcess() as $model) { $implements[$model->filterContent($classData['id'])] = ['id' => $model->filterContent($classData['id']), 'class' => $model->filterContent($classData['class']), 'alias' => $model->filterContent($classData['alias'])]; } return $implements; }
/** * parse member * * @param array $member * @return array */ public function parse(array $member) { $data = []; $constant = $this->classConfig->getBoolValue($member, 'constant'); if ($constant) { $type = 'const'; } else { $type = isset($member['type']) ? $member['type'] : 'protected'; } $data['id'] = $this->filterContent($member['id']); $data['type'] = $type; $data['construct'] = $this->classConfig->getBoolValue($member, 'construct'); $data['constant'] = $constant; $data['parent'] = $this->classConfig->getBoolValue($member, 'parent'); $data['show'] = $this->classConfig->getBoolValue($member, 'show'); $data['skip'] = $this->classConfig->getBoolValue($member, 'skip'); $data['doc'] = isset($member['doc']) ? $this->filterContent($member['doc']) : ''; if (isset($member['var'])) { $classData = $this->classConfig->getClassData($member['var']); $data['var'] = ['class' => $this->filterContent($classData['class']), 'alias' => $this->filterContent($classData['alias'])]; } $data['default'] = isset($member['default']) ? $this->filterContent($member['default']) : ''; $data['core'] = $this->classConfig->getBoolValue($member, 'core'); return $data; }
/** * merge all elements of the class * * @param $string * @return string * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function mergeElements($string) { $this->uses = []; $content = ''; $tab = $this->getPadding(); $eol = $this->getEol(); //add annotations if ($this->module->getSettings()->getAnnotation() && count($this->annotations)) { $content .= '/**' . $this->getEol() . implode($this->getEol(), $this->annotations) . $this->getEol() . ' */' . $this->getEol(); } if ($this->config['abstract']) { $classLine = 'abstract '; } else { $classLine = ''; } $classLine .= 'class ' . $this->className; if ($this->extends) { $classLine .= ' extends ' . $this->getClassName($this->extends); if (!$this->getQualified()) { $this->uses[$this->extends['class']] = $this->extends; } } if ($this->implements) { $interfaces = []; foreach ($this->implements as $classData) { $interfaces[] = $this->getClassName($classData); if (!$this->getQualified()) { $this->uses[$classData['class']] = $classData; } } $classLine .= ' implements ' . implode(', ', $interfaces); } $classLine .= $this->getEol() . '{' . $this->getEol(); //add class definition $content .= $classLine; //separate members $constants = []; $members = []; $forConstruct = []; $hasConstruct = false; foreach ($this->members as $member) { if ($member['constant']) { $constants[] = $member; continue; } if ($member['show']) { $members[] = $member; } if ($member['construct']) { $forConstruct[] = $member; if (!$member['parent']) { $hasConstruct = true; } } } //add constants foreach ($constants as $constant) { $content .= $this->formatMember($constant); } //add members foreach ($members as $member) { $content .= $this->formatMember($member); } if (count($this->constructs)) { $hasConstruct = true; } //generate constructor if ($hasConstruct) { $lines = []; $lines[] = '/**'; $lines[] = ' * constructor'; $lines[] = ' * '; foreach ($forConstruct as $param) { $className = $this->getClassName($param['var']); if (!$this->getQualified()) { $this->uses[$param['var']['class']] = $param['var']; } $lines[] = ' * @param ' . $className . ($className ? ' ' : '') . '$' . $param['id']; } $lines[] = ' */'; $lines[] = 'public function __construct('; foreach ($forConstruct as $index => $param) { $className = $this->getClassName($param['var']); if (!$this->getQualified()) { $this->uses[$param['var']['class']] = $param['var']; } $lines[] = $tab . $className . ($className ? ' ' : '') . '$' . $param['id'] . ($param['default'] ? ' = ' . $param['default'] : '') . ($index < count($forConstruct) - 1 ? ',' : ''); } $lines[] = ')'; $lines[] = '{'; $constructAssign = []; foreach ($forConstruct as $param) { if (!$param['parent'] && !$param['skip']) { $underscore = $this->getUnderscoreValue($param); $constructAssign[] = $tab . '$this->' . $underscore . $param['id'] . ' = ' . '$' . $param['id'] . ';'; } } $constructAssign = $this->beautifyConstructAssigns($constructAssign); foreach ($constructAssign as $line) { $lines[] = $line; } if ($this->extends) { $parentLine = $tab . 'parent::__construct('; $parentParams = []; foreach ($forConstruct as $param) { if ($param['parent']) { $parentParams[] = '$' . $param['id']; } } if ($this->parentConstructExtraParams) { $parentParams[] = $this->parentConstructExtraParams; } $parentLine .= implode(', ', $parentParams) . ');'; $lines[] = $parentLine; } foreach ($this->constructs as $construct) { $parts = explode(self::CONSTRUCT_SEPARATOR, $construct); foreach ($parts as $part) { $lines[] = $tab . $part; } } $lines[] = '}' . $eol; $content .= $this->getScopeModel()->filterContent($tab . implode($eol . $tab, $lines) . $eol); } //add class body $content .= $string; //filter {{class}} directives if (preg_match_all(self::CLASS_PATTERN, $content, $constructions, PREG_SET_ORDER)) { foreach ($constructions as $construction) { if (isset($construction[1])) { $classData = $this->classConfig->getClassData($construction[1]); $classAndUse = $this->getUsesAndClassName($classData); if ($classAndUse['use']) { $this->uses[$classAndUse['use']['class']] = $classAndUse['use']; } $replaceVal = $classAndUse['class']; $content = str_replace($construction[0], $replaceVal, $content); } } } //process uses $useLines = []; $uses = ''; if (!$this->getQualified()) { foreach ($this->uses as $use) { if (!in_array($use['class'], $this->baseTypes)) { $useLines[] = 'use ' . ltrim($use['class'], '\\') . ($use['alias'] ? ' as ' . $use['alias'] : '') . ';'; } } if (count($useLines)) { asort($useLines); $useLines = array_unique($useLines); $uses = implode($this->getEol(), $useLines) . $this->getEol() . $this->getEol(); } } return $uses . $content; }
/** * process element * * @param $implement * @param string $rawContent * @return array|mixed * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ public function process($implement, $rawContent = '') { $classData = $this->classConfig->getClassData($implement['id']); return [$this->getModel()->filterContent($classData['id']) => ['id' => $this->getModel()->filterContent($classData['id']), 'class' => $this->getModel()->filterContent($classData['class']), 'alias' => $this->getModel()->filterContent($classData['alias'])]]; }