more unittests and updated documentation for extensions.  Fixed bug in optimizer that caused blocks to be optimized away under some circumstances.

--HG--
branch : trunk
diff --git a/jinja2/compiler.py b/jinja2/compiler.py
index 3b5f8c0..6dcaf08 100644
--- a/jinja2/compiler.py
+++ b/jinja2/compiler.py
@@ -678,11 +678,11 @@
         self.indent()
         if have_extends:
             self.writeline('parent_template = None')
-        self.pull_locals(frame)
-        self.pull_dependencies(node.body)
         if 'self' in find_undeclared(node.body, ('self',)):
             frame.identifiers.add_special('self')
             self.writeline('l_self = TemplateReference(context)')
+        self.pull_locals(frame)
+        self.pull_dependencies(node.body)
         self.blockvisit(node.body, frame)
         self.outdent()
 
@@ -1364,7 +1364,7 @@
         self.write('environment.' + node.name)
 
     def visit_ExtensionAttribute(self, node, frame):
-        self.write('environment.extensions[%r].%s' % (node.identifier, node.attr))
+        self.write('environment.extensions[%r].%s' % (node.identifier, node.name))
 
     def visit_ImportedName(self, node, frame):
         self.write(self.import_aliases[node.importname])
@@ -1372,6 +1372,9 @@
     def visit_InternalName(self, node, frame):
         self.write(node.name)
 
+    def visit_ContextReference(self, node, frame):
+        self.write('context')
+
     def visit_Continue(self, node, frame):
         self.writeline('continue', node)