This change is breaking some modules when -rename-public-vars=false.  Let's say 
the main app has some method "foo" that gets renamed.  It might accidentally 
get a minified name that coincides with a public var in the module.  For tour 
de flex, some API gets the minified name "UP".  A module has code that 
references Keyboard.UP.

In Pashmina's app, some API gets a minified name like "vs" and the module has a 
property "vs" (for a ViewStack).

We try to allow renaming of APIs in modules for size savings.  The list of 
renames in the main app is output to a file and read into the compiler when 
compiling the module so it starts with the same renaming map.

One thought I had about solving this is to add another compiler option that 
allows a list of other names to not rename.  So for the "UP" scenario, I would 
compile the main app with, say,  -forbidden-minified-names=UP.   Folks can 
probably work around the problem by using Keyboard.UP in the main app, but that 
bloats the main app.  The compiler can already read a file of rename maps, so 
we could just use that, but I think a simpler command-line list will be more 
convenient.

Thoughts?
-Alex

On 2/5/20, 12:18 PM, "Josh Tynjala" <[email protected]> wrote:

    Yeah, I'll make sure that users can control whether renaming happens or not.
    
    --
    Josh Tynjala
    Bowler Hat LLC 
<https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbowlerhat.dev&amp;data=02%7C01%7Caharui%40adobe.com%7C8dcbb865725d4151564408d7aa7893c9%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637165307165113089&amp;sdata=a5evE514IT0GdVvL7w5IbOCcnyb%2FCwCqgxhOIlJsFvM%3D&amp;reserved=0>
    
    
    On Wed, Feb 5, 2020 at 11:51 AM Alex Harui <[email protected]> wrote:
    
    > Great work, Josh!
    >
    > I have to say that the objectProperty output was adding pain to debugging
    > so looking forward to that going away.  I'm assuming there will be 
compiler
    > options/directives to control renaming?  I think there are some scenarios
    > where it is safe to have public variables renamed.
    >
    > Thanks,
    > -Alex
    >
    > On 2/5/20, 11:44 AM, "Josh Tynjala" <[email protected]> wrote:
    >
    >     Thank you for the tips, Alex. Much appreciated. With your help, I've
    >     determined how to use Closure compiler's Java API to prevent the
    > renaming
    >     of a specific public variable that has not been @export-ed. Now, I
    > should
    >     be able to expand this prototype to a full version that prevents the
    >     renaming of all public variables.
    >
    >     --
    >     Josh Tynjala
    >     Bowler Hat LLC <
    > 
