On Dec 12, 2016, at 7:52 AM, Alex Harui <aha...@adobe.com> wrote:

> 
> 
> On 12/11/16, 10:28 AM, "Harbs" <harbs.li...@gmail.com> wrote:
> 
>> I DO want renaming.
>> 
>> My point is that we really need to have an option to disable renaming in
>> specific places in the code.
>> 
>> My example is a very classic case when interop between outside code is
>> going to cause problems. I CAN’T use class definitions everywhere. There
>> needs to be a method to properly deal with that.
>> 
>> I don’t have types for JSZip, and create extern files for every use of
>> third party libraries is not a practical option.
> 
> I don't understand why you can't use class definitions or don't have
> types.  The whole point of the externs for third-party libraries is to
> have an AS API for a external JS API.  Create a JSZip class with a
> generateNodeStream function.  Generate Value Objects for their objects
> that are passed in as objects.  In the final JS, everything is plain
> objects.
> 
> Public class NodeStreamParam
> {
>  Public const NODE_BUFFER:String = "nodeBuffer";
>  Public var type:String;
>  Public var streamFiles:Boolean;
> }
> 
> Public class JSZip
> {
>  Public function generateNodeStream(nsp:NodeStreamParam):NodeStream
>  {
>    return null;
>  }
> }
> 

AFAIU, this will not prevent renaming unless there is a extern js file for the 
Google Compiler — which I don’t have.

Also, there’s lots of APIs that take object literals. Requiring to declare 
classes for each of these raise the overhead for simple implementations. A lot 
of folks will be copying code off Stack Overflow or wherever. Rather than it 
just “working”, they would have a lot of extra overhead. Making that a 
REQUIREMENT is something I think we should avoid.

> 
>> 
>> If you read my email you will see I already stated that using quoted
>> strings is the work-around here, but IMO, it’s not a solution to require
>> client code to always do that.
> 
> I'm not clear any sort of annotation would be any easier for the person
> writing the code.  You have to remember when to use the annotation or
> remember to use the quotes.  There might be a way to make it easier to
> generate the externs for a third party library. If you were to have .AS
> files for JSZip and NodeStreamParam like I do above, maybe we can teach
> the compiler to look for an @externs and treat the file as an extern.
> Similarly, the compiler might be able to package such a file in the SWC
> differently than it does now.

I like this idea for generating externs, but for my examples I was thinking of 
something simpler:

1. instead of:
var zip:* = new JSZip();
or
var zip:Object = new JSZip();

we could enable:
var zip:Extern = new JSZip();

and the compiler would know that “Extern” is of type Object, but all methods 
and properties should have string bracket notation instead of dot notation.

2. We should have a compiler option (on by default) where all untyped object 
literals be written with quoted string literals. So:
var obj:Object = {foo:true,baz:10};
could be rewritten, but
var obj:* = {foo:true,baz:10};
would compile as:
var obj = {“foo":true,”baz":10};
and the names would be preserved by the compiler
Similarly:

myThingy.doSomething({foo:true,baz:10})

would compile as:
myThingy.doSomething({“foo":true,”baz":10})

> Thoughts?
> -Alex
> 

Reply via email to