On Dec 12, 2016, at 7:52 AM, Alex Harui <[email protected]> wrote:
>
>
> On 12/11/16, 10:28 AM, "Harbs" <[email protected]> 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
>