https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbowlerhat.dev&amp;data=02%7C01%7Caharui%40adobe.com%7C8dcbb865725d4151564408d7aa7893c9%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637165307165113089&amp;sdata=a5evE514IT0GdVvL7w5IbOCcnyb%2FCwCqgxhOIlJsFvM%3D&amp;reserved=0
    > >
    >
    >
    >     On Sun, Jan 19, 2020 at 4:58 PM Alex Harui <[email protected]>
    > wrote:
    >
    >     > In response to your prior post, the reason I am saying it removes
    > control
    >     > is because I didn't see any option to not have the compiler output
    >     > goog.reflect.objectProperty and I'm not clear everyone will
    > want/need it.
    >     >
    >     > Regarding how to control Closure Compiler's renaming, the details
    > might be
    >     > changing because I believe I saw that Google refactored the
    > renamer.  At a
    >     > high-level, you probably know most of this, but for other folks
    > reading,
    >     > the Closure Compiler is a set of Java Classes that form a series of
    >     > Compiler Passes.  Each Pass takes information (sometimes source,
    > sometimes
    >     > the AST, sometimes other information, and modifies the AST.  IIRC, a
    > final
    >     > pass generates the output.  There might be more than one pass for
    > output.
    >     >
    >     > The renaming pass we currently use can output as well as accept a
    > file of
    >     > rename mappings.  I’m confident we can subclass or modify and
    > replace the
    >     > renaming pass and feed it a set of mappings.  If you look in the
    >     > royale-compiler source, we've already done this for some other
    > passes.
    >     > Look through the Closure compiler source for what happens to the
    > compiler
    >     > options:
    >     >
    >     > --variable_map_input_file
    >     > --property_map_input_file
    >     >
    >     > You can build examples/mxroyale/TourDeFlexModules which outputs 
these
    >     > files to see what is in them.
    >     >
    >     >
    >     > We should also see if we can agree on the scenarios and likelihood 
of
    >     > property access "by name".  I can quickly think of:
    >     >
    >     > A) MXML setting properties by reference (high usage)
    >     > B) MXML setting properties by value (high usage)
    >     > C) Serializers/Deserializers (moderate usage)
    >     > D) [] bracket access by Literal  (occasional usage)
    >     > E) [] bracket access by String Variable  (occasional usage)
    >     > F) [] bracket access by Expression (infrequent usage)
    >     >
    >     > Exports can solve A.  The compiler can easily detect D & E and
    > prevent
    >     > renaming.  For C, we "could" autogenerate exports for any classes
    > with
    >     > [RemoteClass] metadata or autogenerate getter/setters.
    >     >
    >     > To me, the only difficult case is F and it will rarely happen.
    > Maybe we
    >     > can detect those and warn on that.
    >     >
    >     > Of course, I could be wrong...
    >     > -Alex
    >     >
    >     >
    >     > On 1/17/20, 10:08 AM, "Josh Tynjala" <[email protected]>
    > wrote:
    >     >
    >     >     Comments inline.
    >     >
    >     >     On Thursday, January 16, 2020, Alex Harui
    > <[email protected]>
    >     > wrote:
    >     >     >  Maybe we should start by agreeing on facts and then goals and
    > then
    >     >     discuss solutions.
    >     >
    >     >     Yes, I think that's a good place to start.
    >     >
    >     >     >
    >     >     > Here are some facts that come to mind, not a complete list.
    >     >     >
    >     >     > 1) An export does not prevent renaming.  It builds an alias.
    > All
    >     >     references within the set of sources to be minified are renamed.
    >     >
    >     >     Agreed.
    >     >
    >     >     > 2) Closure's export mechanism only works on non-scalars
    > (Object,
    >     > Arrays,
    >     >     Functions) and not Number, String, Boolean because non-scalars
    > are
    >     >     pass-by-reference instead of pass-by-value
    >     >
    >     >     Agreed.
    >     >
    >     >     > 3) The Closure Compiler is open source and designed to be
    > extended
    >     >
    >     >     Agreed.
    >     >
    >     >     > 4) Use of goog.reflect.objectProperty is not necessarily the
    > only
    >     > way to
    >     >     control renaming.  It is the way recommended by Google for those
    > who
    >     > can't
    >     >     extend the compiler.  We are not constrained to modify our 
