Btw, this is the diff between Closure and Babel: goog.inherits = function (childCtor, parentCtor) { /** @constructor */ function tempCtor() { }; tempCtor.prototype = parentCtor.prototype; childCtor.superClass_ = parentCtor.prototype; childCtor.prototype = new tempCtor(); /** @override */ childCtor.prototype.constructor = childCtor; };
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } Frédéric THOMAS > Date: Thu, 28 May 2015 09:36:50 -0400 > Subject: Re: [FalconJX] JXEmitter accessors > From: teotigraphix...@gmail.com > To: dev@flex.apache.org > > So Alex, you are saying try what Bable produces for get/set and make sure I > make it swappable and not coupled in the emitter right? > > What are you doing for nested function scopes? Just creating local > variables outside the function and referencing the current scope? > > Mike > > On Thu, May 28, 2015 at 9:33 AM, Alex Harui <aha...@adobe.com> wrote: > > > FWIW, I did not test goog.inherit against Object.getPrototypeOf. It might > > not work as some libraries may not use vanilla prototype inheritance. So > > abstracting that piece will provide more flexibility. > > > > -Alex > > > > On 5/28/15, 6:25 AM, "Michael Schmalle" <teotigraphix...@gmail.com> wrote: > > > > >Fred, > > > > > >I said TS only because Josh said it looked nice, the came Josh with Bable > > >and Joa said Babel. > > > > > >Right now it's the whole class structure that needs a template. > > > > > >> Yes but given I'm more than busy, would be nice if you write it first in > > >AS :) > > > > > >I meant copy and paste, I didn't mean write it. Don't worry about it. > > > > > >I'm still confused as usual so I guess I will wait until things sink in > > >more. I have done this a couple times and what I learned is I need a spec > > >first before I start writing the code. > > > > > >I'm setting aside about 3 hours a day to work on this, so I guess I will > > >start with the basic tests in expression and start to fiddle form there. > > > > > >Alex, Josh any thoughts? > > > > > >Mike > > > > > > > > >On Thu, May 28, 2015 at 9:14 AM, Frédéric THOMAS <webdoubl...@hotmail.com > > > > > >wrote: > > > > > >> > You mean if AS3 and ES6 inherit the same way correct? I wouldn't know > > >>the > > >> > answer to this I guess all we can do is try it right? :) > > >> > > >> Nope, I meant Babel and TS because you said you will base your tests on > > >> the TS ones, so, if you emit a such utility function, be sure first we > > >> extend classes in the same way than Babel hoping TS does the same. > > >> > > >> > I guess one of the other questions is how it handles/outputs anonymous > > >> > function call scope, you want to do a test with that? Like three or so > > >> > levels nested. > > >> > > >> Yes but given I'm more than busy, would be nice if you write it first in > > >> AS :) > > >> > > >> Thanks > > >> Frédéric THOMAS > > >> > > >> > Date: Thu, 28 May 2015 08:51:20 -0400 > > >> > Subject: Re: [FalconJX] JXEmitter accessors > > >> > From: teotigraphix...@gmail.com > > >> > To: dev@flex.apache.org > > >> > > > >> > On Thu, May 28, 2015 at 8:41 AM, Frédéric THOMAS < > > >> webdoubl...@hotmail.com> > > >> > wrote: > > >> > > > >> > > > So what is different about this? > > >> > > > > > >> > > > The only thing I can think of is that we introduce utility > > >>functions > > >> to > > >> > > do > > >> > > > the work > > >> > > > > >> > > Yes, that, I guess both of the language inherit in the same way, if > > >> yes, > > >> > > this function is re-usable IMO > > >> > > > > >> > > > >> > > > >> > You mean if AS3 and ES6 inherit the same way correct? I wouldn't know > > >>the > > >> > answer to this I guess all we can do is try it right? :) > > >> > > > >> > I'm going to create a branch in falcon jxemitter and start working on > > >>it. > > >> > > > >> > I guess one of the other questions is how it handles/outputs anonymous > > >> > function call scope, you want to do a test with that? Like three or so > > >> > levels nested. > > >> > > > >> > Mike > > >> > > > >> > > > >> > > > >> > > > > >> > > Frédéric THOMAS > > >> > > > > >> > > > Date: Thu, 28 May 2015 08:38:16 -0400 > > >> > > > Subject: Re: [FalconJX] JXEmitter accessors > > >> > > > From: teotigraphix...@gmail.com > > >> > > > To: dev@flex.apache.org > > >> > > > > > >> > > > Well yes, I follow the logic. I don't understand if this is a > > >> solution, > > >> > > why > > >> > > > TypeScript doesn't use the same algorithm. > > >> > > > > > >> > > > I read what the developers said and they said they had talked > > >>about > > >> it in > > >> > > > length when the project first started and came to the conclusion > > >> there > > >> > > > really is no solution. > > >> > > > > > >> > > > So what is different about this? > > >> > > > > > >> > > > The only thing I can think of is that we introduce utility > > >>functions > > >> to > > >> > > do > > >> > > > the work and they didn't want to do that, I did get this from the > > >> > > > conversation, they stated they wanted it to be plain javascript, > > >>the > > >> only > > >> > > > helper they use is _extends function they write out for > > >>inheritance. > > >> > > > > > >> > > > I was thinking about TypeScript, other than the language > > >>difference, > > >> > > there > > >> > > > is really NO difference in our compiler and what they do. Which is > > >> cool > > >> > > > because all the usecases that they have will apply to this > > >>emitter. > > >> > > > > > >> > > > Plus we have libraries and IDE support and possible MXML in the > > >> future. > > >> > > > > > >> > > > Mike > > >> > > > > > >> > > > On Thu, May 28, 2015 at 8:27 AM, Frédéric THOMAS < > > >> > > webdoubl...@hotmail.com> > > >> > > > wrote: > > >> > > > > > >> > > > > I'm not a javascript guru either, but it was easy to create ES6 > > >> classes > > >> > > > > (left pane) and see the output (right pane), so, for the > > >>setter, it > > >> > > creates: > > >> > > > > > > >> > > > > For class A (simple): > > >> > > > > > > >> > > > > get: function () { > > >> > > > > return this._property; > > >> > > > > }, > > >> > > > > set: function (value) { > > >> > > > > this._property = value; > > >> > > > > } > > >> > > > > > > >> > > > > For class B: > > >> > > > > > > >> > > > > > > >> > > > > set: function (value) { > > >> > > > > _set(Object.getPrototypeOf(B.prototype), "property", > > >> value, > > >> > > > > this); > > >> > > > > } > > >> > > > > > > >> > > > > Which calls: > > >> > > > > > > >> > > > > var _set = function set(object, property, value, receiver) { > > >> > > > > var desc = Object.getOwnPropertyDescriptor(object, > > >>property); > > >> // > > >> > > Get > > >> > > > > the property on B > > >> > > > > if (desc === undefined) { // If not overrided, will set the > > >> parent > > >> > > > > recursively if the parent doesn't override the property either. > > >> > > > > var parent = Object.getPrototypeOf(object); > > >> > > > > if (parent !== null) { > > >> > > > > set(parent, property, value, receiver); > > >> > > > > } > > >> > > > > } else if ("value" in desc && desc.writable) { // didn't get > > >> this > > >> > > part > > >> > > > > desc.value = value; > > >> > > > > } else { // Else call the setterv of this Object > > >> > > > > var setter = desc.set; > > >> > > > > if (setter !== undefined) { > > >> > > > > setter.call(receiver, value); > > >> > > > > } > > >> > > > > } > > >> > > > > return value; > > >> > > > > }; > > >> > > > > > > >> > > > > > > >> > > > > get: function () { > > >> > > > > return _get(Object.getPrototypeOf(B.prototype), > > >> "property", > > >> > > > > this); > > >> > > > > }, > > >> > > > > > > >> > > > > Which calls: > > >> > > > > > > >> > > > > this for the getter, do recursive call to the prototype to check > > >> if the > > >> > > > > property has been overriden, if Yes, get the value. > > >> > > > > > > >> > > > > var _get = function get(_x, _x2, _x3) { > > >> > > > > var _again = true; > > >> > > > > _function: while (_again) { > > >> > > > > var object = _x, property = _x2, receiver = _x3; > > >> > > > > desc = parent = getter = undefined; > > >> > > > > _again = false; > > >> > > > > var desc = Object.getOwnPropertyDescriptor(object, > > >> property); > > >> > > > > if (desc === undefined) { > > >> > > > > var parent = Object.getPrototypeOf(object); > > >> > > > > if (parent === null) { > > >> > > > > return undefined; > > >> > > > > } else { > > >> > > > > _x = parent; > > >> > > > > _x2 = property; > > >> > > > > _x3 = receiver; > > >> > > > > _again = true; > > >> > > > > continue _function; > > >> > > > > } > > >> > > > > } else if ("value" in desc) { > > >> > > > > return desc.value; > > >> > > > > } else { > > >> > > > > var getter = desc.get; > > >> > > > > if (getter === undefined) { > > >> > > > > return undefined; > > >> > > > > } > > >> > > > > return getter.call(receiver); > > >> > > > > } > > >> > > > > } > > >> > > > > }; > > >> > > > > > > >> > > > > Does it do the trick ? > > >> > > > > > > >> > > > > Frédéric THOMAS > > >> > > > > > > >> > > > > > Date: Thu, 28 May 2015 07:47:45 -0400 > > >> > > > > > Subject: Re: [FalconJX] JXEmitter accessors > > >> > > > > > From: teotigraphix...@gmail.com > > >> > > > > > To: dev@flex.apache.org > > >> > > > > > > > >> > > > > > Interesting Fred, I am no javascript guru so I need people to > > >> "tell" > > >> > > me > > >> > > > > > what I should have output. > > >> > > > > > > > >> > > > > > So let me get this straight, the left pane is ES6 and it > > >> converted > > >> > > it to > > >> > > > > > ES5 in the right pane? > > >> > > > > > > > >> > > > > > Mike > > >> > > > > > > > >> > > > > > On Thu, May 28, 2015 at 7:19 AM, Frédéric THOMAS < > > >> > > > > webdoubl...@hotmail.com> > > >> > > > > > wrote: > > >> > > > > > > > >> > > > > > > I just tried in babel, see what it generates: > > >> > > > > > > > > >> > > > > > > > > >> > > > > > > > > >> > > > > > > >> > > > > >> > > >> > > http://babeljs.io/repl/#?experimental=true&evaluate=true&loose=false&spec > > >>=false&code=class%20A%20{%0A%09constructor%28%29%20{%0A%09%20%20this._pro > > >>perty%20%3D%20%22init%22%3B%0A%09}%0A%09get%20property%28%29%3Astring%20{ > > >>%0A%09%09return%20this._property%3B%0A%09}%0A%09%0A%09set%20property%28va > > >>lue%3Astring%29%20{%0A%09%09this._property%20%3D%20value%3B%0A%09}%20%0A% > > >>09%0A%09showMyValue%28%29%20{%0A%09%09alert%28this._property%29%3B%0A%09} > > >>%0A%0A}%0A%0Aclass%20B%20extends%20A%20{%0A%09get%20property%28%29%3Astri > > >>ng%20{%0A%09%09return%20super.property%3B%0A%09}%0A%09%0A%09set%20propert > > >>y%28value%3Astring%29%20{%0A%09%09super.property%20%3D%20value%3B%0A%09}% > > >>0A} > > >> > > > > > > > > >> > > > > > > Frédéric THOMAS > > >> > > > > > > > > >> > > > > > > > Date: Thu, 28 May 2015 06:54:31 -0400 > > >> > > > > > > > Subject: Re: [FalconJX] JXEmitter accessors > > >> > > > > > > > From: teotigraphix...@gmail.com > > >> > > > > > > > To: dev@flex.apache.org > > >> > > > > > > > > > >> > > > > > > > > I’m still surprised that in 2015, TS hasn’t been forced > > >>to > > >> > > handle > > >> > > > > > > super. > > >> > > > > > > > Are people not using inheritance much in TS? > > >> > > > > > > > > > >> > > > > > > > They tell them to use standard getValue(), setValue() in > > >>the > > >> > > > > property if > > >> > > > > > > > they need inheritance overrides. > > >> > > > > > > > > > >> > > > > > > > I'm kind of bummed about this whole thing, I stuck my > > >>foot in > > >> > > mouth > > >> > > > > here, > > >> > > > > > > > since I totally forgot about this stuff. Since I really > > >> wanted > > >> > > to do > > >> > > > > this > > >> > > > > > > > for Josh's POC, I am interested in what he "needs" to get > > >>his > > >> > > project > > >> > > > > > > > working, Josh? > > >> > > > > > > > > > >> > > > > > > > Mike > > >> > > > > > > > > > >> > > > > > > > > > >> > > > > > > > On Wed, May 27, 2015 at 7:51 PM, Alex Harui < > > >> aha...@adobe.com> > > >> > > > > wrote: > > >> > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > On 5/27/15, 4:16 PM, "Michael Schmalle" < > > >> > > teotigraphix...@gmail.com > > >> > > > > > > > >> > > > > > > wrote: > > >> > > > > > > > > > > >> > > > > > > > > >Ok, This needs to be clear to me before I go off to OZ. > > >> > > > > > > > > > > > >> > > > > > > > > >In Flex JS you have; > > >> > > > > > > > > > > > >> > > > > > > > > >Object.defineProperties(Base.prototype, /** @lends > > >> > > > > {Base.prototype} > > >> > > > > > > */ { > > >> > > > > > > > > >/** @expose */ > > >> > > > > > > > > >text: { > > >> > > > > > > > > >get: /** @this {Base} */ function() { > > >> > > > > > > > > > return "A" + > > >> > > org_apache_flex_utils_Language.superGetter(Base, > > >> > > > > this, > > >> > > > > > > > > >'text'); > > >> > > > > > > > > >}, > > >> > > > > > > > > >set: /** @this {Base} */ function(value) { > > >> > > > > > > > > > if (value != > > >> > > org_apache_flex_utils_Language.superGetter(Base, > > >> > > > > this, > > >> > > > > > > > > >'text')) { > > >> > > > > > > > > > org_apache_flex_utils_Language.superSetter(Base, > > >>this, > > >> > > 'text', > > >> > > > > > > "B" + > > >> > > > > > > > > >value); > > >> > > > > > > > > > } > > >> > > > > > > > > >}}} > > >> > > > > > > > > >); > > >> > > > > > > > > > > > >> > > > > > > > > >I must use this obviously since hardly any actionscript > > >> could > > >> > > be > > >> > > > > cross > > >> > > > > > > > > >compiled if you can't call super accessors. > > >> > > > > > > > > > > >> > > > > > > > > I’m still surprised that in 2015, TS hasn’t been forced > > >>to > > >> > > handle > > >> > > > > > > super. > > >> > > > > > > > > Are people not using inheritance much in TS? > > >> > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > >Alex, when you have time, can you explain what this is > > >> doing > > >> > > so I > > >> > > > > can > > >> > > > > > > > > >implement it. > > >> > > > > > > > > > > >> > > > > > > > > I have not read the spec, but Object.defineProperties > > >> appears > > >> > > to > > >> > > > > > > associate > > >> > > > > > > > > a data structure with a “class”. When asked to > > >> > > interpret/execute > > >> > > > > > > > > > > >> > > > > > > > > Someinstance.someprop > > >> > > > > > > > > > > >> > > > > > > > > the JS runtime appears to check this data structure > > >>first, > > >> and > > >> > > > > call the > > >> > > > > > > > > get or set as needed. As I see it, there is no way to > > >> switch > > >> > > from > > >> > > > > > > > > > > >> > > > > > > > > SomeSubClass.someProp > > >> > > > > > > > > > > >> > > > > > > > > back to > > >> > > > > > > > > > > >> > > > > > > > > SomeBaseClass.someProp > > >> > > > > > > > > > > >> > > > > > > > > and retain the ‘this’ pointer and scope. If you had a > > >> variable > > >> > > > > called > > >> > > > > > > > > super it would still point to the same instance so > > >> > > super.someProp > > >> > > > > would > > >> > > > > > > > > just cause the runtime to find the subclass’s property > > >>map. > > >> > > > > > > > > > > >> > > > > > > > > In looking around the internet, the solutions seemed to: > > >> > > > > > > > > 1) get the superclass > > >> > > > > > > > > 2) get the property map of defined properties > > >> > > > > > > > > 3) get the getter or setter from the data structure > > >> > > > > > > > > 4) call it with the right ‘this’ pointer. > > >> > > > > > > > > > > >> > > > > > > > > So that’s what is in the current JSFlexJSEmitter, but it > > >> > > assumes > > >> > > > > > > > > goog.inherit is going to leave references to the base > > >> class in > > >> > > a > > >> > > > > > > > > particular way. TS probably leaves references to base > > >> classes > > >> > > some > > >> > > > > > > how so > > >> > > > > > > > > some abstraction around step 1 is probably required, but > > >> steps > > >> > > 2 > > >> > > > > > > through 4 > > >> > > > > > > > > can be the same. > > >> > > > > > > > > > > >> > > > > > > > > It is step 4 that re-introduces “re-writing” that you > > >>may > > >> be > > >> > > > > referring > > >> > > > > > > to > > >> > > > > > > > > as hell. The super setter again becomes a function > > >>call, > > >> so > > >> > > the > > >> > > > > AST > > >> > > > > > > walk > > >> > > > > > > > > needs to know that and walk the tree differently, > > >>saving a > > >> > > whole > > >> > > > > > > branch to > > >> > > > > > > > > be evaluated as the parameter to the function call. > > >>IOW, a > > >> > > binary > > >> > > > > > > > > operator becomes a function call. I’ll bet there are > > >>still > > >> > > bugs > > >> > > > > in the > > >> > > > > > > > > current JSFlexJSEmitter. > > >> > > > > > > > > > > >> > > > > > > > > And I think I still haven’t fixed the scenario where > > >>only a > > >> > > getter > > >> > > > > or > > >> > > > > > > > > setter is overridden. The generated code must > > >>propagate a > > >> > > “pass > > >> > > > > > > through” > > >> > > > > > > > > for the missing getter or setter to the subclass’s data > > >> > > structure > > >> > > > > > > > > otherwise the runtime will not find the setter or getter > > >> and > > >> > > think > > >> > > > > the > > >> > > > > > > > > property is now read-only or write-only. > > >> > > > > > > > > > > >> > > > > > > > > > > > >> > > > > > > > > >So correct me if I am wrong but, since there is really > > >>no > > >> > > solution > > >> > > > > > > without > > >> > > > > > > > > >an external utility to call a super accessor, we can't > > >> really > > >> > > say > > >> > > > > that > > >> > > > > > > > > >this > > >> > > > > > > > > >transpiler is producing vanilla javascript. Chicken egg > > >> thing. > > >> > > > > > > > > > > >> > > > > > > > > Technically, you could inline everything in the utility > > >> > > function > > >> > > > > and > > >> > > > > > > still > > >> > > > > > > > > called it vanilla. But it would be high-fat vanilla. > > >>;-) > > >> > > > > > > > > > > >> > > > > > > > > A question for Josh is whether it would be ok to have a > > >> Google > > >> > > > > Closure > > >> > > > > > > > > Library dependency. These libraries exist to > > >>encapsulate > > >> some > > >> > > of > > >> > > > > these > > >> > > > > > > > > object oriented patterns like finding the base class and > > >> > > loading > > >> > > > > > > > > dependency definitions in a particular order. It seems > > >>to > > >> be > > >> > > > > somewhat > > >> > > > > > > > > pay-as-you-go. If no inheritance, then almost no > > >>“goog”. > > >> > > > > > > > > > > >> > > > > > > > > -Alex > > >> > > > > > > > > > > >> > > > > > > > > > > >> > > > > > > > > >> > > > > > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > >> > > >> > > > >