diff --git a/Gemfile.lock b/Gemfile.lock
index 22a83c3..0cfd41c 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -30,7 +30,7 @@ GIT
GIT
remote: git://github.com/whitequark/ast.git
- revision: 3814fb102af82a30bf334005ebe17332744f9dad
+ revision: 63db4686b33228e8f703cb7328e5e5c62aa3cd92
specs:
ast (2.1.0)
diff --git a/assets/css/app.css.scss b/assets/css/app.css.scss
index f687711..3fecb66 100644
--- a/assets/css/app.css.scss
+++ b/assets/css/app.css.scss
@@ -59,6 +59,11 @@ $susy: (
.statement {
margin-left: 10px;
}
+
+.ticker{
+ text-align: right;
+}
+
.act{
background-color: #00B3FF;
-moz-border-radius: 7px;
diff --git a/lib/views/html_converter.rb b/lib/views/html_converter.rb
new file mode 100644
index 0000000..49dcab8
--- /dev/null
+++ b/lib/views/html_converter.rb
@@ -0,0 +1,98 @@
+class HtmlConverter < AST::Processor
+
+ alias :old_process :process
+ def process s
+ return "" unless s
+ old_process(s)
+ end
+ def handler_missing s
+ puts "Missing: " + s.type
+ end
+ def div statement , html
+ "
" + html + "
"
+ end
+ def span statement , html
+ "" + html + ""
+ end
+ def on_function statement
+ return_type , name , parameters, kids , receiver = *statement
+ str = return_type + " "
+ str += receiver + "." if receiver
+ str += name.to_a.first + "("
+ str += process(parameters) + ")
"
+ str += process(kids) + "end
"
+ div(statement,str)
+ end
+ def on_parameters statement
+ process_all(statement.children).join(",")
+ end
+ def on_parameter p
+ type , name = *p
+ span(type,type) + " " + span(name,name)
+ end
+ def on_string s
+ span(s, "'" + s.first + "'")
+ end
+ def on_field_def statement
+ type , name , value = *statement
+ str = span(type, type) + " " + span(name,name)
+ str += " = #{process(value)}" if value
+ div(statement,str)
+ end
+ def on_return statement
+ str = "return " + process(statement.first )
+ div(statement,str)
+ end
+ def on_false_statements s
+ on_statements s
+ end
+ def on_true_statements s
+ on_statements s
+ end
+ def on_statements s
+ str = ""
+ s.children.each do |c|
+ str += process(c).to_s
+ end
+ div(s,str)
+ end
+ def on_if_statement statement
+ branch_type , condition , if_true , if_false = *statement
+ condition = condition.first
+ ret = "if_#{branch_type}(" + process(condition) + ")
" + process(if_true)
+ ret += "else" + "
" + process(if_false) if if_false
+ ret += "end"
+ div(statement,ret)
+ end
+ def on_assignment statement
+ name , value = *statement
+ name = process(name)
+ v = process(value)
+ str = name + " = " + v
+ div(statement,str)
+ end
+ def on_call c
+ name , arguments , receiver = *c
+ ret = process(name)
+ ret = process(receiver.first) + "." + ret if receiver
+ ret += "("
+ ret += process(arguments).join(",")
+ ret += ")"
+ span(c,ret)
+ end
+ def on_operator_value statement
+ operator , left_e , right_e = *statement
+ left_reg = process(left_e)
+ right_reg = process(right_e)
+ span(statement , left_reg + " " + operator + " " + right_reg )
+ end
+ def on_arguments args
+ args.children.collect{|c| process(c)}
+ end
+ def on_name name
+ span(name,name.first)
+ end
+ def on_int i
+ span(i , i.first.to_s)
+ end
+end
diff --git a/lib/views/source_view.rb b/lib/views/source_view.rb
index ac1b5d9..e9ff3b5 100644
--- a/lib/views/source_view.rb
+++ b/lib/views/source_view.rb
@@ -1,3 +1,5 @@
+require_relative "html_converter"
+
class SourceView < ElementView
def initialize interpreter
@@ -7,7 +9,7 @@ class SourceView < ElementView
def draw
@text = div(".text")
- @ticker = div
+ @ticker = div(".ticker")
@element = div(".source_view") << div("h4.source" , "Class.Method") << @ticker << @text
@element
end
@@ -15,134 +17,44 @@ class SourceView < ElementView
def instruction_changed
i = @interpreter.instruction
return "" unless i
- if( i.is_a?(Register::Label) and i.name.include?("."))
- update_method
- end
+ update_method
case i.source
when AST::Node
id = i.source.object_id
- text = i.source.type + ":#{id}"
if e = @text.at_css("#i#{id}")
if (old = @text.at_css(".fade_in"))
old.remove_class("fade_in")
end
- text += " found"
e.add_class "fade_in"
end
- @ticker.text = text
when String
@ticker.text = i.source
else
raise i.source.class.name
end
end
+
def update_method
- @element.at_css(".source").text = @interpreter.instruction.name
- cl_name , method_name = *@interpreter.instruction.name.split(".")
- clazz = Register.machine.space.get_class_by_name cl_name
- method = clazz.get_instance_method( method_name)
- @text.inner_html = ToCode.new.process( method.source )
- end
-
- def update_code
- @text.inner_html = ToCode.new.process( @interpreter.instruction.source)
- end
-end
-class ToCode < AST::Processor
-
- alias :old_process :process
- def process s
- return "" unless s
- old_process(s)
- end
- def handler_missing s
- puts "Missing: " + s.type
- end
- def div statement , html
- "" + html + "
"
- end
- def span statement , html
- "" + html + ""
- end
- def on_function statement
- return_type , name , parameters, kids , receiver = *statement
- str = return_type + " "
- str += receiver + "." if receiver
- str += name.to_a.first + "("
- str += process(parameters) + ")
"
- str += process(kids) + "end
"
- div(statement,str)
- end
- def on_parameters statement
- process_all(statement.children).join(",")
- end
- def on_parameter p
- type , name = *p
- span(type,type) + " " + span(name,name)
- end
- def on_string s
- span(s, "'" + s.first + "'")
- end
- def on_field_def statement
- type , name , value = *statement
- str = span(type, type) + " " + span(name,name)
- str += " = #{process(value)}" if value
- div(statement,str)
- end
- def on_return statement
- str = "return " + process(statement.first )
- div(statement,str)
- end
- def on_false_statements s
- on_statements s
- end
- def on_true_statements s
- on_statements s
- end
- def on_statements s
- str = ""
- s.children.each do |c|
- str += process(c).to_s
+ i = @interpreter.instruction
+ case i
+ when Register::Label
+ if i.name.include?(".")
+ cl_name , method_name = *i.name.split(".")
+ clazz = Register.machine.space.get_class_by_name cl_name
+ method = clazz.get_instance_method( method_name)
+ else
+ return
+ end
+ @element.at_css(".source").text = i.name
+ when Register::FunctionReturn
+ object = @interpreter.object_for( i.register )
+ link = object.internal_object_get( i.index )
+ method = link.method
+ @element.at_css(".source").text = method.name
+ else
+ return
end
- div(s,str)
- end
- def on_if_statement statement
- branch_type , condition , if_true , if_false = *statement
- condition = condition.first
- ret = "if_#{branch_type}(" + process(condition) + ")
" + process(if_true)
- ret += "else" + "
" + process(if_false) if if_false
- ret += "end"
- div(statement,ret)
- end
- def on_assignment statement
- name , value = *statement
- name = process(name)
- v = process(value)
- str = name + " = " + v
- div(statement,str)
- end
- def on_call c
- name , arguments , receiver = *c
- ret = process(name)
- ret = process(receiver.first) + "." + ret if receiver
- ret += "("
- ret += process(arguments).join(",")
- ret += ")"
- span(c,ret)
- end
- def on_operator_value statement
- operator , left_e , right_e = *statement
- left_reg = process(left_e)
- right_reg = process(right_e)
- span(statement , left_reg + " " + operator + " " + right_reg )
- end
- def on_arguments args
- args.children.collect{|c| process(c)}
- end
- def on_name name
- span(name,name.first)
- end
- def on_int i
- span(i , i.first.to_s)
+ @text.inner_html = HtmlConverter.new.process( method.source )
end
+
end