output
    >     > because
    >     >     we have control over the compiler.
    >     >
    >     >     Could you share some details how we might have more control over
    >     > Closure
    >     >     compiler's renaming? It sounds like you know, at least somewhat,
    > how
    >     > to use
    >     >     its lower-level Java APIs, but you've never shared the details
    > when
    >     > you've
    >     >     mentioned them in this thread or in the past.
    >     >
    >     >     I should add that I've personally tried to research this topic
    > myself,
    >     > but
    >     >     I had a very hard time finding any information that wasn't just
    > someone
    >     >     explaining to a JS developer that they needed to modify their JS
    > code.
    >     > I
    >     >     eventually couldn't justify spending more time to keep looking.
    >     >
    >     >     > 5) The compiler knows things about how properties were
    > accessed.
    >     > That
    >     >     information is lost in the output in many cases.  Therefore, it
    > should
    >     > be
    >     >     better to inform the Google minifier directly from the Royale
    > compiler,
    >     >     instead of leaving hints in the output.
    >     >
    >     >     Agreed. I'm personally not fully convinced that the Royale
    > compiler has
    >     >     enough information for dynamic stuff (like for serialization
    > with type
    >     >     Object), but that may be due to ignorance about Closure
    > compiler's
    >     >     capabilities. Even without knowing how it works, I can imagine
    > how it
    >     > might
    >     >     be relatively easy to prevent renaming of public variables, but
    > the
    >     > dynamic
    >     >     stuff is trickier. For the dynamic stuff, maybe it's just a
    > matter of
    >     >     Closure detecting when a variable is typed as Object, and then
    > it can
    >     >     switch to ["string"] syntax on its own (instead of us doing it
    > in the
    >     > debug
    >     >     build, like with -js-dynamic-access-unknown-members).
    >     >
    >     >     > 7) We are pretty close to allowing renaming across modules.
    > It was
    >     >     working for a while, but a scenario popped up that isn't
    > currently
    >     >     handled.  We can pre-load the Closure renamer with a name map.
    >     >
    >     >     I haven't looked in detail at the module implementation and
    > don't plan
    >     > to,
    >     >     but I understand it well enough at a high level to say "agreed"
    > here
    >     > too
    >     >
    >     >     >
    >     >     > These are hypotheses, and not proven facts.
    >     >     > 8) The big gain from not exporting everything is in dead code
    > removal
    >     >     instead of shorter variable names
    >     >
    >     >     Agreed, personally. It seems like others have expressed interest
    > in
    >     > both,
    >     >     though. I hope that they'll be willing to prioriitze dead code
    > removal,
    >     >     since it will probably have the bigger impact (my own tests
    > removing
    >     >     @export have been promising in this regard).
    >     >
    >     >     > 9) Renaming can complicate and slow
    > serialization/deserialization
    >     >
    >     >     Agreed, and this is the harder portion to get working, I think.
    >     >
    >     >     However, if release builds didn't rename public variables, and
    > also
    >     > didn't
    >     >     rename dynamic accesses, that would remove my biggest
    > frustration with
    >     > how
    >     >     ActionScript works in Royale/JS compared to SWF. If both kept
    > their
    >     >     original names, things that feel broken today would "just work"
    > again.
    >     >
    >     >     >
    >     >     > IMO, we want to be heading in the direction of A) allowing
    > control
    >     > over
    >     >     what gets renamed
    >     >
    >     >     Agreed, but as I said before, I think that dead code removal
    > will have
    >     > more
    >     >     impact than control over renaming, so if it's one or the other,
    > I'm
    >     > okay
    >     >     with no control over renaming.
    >     >
    >     >     > B) capturing information from the compiler,
    >     >     > C) controlling the set of renames and exports directly, not
    > through
    >     > the
    >     >     output.
    >     >
    >     >     Agreed, being able to pass information Closure compiler on the
    > Java
    >     > side
    >     >     would be better. than through the JS output
    >     >
    >     >
    >     >     >
    >     >     > My 2 cents,
    >     >     > -Alex
    >     >     >
    >     >     >
    >     >     > On 1/16/20, 2:48 PM, "Josh Tynjala" <[email protected]
    > >
    >     > wrote:
    >     >     >
    >     >     >     Some additional context, if anyone is interested.
    >     >     >
    >     >     >     At the request of Harbs, I am currently investigating how
    > we
    >     > might
    >     >     remove
    >     >     >     @export from our generated JS code to improve the
    > minimization
    >     > even
    >     >     more.
    >     >     >     When I modified the compiler to skip emitting @export in
    > some
    >     > places,
    >     >     a
    >     >     >     release build of TourDeJewel was initially broken. When I
    > added
    >     >     >     goog.reflect.objectProperty(), not only did it fix setting
    > public
    >     >     variables
    >     >     >     in MXML, it also made that release build of TourDeJewel
    > start
    >     > working
    >     >     again.
    >     >     >
    >     >     >     --
    >     >     >     Josh Tynjala
    >     >     >     Bowler Hat LLC <
    >     >
    >     >
    > 
https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbowlerhat.dev&amp;data=02%7C01%7Caharui%40adobe.com%7C8dcbb865725d4151564408d7aa7893c9%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637165307165113089&amp;sdata=a5evE514IT0GdVvL7w5IbOCcnyb%2FCwCqgxhOIlJsFvM%3D&amp;reserved=0
    >     >     >
    >     >     >
    >     >     >
    >     >     >     On Thu, Jan 16, 2020 at 12:59 PM Josh Tynjala <
    >     >     [email protected]>
    >     >     >     wrote:
    >     >     >
    >     >     >     > Thank you, Harbs! Wrapping the variable name in a
    >     >     >     > goog.reflect.objectProperty() call works perfectly. This
    > is
    >     > exactly
    >     >     why I
    >     >     >     > started this thread, to see if anyone could suggest
    > possible
    >     >     alternatives.
    >     >     >     >
    >     >     >     > Thankfully, we can keep the same simple data structure 
as
    >     > before,
    >     >     and my
    >     >     >     > initial proposal with functions can be forgotten. In a
    > release
    >     >     build, I can
    >     >     >     > see that goog.reflect.objectProperty() calls are
    > replaced by a
    >     >     simple
    >     >     >     > string literal (containing the minified variable name),
    > so we
    >     > don't
    >     >     have to
    >     >     >     > worry about extra performance impact.
    >     >     >     >
    >     >     >     > --
    >     >     >     > Josh Tynjala
    >     >     >     > Bowler Hat LLC <
    >     >
    >     >
    > 
