Hi all, I'm trying to find a solution to implement the native interface default method for Groovy 3 and encounter the following problems. Any advice is appreciated!
1) [Generating Fields] No matter whether STC is enabled or not, the following fields need to be generated, but `private`, `transient ` are invalid modifier for field in interface declaration. In addition, field `metaClass` is not `static` so `metaClass` can not be generated in interface either... private static org.codehaus.groovy.reflection.ClassInfo $staticClassInfo public static transient boolean __$stMC private transient groovy.lang.MetaClass metaClass 2) [Generating Methods] `protected` can not be used to define interface method. protected synthetic $getStaticMetaClass()Lgroovy/lang/MetaClass; public getMetaClass()Lgroovy/lang/MetaClass; public setMetaClass(Lgroovy/lang/MetaClass;)V public invokeMethod(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; public getProperty(Ljava/lang/String;)Ljava/lang/Object; public setProperty(Ljava/lang/String;Ljava/lang/Object;)V // when STC is disabled, the following additional methods will be generated private static synthetic $createCallSiteArray_1([Ljava/lang/String;)V private static synthetic $createCallSiteArray()Lorg/codehaus/groovy/runtime/callsite/CallSiteArray; private static synthetic $getCallSiteArray()[Lorg/codehaus/groovy/runtime/callsite/CallSite; As for all of the above `public` instance methods, we can transform them to `default` instance methods. At last, I have a crazy idea, maybe we can generate all of the above fields and methods with traits, but the default method is generated in a native way, e.g. ``` // native interface interface SomeInterfaceWithDefaultMethod { // native interface default method default void helloWorld() { // generate bytecode here to use traits to invoke MOP methods } } ``` Cheers, Daniel.Sun ----- Apache Groovy committer Blog: http://blog.sunlan.me Twitter: @daniel_sun -- Sent from: http://groovy.329449.n5.nabble.com/Groovy-Dev-f372993.html