Skip to content

Commit

Permalink
Added tests and prepare for release 1.04 afcastano#16
Browse files Browse the repository at this point in the history
  • Loading branch information
afcastano committed Feb 22, 2017
1 parent c174f74 commit d0297f8
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 29 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
Release 20170223
----------------
* 2017-02-23: Added support for generics.

Release 20170219
----------------
* 2017-02-19: Ignores java beans style if not all properties comply.
Expand Down
2 changes: 1 addition & 1 deletion META-INF/plugin.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<idea-plugin version="2">
<id>com.afcastano.intellij.autovalue</id>
<name>AutoValue plugin</name>
<version>1.0.3</version>
<version>1.0.4</version>
<vendor email="[email protected]" url="https://github.com/afcastano/AutoValuePlugin">AutoValue plugin</vendor>

<description><![CDATA[
Expand Down
Binary file modified dist/AutoValuePlugin.jar
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,7 @@ public PsiClass getBuilderClass() {
}

public PsiMethod newCreateMethodWithBuilder(TargetClassProperties targetClassProperties) {
final PsiMethod method = factory.createMethod("create", getTargetType());
method.getModifierList().setModifierProperty("public", true);
method.getModifierList().setModifierProperty("static", true);
PsiMethod method = PsiMethodUtil.newStaticMethod("create", targetClass, factory);

List<SetterProperties> properties = targetClassProperties.getSettersFromGetters();
for (SetterProperties getter : properties) {
Expand All @@ -119,7 +117,15 @@ public PsiMethod newCreateMethodWithBuilder(TargetClassProperties targetClassPro
builderChain = builderChain + "." + property.getName() + "(" + property.getParameterName() + ")\n";
}

String returnStatementText = "return builder()\n" + builderChain + ".build();";

String builderFactoryName = "builder";

if (targetClass.hasTypeParameters()) {
String typeParams = PsiClassUtil.getTypeParameterString(targetClass.getTypeParameters());
builderFactoryName = targetClass.getName() + "." + typeParams + "builder";
}

String returnStatementText = "return " + builderFactoryName + "()\n" + builderChain + ".build();";

PsiStatement returnStatement = factory.createStatementFromText(returnStatementText, getTargetClass());

Expand All @@ -130,14 +136,7 @@ public PsiMethod newCreateMethodWithBuilder(TargetClassProperties targetClassPro

public PsiMethod newCreateMethodWhenNoBuilder(TargetClassProperties targetClassProperties) {

String targetClassName = PsiClassUtil.getClassName(targetClass);
String builderTypeParameters = PsiClassUtil.getTypeParameterString(targetClass.getTypeParameters());
String methodText = builderTypeParameters + " " + targetClassName + " create(){}";

PsiMethod method = factory.createMethodFromText(methodText.trim(), null);

method.getModifierList().setModifierProperty("public", true);
method.getModifierList().setModifierProperty("static", true);
PsiMethod method = PsiMethodUtil.newStaticMethod("create", targetClass, factory);

ArrayList<String> paramNames = new ArrayList<>();
for (SetterProperties properties : targetClassProperties.getSettersFromGetters()) {
Expand All @@ -159,7 +158,7 @@ public PsiMethod newCreateMethodWhenNoBuilder(TargetClassProperties targetClassP
paramList = paramList.substring(0, paramList.length() - 2);
}

String returnStatementText = "return new " + getAutoValueClassName() + "(" + paramList + ");";
String returnStatementText = "return new " + getAutoValueClassName(false) + "(" + paramList + ");";

PsiStatement returnStatement = factory.createStatementFromText(returnStatementText, getTargetClass());

Expand Down Expand Up @@ -201,16 +200,16 @@ public PsiMethod getBuildMethod() {
}

public PsiMethod newBuilderFactoryMethod() {
String builderName = PsiClassUtil.getClassName(getBuilderClass());
String builderTypeParameters = PsiClassUtil.getTypeParameterString(getBuilderClass().getTypeParameters());
String methodText = builderTypeParameters + " " + builderName + " builder(){}";
PsiMethod builderMethod = PsiMethodUtil.newStaticMethod("builder", getBuilderClass(), factory);

String autoValueClassName = getAutoValueClassName(true);
String builderPart = ".Builder();";

PsiMethod builderMethod = factory.createMethodFromText(methodText.trim(), null);
builderMethod.getModifierList().setModifierProperty("public", true);
builderMethod.getModifierList().setModifierProperty("static", true);
if(getBuilderClass().hasTypeParameters()) {
builderPart = ".Builder<>();";
}

String autoValueClassName = getAutoValueClassName();
String returnStatementText = "return new " + autoValueClassName + ".Builder();";
String returnStatementText = "return new " + autoValueClassName + builderPart;

PsiStatement returnStatement = factory.createStatementFromText(returnStatementText, getTargetClass());

Expand All @@ -219,14 +218,19 @@ public PsiMethod newBuilderFactoryMethod() {
}

@NotNull
private String getAutoValueClassName() {
private String getAutoValueClassName(boolean useAsQualifier) {
String generatedName = "";

for (PsiClass parent : PsiClassUtil.findAllParents(getTargetClass())) {
generatedName = generatedName + parent.getName() + "_";
}

generatedName = generatedName + getTargetClass().getName();
if(getTargetClass().hasTypeParameters() && !useAsQualifier) {
generatedName = generatedName + getTargetClass().getName() + "<>";
} else {
generatedName = generatedName + getTargetClass().getName();
}


String autoValueAnnotationName = StringUtil.getShortName(autoValueAnnotation.getQualifiedName());
return autoValueAnnotationName + "_" + generatedName;
Expand Down
13 changes: 11 additions & 2 deletions src/com/afcastano/intellij/autovalue/util/PsiMethodUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@

import com.afcastano.intellij.autovalue.generator.AutoValueFactory;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.ImmutableList;

Expand Down Expand Up @@ -91,4 +89,15 @@ public static List<PsiMethod> removeMethodByName(String name, List<PsiMethod> me
return abstractGetters;
}

public static PsiMethod newStaticMethod(String methodName, PsiClass returnClass, PsiElementFactory factory) {
String returnTypeName = PsiClassUtil.getClassName(returnClass);
String returnTypeParameters = PsiClassUtil.getTypeParameterString(returnClass.getTypeParameters());
String methodText = returnTypeParameters + " " + returnTypeName + " " + methodName + "(){}";

PsiMethod method = factory.createMethodFromText(methodText.trim(), null);
method.getModifierList().setModifierProperty("public", true);
method.getModifierList().setModifierProperty("static", true);
return method;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ public void testGenerateBuilderWhenCreateExists() {
}

public void testGenerateBuilder_WithGenerics() {
utils.runUpdateMethodsActions("generatebuilder/generics/Test_expected.java",
utils.runGenerateBuilderActions("generatebuilder/generics/Test_expected.java",
"generatebuilder/generics/Test.java",
AUTOVALUE);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,13 +130,13 @@ public void testGenerateBuilderWithInterfaceIgnoringBlacklisted() {
}

public void testGenerateCreateMethodWhenBuilderExists_WithGenerics() {
utils.runUpdateMethodsActions("generatecreatemethod/genericsBuilderExists/Test_expected.java",
utils.runGenerateCreateMethodActions("generatecreatemethod/genericsBuilderExists/Test_expected.java",
"generatecreatemethod/genericsBuilderExists/Test.java",
AUTOVALUE);
}

public void testGenerateCreateMethod_WithGenerics() {
utils.runUpdateMethodsActions("generatecreatemethod/generics/Test_expected.java",
utils.runGenerateCreateMethodActions("generatecreatemethod/generics/Test_expected.java",
"generatecreatemethod/generics/Test.java",
AUTOVALUE);
}
Expand Down
13 changes: 13 additions & 0 deletions testData/generatecreatemethod/genericsBuilderExists/Test.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,17 @@ public abstract class GenericsTestFile<T1, T2> {
<caret>
public abstract T1 value();
public abstract T2 value2();

public static <T1, T2> Builder<T1, T2> builder() {
return new AutoValue_GenericsTestFile.Builder<>();
}

@AutoValue.Builder
public abstract static class Builder<T1, T2> {
public abstract Builder<T1, T2> value(T1 value);

public abstract Builder<T1, T2> value2(T2 value2);

public abstract GenericsTestFile<T1, T2> build();
}
}

0 comments on commit d0297f8

Please sign in to comment.