Giter Site home page Giter Site logo

auto-value-with's Introduction

AutoValue: With Extension

An extension for Google's AutoValue that implements "with-er" methods for AutoValue objects.

Note: This is an early version that requires the extension support currently in AutoValue 1.2-SNAPSHOT.

Usage

Include auto-value-with in your project and "with-er" methods to your auto-value objects.

@AutoValue public abstract class User {
  abstract String id();
  abstract String name();
  abstract String email();

  abstract User withEmail(String email);

  // you can also use multiple
  abstract User withNameAndEmail(String name, String email);
}

The extension will generate an implementation of withEmail(String) that returns a new instance of User with the given email.

By convention "with-er" methods have to use with as prefix and use the exact property name for both method name and parameter name.

Download

Add a Gradle dependency:

annotationProcessor 'com.gabrielittner.auto.value:auto-value-with:1.1.1'

or Maven:

<dependency>
  <groupId>com.gabrielittner.auto.value</groupId>
  <artifactId>auto-value-with</artifactId>
  <version>1.1.1</version>
  <scope>provided</scope>
</dependency>

Snapshots of the development version are available in Sonatype's snapshots repository.

License

Copyright 2016 Gabriel Ittner.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

auto-value-with's People

Contributors

dependabot-preview[bot] avatar eleventigers avatar gabrielittner avatar johnjohndoe avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

auto-value-with's Issues

Can't use generics in Interface, version 1.4

Attempting to use generics in an Interface is causing this NPE (Related #24)

This is my hierarchy

class Children extends BaseClass<Children>{}

class BaseClass<T> implements BaseInterface<T>{}

interface BaseInterface<T> {
  @NonNull
  T withTimestamp(long timestamp);
}

AutoValue_Children is never generated.

If I move T withTimestamp(long timestamp); to BaseClass, everything works fine

Error:(24, 17) error: @AutoValue processor threw an exception: java.lang.NullPointerException
at com.gabrielittner.auto.value.with.WithMethod.getHierarchyUntilClassWithElement(WithMethod.java:138)
at com.gabrielittner.auto.value.with.WithMethod.getResolvedReturnType(WithMethod.java:127)
at com.gabrielittner.auto.value.with.WithMethod.getWithMethods(WithMethod.java:78)
at com.gabrielittner.auto.value.with.AutoValueWithExtension.generateWithMethods(AutoValueWithExtension.java:56)
at com.gabrielittner.auto.value.with.AutoValueWithExtension.generateClass(AutoValueWithExtension.java:49)
at com.google.auto.value.processor.AutoValueProcessor.processType(AutoValueProcessor.java:424)
at com.google.auto.value.processor.AutoValueProcessor.process(AutoValueProcessor.java:143)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:793)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:722)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1700(JavacProcessingEnvironment.java:97)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1029)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1163)
at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1108)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:824)
at com.sun.tools.javac.main.Main.compile(Main.java:439)
at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:132)
at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:45)
at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:33)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:101)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:50)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:36)
at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:34)
at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:25)
at org.gradle.api.tasks.compile.JavaCompile.performCompilation(JavaCompile.java:157)
at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:139)
at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:93)
at com.android.build.gradle.tasks.factory.AndroidJavaCompile.compile(AndroidJavaCompile.java:49)
at sun.reflect.GeneratedMethodAccessor1425.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.doExecute(AnnotationProcessingTaskFactory.java:244)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:220)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.execute(AnnotationProcessingTaskFactory.java:231)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:209)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:66)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:25)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:110)
at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
at org.gradle.initialization.DefaultGradleLauncher$4.run(DefaultGradleLauncher.java:154)
at org.gradle.internal.Factories$1.create(Factories.java:22)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:52)
at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:151)
at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:32)
at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:99)
at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:93)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:93)
at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:82)
at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:94)
at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:46)
at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
at org.gradle.tooling.internal.provider.runner.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:58)
at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:43)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78)
at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:48)
at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:52)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
at org.gradle.util.Swapper.swap(Swapper.java:38)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:66)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

Don't attempt to implement non-abstract 'with' methods

Use case is a value class with a List property. I created a 'with' method to set the complete list but I wanted a 'with' method which only adds a single element to the list. Here's an example of what I'm trying to do.

