public function parseSubscriptExpression($node) {
$stream = $this->parser
->getStream();
$token = $stream
->next();
$lineno = $token
->getLine();
$arguments = new Twig_Node_Expression_Array(array(), $lineno);
$type = Twig_TemplateInterface::ANY_CALL;
if ($token
->getValue() == '.') {
$token = $stream
->next();
if ($token
->getType() == Twig_Token::NAME_TYPE || $token
->getType() == Twig_Token::NUMBER_TYPE || $token
->getType() == Twig_Token::OPERATOR_TYPE && preg_match(Twig_Lexer::REGEX_NAME, $token
->getValue())) {
$arg = new Twig_Node_Expression_Constant($token
->getValue(), $lineno);
if ($stream
->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
$type = Twig_TemplateInterface::METHOD_CALL;
foreach ($this
->parseArguments() as $n) {
$arguments
->addElement($n);
}
}
}
else {
throw new Twig_Error_Syntax('Expected name or number', $lineno);
}
}
else {
$type = Twig_TemplateInterface::ARRAY_CALL;
$arg = $this
->parseExpression();
// slice?
if ($stream
->test(Twig_Token::PUNCTUATION_TYPE, ':')) {
$stream
->next();
if ($stream
->test(Twig_Token::PUNCTUATION_TYPE, ']')) {
$length = new Twig_Node_Expression_Constant(null, $token
->getLine());
}
else {
$length = $this
->parseExpression();
}
$class = $this
->getFilterNodeClass('slice');
$arguments = new Twig_Node(array(
$arg,
$length,
));
$filter = new $class($node, new Twig_Node_Expression_Constant('slice', $token
->getLine()), $arguments, $token
->getLine());
$stream
->expect(Twig_Token::PUNCTUATION_TYPE, ']');
return $filter;
}
$stream
->expect(Twig_Token::PUNCTUATION_TYPE, ']');
}
return new Twig_Node_Expression_GetAttr($node, $arg, $arguments, $type, $lineno);
}