Starting a new thread: We are basically using Closure Library based on Erik’s recommendation, but at the time I still wanted to support IE8. We are now making the minimum IE9 because we want decent SVG support and Object.defineProperties. So, now is a good time to revisit how much of Closure Library we need. IIRC, we are using
-goog.events: This gets us a decent event model on non-DOM objects. -goog.provide/require: This gets us a way to order the loading of multiple JS files which I find useful when debugging JS code during development. -goog.inherits: This provides a way to set up inheritance and call base class methods. I might be forgetting something. Hopefully Erik as time to offer his thoughts. For older browsers I am currently recommending deploying a SWF on those browsers since they almost all have Flash Player in them. Then we don’t have to worry so much about polyfills. -Alex On 5/28/15, 8:11 AM, "Frédéric THOMAS" <webdoubl...@hotmail.com> wrote: >> I suspect Closure is trying to be more backwards compatible. I think >> Object. create() was added in ES5, and maybe they're aiming for ES3 >>there. > >Correct, using Closure we guaranty compatibility < ES5 but I wonder if we >are good to do so, the reason was that companies were very stricks and >allow only one browser and update rarely, my experience tells me it less >true and most of the broswer are now autoupdated, (eg. Chrome, Firefox >and even Opera now, ok, maybe not IE), what others have as experience now >days ? > >A lot of work has been done with the Closure API already, not sure it has >been discussed before but another option would have been to write for ES5 >browsers and have a bootstrap to load ES5 polyfills if the Application >runs under an older browser, doing so, we could have emit the nice, out >of the box more powerfull ES5 code and I might be wrong but also faster >than using Closure and eventually emulate extra JS higher level functions >like what Alex said about the C -> B -> A issue when B doesn't override a >A accessor and we want to access it from C. > >But maybe also, I don't see the all picture why we didn't do that. > >Frédéric THOMAS > >> Date: Thu, 28 May 2015 07:46:10 -0700 >> Subject: Re: [FalconJX] JXEmitter accessors >> From: joshtynj...@gmail.com >> To: dev@flex.apache.org >> >> I suspect Closure is trying to be more backwards compatible. I think >> Object. create() was added in ES5, and maybe they're aiming for ES3 >>there. >> >> - Josh >> On May 28, 2015 7:11 AM, "Michael Schmalle" <teotigraphix...@gmail.com> >> wrote: >> >> > See this is where I am clueless, is this a difference between backward >> > compatibility or something? >> > >> > Like Object.create() not all older browsers support? >> > >> > Mike >> > >> > On Thu, May 28, 2015 at 10:06 AM, Frédéric THOMAS >><webdoubl...@hotmail.com >> > > >> > wrote: >> > >> > > 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._p >>>>ro >> > > > > >> > > >> > >>>>perty%20%3D%20%22init%22%3B%0A%09}%0A%09get%20property%28%29%3Astring%2 >>>>0{ >> > > > > >> > > >> > >>>>%0A%09%09return%20this._property%3B%0A%09}%0A%09%0A%09set%20property%28 >>>>va >> > > > > >> > > >> > >>>>lue%3Astring%29%20{%0A%09%09this._property%20%3D%20value%3B%0A%09}%20%0 >>>>A% >> > > > > >> > > >> > >>>>09%0A%09showMyValue%28%29%20{%0A%09%09alert%28this._property%29%3B%0A%0 >>>>9} >> > > > > >> > > >> > >>>>%0A%0A}%0A%0Aclass%20B%20extends%20A%20{%0A%09get%20property%28%29%3Ast >>>>ri >> > > > > >> > > >> > >>>>ng%20{%0A%09%09return%20super.property%3B%0A%09}%0A%09%0A%09set%20prope >>>>rt >> > > > > >> > > >> > >>>>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 >> > > > > >> > > > > > > > > >> > > > > >> > > > > > > > > >> > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > > >> > > >> > > > > >> > > >> > > > > >> >> > > > > >> >> > > > > >> > > > > >> > > >> > > >> > >