Skip to content

Commit

Permalink
#433 Builder.Include to include constructor and factory builders from
Browse files Browse the repository at this point in the history
external classes
  • Loading branch information
elucash committed Aug 24, 2016
1 parent fbcab6b commit 6fc64bf
Show file tree
Hide file tree
Showing 20 changed files with 226 additions and 76 deletions.
6 changes: 6 additions & 0 deletions builder/src/org/immutables/builder/Builder.java
Expand Up @@ -78,6 +78,12 @@
@Target(ElementType.CONSTRUCTOR) @Target(ElementType.CONSTRUCTOR)
public @interface Constructor {} public @interface Constructor {}


@Documented
@Target({ElementType.TYPE, ElementType.PACKAGE})
public @interface Include {
Class<?>[] value();
}

/** /**
* Factory method parameter might be turned into builder parameter using this annotation. * Factory method parameter might be turned into builder parameter using this annotation.
* *
Expand Down
30 changes: 30 additions & 0 deletions builder/test/org/immutables/builder/fixture/Externals.java
@@ -0,0 +1,30 @@
/*
Copyright 2016 Immutables Authors and Contributors
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.
*/
package org.immutables.builder.fixture;

import org.immutables.builder.Builder;
import org.immutables.builder.fixture.external.ConsClass;

@Builder.Include(ConsClass.class)
public class Externals {
void use() {
ConsClassBuilder consBuilder = new ConsClassBuilder();
consBuilder.c("c").d(true).build();

CreateConsClassBuilder createBuilder = new CreateConsClassBuilder();
createBuilder.a(1).b(2).build();
}
}
2 changes: 1 addition & 1 deletion builder/test/org/immutables/builder/fixture/Pogo.java
Expand Up @@ -30,7 +30,7 @@ public Pogo(@Builder.Parameter int a, String b, @Builder.Switch RetentionPolicy
this.policy = policy; this.policy = policy;
} }


