apollo-kotlin icon indicating copy to clipboard operation
apollo-kotlin copied to clipboard

Similarly named properties result in wrong object used in generated code

Open davidalbers opened this issue 6 years ago • 7 comments

I have a query which I've simplified for this post:

info {
    amenityCategories {
        text
    }
    category
}

amenityCategories is a list of PropertyAmenityCategory Objects. category is an AmenityCategory which is an Enum.

Although named similarly, PropertyAmenityCategory is very different from AmenityCategory.

When the code is generated for it looks like this:

final @NotNull List<AmenityCategory> amenityCategories;
final com.apollographql.apollo.apollobug.type. @Nullable AmenityCategory category;

This causes an exception while building. The generated code should be something like:

final @NotNull List<PropertyAmenityCategory> amenityCategories;
final @Nullable com.apollographql.apollo.apollobug.type.AmenityCategory category;

apollo-android is incorrectly using List<AmenityCategory> for the field amenityCategories.

davidalbers avatar Dec 12 '18 23:12 davidalbers

pls check the lates snapshot version, I believe it was fixed recently

sav007 avatar Dec 13 '18 22:12 sav007

Hi @sav007, I updated to apollo-gradle-plugin:1.0.1-SNAPSHOT and still see the same compilation error

davidalbers avatar Dec 14 '18 15:12 davidalbers

If I am right you have 2 type definitions in your GraphQL schema that have name collision? One for enum another for object:

type PropertyAmenityCategory {
...
}

I'm trying to find the GraphQL specs if name in schema definition is unique or not, but that seems like not right, that schema has 2 types with the same name.

sav007 avatar Jan 03 '19 04:01 sav007

Each type definition has a unique name. However the names share the amenityCategory suffix which seems to cause a problem with apollo-android. Example schema.json:

"types": [ 
  {
    "kind": "OBJECT",
    "name": "PropertyAmenityCategory",
    ...
  },
  {
    "kind": "ENUM",
    "name": "AmenityCategory",
    ...
  },
  {
    "kind": "OBJECT",
    "name": "PropertyInfo",
    "fields": [
      {
        "name": "amenityCategories",
        "type": {
          "kind": "NON_NULL",
          "name": null,
          "ofType": {
            "kind": "LIST",
            "name": null,
            "ofType": {
              "kind": "NON_NULL",
              "name": null,
              "ofType": {
                "kind": "OBJECT",
                "name": "PropertyAmenityCategory",
                "ofType": null
              }
            }
          }
        }
      },
      {
        "name": "category",
        "type": {
          "kind": "ENUM",
          "name": "AmenityCategory",
          "ofType": null
        }
      }
    ]
  }

davidalbers avatar Jan 03 '19 15:01 davidalbers

agh, I see, so its field name causes this issue, well you can always use aliases https://graphql.github.io/learn/queries/#aliases but for sure we need to reserve enum type name and resolve name collision accordingly

sav007 avatar Jan 03 '19 18:01 sav007

That's a good workaround. Doing something like:

propertyAmenityCategories: amenityCategories {
...
}

will avoid the type mismatching and fixes the generated code errors.

davidalbers avatar Jan 03 '19 19:01 davidalbers

Yeah, the existing name conflict resolution in codegen is not straightforward, I thought it's easy fix but not really

sav007 avatar Jan 08 '19 02:01 sav007