lib/phlex/compiler.rb in phlex-0.4.0 vs lib/phlex/compiler.rb in phlex-0.5.0
- old
+ new
@@ -4,26 +4,46 @@
class Compiler
def initialize(view)
@view = view
end
+ attr_writer :scope
+
def inspect
"#{self.class.name} for #{@view.name} view class"
end
def call
Visitors::File.new(self).visit(tree)
end
+ def tag_method?(method_name)
+ (HTML::STANDARD_ELEMENTS.key?(method_name) || HTML::VOID_ELEMENTS.key?(method_name)) && !redefined?(method_name)
+ end
+
def redefined?(method_name)
prototype = @view.allocate
@view.instance_method(method_name).bind(prototype) !=
- Phlex::View.instance_method(method_name).bind(prototype)
+ Phlex::HTML.instance_method(method_name).bind(prototype)
end
- def redefine(method)
- @view.class_eval(method)
+ def redefine(method, line:)
+ patch = scope + method + unscope
+ eval(patch, Kernel.binding, file, (line - 1))
+ end
+
+ def scope
+ @scope.map do |scope|
+ case scope
+ in SyntaxTree::ModuleDeclaration then "module #{scope.constant.constant.value};"
+ in SyntaxTree::ClassDeclaration then "class #{scope.constant.constant.value};"
+ end
+ end.join + "\n"
+ end
+
+ def unscope
+ "; end" * @scope.size
end
def line
location[1]
end