Hi Yishay,

I think you may need to specify the type of myComp.  I'm not sure the
closure compiler is going to inference it.

    /** @type components.MyComp */ var myComp = new components.MyComp();

HTH,
-Alex

On 12/7/17, 1:55 AM, "Yishay Weiss" <yishayj...@hotmail.com> wrote:

>It looks like exported properties are not renamed when they’re not
>initialized, but are renamed when they are. I think I’ve demonstrated [1]
>that this results in bugs in the closure compiler. I suggest to see if
>the closure guys want to fix this or can suggest a workaround.
>
>[1] 
>https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgroups.go
>ogle.com%2Fforum%2F%23!topic%2Fclosure-compiler-discuss%2FgrvfL-PIJUQ&data
>=02%7C01%7Caharui%40adobe.com%7Cf70f3bcc117a445fe6e208d53d58b3eb%7Cfa7b1b5
>a7b34438794aed2c178decee1%7C0%7C0%7C636482373571232425&sdata=GECResTzlpw5G
>WZHUgkqgiuMhy2LpN4xiJz1dO66MmM%3D&reserved=0
>
>From: Alex Harui<mailto:aha...@adobe.com.INVALID>
>Sent: Thursday, December 7, 2017 12:46 AM
>To: dev@royale.apache.org<mailto:dev@royale.apache.org>
>Subject: Re: MXML attributes, minification, and initialization
>
>I think our choices are to not allow any public vars in MXML Components,
>or to warn folks if they use public vars that are primitive types.  I
>guess I don't care too much which way folks want to go.  Sounds like the
>first options, I would probably choose the second.  Let's see what others
>think.
>
>But I'm pretty certain we'll need to keep @export statements so the
>properties can be set from MXML.  At least for a while.
>
>My 2 cents,
>-Alex
>
>On 12/6/17, 1:28 PM, "Harbs" <harbs.li...@gmail.com> wrote:
>
>>
>>> On Dec 6, 2017, at 9:19 PM, Alex Harui <aha...@adobe.com.INVALID>
>>>wrote:
>>>
>>> On 12/6/17, 10:01 AM, "Harbs" <harbs.li...@gmail.com> wrote:
>>>
>>>> Yes. I think we are saying the same thing. It’s curious that
>>>>assignment
>>>> on declaration makes a difference.
>>>
>>> I don't think we are saying the same thing.  Did you actually look at
>>>the
>>> output code?
>>
>>Yes. I did look at the output code, but it was a few days ago.
>>
>>> I'm pretty sure if you assign somewhere other than as an
>>> initialization value, GCC will use the renamed variable.
>>
>>Yup. I was not saying differently.
>>
>>>>
>>>>> But:
>>>>> MyComp.prototype.aa = false;
>>>>> MyComp.prototype.myProp = MyComp.prototype.aa;
>>>>
>>>> I actually think that it’s the reverse (although there’s no practical
>>>> difference):
>>>>
>>>>> MyComp.prototype.myProp = false;
>>>>> MyComp.prototype.aa = MyComp.prototype.myProp;
>>>
>>> I don't think it is the reverse.  GCC is going to use the shortened
>>>name
>>> and never use the exported name as the shortened name is smaller code.
>>
>>Agreed. I think you misread what I wrote. I was being a bit pedantic.
>>
>>>>
>>>> The issue is that all accessors (elsewhere) are renamed to aa instead
>>>>of
>>>> myProp with the exception of the mxml assignment.
>>>
>>> It is ok for things to be renamed as long as the exported reference is
>>>a
>>> reference instead of a value.
>>
>>Right. But Booleans, Strings and Numbers will all have this issue.
>>
>>>>
>>>>> Is not going to work.  I guess the compiler should either warn on
>>>>>public
>>>>> scalar vars, or generate bracket notation for those vars:
>>>>>
>>>>> MyComp.protoype["myProp"] = false;
>>>>
>>>> How would bracket notation work when myProp is used elsewhere? What’s
>>>> going to prevent that from being minified?
>>>>
>>>> Another approach might be to require that properties assigned via MXML
>>>> should be getters rather than properties. Then maybe we can avoid
>>>> @exporting properties.
>>>
>>> MXML relies on exported names.  The compiler is not smart enough to
>>>know
>>> how things will be renamed.  Maybe we can manage that someday, but I
>>>don't
>>> want to work on that now.  The MXMLDataInterpreter takes the structure
>>> like Yishay showed upthread:
>>>
>>> [org.apache.royale.core.View, 1, '_id', true, '$ID1', 0, 0,
>>> [components.MyComp, 2, 'id', true, 'myComp', 'myProp', true
>>>
>>>
>>> myProp is referenced by its exported name.
>>
>>Sure. I’m not sure how this is a response to what I wrote. I was
>>suggesting that MXML should require getters rather than public
>>properties. I’m not sure whether that makes sense, how hard it would be
>>to implement, or what the implications of doing so will be.
>>
>>> Of course I could be wrong...
>>>
>>> -Alex
>>>
>>>
>>>>> On Dec 6, 2017, at 7:54 PM, Alex Harui <aha...@adobe.com.INVALID>
>>>>>wrote:
>>>>>
>>>>> In [1], you might need JSDoc for the class function (@constructor,
>>>>>for
>>>>> example).
>>>>>
>>>>> Back to your original test case:  If you don't initialize the var
>>>>>myProp
>>>>> in your test case, what code is generated for these snippets we've
>>>>>been
>>>>> looking at?  I would expect that GCC still renames myProp and
>>>>>whatever
>>>>> code end up initializing it also uses the renamed value.
>>>>>
>>>>> @export does not prevent renaming per-se.  Instead it builds up a
>>>>> reference to the same thing.  Maybe that's why it doesn't work,
>>>>>scalar
>>>>> types are by-value and not by-reference.  IOW, if you have:
>>>>>
>>>>> AS: public function myMethod() {}
>>>>>
>>>>> The JS is:
>>>>>
>>>>> /**
>>>>> * @export
>>>>> */
>>>>> MyComp.prototype.myMethod = function() {};
>>>>>
>>>>> Then GCC outputs:
>>>>>
>>>>> MyComp.prototype.aa = function() {};
>>>>> MyComp.prototype.myMethod = MyComp.prototype.aa;
>>>>>
>>>>> GCC will use aa instead of myMethod throughout the minified code.
>>>>>The
>>>>> myMethod is there for callers from outside the minified code or
>>>>>people
>>>>> using ["myMethod"] which is what MXML essentially does.
>>>>>
>>>>> But:
>>>>> MyComp.prototype.aa = false;
>>>>> MyComp.prototype.myProp = MyComp.prototype.aa;
>>>>>
>>>>> Is not going to work.  I guess the compiler should either warn on
>>>>>public
>>>>> scalar vars, or generate bracket notation for those vars:
>>>>>
>>>>> MyComp.protoype["myProp"] = false;
>>>>>
>>>>> Thoughts?
>>>>> -Alex
>>>>>
>>>>>
>>>>> On 12/6/17, 2:51 AM, "Yishay Weiss" <yishayj...@hotmail.com> wrote:
>>>>>
>>>>>>
>>>>>>
>>>>>>> For some reason, when this code is output, the code gets minified
>>>>>> I guess the question is why the code gets mifinied if it’s annotated
>>>>>> with
>>>>>> @export. I’m not sure it’s related but when I compile this [1] file
>>>>>> with
>>>>>> gcc I get an internal compiler error [2]. When replacing in [1]
>>>>>>
>>>>>> components.MyComp.prototype.myProp = false;
>>>>>> with
>>>>>> components.MyComp.prototype.myProp;
>>>>>>
>>>>>> I don’t get the error and myProp is correctly not renamed.
>>>>>>
>>>>>> [1]
>>>>>>
>>>>>>
>>>>>>https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpast
>>>>>>e
>>>>>>.a
>>>>>> pa
>>>>>>
>>>>>>
>>>>>>che.org%2FDSR0&data=02%7C01%7Caharui%40adobe.com%7C7a9997dab7ab4c0108
>>>>>>9
>>>>>>30
>>>>>> 8d
>>>>>>
>>>>>>
>>>>>>53c974ac1%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C63648154285100
>>>>>>8
>>>>>>41
>>>>>> 7&
>>>>>> sdata=LCDygcxHaiINRHE7pFbMEzng%2FUXv%2FgntIRpUSpJ2jBk%3D&reserved=0
>>>>>> [2]
>>>>>>
>>>>>>
>>>>>>https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpast
>>>>>>e
>>>>>>.a
>>>>>> pa
>>>>>>
>>>>>>
>>>>>>che.org%2FYtKp&data=02%7C01%7Caharui%40adobe.com%7C7a9997dab7ab4c0108
>>>>>>9
>>>>>>30
>>>>>> 8d
>>>>>>
>>>>>>
>>>>>>53c974ac1%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C63648154285100
>>>>>>8
>>>>>>41
>>>>>> 7&
>>>>>> sdata=Q2z8qUTVlYFfBXF7T9KuilRc4AdSd8PZnZF6LRD4QCY%3D&reserved=0
>>>>>>
>>>>>
>>>>
>>>
>>
>

Reply via email to