OK, well that made things “easier”.  I’ve pushed changes with a few tests
into the JsToAs branch.  Volunteers are welcome to add more tests for the
other keywords

Now the question is:  Do we gamble and merge these changes into the
develop branch for the upcoming release?

-Alex

On 9/24/15, 9:15 AM, "Josh Tynjala" <joshtynj...@gmail.com> wrote:

>Requiring "this." before a reserved word when it's used as the name of a
>member seems perfectly reasonable. It's sort of the same thing as when a
>function parameter is named the same as a member variable.
>
>function(param:String):void
>{
>    this.param = param;
>}
>
>Sometimes, certain naming conflicts require you to use "this." to access
>what you want, and that's okay.
>
>- Josh
>
>On Thu, Sep 24, 2015 at 8:53 AM, Alex Harui <aha...@adobe.com> wrote:
>
>> Well, this is turning out to be trickier than I thought.  I’m not a
>> language person, but one difficulty in getting this to work in our
>> compiler seems to have to do with a key difference between AS and JS.
>>
>> As Josh mentioned in the links below, in JS identifierNames can be used
>> essentially anywhere you can use bracket access.  My current theory is
>> that this is allowed in JS because all identifierNames have to be
>>accessed
>> as obj.identifierName.
>>
>> But in AS, obj is assumed and that makes lexing and parsing difficult
>>in a
>> couple of situations.  For example:
>>
>> JS:
>>
>> Foo = function() {};
>> Foo.prototype.return = function(someParam) {
>> };
>> Foo.prototype.test = function() {
>>   this.return(10+20);
>>   return (10+20);
>> };
>>
>> In the above example, I can create a function called “return” and call
>>it
>> with an expression as a parameter and then return an expression.
>>
>> But now look at the AS:
>>
>> class Foo
>> {
>>   function return(someParam)
>>   {
>>   }
>>   function test():int
>>   {
>>      return(10+20);
>>      return (10+20);
>>   }
>> }
>>
>> Because AS assumes ‘this’, I can’t think of a way to distinguish
>>between a
>> call to a function called “return” and the return keyword that returns
>>an
>> expression.  Same for “catch” and probably “new” and maybe even “throw”.
>> I think this is why JS disallows keywords for local variable and local
>> function names.
>>
>> I think other keywords like “default” and “as” and “is” can be
>> distinguished from the token stream which can look back one token and
>> ahead a few tokens.  I gave up trying to handle this on the parsing side
>> because the set of allowed tokens was going to greatly complicate the
>> grammar.
>>
>> My current plan is to “do the best we can” which means that there will
>>be
>> funky rules when using keywords in identifierNames.  I think the only
>> other option is to simply disallow some keywords as identifierNames.
>>
>> So the funky rules are going to be things like:
>> 1. You can use “return” and “catch” as identifierNames but you must use
>> “this.” or some other “.” expression in order to access it.
>> 2. You can use “break” and “continue” as identifierNames but plain
>> “break;” is the keyword and not a call to the getter. Same for
>>“continue”;
>>
>> Thoughts?
>> -Alex
>>
>> On 9/22/15, 10:56 AM, "Alex Harui" <aha...@adobe.com> wrote:
>>
>> >I’m going to see what compiler changes are needed for this.
>> >
>> >-Alex
>> >
>> >On 9/18/15, 4:56 PM, "Josh Tynjala" <joshtynj...@gmail.com> wrote:
>> >
>> >>Here's the section on reserved words in the ES5.1 spec:
>> >>
>> >>http://www.ecma-international.org/ecma-262/5.1/#sec-7.6.1
>> >>
>> >>And the same section in the ES6 / ES2015 spec:
>> >>
>> >>http://www.ecma-international.org/ecma-262/6.0/#sec-reserved-words
>> >>
>> >>The rule seems to hinge on whether something is an "identifier" or an
>> >>"identifier name". It says that an "identifier" is any valid
>>"identifier
>> >>name", not including reserved words.
>> >>
>> >>I'm not an expert at reading language specs, so I can't find the
>>places
>> >>where the spec clearly shows that an "identifier name" is allowed.
>> >>
>> >>Mozilla's docs have a clearer explanation, though.
>> >>
>> 
>>https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical
>> >>_
>> >>grammar#Keywords
>> >>
>> >>Basically, in JS, it seems to boil down to places where you're
>>allowed to
>> >>optionally put quotes around something:
>> >>
>> >>1. obj.identifierName
>> >>
>> >>2. obj.indentifierName()
>> >>
>> >>3. { identifierName: 2 }
>> >>
>> >>They could all be rewritten with quotes:
>> >>
>> >>1. obj["identifierName"]
>> >>
>> >>2. obj["indentifierName"]
>> >>
>> >>3. { "identifierName": 2 }
>> >>
>> >>The Mozilla doc notes that this is not allowed, though:
>> >>
>> >>function identifierName() {} //error
>> >>
>> >>At first, I noticed similarity to member functions in AS3:
>> >>
>> >>class MyClass
>> >>{
>> >>    public function identifierName() {} //is this considered the same
>>as
>> >>above?
>> >>}
>> >>
>> >>However, the first one could be rewritten like this, where it's a
>> >>variable,
>> >>which must be an "identifier" instead of an "identifier name":
>> >>
>> >>var identifierName = function() {} //error because identifier names
>>are
>> >>not
>> >>allowed!
>> >>
>> >>If classes are considered syntactic sugar for prototypes, then the AS3
>> >>version might be considered to be equivalent to this:
>> >>
>> >>MyClass.prototype.identifierName = function() {}
>> >>
>> >>We can rewrite that one with quotes, so the original sugar seems safe
>>as
>> >>an
>> >>"identifier name", assuming that AS3 should follow the same logic.
>> >>
>> >>MyClass.prototype["identifierName"] = function() {}
>> >>
>> >>Anyway, just trying to wrap my head around it all.
>> >>
>> >>- Josh
>> >>
>> >>On Fri, Sep 18, 2015 at 2:03 PM, Alex Harui <aha...@adobe.com> wrote:
>> >>
>> >>> Josh,
>> >>>
>> >>> The key question here is whether is it is not valid AS3 per the
>> >>>language
>> >>> spec, or whether the runtime and/or the compiler won’t let you
>>compile
>> >>>it.
>> >>>
>> >>> AFAICT, what you want to do here is valid AS3 and I would expect the
>> >>> runtime to run the expected ABC code, so it should be possible to
>>get
>> >>>the
>> >>> compiler to allow it.  Where to look in the compiler code, I’m not
>> >>>sure.
>> >>> My trick is to set a breakpoint on the CompilerProblem constructors
>>and
>> >>> look up the stack to see who decided it was time to generate an
>>error
>> >>>and
>> >>> why.
>> >>>
>> >>> One more scenario that I ran into today and haven’t tested on JS:
>> >>>
>> >>> I was porting the MXML feature test base class and to create AS
>>feature
>> >>> tests.  It had:
>> >>>         var mxml:String = generateMXMLForTest();
>> >>>
>> >>> Which I changed to:
>> >>>         var as:String = generateASForTest();
>> >>>
>> >>> I would expect this to be valid in JS because “as” is not a keyword
>>in
>> >>>JS.
>> >>>  It is interesting that you can’t do “var var” in JS or AS3, but
>>since
>> >>>AS3
>> >>> has more keywords like that than JS, it is possible someone might
>>have
>> >>>a
>> >>> d.ts file with an API with an AS-only keyword in it and then I’m not
>> >>>sure
>> >>> what to do there.  In this case, though, I think it should be ok to
>> >>>have a
>> >>> local variable names “as”.
>> >>>
>> >>> So, do we know in JS where keywords are and aren’t allowed?
>> >>>
>> >>> Can you do:
>> >>>   var in;
>> >>>
>> >>> Or:
>> >>>
>> >>>   foo = function(in, out)
>> >>>
>> >>> We should probably get the big picture of where keywords are allowed
>> >>> before making changes in this area.
>> >>>
>> >>> Thanks,
>> >>> -Alex
>> >>>
>> >>>
>> >>> On 9/18/15, 12:39 PM, "Josh Tynjala" <joshtynj...@gmail.com> wrote:
>> >>>
>> >>> >JavaScript allows the use of reserved words as members of
>> >>> >classes/interfaces, but AS3 does not.
>> >>> >
>> >>> >In JS and AS3, this is not valid:
>> >>> >
>> >>> >var var = 5;
>> >>> >
>> >>> >However, in JS, this is valid:
>> >>> >
>> >>> >var obj = {};
>> >>> >obj.var = 5;
>> >>> >
>> >>> >Not in AS3, though.
>> >>> >
>> >>> >Similarly, these are not valid AS3, but some JS types have methods
>> >>>with
>> >>> >these exact names, so that needs to change:
>> >>> >
>> >>> >class Test
>> >>> >{
>> >>> >    public function delete():void {}
>> >>> >    public function continue():void {}
>> >>> >}
>> >>> >
>> >>> >As far as I can tell, this JS behavior became valid in ES5. I
>>assume
>> >>>after
>> >>> >ES4 was cancelled. There are even some APIs in the JS standard
>>library
>> >>> >take
>> >>> >advantage of this behavior already, and I'm sure that many JS
>> >>>libraries do
>> >>> >too.
>> >>> >
>> >>> >Right now, to successfully build a standard library with externc
>>(or
>> >>>my
>> >>> >dts2as tool), these APIs need to be completely excluded. It's fine
>>for
>> >>>a
>> >>> >temporary workaround, but it will become an issue eventually.
>> >>> >
>> >>> >Alex, since you've been talking about compiler changes, I thought
>>I'd
>> >>> >throw
>> >>> >this one into the ring too.
>> >>> >
>> >>> >(I'm not yet familiar with this part of the compiler, but if I knew
>> >>>where
>> >>> >to look, I might be able to figure it out.)
>> >>> >
>> >>> >- Josh
>> >>>
>> >>>
>> >
>>
>>

Reply via email to