Skip to content

ProcessMethodBodiesWithDuckTyping

Nathaniel Sabanski edited this page Jan 20, 2016 · 6 revisions

Added by dholton dholton

The ProcessMethodBodies step does a tremendous amount of work.

  • One of the things it does is handle when you set properties by passing them to the constructor, using the builtin eval function.
  • Also adding an event handler (Click += OnClick) is transformed into a method call (add_Click(OnClick)).
  • Closures are duplicated into a regular method. These are processed more in later steps.

See this example:

import System.Windows.Forms from System.Windows.Forms

[Boo.Lang.ModuleAttribute]
public final transient class TempModule(System.Object):

	private static def Main(argv as (string)) as System.Void:
		f = Form()
		clickcount = 0
		b = Button(Text: 'Hello', Dock: DockStyle.Fill)
		b.Click += { print("you clicked me ${(++clickcount)} times") }
		f.Controls.Add(b)
		f.ShowDialog()

	private def constructor():
		pass

is transformed into:

import System.Windows.Forms from System.Windows.Forms

[Boo.Lang.ModuleAttribute]
public final transient class TempModule(System.Object):

	private static def Main(argv as (System.String)) as System.Void:
		f = System.Windows.Forms.Form()
		clickcount = 0
		b = __eval__(
                     (___temp1 = System.Windows.Forms.Button()), 
                      ___temp1.set_Text('Hello'), 
                      ___temp1.set_Dock(System.Windows.Forms.DockStyle.Fill), 
                      ___temp1)
		b.add_Click(
                 { Boo.Lang.Builtins.print("you clicked me ${(clickcount = (clickcount + 1))} times") })
		f.get_Controls().Add(b)
		f.ShowDialog()

	private def constructor():
		super()

	internal static def ___closure2() as System.Void:
		Boo.Lang.Builtins.print(
                  "you clicked me ${(clickcount = (clickcount + 1))} times")
Clone this wiki locally