Hi,
Seeing as winter is here in NewHampshire and ice covers the ground, I used the opportunity to put my money where my mouth is;
NOTE: All the javascript is generated by code I wrote using the AST/Visitor/Walker pattern of the node hierarchy and their corresponding definitions. I have it running from the command line like MXMLC does.
I about 10 hours of programing I have the following constructs cross compiling to JS using Flacon.
I will say, Falcon is one of the best designed APIs I have used in a long time. Whoever architected this compiler gets a huge pat on the back from me.
Right now this is hoisted ontop of MXMLC as a quasi target compiler. Oh how I love prototypes. I cannot believe I actually have this working in less than two days.
As far as code, it will be in my whiteboard when it's in my whiteboard. :) Whenever that is, no specific time.
The amount of ridiculousness I felt trying to wade through the FlaconJS code prompted me to do this.
The thing I really grabbed on to is we are using the closure compiler so worrying about highly optimized cross compiler becomes a non issue. Quote Erik on this.
//------------------------------------------------------- // ActionScript class package com.example.components { import flash.display.Sprite; import flash.events.Event; public class MyTextButton extends Sprite { public var foo:Number = 100; protected var baz:String = "what are you doing"; private var _goo:String = 'goog'; private var _bar:int = 1 + 3; public function MyTextButton() { super(); testFunc(4, "20"); for (var b:int=1;b<=10;b++) { bar(); } for (;;) { break foo; } for (var g:int in blah) { r(); } for each (var g:Object in baz[goo]) { r(); } if (a) b(); while (false) v(); do { continue; } while (m); if (true) { if (a) { } else { if (b == c) { foo.bar['baz']['goo'].baz(42); } else if (c != d) { } else { trace('mike'); } } } else if (false) { } else if (a < 3) { } else { } return a.call(i.j*k, l[m]); } public function testFunc(a:int = 4, b:String = null):Event { print(); return null; } } } // end ActionScript ///////////////////////////////////////////////////////// //------------------------------------------------------- // Javascript class /** * CROSS-COMPILED BY MXMLJxC (329449.1) ON 2012-12-09 16:07:04 */ goog.provide('com.example.components.MyTextButton'); goog.require('flash.display.Sprite'); goog.require('flash.events.Event'); /** * @constructor * @extends {flash.display.Sprite} */ com.example.components.MyTextButton = function() { goog.base(this); /** * @type {string} */ this._goo = 'goog'; /** * @type {number} */ this._bar = 1 + 3; testFunc(4, "20"); for(var b = 1;b <= 10;++b;){ bar(); } for(;;){ break foo; } for(var g in blah){ r(); } for each(var g in baz[goo]){ r(); } if(a){ b(); } while(false){ v(); } do{ continue; }while(m); if(true){ if(a){ }else{ if(b == c){ foo.bar['baz']['goo'].baz(42); }else if(c != d){ }else{ trace('mike'); } } }else if(false){ }else if(a < 3){ }else{ } m = return a.call(i.j * k, l[m]); } goog.inherits(com.example.components.MyTextButton, flash.display.Sprite); /** @type {number} */ com.example.components.MyTextButton.prototype.foo = 100; /** @type {string} */ com.example.components.MyTextButton.prototype.baz = "what are you doing"; /** * @this {com.example.components.MyTextButton} * @param {int} a * @param {String} b * @return {Event} */ com.example.components.MyTextButton.testFunc = function(a, b) { print(); return null } // end Javascript ///////////////////////////////////////////////////////// Peace, Mike -- Michael Schmalle - Teoti Graphix, LLC http://www.teotigraphix.com http://blog.teotigraphix.com