Hello everyone,

I've encountered a "problem" when using traits. Say you have a couple of
traits that define fileds in the following order

@CompileStatic
trait CompartmentIdAwareTrait implements PathAware, ProjectAware {
   @Internal
   final Property<String> compartmentId = project.objects.property(String)

   @Input
   final Provider<String> resolvedCompartmentId = stringProvider(
       'OCI_COMPARTMENT_ID',
       'oci.compartment.id',
       getCompartmentId(),
       project)
}

and

@CompileStatic
trait InstanceNameAwareTrait implements PathAware, ProjectAware {
    @Internal
    final Property<String> instanceName = project.objects.property(String)

    @Input
    final Provider<String> resolvedInstanceName = stringProvider(
        'OCI_INSTANCE_NAME',
        'oci.instance.name',
        getInstanceName(),
        project)
}

As you can see there's a regular property field and a "resolved" provider
field. I expected these fields to be copied in definition order, that is,
resolved fields will always be second thus the reference to their
corresponding property field will work.

However that's not the case. I'm compiling code with Groovy 2.5.8 (I think
that's the version used by Gradle 6.0.1) and I find the following fields in
the bytecode of the target class that applies the traits

  private final org.gradle.api.provider.Provider<java.lang.String>
org_kordamp_gradle_plugin_oci_tasks_traits_InstanceNameAwareTrait__resolvedInstanceName;
  private final org.gradle.api.provider.Property<java.lang.String>
org_kordamp_gradle_plugin_oci_tasks_traits_InstanceNameAwareTrait__instanceName;
  private final org.gradle.api.provider.Property<java.lang.String>
org_kordamp_gradle_plugin_oci_tasks_traits_CompartmentIdAwareTrait__compartmentId;
  private final org.gradle.api.provider.Provider<java.lang.String>
org_kordamp_gradle_plugin_oci_tasks_traits_CompartmentIdAwareTrait__resolvedCompartmentId;

The order of copied fields is not consistent either

  private final org.gradle.api.provider.Property<java.lang.Boolean>
org_kordamp_gradle_plugin_oci_tasks_traits_VerboseAwareTrait__verbose;
  private final org.gradle.api.provider.Provider<java.lang.Boolean>
org_kordamp_gradle_plugin_oci_tasks_traits_VerboseAwareTrait__resolvedVerbose;
  private final
org.gradle.api.provider.Provider<org.gradle.api.file.RegularFile>
org_kordamp_gradle_plugin_oci_tasks_traits_UserDataFileAwareTrait__resolvedUserDataFile;
  private final org.gradle.api.file.RegularFileProperty
org_kordamp_gradle_plugin_oci_tasks_traits_UserDataFileAwareTrait__userDataFile;
  private final org.gradle.api.file.RegularFileProperty
org_kordamp_gradle_plugin_oci_tasks_traits_PublicKeyFileAwareTrait__publicKeyFile;
  private final
org.gradle.api.provider.Provider<org.gradle.api.file.RegularFile>
org_kordamp_gradle_plugin_oci_tasks_traits_PublicKeyFileAwareTrait__resolvedPublicKeyFile;
  private final org.gradle.api.provider.Provider<java.lang.String>
org_kordamp_gradle_plugin_oci_tasks_traits_ShapeAwareTrait__resolvedShape;
  private final org.gradle.api.provider.Property<java.lang.String>
org_kordamp_gradle_plugin_oci_tasks_traits_ShapeAwareTrait__shape;
  private final org.gradle.api.provider.Provider<java.lang.String>
org_kordamp_gradle_plugin_oci_tasks_traits_ImageAwareTrait__resolvedImage;
  private final org.gradle.api.provider.Property<java.lang.String>
org_kordamp_gradle_plugin_oci_tasks_traits_ImageAwareTrait__image;
  private final org.gradle.api.provider.Provider<java.lang.String>
org_kordamp_gradle_plugin_oci_tasks_traits_InstanceNameAwareTrait__resolvedInstanceName;
  private final org.gradle.api.provider.Property<java.lang.String>
org_kordamp_gradle_plugin_oci_tasks_traits_InstanceNameAwareTrait__instanceName;
  private final org.gradle.api.provider.Property<java.lang.String>
org_kordamp_gradle_plugin_oci_tasks_traits_CompartmentIdAwareTrait__compartmentId;
  private final org.gradle.api.provider.Provider<java.lang.String>
org_kordamp_gradle_plugin_oci_tasks_traits_CompartmentIdAwareTrait__resolvedCompartmentId;

So I wonder if this is some bug or my expectations are wrong.

I expected fields to be copied in the same order as they were defined in
the trait.

Cheers,
Andres

-------------------------------------------
Java Champion; Groovy Enthusiast
http://andresalmiray.com
http://www.linkedin.com/in/aalmiray
--
What goes up, must come down. Ask any system administrator.
There are 10 types of people in the world: Those who understand binary, and
those who don't.
To understand recursion, we must first understand recursion.

Reply via email to