gabrielittner / auto-value-with Goto Github PK
View Code? Open in Web Editor NEWAutoValue extension to implement "with-er" methods for AutoValue objects
License: Apache License 2.0
AutoValue extension to implement "with-er" methods for AutoValue objects
License: Apache License 2.0
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
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
Just like auto-value-json.
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)
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
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.
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);
}
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 AutoValueWithExtension
and 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.
Are there plans to support multiple fields? For example: withEmailAndPhone
.
I know it's currently possible by having withEmail
and withPhone
, but this causes one unnecessary object creation.
Given https://developer.android.com/reference/android/support/annotation/CheckResult.html, I think it would be a good idea if auto-value-with automatically included this annotation on the generated with* methods.
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.
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.
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();
}
}
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?...
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();
}
}
It looks to me that
abstract String withEmail(String email);
should instead be:
abstract User withEmail(String email);
Whoops! I'll make a PR to fix this.
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.
Do you plan on cutting a release since AutoValue 1.3 is finally released?
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.
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 {
}
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.