pawellabaj / auto-record Goto Github PK
View Code? Open in Web Editor NEWJava record source generator
License: Apache License 2.0
Java record source generator
License: Apache License 2.0
Describe the bug
Given following set of interfaces:
interface BaseType {
}
public interface Common<T extends BaseType> {
T getParam();
}
public interface ConcreteType extends BaseType {
}
@DefaultAutoRecord
public interface MyRecord extends Common<ConcreteType> {
}
I would expect generated MyRecordRecord constructor to have argument of type ConcreteType, however this is not the case, Type is set to T and record cannot be compiled.
**Details**
See above
3. Generated record:
```java
@Generated("pl.com.labaj.autorecord.AutoRecord")
@GeneratedWithAutoRecord
@RecordBuilder
@RecordBuilder.Options(
addClassRetainedGenerated = true,
enableWither = false
)
public record MyRecordRecord(T getParam) implements MyRecord {
public MyRecordRecord {
// pl.com.labaj.autorecord.processor.AutoRecordProcessor
requireNonNull(getParam, "getParam must not be null");
}
public static MyRecordRecordBuilder builder() {
return MyRecordRecordBuilder.builder();
}
public MyRecordRecordBuilder toBuilder() {
return MyRecordRecordBuilder.builder(this);
}
}
5. Error during compilation:
java: cannot find symbol
symbol: class T
location: class MyRecordRecord
**Expected behavior**
```java
public record MyRecordRecord(ConcreteType getParam) implements MyRecord
Avoid failing the java:S6218 rule
Put utility classes into generated sources to avoid declaring utility dependencies with compile scope as an addition to processor in pom.xml
CompactConstructorExtension replaces collection-type components with their immutable copy. By collection-type, Set
, List
, Queue
and Map
implementations need to be understand.
It'd be good allowing users to provide additional content for a compact constructor as a default method in the processed interface. It could be used for defining an additional validation of parameters being passed to the constructor.
Describe the bug
Annotation parameters are not passed to generated record. Only the annotation itself.
Details
Details needed to reproduce bug:
@AutoRecord
public interface MyCustomClass {
@JsonProperty("myIds")
Collection<String> getMyIds();
@JsonCreator
static MyCustomClass create(Collection<String> getMyIds) {
return new MyCustomClassRecord(getMyIds);
}
}
@Generated("pl.com.labaj.autorecord.AutoRecord")
@GeneratedWithAutoRecord
public record MyCustomClass(
@JsonProperty Collection<String> getMyIds) implements MyIdsResponse {
public MyIdsResponseRecord {
requireNonNull(getMyIds, "getMyIds must not be null");
}
}
none
Expected behavior
In generated record: @JsonProperty("myIds") Collection<String> getMyIds
Additional context
Add any other context about the problem here.
none
What to do to write unit tests easier?
How to get correct coverage analysis?
Maybe use compile-testing?
Currently, generated records treat components as {nonnull by default}.
It'd be good allowing users to choose between {nonnull} and {nullable} by default modes.
It'd be good allowing users to provide kind of plugin or extension wich generates toString method in a specified way
It'd be good allowing users to choose and configure an annotation class used in mode introduced in #7
Describe the bug
Create an interface with method annotated with @JsonProperty, after generation annotation is not propagated
Details
Details needed to reproduce bug:
@DefaultAutoRecordApi
public interface TestRecord {
@JsonProperty
String name();
}
Annotation
@Retention(SOURCE)
@Target(TYPE)
@AutoRecord.Template(
recordOptions = @AutoRecord.Options(withBuilder = true),
builderOptions = @RecordBuilder.Options(enableWither = false, useImmutableCollections = false, useUnmodifiableCollections = false),
extensions = @AutoRecord.Extension(extensionClass = "pl.com.labaj.autorecord.extension.arice.ImmutableCollectionsExtension")
)
public @interface DefaultAutoRecordApi {}
@Generated("pl.com.labaj.autorecord.AutoRecord")
@GeneratedWithAutoRecord
@RecordBuilder
@RecordBuilder.Options(
addClassRetainedGenerated = true,
enableWither = false
)
public record TestRecordRecord(String name) implements TestRecord {
public TestRecordRecord {
// pl.com.labaj.autorecord.processor.AutoRecordProcessor
requireNonNull(name, "name must not be null");
}
public static TestRecordRecordBuilder builder() {
return TestRecordRecordBuilder.builder();
}
public TestRecordRecordBuilder toBuilder() {
return TestRecordRecordBuilder.builder(this);
}
}
Builder
@Generated("io.soabase.recordbuilder.core.RecordBuilder")
@RecordBuilderGenerated
public class TestRecordRecordBuilder {
private String name;
@Generated("io.soabase.recordbuilder.core.RecordBuilder")
private TestRecordRecordBuilder() {
}
@Generated("io.soabase.recordbuilder.core.RecordBuilder")
private TestRecordRecordBuilder(String name) {
this.name = name;
}
/**
* Static constructor/builder. Can be used instead of new TestRecordRecord(...)
*/
@Generated("io.soabase.recordbuilder.core.RecordBuilder")
public static TestRecordRecord TestRecordRecord(String name) {
return new TestRecordRecord(name);
}
/**
* Return a new builder with all fields set to default Java values
*/
@Generated("io.soabase.recordbuilder.core.RecordBuilder")
public static TestRecordRecordBuilder builder() {
return new TestRecordRecordBuilder();
}
/**
* Return a new builder with all fields set to the values taken from the given record instance
*/
@Generated("io.soabase.recordbuilder.core.RecordBuilder")
public static TestRecordRecordBuilder builder(TestRecordRecord from) {
return new TestRecordRecordBuilder(from.name());
}
/**
* Return a stream of the record components as map entries keyed with the component name and the value as the component value
*/
@Generated("io.soabase.recordbuilder.core.RecordBuilder")
public static Stream<Map.Entry<String, Object>> stream(TestRecordRecord record) {
return Stream.of(new AbstractMap.SimpleImmutableEntry<>("name", record.name()));
}
/**
* Return a new record instance with all fields set to the current values in this builder
*/
@Generated("io.soabase.recordbuilder.core.RecordBuilder")
public TestRecordRecord build() {
return new TestRecordRecord(name);
}
@Generated("io.soabase.recordbuilder.core.RecordBuilder")
@Override
public String toString() {
return "TestRecordRecordBuilder[name=" + name + "]";
}
@Generated("io.soabase.recordbuilder.core.RecordBuilder")
@Override
public int hashCode() {
return Objects.hash(name);
}
@Generated("io.soabase.recordbuilder.core.RecordBuilder")
@Override
public boolean equals(Object o) {
return (this == o) || ((o instanceof TestRecordRecordBuilder r)
&& Objects.equals(name, r.name));
}
/**
* Set a new value for the {@code name} record component in the builder
*/
@Generated("io.soabase.recordbuilder.core.RecordBuilder")
public TestRecordRecordBuilder name(String name) {
this.name = name;
return this;
}
/**
* Return the current value for the {@code name} record component in the builder
*/
@Generated("io.soabase.recordbuilder.core.RecordBuilder")
public String name() {
return name;
}
Expected behavior
@JsonProperty annotation being present on record field declaration and builder's name(...) method.
Additional context
Add any other context about the problem here.
It'd be good allowing users to define their own toString
method implementation
I've created jvm-repo-rebuild/reproducible-central#130 according to the documentation.
I'm facing unexpected errors during build:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 16.946 s
[INFO] Finished at: 2023-10-27T21:58:16Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources (default-resources) on project auto-record-api: Execution default-resources of goal org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources failed: A required class was missing while executing org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources: org/apache/commons/lang3/StringUtils
[ERROR] -----------------------------------------------------
[ERROR] realm = plugin>org.apache.maven.plugins:maven-resources-plugin:3.3.1
[ERROR] strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
[ERROR] urls[0] = file:/var/maven/.m2/repository-022/org/apache/maven/plugins/maven-resources-plugin/3.3.1/maven-resources-plugin-3.3.1.jar
[ERROR] urls[1] = file:/var/maven/.m2/repository-022/org/codehaus/plexus/plexus-interpolation/1.26/plexus-interpolation-1.26.jar
[ERROR] urls[2] = file:/var/maven/.m2/repository-022/org/codehaus/plexus/plexus-utils/3.5.1/plexus-utils-3.5.1.jar
[ERROR] urls[3] = file:/var/maven/.m2/repository-022/org/apache/maven/shared/maven-filtering/3.3.1/maven-filtering-3.3.1.jar
[ERROR] urls[4] = file:/var/maven/.m2/repository-022/org/sonatype/plexus/plexus-build-api/0.0.7/plexus-build-api-0.0.7.jar
[ERROR] urls[5] = file:/var/maven/.m2/repository-022/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar
[ERROR] urls[6] = file:/var/maven/.m2/repository-022/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar
[ERROR] Number of foreign imports: 1
[ERROR] import: Entry[import from realm ClassRealm[project>pl.com.labaj.autorecord:auto-record-project:3.1.0, parent: ClassRealm[maven.api, parent: null]]]
[ERROR]
[ERROR] -----------------------------------------------------
[ERROR] : org.apache.commons.lang3.StringUtils
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources (default-resources) on project auto-record-api: Execution default-resources of goal org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources failed: A required class was missing while executing org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources: org/apache/commons/lang3/StringUtils
-----------------------------------------------------
realm = plugin>org.apache.maven.plugins:maven-resources-plugin:3.3.1
strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
urls[0] = file:/var/maven/.m2/repository-022/org/apache/maven/plugins/maven-resources-plugin/3.3.1/maven-resources-plugin-3.3.1.jar
urls[1] = file:/var/maven/.m2/repository-022/org/codehaus/plexus/plexus-interpolation/1.26/plexus-interpolation-1.26.jar
urls[2] = file:/var/maven/.m2/repository-022/org/codehaus/plexus/plexus-utils/3.5.1/plexus-utils-3.5.1.jar
urls[3] = file:/var/maven/.m2/repository-022/org/apache/maven/shared/maven-filtering/3.3.1/maven-filtering-3.3.1.jar
urls[4] = file:/var/maven/.m2/repository-022/org/sonatype/plexus/plexus-build-api/0.0.7/plexus-build-api-0.0.7.jar
urls[5] = file:/var/maven/.m2/repository-022/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar
urls[6] = file:/var/maven/.m2/repository-022/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar
Number of foreign imports: 1
import: Entry[import from realm ClassRealm[project>pl.com.labaj.autorecord:auto-record-project:3.1.0, parent: ClassRealm[maven.api, parent: null]]]
-----------------------------------------------------
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:347)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:330)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:213)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:175)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:76)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:163)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:160)
at org.apache.maven.lifecycle.internal.MojoExecutor.executeForkedExecutions (MojoExecutor.java:462)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:325)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:213)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:175)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:76)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:163)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:160)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:827)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:272)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:195)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:568)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: org.apache.maven.plugin.PluginExecutionException: Execution default-resources of goal org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources failed: A required class was missing while executing org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources: org/apache/commons/lang3/StringUtils
-----------------------------------------------------
realm = plugin>org.apache.maven.plugins:maven-resources-plugin:3.3.1
strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
urls[0] = file:/var/maven/.m2/repository-022/org/apache/maven/plugins/maven-resources-plugin/3.3.1/maven-resources-plugin-3.3.1.jar
urls[1] = file:/var/maven/.m2/repository-022/org/codehaus/plexus/plexus-interpolation/1.26/plexus-interpolation-1.26.jar
urls[2] = file:/var/maven/.m2/repository-022/org/codehaus/plexus/plexus-utils/3.5.1/plexus-utils-3.5.1.jar
urls[3] = file:/var/maven/.m2/repository-022/org/apache/maven/shared/maven-filtering/3.3.1/maven-filtering-3.3.1.jar
urls[4] = file:/var/maven/.m2/repository-022/org/sonatype/plexus/plexus-build-api/0.0.7/plexus-build-api-0.0.7.jar
urls[5] = file:/var/maven/.m2/repository-022/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar
urls[6] = file:/var/maven/.m2/repository-022/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar
Number of foreign imports: 1
import: Entry[import from realm ClassRealm[project>pl.com.labaj.autorecord:auto-record-project:3.1.0, parent: ClassRealm[maven.api, parent: null]]]
-----------------------------------------------------
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:152)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:342)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:330)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:213)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:175)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:76)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:163)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:160)
at org.apache.maven.lifecycle.internal.MojoExecutor.executeForkedExecutions (MojoExecutor.java:462)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:325)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:213)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:175)
at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:76)
at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:163)
at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:160)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:827)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:272)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:195)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:77)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:568)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: org.apache.maven.plugin.PluginContainerException: A required class was missing while executing org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources: org/apache/commons/lang3/StringUtils
-----------------------------------------------------
realm = plugin>org.apache.maven.plugins:maven-resources-plugin:3.3.1
strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
urls[0] = file:/var/maven/.m2/repository-022/org/apache/maven/plugins/maven-resources-plugin/3.3.1/maven-resources-plugin-3.3.1.jar
urls[1] = file:/var/maven/.m2/repository-022/org/codehaus/plexus/plexus-interpolation/1.26/plexus-interpolation-1.26.jar
urls[2] = file:/var/maven/.m2/repository-022/org/codehaus/plexus/plexus-utils/3.5.1/plexus-utils-3.5.1.jar
urls[3] = file:/var/maven/.m2/repository-022/org/apache/maven/shared/maven-filtering/3.3.1/maven-filtering-3.3.1.jar
urls[4] = file:/var/maven/.m2/repository-022/org/sonatype/plexus/plexus-build-api/0.0.7/plexus-build-api-0.0.7.jar
urls[5] = file:/var/maven/.m2/repository-022/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar
urls[6] = file:/var/maven/.m2/repository-022/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar
Number of foreign imports: 1
import: Entry[import from realm ClassRealm[project>pl.com.labaj.autorecord:auto-record-project:3.1.0, parent: ClassRealm[maven.api, parent: null]]]
-----------------------------------------------------
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:150)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:342)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:330)
(...)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils
at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass (SelfFirstStrategy.java:50)
at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass (ClassRealm.java:271)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass (ClassRealm.java:247)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass (ClassRealm.java:239)
Archive /var/maven/.m2/repository-022/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar
exists and org.apache.commons.lang3.StringUtils
class int it.
A record created with builder does not set memoizers as builder call full constructor
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.