google/dagger

KSP processing does not see member injections from typealiased superclass in 2.50

ZacSweers opened this issue · 2 comments

When testing with Dagger 2.50, it looks like its KSP implementation does not see through typealias'd superclasses. This seems to be a regression, as it works in 2.49.

Repro

abstract class ActualBase {
  @Inject lateinit var string: String
}

typealias Base = ActualBase

class InjectClass : Base() {
  @Inject lateinit var numbers: List<Int>

  override fun equals(other: Any?): Boolean {
    if (this === other) return true
    if (javaClass != other?.javaClass) return false

    other as InjectClass

    if (numbers != other.numbers) return false
    if (string != other.string) return false

    return true
  }

  override fun hashCode(): Int {
    var result = numbers.hashCode()
    result = 31 * result + string.hashCode()
    return result
  }
}

The generated MembersInjector class however is missing the base class's string member

package com.squareup.test;

import dagger.MembersInjector;
import dagger.internal.DaggerGenerated;
import dagger.internal.InjectedFieldSignature;
import dagger.internal.QualifierMetadata;
import java.util.List;
import javax.annotation.processing.Generated;
import javax.inject.Provider;

@QualifierMetadata
@DaggerGenerated
@Generated(
    value = "dagger.internal.codegen.ComponentProcessor",
    comments = "https://dagger.dev"
)
@SuppressWarnings({
    "unchecked",
    "rawtypes",
    "KotlinInternal",
    "KotlinInternalInJava"
})
public final class InjectClass_MembersInjector implements MembersInjector<InjectClass> {
  private final Provider<List<Integer>> numbersProvider;

  public InjectClass_MembersInjector(Provider<List<Integer>> numbersProvider) {
    this.numbersProvider = numbersProvider;
  }

  public static MembersInjector<InjectClass> create(Provider<List<Integer>> numbersProvider) {
    return new InjectClass_MembersInjector(numbersProvider);
  }

  @Override
  public void injectMembers(InjectClass instance) {
    injectNumbers(instance, numbersProvider.get());
  }

  @InjectedFieldSignature("com.squareup.test.InjectClass.numbers")
  public static void injectNumbers(InjectClass instance, List<Integer> numbers) {
    instance.numbers = numbers;
  }
}

Thanks for reporting this!

My guess is that it's due to 5f8b76c, where we changed the implementation of XTypes#nonObjectSuperclass(). That should have been a non-functional change but this sounds like there's a bug in XProcessing. I'll take a look and report back once I have more information.

Filed https://issuetracker.google.com/317818395, and I'll have the fix submitted this week.