Skip to content

Commit

Permalink
fixed #81 @builder: buildMethod should have same throws-list as annot…
Browse files Browse the repository at this point in the history
…ated static method
  • Loading branch information
Michail Plushnikov committed Mar 9, 2015
1 parent e061975 commit 9db788c
Show file tree
Hide file tree
Showing 10 changed files with 167 additions and 7 deletions.
Expand Up @@ -4,6 +4,7 @@
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiClassType;
import com.intellij.psi.PsiCodeBlock;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiManager;
Expand Down Expand Up @@ -425,11 +426,27 @@ private PsiMethod createBuildMethod(@NotNull PsiClass parentClass, @Nullable Psi
.withModifier(PsiModifier.PUBLIC)
.withBody(psiCodeBlock);

if (null == psiMethod) {
final Collection<PsiMethod> classConstructors = PsiClassUtil.collectClassConstructorIntern(parentClass);
if (!classConstructors.isEmpty()) {
final PsiMethod constructor = classConstructors.iterator().next();
addExceptions(methodBuilder, constructor);
}
} else {
addExceptions(methodBuilder, psiMethod);
}

addTypeParameters(builderClass, psiMethod, methodBuilder);

return methodBuilder;
}

private void addExceptions(LombokLightMethodBuilder methodBuilder, PsiMethod psiMethod) {
for (PsiClassType psiClassType : psiMethod.getThrowsList().getReferencedTypes()) {
methodBuilder.withException(psiClassType);
}
}

private void addTypeParameters(PsiClass builderClass, PsiMethod psiMethod, LombokLightMethodBuilder methodBuilder) {
final PsiTypeParameter[] psiTypeParameters;
if (null == psiMethod) {
Expand Down
1 change: 1 addition & 0 deletions lombok-plugin/src/main/resources/META-INF/plugin.xml
Expand Up @@ -199,6 +199,7 @@
<ul>
<li>0.9.2
<ol>
<li>Fixed #81: @Builder: buildMethod should have same throws-list as annotated static method</li>
<li>Fixed #82: Abstract Class + @Delegate</li>
<li>Fixed #83: Getting inconvertible types error assigning new builder instance</li>
</ol>
Expand Down
41 changes: 41 additions & 0 deletions lombok-plugin/src/test/data/after/BuilderConstructorException.java
@@ -0,0 +1,41 @@
class Exception {
}
public class BuilderConstructorException {

private int i;

public BuilderConstructorException(int i) throws Exception {
System.out.println("sss");
}

public static void main(String[] args) {
try {
builder().i(2).build();
} catch (Exception ignore) {
}
}

public static BuilderConstructorExceptionBuilder builder() {
return new BuilderConstructorExceptionBuilder();
}

public static class BuilderConstructorExceptionBuilder {
private int i;

BuilderConstructorExceptionBuilder() {
}

public BuilderConstructorExceptionBuilder i(int i) {
this.i = i;
return this;
}

public BuilderConstructorException build() throws Exception {
return new BuilderConstructorException(i);
}

public String toString() {
return "BuilderConstructorException.BuilderConstructorExceptionBuilder(i=" + this.i + ")";
}
}
}
40 changes: 40 additions & 0 deletions lombok-plugin/src/test/data/after/BuilderMethodException.java
@@ -0,0 +1,40 @@
class Exception {
}

public class BuilderMethodException {

private static void foo(int i) throws Exception {
System.out.println("sss");
}

public static void main(String[] args) {
try {
builder().i(2).build();
} catch (Exception ignore) {
}
}

public static VoidBuilder builder() {
return new VoidBuilder();
}

public static class VoidBuilder {
private int i;

VoidBuilder() {
}

public VoidBuilder i(int i) {
this.i = i;
return this;
}

public void build() throws Exception {
foo(i);
}

public String toString() {
return "BuilderMethodException.VoidBuilder(i=" + this.i + ")";
}
}
}
@@ -0,0 +1,19 @@
class Exception {
}

@lombok.Builder
public class BuilderConstructorException {

private int i;

public BuilderConstructorException(int i) throws Exception {
System.out.println("sss");
}

public static void main(String[] args) {
try {
builder().i(2).build();
} catch (Exception ignore) {
}
}
}
17 changes: 17 additions & 0 deletions lombok-plugin/src/test/data/before/BuilderMethodException.java
@@ -0,0 +1,17 @@
class Exception {
}

public class BuilderMethodException {
@lombok.Builder
private static void foo(int i) throws Exception {
System.out.println("sss");
}

public static void main(String[] args) {
try {
builder().i(2).build();
} catch (Exception ignore) {
}
}
}

Expand Up @@ -72,8 +72,8 @@ protected void doTest(String fileName) throws IOException {
}

private void compareClasses(PsiClass[] beforeClasses, PsiClass[] afterClasses) {
LOG.info("Before innerclasses: " + Arrays.toString(beforeClasses));
LOG.info("After innerclasses: " + Arrays.toString(afterClasses));
LOG.info("Before classes: " + Arrays.toString(beforeClasses));
LOG.info("After classes: " + Arrays.toString(afterClasses));

assertEquals("Class counts are different", afterClasses.length, beforeClasses.length);

Expand Down
Expand Up @@ -43,4 +43,13 @@ public void testBuilderPredefined() throws IOException {
public void testBuilderWithExistingBuilderClass() throws IOException {
doTest();
}

public void testBuilderConstructorException() throws IOException {
doTest();
}

// TODO fixme
// public void testBuilderMethodException() throws IOException {
// doTest();
// }
}
@@ -0,0 +1,18 @@
package de.plushnikov.builder;

@lombok.Builder
public class BuilderConstructorException {

private int i;

public BuilderConstructorException(int i) throws Exception {
System.out.println("sss");
}

public static void main(String[] args) {
try {
builder().i(2).build();
} catch (Exception ignore) {
}
}
}
@@ -1,17 +1,15 @@
package de.plushnikov.builder;

import lombok.Builder;

public class BuilderExceptions {
@Builder
public class BuilderMethodException {
@lombok.Builder
private static void foo(int i) throws Exception {
System.out.println("sss");
}

public static void main(String[] args) {
try {
builder().i(2).build();
} catch (Exception e) {
} catch (Exception ignore) {
}
}
}

0 comments on commit 9db788c

Please sign in to comment.