I'd be inclined to leave the current implementation for dynamic Groovy and
have a native implementation just with @CS. That gives us some scope for
leaving out some of those fields/methods.

On Wed., 13 Feb. 2019, 2:39 am Daniel.Sun <sun...@apache.org wrote:

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

Reply via email to