Skip to content

Commit

Permalink
optimized some code paths
Browse files Browse the repository at this point in the history
  • Loading branch information
mplushnikov committed Aug 29, 2017
1 parent 2916a68 commit fc9cea8
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import com.intellij.psi.PsiTypeParameterListOwner;
import com.intellij.psi.PsiVariable;
import com.intellij.psi.impl.source.PsiClassReferenceType;
import com.intellij.psi.util.PsiTypesUtil;
import de.plushnikov.intellij.plugin.problem.ProblemBuilder;
import de.plushnikov.intellij.plugin.processor.ShouldGenerateFullCodeBlock;
import de.plushnikov.intellij.plugin.processor.clazz.ToStringProcessor;
Expand Down Expand Up @@ -256,23 +255,19 @@ public String getBuilderClassName(@NotNull PsiClass psiClass, @NotNull PsiAnnota

@NotNull
public String getBuilderClassName(@NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation, @Nullable PsiMethod psiMethod) {
String builderClassName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, ANNOTATION_BUILDER_CLASS_NAME);
if (StringUtil.isEmptyOrSpaces(builderClassName)) {
final PsiClass psiBuilderClass;
if (null != psiMethod && !psiMethod.isConstructor()) {
final PsiType psiMethodReturnType = psiMethod.getReturnType();
if (PsiType.VOID.equals(psiMethodReturnType)) {
return StringUtil.capitalize(PsiType.VOID.getCanonicalText()) + BUILDER_CLASS_NAME;
} else {
final PsiClass psiMethodReturnClass = PsiTypesUtil.getPsiClass(psiMethodReturnType);
psiBuilderClass = null == psiMethodReturnClass ? psiClass : psiMethodReturnClass;
}
} else {
psiBuilderClass = psiClass;
final String builderClassName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, ANNOTATION_BUILDER_CLASS_NAME);
if (!StringUtil.isEmptyOrSpaces(builderClassName)) {
return builderClassName;
}

String rootBuilderClassName = psiClass.getName();
if (null != psiMethod && !psiMethod.isConstructor()) {
final PsiType psiMethodReturnType = psiMethod.getReturnType();
if (null != psiMethodReturnType) {
rootBuilderClassName = PsiNameHelper.getQualifiedClassName(psiMethodReturnType.getPresentableText(), false);
}
return StringUtil.capitalize(psiBuilderClass.getName()) + BUILDER_CLASS_NAME;
}
return builderClassName;
return StringUtil.capitalize(rootBuilderClassName + BUILDER_CLASS_NAME);
}

private boolean hasMethod(@NotNull PsiClass psiClass, String builderMethodName) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.intellij.psi.PsiJavaCodeReferenceElement;
import com.intellij.psi.PsiModifierList;
import com.intellij.psi.PsiModifierListOwner;
import com.intellij.psi.impl.source.SourceJavaCodeReference;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
Expand All @@ -30,13 +31,53 @@ public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModi

@Nullable
public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull final Class<? extends Annotation>... annotationTypes) {
if (annotationTypes.length == 1) {
return findAnnotation(psiModifierListOwner, annotationTypes[0]);
}

final String[] qualifiedNames = new String[annotationTypes.length];
for (int i = 0; i < annotationTypes.length; i++) {
qualifiedNames[i] = annotationTypes[i].getName();
}
return findAnnotationQuick(psiModifierListOwner.getModifierList(), qualifiedNames);
}

@Nullable
private static PsiAnnotation findAnnotationQuick(@Nullable PsiAnnotationOwner annotationOwner, @NotNull String qualifiedName) {
if (annotationOwner == null) {
return null;
}

PsiAnnotation[] annotations = annotationOwner.getAnnotations();
if (annotations.length == 0) {
return null;
}

final String shortName = StringUtil.getShortName(qualifiedName);

for (PsiAnnotation annotation : annotations) {
PsiJavaCodeReferenceElement referenceElement = annotation.getNameReferenceElement();
if (null != referenceElement) {
if (shortName.equals(referenceElement.getReferenceName())) {

if (referenceElement.isQualified() && referenceElement instanceof SourceJavaCodeReference) {
String possibleFullQualifiedName = ((SourceJavaCodeReference) referenceElement).getClassNameText();
if (qualifiedName.equals(possibleFullQualifiedName)) {
return annotation;
}
}

final String annotationQualifiedName = getAndCacheFQN(annotation);
if (qualifiedName.equals(annotationQualifiedName)) {
return annotation;
}
}
}
}

return null;
}

