added an exception when the parser want to move after the EOF, and added a better...
authorFabien Potencier <fabien.potencier@gmail.com>
Fri, 19 Feb 2010 17:19:11 +0000 (18:19 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Fri, 19 Feb 2010 17:19:25 +0000 (18:19 +0100)
lib/Twig/TokenParser/If.php
lib/Twig/TokenStream.php

index adf8f7b..9bd4400 100644 (file)
@@ -23,23 +23,33 @@ class Twig_TokenParser_If extends Twig_TokenParser
     $end = false;
     while (!$end)
     {
-      switch ($this->parser->getStream()->next()->getValue())
+      try
       {
-        case 'else':
-          $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-          $else = $this->parser->subparse(array($this, 'decideIfEnd'));
-          break;
+        switch ($this->parser->getStream()->next()->getValue())
+        {
+          case 'else':
+            $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+            $else = $this->parser->subparse(array($this, 'decideIfEnd'));
+            break;
 
-        case 'elseif':
-          $expr = $this->parser->getExpressionParser()->parseExpression();
-          $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-          $body = $this->parser->subparse(array($this, 'decideIfFork'));
-          $tests[] = array($expr, $body);
-          break;
+          case 'elseif':
+            $expr = $this->parser->getExpressionParser()->parseExpression();
+            $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+            $body = $this->parser->subparse(array($this, 'decideIfFork'));
+            $tests[] = array($expr, $body);
+            break;
 
-        case 'endif':
-          $end = true;
-          break;
+          case 'endif':
+            $end = true;
+            break;
+
+          default:
+            throw new Twig_SyntaxError('', -1);
+        }
+      }
+      catch (Twig_SyntaxError $e)
+      {
+        throw new Twig_SyntaxError(sprintf('Unexpected end of template. Twig was looking for the following tags "else", "elseif", or "endif" to close the "if" block started at line %d)', $lineno), -1);
       }
     }
 
index a696d3c..74e1537 100644 (file)
@@ -63,6 +63,11 @@ class Twig_TokenStream
       $token = array_shift($this->tokens);
     }
 
+    if (null === $token)
+    {
+      throw new Twig_SyntaxError('Unexpected end of template', -1);
+    }
+
     // trim blocks
     if ($this->trimBlocks &&
       $this->current &&