fixed scope for macros (macros can be imported in a block or outside of a block)
authorFabien Potencier <fabien.potencier@gmail.com>
Wed, 29 Dec 2010 09:17:06 +0000 (10:17 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Thu, 30 Dec 2010 08:51:57 +0000 (09:51 +0100)
    {% import "macros" as foo %}
    {% from "macros" import foo, bar as bar %}

    {% block foo %}
        {% import "macros" as foofoo %}
        {% from "macros" import foo as foofoo, bar as barbar %}

        {{ foo('something') }}
        {{ bar('something') }}

        {{ foofoo('something') }}
        {{ barbar('something') }}
    {% endblock %}

lib/Twig/Node/Expression/AssignLocalName.php [deleted file]
lib/Twig/Node/Expression/LocalName.php [deleted file]
lib/Twig/Node/From.php
lib/Twig/Parser.php
lib/Twig/TokenParser/Filter.php

diff --git a/lib/Twig/Node/Expression/AssignLocalName.php b/lib/Twig/Node/Expression/AssignLocalName.php
deleted file mode 100644 (file)
index 68868a8..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2010 Arnaud Le Blanc
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a local private variable.
- *
- * Such variables are not visible from templates.
- *
- * @package    twig
- * @author     Arnaud Le Blanc <arnaud.lb@gmail.com>
- */
-class Twig_Node_Expression_AssignLocalName extends Twig_Node_Expression_LocalName
-{
-}
diff --git a/lib/Twig/Node/Expression/LocalName.php b/lib/Twig/Node/Expression/LocalName.php
deleted file mode 100644 (file)
index aac10bb..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2010 Arnaud Le Blanc
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a local private variable.
- *
- * Such variables are not visible from templates.
- *
- * @package    twig
- * @author     Arnaud Le Blanc <arnaud.lb@gmail.com>
- */
-class Twig_Node_Expression_LocalName extends Twig_Node_Expression
-{
-    static protected $counter = 0;
-
-    public function __construct($name = null, $lineno = null)
-    {
-        if (null === $name) {
-            $uniq = self::$counter++;
-            $name = '__'.$uniq;
-        }
-
-        parent::__construct(array(), array('name' => $name), $lineno);
-    }
-
-    public function compile($compiler)
-    {
-        $compiler->raw('$'.$this->getAttribute('name'));
-    }
-}
-
index 0af0fea..224a905 100644 (file)
@@ -19,6 +19,6 @@ class Twig_Node_From extends Twig_Node_Import
 {
     public function __construct(Twig_Node_Expression $expr, $lineno, $tag = null)
     {
-        parent::__construct($expr, new Twig_Node_Expression_AssignLocalName(null, $lineno), $lineno, $tag);
+        parent::__construct($expr, new Twig_Node_Expression_AssignName(str_replace('.', '_', uniqid('_imported_', true)), $lineno), $lineno, $tag);
     }
 }
index 0d13798..06830e2 100644 (file)
@@ -195,18 +195,16 @@ class Twig_Parser implements Twig_ParserInterface
 
     public function addImportedFunction($alias, $name, Twig_Node_Expression $node)
     {
-        $this->importedFunctions[0][$alias] = array(
-            'name' => $name,
-            'node' => $node,
-        );
+        $this->importedFunctions[0][$alias] = array('name' => $name, 'node' => $node);
     }
 
     public function getImportedFunction($alias)
     {
-        if (!isset($this->importedFunctions[0][$alias])) {
-            return null;
+        foreach ($this->importedFunctions as $functions) {
+            if (isset($functions[$alias])) {
+                return $functions[$alias];
+            }
         }
-        return $this->importedFunctions[0][$alias];
     }
 
     public function pushLocalScope()
index b800f10..35d3b54 100644 (file)
@@ -19,7 +19,7 @@ class Twig_TokenParser_Filter extends Twig_TokenParser
      */
     public function parse(Twig_Token $token)
     {
-        $name = '_tmp'.rand(10000, 99999);
+        $name = str_replace('.', '_', uniqid('_tmp_', true));
         $node = new Twig_Node_Expression_Name($name, $token->getLine());
 
         $filter = $this->parser->getExpressionParser()->parseFilterExpressionRaw($node, $this->getTag());