Already, the compiler knows if you do

[Bindable]
public class MyClass {
  public var foo:int;
}

that it should auto-generate some code, then the whole thing is handed
down to the reducer/emitter.  Seems like you could inject SecretToken in a
similar way if someone did:

[Singleton]
public class MySingleton {
}


-Alex

On 10/6/14, 3:44 PM, "Frédéric THOMAS" <webdoubl...@hotmail.com> wrote:

>Actually, I guess I would find where and maybe how as I've seen it while
>I was debugging the constructor, at emit time, but would mean to generate
>"
>internal class SecretToken {}" and that I've got no idea when and how.
>Frédéric THOMAS
>
>> From: webdoubl...@hotmail.com
>> To: dev@flex.apache.org
>> Subject: RE: AW: [Falcon] Constructor NS (was: [Falcon] starting up)
>> Date: Mon, 6 Oct 2014 23:27:58 +0100
>> 
>> Hi Alex,
>> 
>> > I have no idea what the right answer is, but I was wondering if you
>>could
>> > try to describe (in AS code) what scenarios you want to support and
>>not
>> > support.  Is this just for Singletons or are there other use cases?
>>And
>> > what edge cases are allowed, if any?
>> 
>> It is not only for the singleton, for examle, at some point, I would
>>like to be able to do that:
>> [Abstract]
>> public class BaseClass {
>> 
>>     public static const INSTANCE:BaseClass = new BaseClass(11);
>> 
>>     private var _p:int;
>> 
>>     protected function BaseClass(p:int) {
>>         _p = p;
>>     }
>> 
>>     public function get p():int;
>> }
>> }
>> 
>> ---
>> 
>> // Error, p not implemented
>> public class SubClass extends BaseClass {
>> 
>>     public function SubClass() {
>>         super(12);
>>     }
>> }
>> 
>> ---
>> public class AnotherClass {
>> 
>>     public function AnotherClass() {
>>         const a:BaseClass = new BaseClass(13); // Error, can't
>>instantiate a non public ctor.
>>     }
>> }> Maybe some metadata can cause the compiler to generate different AS
>>that
>> > is sufficient for your needs.  You could even change any call to the
>> > constructor from within the Singleton source code to some other
>>function
>> > that initializes the single instance.
>> 
>> Yes, I guess we could eventually generate some ABC code to simulate the
>>behavior, just for now, I'm not sure when and how exactly to tell the
>>compiler to generate that in case of private ctor, this in case of
>>protected, I'm just discovering it but will continue to dig into.
>> 
>> Frédéric THOMAS
>> 
>> > From: aha...@adobe.com
>> > To: dev@flex.apache.org
>> > Subject: Re: AW: [Falcon] Constructor NS (was: [Falcon] starting up)
>> > Date: Mon, 6 Oct 2014 21:57:09 +0000
>> > 
>> > Hi Fred,
>> > 
>> > I have no idea what the right answer is, but I was wondering if you
>>could
>> > try to describe (in AS code) what scenarios you want to support and
>>not
>> > support.  Is this just for Singletons or are there other use cases?
>>And
>> > what edge cases are allowed, if any?
>> > 
>> > For example, if you have code like:
>> > 
>> > var c:Class = MySingleton;
>> > var instance:MySingleton = new c();
>> > 
>> > what would you want to have happen?  I¹d guess the compiler cannot
>>check
>> > it.
>> > 
>> > Similarly, are there any AS Singleton patterns that are sufficient?
>>Such
>> > as:
>> > 
>> > public class MySingleton
>> > {
>> >     public function MySingleton(secretToken:SecretToken)
>> >     {
>> >     }
>> > } 
>> > internal class SecretToken
>> > {
>> > }
>> > 
>> > Maybe some metadata can cause the compiler to generate different AS
>>that
>> > is sufficient for your needs.  You could even change any call to the
>> > constructor from within the Singleton source code to some other
>>function
>> > that initializes the single instance.
>> > 
>> > Thanks,
>> > -Alex
>> > 
>> > 
>> > On 10/6/14, 2:33 PM, "Frédéric THOMAS" <webdoubl...@hotmail.com>
>>wrote:
>> > 
>> > >
>> > >
>> > >
>> > >Hi Gordon, Darrell, Alex,
>> > >
>> > >I've been able to work on it a bit tonight and realized that I was
>>wrong,
>> > >actually, I can get the right NS infos parsed and emitted but can't
>>get
>> > >it back thru the ABCParser.
>> > >I've been confused because I didn't check the Qualifier NS but
>>instead
>> > >its kind which was 5 (private) as I wanted but it was actually the
>>one of
>> > >the CMImplicitNS (aka, invalid NS) and wasn,'t able to find in the
>>chain
>> > >where it has been forced as I thought having removed all the one
>> > >implicated in defining a ctor NS, I wonder now if the fact that the
>>ctor
>> > >is not part of a trait is the cause ?
>> > >
>> > >Any way, I started to explore other possibilities, one of them is to
>>pass
>> > >the NS info via MetaTag as done for go_to_definition and use this
>>info in
>> > >the semantic checker as I can't at the time of the ABC Parsing, set
>>the
>> > >NS because the Metadata are checked after the methodbody and in more,
>> > >I've got no info at this point about the super class except its name
>> > >coming from InstanceInfo (or indirectly via IReference) but would
>>like to
>> > >think I can manage to use the MetaTag (like
>> > >"[constructor(ns:'protected')]  in the semantic checker, do you see
>>any
>> > >problem in doing so or if there's a better place and moment to do it
>> > >except it could be erased by the optimiser ?
>> > >
>> > >The last possibility as I didn't see any drawback yet in debugging
>>it in
>> > >the emitter, is to pass the info directly in the name at FunctionNode
>> > >construction time and either set the NS accordingly or use this info
>>in
>> > >the semantic checker,  as far as I've debugged it (didn't to the
>>test yet
>> > >but followed all the emitter chain), I didn't see any problem that
>>could
>> > >be to emit it and don't think there are any in reading it either
>>thru the
>> > >ABCParser, I would pass for example pass
>>"protected:MyConstructorName",
>> > >tweak the FunctionNode:isConstructor accordingly and remove the
>> > >CMImplitNS checks as I did until now, what do you think, do you see
>>any
>> > >problem with this approach ?
>> > >
>> > >More over if the latter appears to be a valid option, it could be
>>used
>> > >for the method overloading.
>> > >
>> > >Thanks,
>> > >Frédéric THOMAS
>> > >
>> > >> Subject: Re: AW: [Falcon] Constructor NS (was: [Falcon] starting
>>up)
>> > >> From: gsmit...@hotmail.com
>> > >> Date: Sun, 5 Oct 2014 09:24:14 -0700
>> > >> To: dev@flex.apache.org
>> > >> 
>> > >> It's a bit different in that the AVM is strict about access
>>modifiers;
>> > >>you cannot use reflection to call a private method from outside its
>> > >>class. However I know developers have wanted non-public
>>constructors for
>> > >>a long time and most won't care if they're not enforced at runtime,
>>so I
>> > >>don't object to the compiler enhancement. I just wanted to mention
>> > >>something that folks should be aware of.
>> > >> 
>> > >> Another thing to be aware of is that this mean there will be source
>> > >>code that compiles under a Falcon that doesn't compile under the old
>> > >>compiler. Would we change the old compiler as we'll or not bother?
>>I'd
>> > >>say don't bother.
>> > >> 
>> > >> - Gordon
>> > >> 
>> > >> > On Oct 5, 2014, at 8:09 AM, "Christofer Dutz"
>> > >><christofer.d...@c-ware.de> wrote:
>> > >> > 
>> > >> > But in java this is not much different. Unless you explicitly
>>tell
>> > >>your Java VM to be strict, you can get a private constructor via
>> > >>Reflection, make this accesslible at runtime and instantiate it, no
>> > >>matter what the source-code says. Same with the type of generics.
>> > >> > 
>> > >> > So I guess it would be a great addition to Flex to at least have
>> > >>features checked by the compiler, even if the runtime doesn't
>>enforce it.
>> > >> > 
>> > >> > Chris
>> > >> > 
>> > >> > 
>> > >> > -----Ursprüngliche Nachricht-----
>> > >> > Von: Gordon Smith [mailto:gsmit...@hotmail.com]
>> > >> > Gesendet: Sonntag, 5. Oktober 2014 04:36
>> > >> > An: dev@flex.apache.org
>> > >> > Betreff: Re: [Falcon] Constructor NS (was: [Falcon] starting up)
>> > >> > 
>> > >> > In general the ActionScript Virtual Machine enforces access
>>modifiers
>> > >>(so that, for example, something marked private is truly
>>inaccessible by
>> > >>any means outside the class) but I don't think the AVM enforces
>> > >>non-public constructors. I'm guessing that a constructor in the ABC
>>is
>> > >>public regardless of what the source code says, which would mean
>>that
>> > >>the constructor could be invoked by any code via reflection. If
>>this is
>> > >>the case, I'm not convinced we should pretend that constructors can
>>be
>> > >>non-public.
>> > >> > 
>> > >> > - Gordon
>> > >> > 
>> > >> > Sent from my iPad
>> > >> > 
>> > >> >>> On Oct 4, 2014, at 4:14 PM, "OmPrakash Muppirala"
>> > >><bigosma...@gmail.com> wrote:
>> > >> >>> 
>> > >> >>> On Oct 4, 2014 12:55 PM, "Frédéric THOMAS"
>> > >><webdoubl...@hotmail.com> wrote:
>> > >> >>> 
>> > >> >>> Hi,
>> > >> >>> 
>> > >> >>> I started to check if it was possible to have private and
>>protected
>> > >> >> constructor in Falcon and I have to admit it was tricky
>>especially
>> > >> >> because I never seen a compiler from inside before but it is
>> > >> >> apparently possible, I've been able to compile successfully:
>> > >> >>> package myLib {
>> > >> >>> public class CTORTest {
>> > >> >>>   private var _p:int;
>> > >> >>> 
>> > >> >>>   private function CTORTest(p:int) {
>> > >> >>>       _p = p;
>> > >> >>>   }
>> > >> >>> 
>> > >> >>>   private function anotherFct():CTORTest {
>> > >> >>>       return new CTORTest(10);
>> > >> >>>   }
>> > >> >>> }
>> > >> >>> }
>> > >> >>> and using the compiled lib:
>> > >> >>> 
>> > >> >>> <?xml version="1.0"?>
>> > >> >>> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009";
>> > >> >> xmlns:s="library://ns.adobe.com/flex/spark"
>> > >> >> creationComplete="creationCompleteHandler(event)">
>> > >> >>>   <fx:Script><![CDATA[
>> > >> >>>       import mx.events.FlexEvent;
>> > >> >>> 
>> > >> >>>       import myLib.CTORTest;
>> > >> >>> 
>> > >> >>>       private function
>> > >>creationCompleteHandler(event:FlexEvent):void {
>> > >> >>>           var a:CTORTest = new CTORTest(1);
>> > >> >>>       }
>> > >> >>>       ]]></fx:Script>
>> > >> >>> </s:Application>
>> > >> >>> 
>> > >> >>> gives:
>> > >> >>> [Fault] exception, information=VerifyError: Error #1014: La
>>classe
>> > >> >> myLib:CTORTest::CTORTest est introuvable. (not found) with the
>> > >>legacy 
>> > >> >> compiler
>> > >> >>> and:
>> > >> >>> F:\sources\falconTestDrive\shell\src\Main.mxml:9
>> > >> >>> Erreur: Appel d'une méthode qui ne semble pas définie CTORTest.
>> > >>(Call 
>> > >> >>> to
>> > >> >> a undefined method)
>> > >> >>>           var a:CTORTest = new CTORTest(1);
>> > >> >>> 
>> > >> >>> (I will customize the error message later)
>> > >> >>> 
>> > >> >>> I still need to check it works in the 3 possible ways to
>> > >>instantiate 
>> > >> >>> a
>> > >> >> Class [1] (at the moment it works only with 1st one), check that
>> > >>works 
>> > >> >> with is  / instanceOf, revisit the cast function accordingly and
>> > >>maybe 
>> > >> >> other things not yet in my mind and especially check FP won't
>> > >>complain using it.
>> > >> >>> 
>> > >> >>> /* expression = FunctionCallID(KeywordNewID(void),
>>new_type_name,
>> > >> >> ContainerID(expression*)) */
>> > >> >>> /* expression = FunctionCallID(KeywordNewID(void), expression,
>> > >> >> ContainerID(expression*)) */
>> > >> >>> /* expression = FunctionCallID(KeywordNewID(void),
>>vector_literal,
>> > >> >> ContainerID(void)) */
>> > >> >>> 
>> > >> >>> In case all this works and I'm far to know it at the moment, I
>>will
>> > >> >>> have
>> > >> >> to think about implement "method overloading" otherwise I can't
>>see
>> > >> >> any usage of a protected constructor and therefore will probably
>> > >> >> require some help for the best way to implement it.
>> > >> >> 
>> > >> >> Exciting to see these kind of experiments.  A really good
>>usecase
>> > >>for 
>> > >> >> private constructor would be to create a Singleton class, I.e a
>> > >>class  
>> > >> >> that cannot be instantiated outside of itself.  Would that be
>> > >> >> something you can test for?
>> > >> >> 
>> > >> >> Thanks,
>> > >> >> Om
>> > >> >> 
>> > >> >>> 
>> > >> >>> Thanks,
>> > >> >>> Frédéric THOMAS
>> > >> >>> 
>> > >> >>>> From: webdoubl...@hotmail.com
>> > >> >>>> To: dev@flex.apache.org
>> > >> >>>> Subject: RE: [Falcon] starting up
>> > >> >>>> Date: Wed, 1 Oct 2014 16:57:28 +0100
>> > >> >>>> 
>> > >> >>>> Ah ok, thanks Gordon, I was tearing my hair out :-)
>> > >> >>>> 
>> > >> >>>> Frédéric THOMAS
>> > >> >>>> 
>> > >> >>>>> Subject: Re: [Falcon] starting up
>> > >> >>>>> From: gsmit...@hotmail.com
>> > >> >>>>> Date: Wed, 1 Oct 2014 08:51:16 -0700
>> > >> >>>>> To: dev@flex.apache.org
>> > >> >>>>> 
>> > >> >>>>> That comment is out of date. Code Model was the part of
>>pre-Falcon
>> > >> >> Flash Builder that built an abstract syntax tree to support
>> > >> >> intelligent editing. We used it as the beginning of Falcon's
>>lexer
>> > >>and 
>> > >> >> parser. The code is just looking at the AST to see if the
>> > >>constructor 
>> > >> >> has a non-public namespace.
>> > >> >>>>> 
>> > >> >>>>> - Gordon
>> > >> >>>>> 
>> > >> >>>>>> On Oct 1, 2014, at 8:33 AM, "Frédéric THOMAS" <
>> > >> >> webdoubl...@hotmail.com> wrote:
>> > >> >>>>>> 
>> > >> >>>>>> 
>> > >> >>>>>> 
>> > >> >>>>>> 
>> > >> >>>>>> 
>> > >> >>>>>> 
>> > >> >>>>>> 
>> > >> >>>>>> I updated it to v17.0 and check in
>> > >> >> falcon\compiler\generated\dist\sdk\lib\external, is there.
>> > >> >>>>>> 
>> > >> >>>>>> oops, looking better, it has both, just removed the bad
>>one, it
>> > >> >> runs.
>> > >> >>>>>> 
>> > >> >>>>>> Now, looking at
>> > >>internal\as\codegen\ClassDirectiveProcessor.java,
>> > >> >>>>>> I
>> > >> >> see that:
>> > >> >>>>>> 
>> > >> >>>>>> // If a constructor has a namespace as part of it's
>>declaration,
>> > >> >>>>>> it
>> > >> >> must be declared public.
>> > >> >>>>>> // It is ok to omit the namespace
>> > >> >>>>>> // We must check the AST, as CM treats all ctors as public
>>no
>> > >> >> matter what the user typed in
>> > >> >>>>>> // so the FunctionDefinition will always be in the public
>> > >> >>>>>> namespace if( node.getActualNamespaceNode() != null &&
>> > >> >>>>>>      node.getActualNamespaceNode().getName() !=
>> > >> >> IASKeywordConstants.PUBLIC)
>> > >> >>>>>>  problems.add(new
>> > >> >> ConstructorMustBePublicProblem(node.getActualNamespaceNode()));
>> > >> >>>>>> 
>> > >> >>>>>> What is the CM or Code Model ?
>> > >> >>>>>> 
>> > >> >>>>>> Thanks,
>> > >> >>>>>> Frédéric THOMAS
>> > >> >>>>>> 
>> > >> >>>>>>> From: aha...@adobe.com
>> > >> >>>>>>> To: dev@flex.apache.org
>> > >> >>>>>>> Subject: Re: [Falcon] starting up
>> > >> >>>>>>> Date: Wed, 1 Oct 2014 13:36:50 +0000
>> > >> >>>>>>> 
>> > >> >>>>>>> Could you have an old guava.jar?
>> > >> >>>>>>> 
>> > >> >>>>>>>> On 10/1/14 4:32 AM, "Frédéric THOMAS"
>><webdoubl...@hotmail.com>
>> > >> >> wrote:
>> > >> >>>>>>>> 
>> > >> >>>>>>>> Hi,
>> > >> >>>>>>>> 
>> > >> >>>>>>>> I built it with ANT an ran Falcon compc.bat from the
>> > >> >> generated/dist/sdk,
>> > >> >>>>>>>> does anyone knows why I get that ?
>> > >> >>>>>>>> 
>> > >> >>>>>>>> Exception in thread "main" java.lang.NoClassDefFoundError:
>> > >> >>>>>>>> com/google/common/cache/CacheLoader
>> > >> >>>>>>>> at
>> > >> >>>>>>>> 
>>org.apache.flex.compiler.clients.MXMLC.<init>(MXMLC.java:379)
>> > >> >>>>>>>> at
>>org.apache.flex.compiler.clients.COMPC.<init>(COMPC.java:54)
>> > >> >>>>>>>> at
>> > >> >> 
>> > 
>>>>org.apache.flex.compiler.clients.COMPC.staticMainNoExit(COMPC.java:75)
>> > >> >>>>>>>> at
>>org.apache.flex.compiler.clients.COMPC.main(COMPC.java:63)
>> > >> >>>>>>>> Caused by: java.lang.ClassNotFoundException:
>> > >> >>>>>>>> com.google.common.cache.CacheLoader
>> > >> >>>>>>>> at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
>> > >> >>>>>>>> at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
>> > >> >>>>>>>> at java.security.AccessController.doPrivileged(Native
>>Method)
>> > >> >>>>>>>> at
>>java.net.URLClassLoader.findClass(URLClassLoader.java:354)
>> > >> >>>>>>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
>> > >> >>>>>>>> at
>> > >> >>>>>>>> 
>>sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
>> > >> >>>>>>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
>> > >> >>>>>>>> ... 4 more
>> > >> >>>>>>>> 
>> > >> >>>>>>>> Thanks,
>> > >> >>>>>>>> Frédéric THOMAS
>> > >> >>> 
>> > >
>> > >                                    
>> > 
>>                                        
>                                         

Reply via email to