https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbowlerhat.dev&amp;data=02%7C01%7Caharui%40adobe.com%7C8dcbb865725d4151564408d7aa7893c9%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637165307165113089&amp;sdata=a5evE514IT0GdVvL7w5IbOCcnyb%2FCwCqgxhOIlJsFvM%3D&amp;reserved=0
    >     >     >
    >     >     >     >
    >     >     >     >
    >     >     >     > On Wed, Jan 15, 2020 at 8:32 PM Harbs <
    > [email protected]>
    >     > wrote:
    >     >     >     >
    >     >     >     >> Sounds good!
    >     >     >     >>
    >     >     >     >>
    >     >     >     >>
    >     >
    >     >
    > 
https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fgoogle%2Fclosure-compiler%2Fwiki%2FType-Based-Property-Renaming&amp;data=02%7C01%7Caharui%40adobe.com%7C8dcbb865725d4151564408d7aa7893c9%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637165307165113089&amp;sdata=O5PMzmZaDJnnWfkJL1EQMlGudNjREP88VIbImidkXtw%3D&amp;reserved=0
    >     >     >     >> <
    >     >     >     >>
    >     >
    >     >
    > 
https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fgoogle%2Fclosure-compiler%2Fwiki%2FType-Based-Property-Renaming&amp;data=02%7C01%7Caharui%40adobe.com%7C8dcbb865725d4151564408d7aa7893c9%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637165307165113089&amp;sdata=O5PMzmZaDJnnWfkJL1EQMlGudNjREP88VIbImidkXtw%3D&amp;reserved=0
    >     >     >     >> >
    >     >     >     >>
    >     >     >     >> The function seems to be goog.reflect.objectProperty()
    >     >     >     >>
    >     >     >     >> I’m not sure exactly how it works though.
    >     >     >     >>
    >     >     >     >> > On Jan 16, 2020, at 1:37 AM, Greg Dove <
    > [email protected]
    >     > >
    >     >     wrote:
    >     >     >     >> >
    >     >     >     >> > actually just as another fyi, Harbs pointed out some
    >     > intriguing
    >     >     goog
    >     >     >     >> > methods recently - I don't have an immediate
    > reference to it
    >     >     sorry. One
    >     >     >     >> of
    >     >     >     >> > those seemed to allow for access to renamed names by
    >     > wrapping the
    >     >     >     >> original
    >     >     >     >> > names in a 'magic' method that presumably GCC
    > recognises
    >     > (but
    >     >     presumably
    >     >     >     >> > returns the name unchanged in debug mode)
    >     >     >     >> >
    >     >     >     >> >
    >     >     >     >> > On Thu, Jan 16, 2020 at 12:33 PM Greg Dove <
    >     > [email protected]>
    >     >     wrote:
    >     >     >     >> >
    >     >     >     >> >> reflection data has similar stuff to support release
    > mode
    >     >     get/set for
    >     >     >     >> >> public vars.
    >     >     >     >> >>
    >     >     >     >> >> I did not look at MXML startup assignments like
    > this, but
    >     > it
    >     >     sounds
    >     >     >     >> good
    >     >     >     >> >> to me. I don't know if it makes sense, but
    > considering
    >     > this is
    >     >     just
    >     >     >     >> startup
    >     >     >     >> >> assignments, could one function combine all of the
    > startup
    >     >     assignments
    >     >     >     >> (in
    >     >     >     >> >> the same sequence as before)?
    >     >     >     >> >>
    >     >     >     >> >>
    >     >     >     >> >> On Thu, Jan 16, 2020 at 12:23 PM Josh Tynjala <
    >     >     >     >> [email protected]>
    >     >     >     >> >> wrote:
    >     >     >     >> >>
    >     >     >     >> >>> According to the commit linked below, the
    >     > -warn-public-vars
    >     >     compiler
    >     >     >     >> >>> option
    >     >     >     >> >>> was added because setting a public var in MXML does
    > not
    >     >     currently work
    >     >     >     >> >>> properly in a release build.
    >     >     >     >> >>>
    >     >     >     >> >>>
    >     >     >     >> >>>
    >     >     >     >>
    >     >
    >     >
    > 
