function Parser::parseJSXElement
Parses a jsx element
Return value
\Peast\Syntax\Node\JSX\JSXElement|null
2 calls to Parser::parseJSXElement()
- Parser::parseJSXAttribute in vendor/
mck89/ peast/ lib/ Peast/ Syntax/ JSX/ Parser.php - Parses a jsx spread attribute
- Parser::parseJSXChild in vendor/
mck89/ peast/ lib/ Peast/ Syntax/ JSX/ Parser.php - Parses a jsx child
File
-
vendor/
mck89/ peast/ lib/ Peast/ Syntax/ JSX/ Parser.php, line 160
Class
- Parser
- JSX parser trait
Namespace
Peast\Syntax\JSXCode
protected function parseJSXElement() {
$startOpeningToken = $this->scanner
->getToken();
if (!$startOpeningToken || $startOpeningToken->value !== "<") {
return null;
}
$nextToken = $this->scanner
->getNextToken();
if ($nextToken && $nextToken->value === "/") {
return null;
}
$this->scanner
->consumeToken();
if (!($name = $this->parseJSXIdentifierOrMemberExpression())) {
$this->error();
}
$attributes = $this->parseJSXAttributes();
$selfClosing = $this->scanner
->consume("/");
$endOpeningToken = $this->scanner
->reconsumeCurrentTokenInJSXMode();
if (!$endOpeningToken || $endOpeningToken->value !== ">") {
$this->error();
}
$this->scanner
->consumeToken();
if (!$selfClosing) {
$children = $this->parseJSXChildren();
if (($startClosingToken = $this->scanner
->consume("<")) && $this->scanner
->consume("/") && ($closingName = $this->parseJSXIdentifierOrMemberExpression()) && ($endClosingToken = $this->scanner
->reconsumeCurrentTokenInJSXMode()) && $endClosingToken->value === ">") {
$this->scanner
->consumeToken();
if (!$this->isSameJSXElementName($name, $closingName)) {
$this->error("Closing tag does not match opening tag");
}
}
else {
$this->error();
}
}
//Opening tag
$openingNode = $this->createJSXNode("JSXOpeningElement", $startOpeningToken);
$openingNode->setName($name);
$openingNode->setSelfClosing($selfClosing);
if ($attributes) {
$openingNode->setAttributes($attributes);
}
$this->completeNode($openingNode, $endOpeningToken->location->end);
//Closing tag
$closingNode = null;
if (!$selfClosing) {
$closingNode = $this->createJSXNode("JSXClosingElement", $startClosingToken);
$closingNode->setName($closingName);
$this->completeNode($closingNode);
}
//Element
$node = $this->createJSXNode("JSXElement", $startOpeningToken);
$node->setOpeningElement($openingNode);
if ($closingNode) {
$node->setClosingElement($closingNode);
if ($children) {
$node->setChildren($children);
}
}
return $this->completeNode($node);
}