This is very strange. It could be that certain words like position and data are in a blacklist. I tried this (essentially the same example but using productService as the name)
// ==ClosureCompiler== // @compilation_level ADVANCED_OPTIMIZATIONS // @output_file_name default.js // @language ECMASCRIPT5_STRICT // ==/ClosureCompiler== // ADD YOUR CODE HERE goog.provide('org_apache_flex_utils_BinaryData'); /** * @constructor */ var org_apache_flex_utils_BinaryData = function () { /** * @private * @type {number} */ this.productService_; this.someFunction(); } /** * @private */ org_apache_flex_utils_BinaryData.prototype.someFunction = function() { console.log(this.productService); }; Object.defineProperties(org_apache_flex_utils_BinaryData.prototype, { 'productService': { /** @this {org_apache_flex_utils_BinaryData} */ get: function() { return this.productService_; }, /** @this {org_apache_flex_utils_BinaryData} */ set: function(value) { this.productService_ = value; } } }); And got this: 'use strict';Object.defineProperties(function(){console.log(this.b)}.prototype,{ productService:{get:function(){return this.a},set:function(a){this.a=a}}}); Along with a warning: JSC_INEXISTENT_PROPERTY: Property productService never defined on org_apache_flex_utils_BinaryData. Did you mean productService_? at line 24 character 21 console.log(this.productService); As you can see, in the console.log() call, this.productService has been renamed to this.b. That is essentially what is screwing up the JS release version. Or did I make a mistake somewhere? Thanks, -Alex On 4/6/15, 7:07 AM, "Erik de Bruin" <e...@ixsoftware.nl> wrote: >I'm assuming (but can't find any directly relevant links ;-) that this >is because the JS spec (ECMA) says that an object's properties should >be addressable with quoted AND dotted notification (i.e. obj['prop'] >and obj.prop). If the compiler renamed the property, it would remove >the ability to use quoted access... > >EdB > > >On Mon, Apr 6, 2015 at 3:36 PM, Alex Harui <aha...@adobe.com> wrote: >> Hi Erik, >> >> That’s interesting. I’ll try that site. I would have expected the >> compiler to rename position to some one or two-letter variable. Can you >> tell me why it didn’t? >> >> -Alex >> >> On 4/6/15, 5:17 AM, "Erik de Bruin" <e...@ixsoftware.nl> wrote: >> >>>Alex, >>> >>>I used 'http://closure-compiler.appspot.com/' with this input: >>> >>>// ==ClosureCompiler== >>>// @compilation_level ADVANCED_OPTIMIZATIONS >>>// @warning_level VERBOSE >>>// @language ECMASCRIPT5_STRICT >>>// ==/ClosureCompiler== >>> >>>'use strict'; >>> >>>/** >>> * @constructor >>> */ >>>var org_apache_flex_utils_BinaryData = function () {} >>> >>>/** >>> * @private >>> * @type {number} >>> */ >>>org_apache_flex_utils_BinaryData.prototype.position_ = 0; >>> >>>Object.defineProperties(org_apache_flex_utils_BinaryData.prototype, { >>> position: { >>> /** @this {org_apache_flex_utils_BinaryData} */ >>> get: function() { >>> return this.position_; >>> }, >>> /** @this {org_apache_flex_utils_BinaryData} */ >>> set: function(value) { >>> this.position_ = value + 10; >>> } >>> } >>>}); >>> >>>var binaryData = new org_apache_flex_utils_BinaryData(); >>>binaryData.position = 100; >>>console.log(binaryData.position); >>> >>>And I got this output (no errors, no warnings): >>> >>>'use strict';function >>>a(){}a.prototype.a=0;Object.defineProperties(a.prototype,{position:{get: >>>fu >>>nction(){return >>>this.a},set:function(c){this.a=c+10}}});var b=new >>>a;b.position=100;console.log(b.position); >>> >>>What about the above output isn't what you expect? >>> >>>EdB >>> >>> >>> >>>On Mon, Apr 6, 2015 at 9:25 AM, Erik de Bruin <e...@ixsoftware.nl> >>>wrote: >>>> Have you tried it without the quotes around the property name in >>>> Object.defineProperties? >>>> >>>> Also, if you're looking to prevent renaming by the GCC, you may want >>>>to >>>>look >>>> into the use of 'externs' files: >>>> >>>> >>>>https://developers.google.com/closure/compiler/docs/api-tutorial3#exter >>>>ns >>>> >>>> EdB >>>> >>>> >>>> >>>> On Mon, Apr 6, 2015 at 8:18 AM, Alex Harui <aha...@adobe.com> wrote: >>>>> Thanks for the suggestion. It didn’t seem to help. I’ve grepped the >>>>>GCC >>>>> code and didn’t see any attempt to handle defineProp. >>>>> >>>>> I think the issue is that GCC doesn’t expect code in the >>>>>defineProperties >>>>> functions to be referencing other functions in the class and vice >>>>>versa. >>>>> >>>>> For example, this method references productService which is defined >>>>>in >>>>>the >>>>> Object.defineProperties: >>>>> >>>>> /** >>>>> * @private >>>>> */ >>>>> FlexJSStore.prototype.startService = function() { >>>>> this.productService.send(); >>>>> }; >>>>> >>>>> Object.defineProperties(FlexJSStore.prototype, { >>>>> 'productService': { >>>>> >>>>> The optimizer renames “this.productServices.send()” to something like >>>>> “this.Jj.send()”. It doesn’t seem to know about the defineProperties >>>>> structure and that there is a non-renamable property called >>>>> ‘productService’ so it uses a renaming variable like “Jj”. >>>>> >>>>> >>>>> Putting all of the functions on the prototype slots would allow the >>>>> optimizer to rename everything together. But we’d still need a way >>>>>to >>>>> teach GCC that the properties in the defineProperties structure can’t >>>>>be >>>>> renamed. GCC has deprecated @expose. It appears to be trying to be >>>>>smart >>>>> about use of string literals as a hint as to what can’t be renamed, >>>>>but it >>>>> isn’t very cautious. Use of ‘productService’ in the MXML output >>>>>array >>>>> won’t prevent renaming. It probably has to be a more direct usage >>>>>off >>>>>of >>>>> a reference to the class or instance. There appears to be a >>>>>blacklist >>>>> Regex you can use to prevent renaming as well. It might be possible >>>>>for >>>>> the compiler to build out that regex. >>>>> >>>>> >>>>> Thanks, >>>>> -Alex >>>>> >>>>> On 4/4/15, 11:36 PM, "Erik de Bruin" <e...@ixsoftware.nl> wrote: >>>>> >>>>>>Alex, >>>>>> >>>>>>When working with Object.definePropert(y)(ies), did you experiment >>>>>>using with the setting: >>>>>> >>>>>>options_.setLanguageIn(LanguageMode.ECMASCRIPT5_STRICT) >>>>>> >>>>>>in the class JSClosureCompilerWrapper? >>>>>> >>>>>>The compiler defaults to ECMASCRIPT3 and I guess that might explain >>>>>>why it doesn't handle 'newer' features properly? >>>>>> >>>>>>EdB >>>>>> >>>>>> >>>>>> >>>>>>On Sat, Apr 4, 2015 at 5:12 PM, Alex Harui <aha...@adobe.com> wrote: >>>>>>> After getting this working for the js-debug version, I’ve come to >>>>>>>the >>>>>>> conclusion that the Google Closure Compiler cannot handle the >>>>>>> defineProperties pattern I proposed. The variable and property >>>>>>>renaming, >>>>>>> and a few other places, gets totally confused by the code in the >>>>>>>object >>>>>>> structure, even after I added @this JSDoc annotations. It does not >>>>>>> recognize the code in the object structure as belonging to the rest >>>>>>>of >>>>>>>the >>>>>>> code in the class and thus renames everything in the object >>>>>>>structure in >>>>>>> an incompatible way with the rest of the code in the class that has >>>>>>>the >>>>>>> classname.prototype pattern. It also reports that code in the >>>>>>>structure >>>>>>> is accessing properties in the class that it shouldn’t and vice >>>>>>>versa. >>>>>>> >>>>>>> So, I’m mulling over the options. The direction I’m currently >>>>>>>thinking >>>>>>>of >>>>>>> trying is to go back to the get_ and set_ pattern and then name >>>>>>>those >>>>>>> functions in the object structure. Thus the code would look like >>>>>>>the >>>>>>>old >>>>>>> code, but there’d be an additional defineProperties structure like >>>>>>>this: >>>>>>> >>>>>>> /** >>>>>>> * @return {number} The offset to write to or read from. >>>>>>> */ >>>>>>> org_apache_flex_utils_BinaryData.prototype.get_position = >>>>>>>function() >>>>>>>{ >>>>>>> return this.position_; >>>>>>> }; >>>>>>> >>>>>>> >>>>>>> /** >>>>>>> * @param {number} value The offset to write to or read from. >>>>>>> */ >>>>>>> org_apache_flex_utils_BinaryData.prototype.set_position = >>>>>>>function(value) { >>>>>>> this.position_ = value; >>>>>>> }; >>>>>>> >>>>>>> >>>>>>> >>>>>>>Object.defineProperties(org_apache_flex_utils_BinaryData.prototype, >>>>>>>{ >>>>>>> 'position': { >>>>>>> get: org_apache_flex_utils_BinaryData.prototype.get_position, >>>>>>> set: org_apache_flex_utils_BinaryData.prototype.set_position >>>>>>> } >>>>>>> }); >>>>>>> >>>>>>> In addition, each property in the structure would have to be >>>>>>>‘exposed’ >>>>>>>as >>>>>>> “not rename-able” probably by doing something like this: >>>>>>> >>>>>>> >>>>>>> /** >>>>>>> * @type {number} The offset to write to or read from. >>>>>>> */ >>>>>>> org_apache_flex_utils_BinaryData.prototype.position; >>>>>>> >>>>>>> This has the disadvantage of adding more prototype slots at >>>>>>>startup, >>>>>>>but >>>>>>> might make debugging easier. Right now, the call stacks are less >>>>>>>helpful >>>>>>> because they often contain a function call “set” and you don’t know >>>>>>>what >>>>>>> setter it is. This new pattern would hopefully result in the >>>>>>>debugger >>>>>>> showing the function with its set_position name. We’ll see. >>>>>>> >>>>>>> >>>>>>> Another option is to try to get GCC to not rename any variables and >>>>>>>absorb >>>>>>> the extra code size until they get around to handling this better. >>>>>>> >>>>>>> Thoughts? I could have certainly missed something about how to get >>>>>>>GCC >>>>>>>to >>>>>>> handle this correctly. >>>>>>> >>>>>>> -Alex >>>>>>> >>>>>>> >>>>>>> On 3/12/15, 9:15 PM, "Alex Harui" <aha...@adobe.com> wrote: >>>>>>> >>>>>>>>I’ve been plugging away trying to convert the FlexJS framework to >>>>>>>>use >>>>>>>>Object.defineProperty. >>>>>>>> >>>>>>>>I’m looking to get other’s thoughts on how to indent, comment and >>>>>>>>otherwise format or style the actual code. Here’s what I mean: >>>>>>>> >>>>>>>>The old code looked like this: >>>>>>>> >>>>>>>>/** >>>>>>>> * @expose >>>>>>>> * @return {number} The offset to write to or read from. >>>>>>>> */ >>>>>>>>org_apache_flex_utils_BinaryData.prototype.get_position = >>>>>>>>function() >>>>>>>>{ >>>>>>>> return this.position_; >>>>>>>>}; >>>>>>>> >>>>>>>> >>>>>>>>/** >>>>>>>> * @expose >>>>>>>> * @param {number} value The offset to write to or read from. >>>>>>>> */ >>>>>>>>org_apache_flex_utils_BinaryData.prototype.set_position = >>>>>>>>function(value) >>>>>>>>{ >>>>>>>> this.position_ = value; >>>>>>>>}; >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>I think the equivalent with Object.defineProperties is this: >>>>>>>> >>>>>>>>Object.defineProperties(org_apache_flex_utils_BinaryData.prototype, >>>>>>>> { >>>>>>>> 'position': { >>>>>>>> get: function() { >>>>>>>> return this.position_; >>>>>>>> }, >>>>>>>> set: function(value) { >>>>>>>> this.position_ = value; >>>>>>>> } >>>>>>>> } >>>>>>>> }); >>>>>>>> >>>>>>>>As you can see, it looks like we are building out object structures >>>>>>>>with >>>>>>>>functions as values. One of the things I don’t like is it causes >>>>>>>>the >>>>>>>>code >>>>>>>>to be indented pretty far in. And when you start placing in >>>>>>>>comments, >>>>>>>>they are also indented and it really starts to look cluttered. >>>>>>>> >>>>>>>> >>>>>>>>I’m also wondering whether comments even matter for the Google >>>>>>>>Closure >>>>>>>>Compiler. No code will directly access the get or set properties >>>>>>>>of >>>>>>>>these >>>>>>>>subobjects. >>>>>>>> >>>>>>>>Finally, I’ve been reading that @expose is deprecated in GCC. I’m >>>>>>>>wondering how we are supposed to prevent property renaming, if at >>>>>>>>all. >>>>>>>> >>>>>>>> >>>>>>>>Thoughts? >>>>>>>> >>>>>>>>Thanks, >>>>>>>>-Alex >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>>-- >>>>>>Ix Multimedia Software >>>>>> >>>>>>Jan Luykenstraat 27 >>>>>>3521 VB Utrecht >>>>>> >>>>>>T. 06-51952295 >>>>>>I. www.ixsoftware.nl >>>>> >>>> >>>> >>>> >>>> -- >>>> Ix Multimedia Software >>>> >>>> Jan Luykenstraat 27 >>>> 3521 VB Utrecht >>>> >>>> T. 06-51952295 >>>> I. www.ixsoftware.nl >>>> >>>> >>>> -- >>>> Ix Multimedia Software >>>> >>>> Jan Luykenstraat 27 >>>> 3521 VB Utrecht >>>> >>>> T. 06-51952295 >>>> I. www.ixsoftware.nl >>> >>> >>> >>>-- >>>Ix Multimedia Software >>> >>>Jan Luykenstraat 27 >>>3521 VB Utrecht >>> >>>T. 06-51952295 >>>I. www.ixsoftware.nl >> > > > >-- >Ix Multimedia Software > >Jan Luykenstraat 27 >3521 VB Utrecht > >T. 06-51952295 >I. www.ixsoftware.nl