https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fapache%2Froyale-compiler%2Fcommit%2Feed5882ba935870a98ba4fe8cbf499e5d8344f60&amp;data=02%7C01%7Caharui%40adobe.com%7C8dcbb865725d4151564408d7aa7893c9%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637165307165113089&amp;sdata=M%2BEvAma5g8ufQL0Nf2Krb3hrr2ERTHhdsofqVUhm7f4%3D&amp;reserved=0
    >     >     >     >> >>>
    >     >     >     >> >>> In other words, this MXML code won't work if it's a
    > public
    >     >     variable
    >     >     >     >> and
    >     >     >     >> >>> not
    >     >     >     >> >>> a setter:
    >     >     >     >> >>>
    >     >     >     >> >>> <Component publicVar="value"/>
    >     >     >     >> >>>
    >     >     >     >> >>> For reference, the compiler currently writes the
    > name of
    >     > the
    >     >     public
    >     >     >     >> >>> variable as a string to the generated JS, like 
this:
    >     >     >     >> >>>
    >     >     >     >> >>> var data = [
    >     >     >     >> >>> Component,
    >     >     >     >> >>>    1,
    >     >     >     >> >>>    'publicVar',
    >     >     >     >> >>>    true,
    >     >     >     >> >>>    'value'
    >     >     >     >> >>> ]
    >     >     >     >> >>>
    >     >     >     >> >>> At runtime, it interprets this array of properties,
    > and
    >     >     basically runs
    >     >     >     >> >>> code
    >     >     >     >> >>> like this:
    >     >     >     >> >>>
    >     >     >     >> >>> comp['publicVar'] = 'value';
    >     >     >     >> >>>
    >     >     >     >> >>> Since Closure compiler rewrites variable names
    > during the
    >     >     minification
    >     >     >     >> >>> process, this code keeps using the original name,
    > but
    >     > other
    >     >     code in
    >     >     >     >> the
    >     >     >     >> >>> app
    >     >     >     >> >>> might start looking for a shorter variable name
    > like "uB".
    >     >     This is the
    >     >     >     >> >>> failure that we're warning about.
    >     >     >     >> >>>
    >     >     >     >> >>> I propose updating the code generated by the
    > compiler to
    >     >     something
    >     >     >     >> like
    >     >     >     >> >>> this instead:
    >     >     >     >> >>>
    >     >     >     >> >>> var data = [
    >     >     >     >> >>>    Component,
    >     >     >     >> >>>    1,
    >     >     >     >> >>>    function(){ this.publicVar=true }
    >     >     >     >> >>> ]
    >     >     >     >> >>>
    >     >     >     >> >>> At runtime, the class that interprets MXML data 
will
    >     > detect the
    >     >     >     >> function
    >     >     >     >> >>> and call it like this:
    >     >     >     >> >>>
    >     >     >     >> >>> func.apply(comp);
    >     >     >     >> >>>
    >     >     >     >> >>> Because this new code will no longer use a string,
    >     > Closure can
    >     >     >     >> rewrite the
    >     >     >     >> >>> property name with its minified version, just like
    > in
    >     > other
    >     >     parts of
    >     >     >     >> the
    >     >     >     >> >>> app, and we'll no longer need to warn on
    > declarations of
    >     > public
    >     >     >     >> variables.
    >     >     >     >> >>>
    >     >     >     >> >>> I have a working prototype for primitive values,
    > like
    >     > String,
    >     >     >     >> Boolean, and
    >     >     >     >> >>> Number. Objects and Arrays follow a different path
    > in the
    >     > MXML
    >     >     data
    >     >     >     >> >>> interpreter, but I don't see why I wouldn't be able
    > to
    >     > handle
    >     >     those
    >     >     >     >> with a
    >     >     >     >> >>> similar approach.
    >     >     >     >> >>>
    >     >     >     >> >>> Thoughts?
    >     >     >     >> >>>
    >     >     >     >> >>> --
    >     >     >     >> >>> Josh Tynjala
    >     >     >     >> >>> Bowler Hat LLC <
    >     >
    >     >
    > 
https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbowlerhat.dev&amp;data=02%7C01%7Caharui%40adobe.com%7C8dcbb865725d4151564408d7aa7893c9%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637165307165113089&amp;sdata=a5evE514IT0GdVvL7w5IbOCcnyb%2FCwCqgxhOIlJsFvM%3D&amp;reserved=0
    >     >     >
    >     >     >     >> >>>
    >     >     >     >> >>
    >     >     >     >>
    >     >     >     >>
    >     >     >
    >     >     >
    >     >     >
    >     >
    >     >
    >     >
    >
    >
    >
    

Reply via email to