@Nullable
private static PsiAnnotation findAnnotationQuick(@Nullable PsiAnnotationOwner annotationOwner, @NotNull String... qualifiedNames) {
if (annotationOwner == null || qualifiedNames.length == 0) {
Expand All @@ -54,26 +95,41 @@ private static PsiAnnotation findAnnotationQuick(@Nullable PsiAnnotationOwner an
}

for (PsiAnnotation annotation : annotations) {
PsiJavaCodeReferenceElement referenceElement = annotation.getNameReferenceElement();
if (referenceElement != null && ArrayUtil.find(shortNames, referenceElement.getReferenceName()) > -1) {
final PsiJavaCodeReferenceElement referenceElement = annotation.getNameReferenceElement();
if (null != referenceElement) {
if (ArrayUtil.find(shortNames, referenceElement.getReferenceName()) > -1) {

String annotationQualifiedName = annotation.getCopyableUserData(LOMBOK_ANNOTATION_FQN_KEY);
if (null == annotationQualifiedName) {
annotationQualifiedName = annotation.getQualifiedName();
if (null != annotationQualifiedName && annotationQualifiedName.indexOf('.') > -1) {
annotation.putCopyableUserData(LOMBOK_ANNOTATION_FQN_KEY, annotationQualifiedName);
if (referenceElement.isQualified() && referenceElement instanceof SourceJavaCodeReference) {
final String possibleFullQualifiedName = ((SourceJavaCodeReference) referenceElement).getClassNameText();

if (ArrayUtil.find(qualifiedNames, possibleFullQualifiedName) > -1) {
return annotation;
}
}
}

if (ArrayUtil.find(qualifiedNames, annotationQualifiedName) > -1) {
return annotation;
final String annotationQualifiedName = getAndCacheFQN(annotation);
if (ArrayUtil.find(qualifiedNames, annotationQualifiedName) > -1) {
return annotation;
}
}
}
}

return null;
}

@Nullable
private static String getAndCacheFQN(PsiAnnotation annotation) {
String annotationQualifiedName = annotation.getCopyableUserData(LOMBOK_ANNOTATION_FQN_KEY);
if (null == annotationQualifiedName) {
annotationQualifiedName = annotation.getQualifiedName();
if (null != annotationQualifiedName && annotationQualifiedName.indexOf('.') > -1) {
annotation.putCopyableUserData(LOMBOK_ANNOTATION_FQN_KEY, annotationQualifiedName);
}
}
return annotationQualifiedName;
}

public static boolean isAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull final Class<? extends Annotation> annotationType) {
return null != findAnnotation(psiModifierListOwner, annotationType);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,25 +59,35 @@ public void doTest() throws IOException {
}

public void doTest(final boolean lowercaseFirstLetter) throws IOException {
final String fileName = getTestName(lowercaseFirstLetter).replace('$', '/') + ".java";
final String beforeFileName = "before/" + fileName;
final String afterFileName = "after/" + fileName;
doTest(beforeFileName, afterFileName);
doTest(getTestName(lowercaseFirstLetter));
}

protected void doTest(final String beforeFileName, final String afterFileName) throws IOException {
final PsiFile psiDelombokFile = loadToPsiFile(afterFileName);
final PsiFile psiLombokFile = loadToPsiFile(beforeFileName);
public void doTest(String testName) throws IOException {
compareFiles(loadBeforeLombokFile(testName), loadAfterDeLombokFile(testName));
}

protected PsiJavaFile loadBeforeLombokFile(String testName) {
return getPsiJavaFile(testName, "before");
}

protected PsiJavaFile loadAfterDeLombokFile(String testName) {
return getPsiJavaFile(testName, "after");
}

if (!(psiLombokFile instanceof PsiJavaFile) || !(psiDelombokFile instanceof PsiJavaFile)) {
@NotNull
private PsiJavaFile getPsiJavaFile(String testName, String type) {
final String fileName = testName.replace('$', '/') + ".java";
final String beforeFileName = type + "/" + fileName;
final PsiFile psiFile = loadToPsiFile(beforeFileName);
if (!(psiFile instanceof PsiJavaFile)) {
fail("The test file type is not supported");
}
return (PsiJavaFile) psiFile;
}

final PsiJavaFile beforeFile = (PsiJavaFile) psiLombokFile;
final PsiJavaFile afterFile = (PsiJavaFile) psiDelombokFile;

PsiClass[] beforeClasses = beforeFile.getClasses();
PsiClass[] afterClasses = afterFile.getClasses();
protected void compareFiles(PsiJavaFile beforeLombokFile, PsiJavaFile afterDelombokFile) {
PsiClass[] beforeClasses = beforeLombokFile.getClasses();
PsiClass[] afterClasses = afterDelombokFile.getClasses();

compareClasses(beforeClasses, afterClasses);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package de.plushnikov.intellij.plugin.configsystem;

import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiJavaFile;
import de.plushnikov.intellij.plugin.AbstractLombokParsingTestCase;

import java.io.IOException;
Expand All @@ -14,4 +16,15 @@ public void doTest() throws IOException {

doTest(fullFileName, subPath + "/after/" + fileName);
}

protected void doTest(final String beforeFileName, final String afterFileName) throws IOException {
final PsiFile psiDelombokFile = loadToPsiFile(afterFileName);
final PsiFile psiLombokFile = loadToPsiFile(beforeFileName);

if (!(psiLombokFile instanceof PsiJavaFile) || !(psiDelombokFile instanceof PsiJavaFile)) {
fail("The test file type is not supported");
}

compareFiles((PsiJavaFile) psiLombokFile, (PsiJavaFile) psiDelombokFile);
}
}
6 changes: 4 additions & 2 deletions testData/before/builder/BuilderWithToBuilderOnMethod.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import lombok.Builder;

class BuilderWithToBuilderOnMethod<T, K> {
private String one, two;
private T foo;
private K bar;

private int some;

@lombok.Builder(toBuilder = true)
public static <Z> BuilderWithToBuilderOnMethod<Z, String> test(String one, @lombok.Builder.ObtainVia(field = "foo") Z bar) {
@Builder(toBuilder = true)
public static <Z> BuilderWithToBuilderOnMethod<Z, String> test(String one, @Builder.ObtainVia(field = "foo") Z bar) {
return new BuilderWithToBuilderOnMethod<Z, String>();
}
}

0 comments on commit fc9cea8

Please sign in to comment.