@AutoValue
public abstract class Example {
    public abstract ImmutableList<String> strings();
    public abstract Example withStrings(ImmutableList<String> strings);
    public Example withString(String string) {
        return withStrings(ImmutableList.<String>builder().addAll(strings()).add(string).build());
    }
}

I could change the withString method to addString - and that's probably what I'll do in the meantime - but that departs from the pattern. Let me know if you would be willing to take a pull request for this and I can work on it myself.

Binaries of latest release (1.1.0) lack class files of shaded dependencies

First of all: Thanks a lot for this extension.

The issue:
When upgrading from version 1.1.0-rc1 to version 1.1.0 the following error occurs:

Execution failed for task ':compileJava'.
> java.lang.NoClassDefFoundError: com/gabrielittner/auto/value/util/AutoValueUtil

The published auto-value-with-1.1.0.jar file contains only two .class files (for AutoValueWithExtensionand WithMethod). The .class files that are relocated by the shadowJar task are not contained anymore.

This can be reproduced when publishing to the local maven repository by running the installArchives task.

@Override annotation is duplicated

Due to #24, I was forced to add a non-generics implementation such as the following

  @NonNull
  @Override
  public abstract Timeline withUploadStatus(@NonNull UPLOAD_STATUS status);

auto-value-with generates the withUploadStatus method with a duplicated @OverRide annotation, which of course throws a duplicate annotation compile time error

  @Override
  @NonNull
  @Override
  public final Timeline withUploadStatus(ISynchronizable.UPLOAD_STATUS uploadStatus) {
    return new AutoValue_Timeline(id(), ..., uploadStatus, ...);
  }

Removing the @OverRide annotation fixes the issue.

Add support for generic arguments

I don't know how much work is needed to implement this feature, but it'd be great to be able to do something like this:

public abstract class PersistentModel<T extends PersistentModel<T>> {
    public abstract long id();
    public abstract T withId(long id);
}

@AutoValue
public abstract class MyModel extends PersistentModel<MyModel> {}

Which currently throws:

Error:(6, 17) error: @autovalue processor threw an exception: java.lang.IllegalArgumentException: withId() in [...].MyModel returns T, expected [...].MyModel

readme update?

It looks to me that

abstract String withEmail(String email);

should instead be:

abstract User withEmail(String email);

Multiple Fields Support

Are there plans to support multiple fields? For example: withEmailAndPhone.
I know it's currently possible by having withEmailand withPhone, but this causes one unnecessary object creation.

Get methods are not handled properly

When messing around with AutoValue and your extension, if a property has a getX() method, this is not handled properly. The generated with method will have the short form method calls - which don't exist - instead of the getX() method calls.

Let me know if you need an example and I can provide one.

Compiler disallowing abstract with-er method

I have been trying to figure out the reason for this problem for a while now. By my understanding I should just be able to add the dependency to my build.gradle and use the abstract with-er method based on another "attributes" name. However, I keep getting this error:

@AutoValue classes cannot have abstract methods other than property getters and Builder converters

Is this an error on my end, or is this a library bug? Thanks for any help in advance, and here's my code for the problematic model class:

@autovalue
public abstract class Comic {

public static final String TABLE = "xkcd";

public static final String NUM = BaseColumns._ID;
public static final String ALT = "alt";
public static final String IMG = "img";
public static final String TITLE = "title";
public static final String IMG_RATIO = "imgRatio";

@ColumnName(NUM)
public abstract int num();
public abstract String alt();
public abstract String img();
public abstract String title();
public abstract float imgRatio();

public abstract Comic withImgRatio(float imgRatio);

public abstract ContentValues toContentValues();

public static JsonAdapter<Comic> jsonAdapter(Moshi moshi) {
    return new AutoValue_Comic.MoshiJsonAdapter(moshi);
}

public static Comic create(Cursor cursor) {
    return AutoValue_Comic.createFromCursor(cursor);
}

public static final Func1<Cursor, Comic> MAPPER = Comic::create;

public String displayNum() {
    return "#" + num();
}

}

The generated class uses an inexistent constructor when using AutoValue's Builder

Given the example below:

import com.google.auto.value.AutoValue;

@AutoValue
abstract class Animal {
  abstract String name();
  abstract int numberOfLegs();
  abstract Animal withName(String name);
  abstract Builder toBuilder();

