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