public static void main(String... args) { void use() {
Pogo pogo = new PogoBuilder(1) Pogo pogo = new PogoBuilder(1)
.b("a") .b("a")
.runtimePolicy() .runtimePolicy()
Expand Down
Expand Up @@ -13,19 +13,18 @@
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package org.immutables.cases; package org.immutables.builder.fixture.external;


import java.lang.annotation.ElementType; public class ConsClass {
import java.lang.annotation.Target; final String c;
final boolean d;


/** public ConsClass(String c, boolean d) {
* Umbrella annotation which groups nested annotation for generation of visitor-like constructs for this.c = c;
* ADT-like case classes. this.d = d;
*/ }
@Target({})
public @interface Cases {
@Target({ElementType.PACKAGE, ElementType.TYPE})
public @interface Chain {


public static String createConsClass(int a, int b) {
return "CONS" + a + ":" + b;
} }
} }
1 change: 1 addition & 0 deletions generator-processor/pom.xml
Expand Up @@ -93,6 +93,7 @@


<artifactSet> <artifactSet>
<includes> <includes>
<include>org.immutables:cases</include>
<include>org.immutables:generator</include> <include>org.immutables:generator</include>
<include>org.immutables:generator-processor</include> <include>org.immutables:generator-processor</include>
<include>org.parboiled:parboiled-java</include> <include>org.parboiled:parboiled-java</include>
Expand Down
Expand Up @@ -15,7 +15,6 @@
*/ */
package org.immutables.generator; package org.immutables.generator;


import com.google.common.base.CharMatcher;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Joiner; import com.google.common.base.Joiner;
import com.google.common.collect.HashMultimap; import com.google.common.collect.HashMultimap;
Expand Down
4 changes: 2 additions & 2 deletions pom.xml
Expand Up @@ -52,7 +52,7 @@
<module>value-processor</module> <module>value-processor</module>
<module>value-fixture</module> <module>value-fixture</module>
<module>serial</module> <module>serial</module>
<module>cases</module> <module>trees</module>
<module>encode</module> <module>encode</module>
</modules> </modules>


Expand Down Expand Up @@ -100,7 +100,7 @@
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- artifacts of retro version used for self-bootstrap complilation --> <!-- artifacts of retro version used for self-bootstrap complilation -->
<retro.version>2.2.10</retro.version> <retro.version>2.2.12</retro.version>
</properties> </properties>


<build> <build>
Expand Down
22 changes: 2 additions & 20 deletions cases/pom.xml → trees/pom.xml
Expand Up @@ -21,10 +21,10 @@
<groupId>org.immutables</groupId> <groupId>org.immutables</groupId>
<version>2.2.13-SNAPSHOT</version> <version>2.2.13-SNAPSHOT</version>
</parent> </parent>
<artifactId>cases</artifactId> <artifactId>trees</artifactId>


<name>${project.groupId}.${project.artifactId}</name> <name>${project.groupId}.${project.artifactId}</name>
<description>Experimental and incomplete stuff goes here.</description> <description>Stuff related to immutable object trees, including parboiled as and transformers.</description>


<dependencies> <dependencies>
<!-- it's better have just 'value' dep, but due to some maven 3.3.1 bug, <!-- it's better have just 'value' dep, but due to some maven 3.3.1 bug,
Expand Down Expand Up @@ -66,25 +66,7 @@
<version>${project.version}</version> <version>${project.version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>com.atlassian.fugue</groupId>
<artifactId>fugue</artifactId>
<version>2.6.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.atlassian.fugue</groupId>
<artifactId>fugue</artifactId>
<version>3.0.0</version>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<url>http://repo.spring.io/libs-milestone/</url>
</repository>
</repositories>
<profiles> <profiles>
<profile> <profile>
<id>lint-javadoc</id> <id>lint-javadoc</id>
Expand Down
File renamed without changes.
Expand Up @@ -15,7 +15,6 @@
*/ */
package org.immutables.trees.ast; package org.immutables.trees.ast;


import com.atlassian.fugue.Option;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import java.util.List; import java.util.List;
import org.immutables.trees.Trees; import org.immutables.trees.Trees;
Expand Down Expand Up @@ -49,10 +48,6 @@ interface Operator extends Expression {


Optional<String> position(); Optional<String> position();


Option<String> fugue2Option();

io.atlassian.fugue.Option<String> fugue3Option();

enum Kind { enum Kind {
PLUS, PLUS,
MINUS MINUS
Expand Down
Expand Up @@ -15,6 +15,7 @@
*/ */
package org.immutables.value.processor; package org.immutables.value.processor;


import org.immutables.value.processor.meta.FIncludeMirror;
import org.immutables.value.processor.meta.FConstructorMirror; import org.immutables.value.processor.meta.FConstructorMirror;
import com.google.common.collect.FluentIterable; import com.google.common.collect.FluentIterable;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
Expand All @@ -40,7 +41,8 @@
ModifiableMirror.QUALIFIED_NAME, ModifiableMirror.QUALIFIED_NAME,
ValueUmbrellaMirror.QUALIFIED_NAME, ValueUmbrellaMirror.QUALIFIED_NAME,
FactoryMirror.QUALIFIED_NAME, FactoryMirror.QUALIFIED_NAME,
FConstructorMirror.QUALIFIED_NAME FConstructorMirror.QUALIFIED_NAME,
FIncludeMirror.QUALIFIED_NAME
}) })
public final class Processor extends AbstractGenerator { public final class Processor extends AbstractGenerator {
@Override @Override
Expand Down
Expand Up @@ -26,6 +26,11 @@ private BuilderMirrors() {}
@Mirror.Annotation("org.immutables.builder.Builder.Constructor") @Mirror.Annotation("org.immutables.builder.Builder.Constructor")
public @interface FConstructor {} public @interface FConstructor {}


@Mirror.Annotation("org.immutables.builder.Builder.Include")
public @interface FInclude {
Class<?>[] value();
}

@Mirror.Annotation("org.immutables.builder.Builder.Parameter") @Mirror.Annotation("org.immutables.builder.Builder.Parameter")
public @interface FParameter {} public @interface FParameter {}


Expand Down
Expand Up @@ -54,7 +54,7 @@ public abstract class Constitution {
@Value.Lazy @Value.Lazy
public Generics generics() { public Generics generics() {
return new Generics(protoclass(), return new Generics(protoclass(),
protoclass().kind() == Kind.DEFINED_CONSTRUCTOR protoclass().kind().isConstructor()
? protoclass().sourceElement().getEnclosingElement() ? protoclass().sourceElement().getEnclosingElement()
: protoclass().sourceElement()); : protoclass().sourceElement());
} }
Expand Down Expand Up @@ -169,13 +169,16 @@ public NameForms typeValue() {
: typeImmutable(); : typeImmutable();
} }
if (isFactory()) { if (isFactory()) {
if (protoclass().kind() == Kind.DEFINED_CONSTRUCTOR) {
if (protoclass().kind().isConstructor()) {
TypeElement enclosingType = (TypeElement) protoclass().sourceElement().getEnclosingElement();

return ImmutableConstitution.NameForms.builder() return ImmutableConstitution.NameForms.builder()
.simple(protoclass().declaringType().get().element().getSimpleName().toString()) .simple(enclosingType.getSimpleName().toString())
.relativeRaw(protoclass().declaringType().get().name()) .relativeRaw(enclosingType.getQualifiedName().toString())
.genericArgs(generics().args()) .genericArgs(generics().args())
.relativeAlreadyQualified(true) .relativeAlreadyQualified(true)
.packageOf(implementationPackage()) .packageOf(NA_ERROR)
.visibility(protoclass().visibility()) .visibility(protoclass().visibility())
.build(); .build();
} }
Expand Down Expand Up @@ -235,7 +238,7 @@ public boolean hasEnclosingNonvalue() {
*/ */
@Value.Lazy @Value.Lazy
public NameForms typeAbstract() { public NameForms typeAbstract() {
if (protoclass().kind() == Kind.DEFINED_CONSTRUCTOR) { if (protoclass().kind().isConstructor()) {
return typeValue(); return typeValue();
} }


Expand Down Expand Up @@ -373,16 +376,18 @@ private boolean isConstantNamingEquals(Naming naming, String name) {
@Value.Lazy @Value.Lazy
public AppliedNameForms factoryOf() { public AppliedNameForms factoryOf() {
if (isFactory()) { if (isFactory()) {
String invoke = protoclass().kind() == Kind.DEFINED_CONSTRUCTOR TypeElement enclosingType = (TypeElement) protoclass().sourceElement().getEnclosingElement();

String invoke = protoclass().kind().isConstructor()
? "new" ? "new"
: protoclass().sourceElement().getSimpleName().toString(); : protoclass().sourceElement().getSimpleName().toString();


return ImmutableConstitution.NameForms.builder() return ImmutableConstitution.NameForms.builder()
.simple(protoclass().declaringType().get().element().getSimpleName().toString()) .simple(enclosingType.getSimpleName().toString())
.relativeRaw(protoclass().declaringType().get().name()) .relativeRaw(enclosingType.getQualifiedName().toString())
.genericArgs(generics().args()) .genericArgs(generics().args())
.relativeAlreadyQualified(true) .relativeAlreadyQualified(true)
.packageOf(implementationPackage()) .packageOf(NA_ERROR)
.visibility(protoclass().visibility()) .visibility(protoclass().visibility())
.build() .build()
.applied(invoke); .applied(invoke);
Expand Down

0 comments on commit 6fc64bf

Please sign in to comment.