  static Builder builder() {
    return new AutoValue_Animal.Builder();
  }

  @AutoValue.Builder
  abstract static class Builder {
    abstract Builder name(String value);
    abstract Builder numberOfLegs(int value);
    abstract Animal build();
  }
}

(Usage of toBuilder is documented here: https://github.com/google/auto/blob/master/value/userguide/builders-howto.md#to_builder )

We're getting the following error when the auto-value-with class gets generated:

error: constructor AutoValue_Animal in class AutoValue_Animal cannot be applied to given types;
      return new AutoValue_Animal(
             ^
  required: String,int,Builder
  found: String,int
  reason: actual and formal argument lists differ in length

error: constructor $AutoValue_Animal in class $AutoValue_Animal cannot be applied to given types;
    super(name, numberOfLegs, toBuilder);
    ^
  required: String,int
  found: String,int,Builder
  reason: actual and formal argument lists differ in length

Looking at the generated code this is what we get:

final class AutoValue_Animal extends $AutoValue_Animal {
  AutoValue_Animal(String name, int numberOfLegs, Animal.Builder toBuilder) {
    super(name, numberOfLegs, toBuilder);
  }

  @Override
  public final AutoValue_Animal withName(String name) {
    return new AutoValue_Animal(name, numberOfLegs(), toBuilder());
  }
}

So seems like it's trying to pass in the Builder as constructor parameter but it shouldn't.

IllegalStateException: Missing required properties

so I'm trying your extension with AutoValue and I'm getting :

     java.lang.IllegalStateException: Missing required properties: accountId name company postId flaggedYes totalComments

The class is :

@AutoValue
public abstract class FeedItem implements Parcelable {
    public abstract String getAccountId();
    public abstract String getName();
    public abstract String getCompany();
    @Nullable
    public abstract String getAvatar();
    @Nullable
    public abstract String getPostImage();
    @Nullable
    public abstract String getThumb();
    public abstract String getPostId();
    public abstract String getFlaggedYes();
    public abstract int getTotalFlags();
    public abstract int getTotalComments();

    // Returns slightly altered instance
    public FeedItem withTotalFlags(int totalFlags) {
        return builder().setTotalFlags(totalFlags).build();
    }

    public static Builder builder() {
        return new AutoValue_FeedItem.Builder();
    }

    @AutoValue.Builder
    public static abstract class Builder {
        public abstract Builder setAccountId(String accountId);
        public abstract Builder setName(String name);
        public abstract Builder setCompany(String company);
        public abstract Builder setAvatar(@Nullable String avatar);
        public abstract Builder setPostImage(@Nullable String image);
        public abstract Builder setThumb(@Nullable String thumb);
        public abstract Builder setPostId(String postId);
        public abstract Builder setFlaggedYes(String flaggedYes);
        public abstract Builder setTotalFlags(int totalFlags);
        public abstract Builder setTotalComments(int totalComments);

        public abstract FeedItem build();
    }

} 

And I'm using it like :

        FeedItem feedItem = dataset.get(position)
            .withTotalFlags(updatedTotalFlags);

Am I using it wrong? Thanks and Happy new year!!

PS : would be great if you could add a demo/sample

Exception when compiling

Updated to the latest version of auto-value-with, 0.1.3, and hit this exception.

Caused by: java.lang.NoSuchMethodError: com.squareup.javapoet.CodeBlock.of(Ljava/lang/String;[Ljava/lang/Object;)Lcom/squareup/javapoet/CodeBlock;
        at com.gabrielittner.auto.value.util.AutoValueUtil.newConstructor(AutoValueUtil.java:100)
        at com.gabrielittner.auto.value.util.AutoValueUtil.newTypeSpecBuilder(AutoValueUtil.java:71)
        at com.gabrielittner.auto.value.with.AutoValueWithExtension.generateClass(AutoValueWithExtension.java:123)
        at com.google.auto.value.processor.AutoValueProcessor.processType(AutoValueProcessor.java:424)
        at com.google.auto.value.processor.AutoValueProcessor.process(AutoValueProcessor.java:143)
        at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794)
        at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705)
        at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
        at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
        at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
        at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
        at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
        at com.sun.tools.javac.main.Main.compile(Main.java:523)

Dependencies in pom file.

...
    <dependency>
      <groupId>com.google.auto.value</groupId>
      <artifactId>auto-value</artifactId>
      <version>1.2</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.ryanharter.auto.value</groupId>
      <artifactId>auto-value-moshi</artifactId>
      <version>0.3.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.gabrielittner.auto.value</groupId>
      <artifactId>auto-value-with</artifactId>
      <version>0.1.3</version>
      <scope>provided</scope>
    </dependency>
...

I think it might be colliding with auto-value-moshi which brings in javapoet:1.7.0. I tried to exclude javapoet from auto-value-moshi and also tried an explicit dependency on javapoet:1.6.0 and neither worked. I can provide more specifics on the project if you need.

IllegalStateException: Missing required properties

Below is my code, kindly provide support to resolve this issue.

@AutoValue
public abstract class PaymentHistoryViewModelNew implements Parcelable {

    public abstract String paidAmount();

    public abstract String numberOfPayments();

    public abstract List<PaymentItemViewModelNew> paymentViewModels();


    public static Builder builder() {
        return new AutoValue_PaymentHistoryViewModelNew.Builder();
    }

    public static PaymentHistoryViewModelNew from(PaymentHistoryResponse paymentHistoryResponse, String paidAmount) {
        List<PaymentItemViewModelNew> list = new ArrayList<>();

        if (paymentHistoryResponse.payments != null) {
            Collections.sort(paymentHistoryResponse.payments, new Comparator<Payment>() {
                @Override
                public int compare(Payment thisPayment, Payment otherPayment) {
                    Date thisPaymentDate = DateHelper.parseDate(thisPayment.date, DateHelper.DATE_API_FORMAT);
                    Date otherPaymentDate = DateHelper.parseDate(otherPayment.date, DateHelper.DATE_API_FORMAT);
                    if (thisPaymentDate != null && otherPaymentDate != null) {
                        return otherPaymentDate.compareTo(thisPaymentDate);
                    }
                    return 0;
                }
            });

            for (Payment payment : paymentHistoryResponse.payments) {
                list.add(PaymentItemViewModelNew.builder().build().from(payment));
            }
        }

        return builder()
                .numberOfPayments(NumberUtils.formatTimes(list.size()))
                .paidAmount(paidAmount)
                .paymentViewModels(list)
                .build();
    }

    @AutoValue.Builder
    public abstract static class Builder {
        public abstract Builder paidAmount(String amount);

        public abstract Builder numberOfPayments(String amount);

        public abstract Builder paymentViewModels(List<PaymentItemViewModelNew> list);

        public abstract PaymentHistoryViewModelNew build();
    }
}

Allow changes in generic types

Right now the library allows this:

@AutoValue
public abstract class Foo<T> {
    public abstract T bar();

    public abstract Foo<T> withBar(T bar);
}

It would be great if it would allow this too:

@AutoValue
public abstract class Foo<T> {
    public abstract T bar();

    public abstract <X> Foo<X> withBar(X bar);
}

Support superclasses as return types

This does not work because the extension wants withA(String) to return BaseClassImpl

public abstract class BaseClass {
  public String a();
  public BaseClass withA(String a);
}

@AutoValue public abstract class BaseClassImpl {
}

0.1.2's wither implementations return wrong AutoValue class for Nested classes

If I have a class B nested in A

public class A {
    @AutoValue
    public abstract class B {
        public abstract int xyz();
        public abstract B withXyz(int xyz);
    }
}

the generated class from auto-value-with extension is as follows

abstract class $$AutoValue_A_B extends $$$AutoValue_A_B {
  $$AutoValue_A_B(int xyz) {
    super(xyz);
  }

  @Override
  public final AutoValue_B withXyz(int xyz) {
    return new AutoValue_B(xyz);
  }
}

Notice that the return type of wither implementations is AutoValue_B instead of AutoValue_A_B

Adding with-er methods generates a lot of warnings

While using this extension and adding a lot of with-methods I also start to see a lot of warnings during compilation, for example:

warning: @AutoValue classes cannot have abstract methods other than property getters and Builder converters
  public abstract Flight withIsInternational(boolean isInternational);
                         ^

Isn't there something in AutoValue extension API which can help to suppress such warnings, because obviously in this case we want these methods?...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.