public function visitTypeAttributeEnter(PiBX_AST_Tree $tree) { if ($tree->countChildren() == 0) { // base type attribute $attributeName = PiBX_Binding_Names::getAttributeName($tree->getName()); $methodName = PiBX_Binding_Names::getCamelCasedName($tree->getName()); $this->currentClassAttributes .= "\tprivate \$" . $attributeName . ";\n"; $type = $tree->getType(); $methods = "\tpublic function set" . $methodName . "("; if (!PiBX_ParseTree_BaseType::isBaseType($type)) { // complexTypes (i.e. classes) have to be type-hinted // in the method signature. $expectedType = PiBX_Binding_Names::createClassnameFor($type); $methods .= $expectedType . ' '; } $methods .= "\$" . $attributeName . ") {\n"; if ($this->doTypeChecks) { $methods .= $this->typeChecks->getTypeCheckFor($tree->getType(), $attributeName); } $methods .= "\t\t\$this->" . $attributeName . " = \$" . $attributeName . ";\n" . "\t}\n" . "\tpublic function get" . $methodName . "() {\n" . "\t\treturn \$this->" . $attributeName . ";\n" . "\t}\n"; $this->currentClassMethods .= $methods; return false; } else { return true; } }
/** * Returns the PHP code for a collection of arbitrary types. * * @param PiBX_AST_Collection $ast * @return string */ public function getListTypeCheckFor(PiBX_AST_Tree $ast, $attributeName) { if (!$ast instanceof PiBX_AST_Collection && !$ast instanceof PiBX_AST_CollectionItem) { throw new RuntimeException('Not valid list AST given.'); } if ($ast instanceof PiBX_AST_CollectionItem) { $ast = $ast->getParent(); } $iterationVar = strtolower(substr($attributeName, 0, 1)); $expectedType = $ast->getType(); if ($ast->countChildren() == 1) { $childAst = $ast->get(0); $expectedType = $childAst->getType(); } else { throw new RuntimeException('Currently not supported.'); } $code = "\t\tforeach (\$" . $attributeName . " as &\$" . $iterationVar . ") {\n"; if (PiBX_ParseTree_BaseType::isBaseType($expectedType)) { $code .= "\t\t\tif (!is_" . $expectedType . "(\$" . $iterationVar . ")) {\n"; } else { $expectedType = PiBX_Binding_Names::createClassnameFor($expectedType); $code .= "\t\t\tif (get_class(\$" . $iterationVar . ") !== '" . $expectedType . "') {\n"; } $code .= "\t\t\t\tthrow new InvalidArgumentException('Invalid list. " . "All containing elements have to be of type \"" . $expectedType . "\".');\n" . "\t\t\t}\n" . "\t\t}\n"; return $code; }
public function visitTypeAttributeEnter(PiBX_AST_Tree $tree) { if ($tree->countChildren() == 0) { if (PiBX_ParseTree_BaseType::isBaseType($tree->getType())) { $this->xml .= '<value style="' . $tree->getStyle() . '"'; $this->xml .= ' name="' . $tree->getName() . '"'; $getter = PiBX_Binding_Names::createGetterNameFor($tree); $setter = PiBX_Binding_Names::createSetterNameFor($tree); $this->xml .= ' get-method="' . $getter . '"'; $this->xml .= ' set-method="' . $setter . '"'; $this->xml .= '/>'; } else { $this->xml .= '<structure map-as="' . $tree->getType() . '"'; $getter = PiBX_Binding_Names::createGetterNameFor($tree); $setter = PiBX_Binding_Names::createSetterNameFor($tree); $this->xml .= ' get-method="' . $getter . '"'; $this->xml .= ' set-method="' . $setter . '"'; $this->xml .= ' name="' . $tree->getName() . '"'; $this->xml .= '/>'; } return false; } else { return true; } }