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 > > >> >>> > > > > > > > > >