Skip to content

Commit

Permalink
refactored annotation processing, more use of IntelliJ own util classes
Browse files Browse the repository at this point in the history
java.lang.AssertionError: Stub and PSI element type mismatch #100
Stub and PSI element type mismatch #72
  • Loading branch information
Michail Plushnikov committed Apr 28, 2015
1 parent b3fed14 commit 62b42c1
Show file tree
Hide file tree
Showing 19 changed files with 77 additions and 150 deletions.
Expand Up @@ -6,21 +6,15 @@
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiIdentifier;
import com.intellij.psi.PsiModifierList;
import com.intellij.psi.util.PsiTreeUtil;
import de.plushnikov.intellij.plugin.util.PsiAnnotationUtil;
import lombok.Getter;
import lombok.LazyGetter;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class LazyGetterHandler {

private static final String LAZY_GETTER_FQN = LazyGetter.class.getName();
private static final String GETTERN_FQN = Getter.class.getName();
private static final Set<String> ANNOTATION_NAMES = new HashSet<String>(Arrays.asList(Getter.class.getSimpleName(), LazyGetter.class.getSimpleName()));

public static boolean isLazyGetterHandled(HighlightInfo highlightInfo, PsiFile file) {
PsiElement element = file.findElementAt(highlightInfo.getStartOffset());
Expand All @@ -32,18 +26,10 @@ public static boolean isLazyGetterHandled(HighlightInfo highlightInfo, PsiFile f
return false;
}

if (PsiAnnotationUtil.checkAnnotationsSimpleNameExistsIn(field, ANNOTATION_NAMES)) {
final PsiModifierList fieldModifierList = field.getModifierList();
for (PsiAnnotation psiAnnotation : fieldModifierList.getAnnotations()) {
final String qualifiedName = psiAnnotation.getQualifiedName();
if (GETTERN_FQN.equals(qualifiedName)) {
Boolean lazyObj = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "lazy", Boolean.class);
return null != lazyObj && lazyObj;
} else if (LAZY_GETTER_FQN.equals(qualifiedName)) {
return true;
}
}
final PsiAnnotation getterAnnotation = PsiAnnotationUtil.findAnnotation(field, GETTERN_FQN);
if (null != getterAnnotation) {
return PsiAnnotationUtil.getBooleanAnnotationValue(getterAnnotation, "lazy", false);
}
return false;
return PsiAnnotationUtil.isAnnotatedWith(field, LAZY_GETTER_FQN);
}
}
Expand Up @@ -116,7 +116,7 @@ protected void filterToleratedElements(@NotNull Collection<? extends PsiModifier
public static boolean readAnnotationOrConfigProperty(@NotNull PsiAnnotation psiAnnotation, @NotNull PsiClass psiClass,
@NotNull String annotationParameter, @NotNull ConfigKeys configKeys) {
final boolean result;
final Boolean declaredAnnotationValue = PsiAnnotationUtil.getDeclaredAnnotationValue(psiAnnotation, annotationParameter, Boolean.class);
final Boolean declaredAnnotationValue = PsiAnnotationUtil.getDeclaredBooleanAnnotationValue(psiAnnotation, annotationParameter);
if (null == declaredAnnotationValue) {
result = ConfigDiscovery.getInstance().getBooleanLombokConfigProperty(configKeys, psiClass);
} else {
Expand Down
Expand Up @@ -43,7 +43,7 @@ public Collection<LombokProblem> verifyAnnotation(@NotNull PsiAnnotation psiAnno

PsiLocalVariable psiVariable = PsiTreeUtil.getParentOfType(psiAnnotation, PsiLocalVariable.class);
if (null != psiVariable) {
final String cleanupName = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "value", String.class);
final String cleanupName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "value");

if (StringUtil.isEmptyOrSpaces(cleanupName)) {
problemNewBuilder.addError("'@Cleanup': value cannot be the empty string");
Expand Down
Expand Up @@ -51,7 +51,7 @@ public Collection<LombokProblem> verifyAnnotation(@NotNull PsiAnnotation psiAnno
);
}

final String lockFieldName = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "value", String.class);
final String lockFieldName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "value");
if (StringUtil.isNotEmpty(lockFieldName)) {
final PsiClass containingClass = psiMethod.getContainingClass();

Expand Down
Expand Up @@ -84,7 +84,7 @@ public Collection<LombokProblem> verifyAnnotation(@NotNull PsiAnnotation psiAnno
protected abstract void generatePsiElements(@NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation, @NotNull List<? super PsiElement> target);

protected void validateCallSuperParam(PsiAnnotation psiAnnotation, PsiClass psiClass, ProblemBuilder builder, String generatedMethodName) {
Boolean callSuperProperty = PsiAnnotationUtil.getDeclaredAnnotationValue(psiAnnotation, "callSuper", Boolean.class);
Boolean callSuperProperty = PsiAnnotationUtil.getDeclaredBooleanAnnotationValue(psiAnnotation, "callSuper");
if (null == callSuperProperty && PsiClassUtil.hasSuperClass(psiClass)) {
builder.addWarning("Generating " + generatedMethodName + " implementation but without a call to superclass, " +
"even though this class does not extend java.lang.Object." +
Expand Down
Expand Up @@ -83,7 +83,7 @@ protected void generatePsiElements(@NotNull PsiClass psiClass, @NotNull PsiAnnot
if (definedConstructors.isEmpty()) {
final RequiredArgsConstructorProcessor requiredArgsConstructorProcessor = new RequiredArgsConstructorProcessor();

final String staticName = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "staticConstructor", String.class);
final String staticName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "staticConstructor");
final Collection<PsiField> requiredFields = requiredArgsConstructorProcessor.getRequiredFields(psiClass);

if (requiredArgsConstructorProcessor.validateIsConstructorDefined(psiClass, staticName, requiredFields, ProblemEmptyBuilder.getInstance())) {
Expand Down
Expand Up @@ -69,8 +69,8 @@ protected boolean validate(@NotNull PsiAnnotation psiAnnotation, @NotNull PsiCla
}

protected void validateCallSuperParamForObject(PsiAnnotation psiAnnotation, PsiClass psiClass, ProblemBuilder builder) {
Boolean callSuperProperty = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "callSuper", Boolean.class);
if (null != callSuperProperty && callSuperProperty && !PsiClassUtil.hasSuperClass(psiClass)) {
boolean callSuperProperty = PsiAnnotationUtil.getBooleanAnnotationValue(psiAnnotation, "callSuper", false);
if (callSuperProperty && !PsiClassUtil.hasSuperClass(psiClass)) {
builder.addError("Generating equals/hashCode with a supercall to java.lang.Object is pointless.",
PsiQuickFixFactory.createChangeAnnotationParameterFix(psiAnnotation, "callSuper", "false"),
PsiQuickFixFactory.createChangeAnnotationParameterFix(psiAnnotation, "callSuper", null));
Expand Down Expand Up @@ -174,7 +174,7 @@ private PsiMethod createCanEqualMethod(@NotNull PsiClass psiClass, @NotNull PsiE
}

private String createEqualsBlockString(@NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation, boolean hasCanEqualMethod) {
final boolean callSuper = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "callSuper", Boolean.class, Boolean.FALSE);
final boolean callSuper = PsiAnnotationUtil.getBooleanAnnotationValue(psiAnnotation, "callSuper", false);
final boolean doNotUseGetters = readAnnotationOrConfigProperty(psiAnnotation, psiClass, "doNotUseGetters", ConfigKeys.EQUALSANDHASHCODE_DO_NOT_USE_GETTERS);

final String psiClassName = psiClass.getName();
Expand Down Expand Up @@ -233,8 +233,8 @@ private String createEqualsBlockString(@NotNull PsiClass psiClass, @NotNull PsiA
private static final int PRIME_FOR_FALSE = 97;

private String createHashcodeBlockString(@NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation) {
final boolean callSuper = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "callSuper", Boolean.class, Boolean.FALSE);
final boolean doNotUseGetters = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "doNotUseGetters", Boolean.class, Boolean.FALSE);
final boolean callSuper = PsiAnnotationUtil.getBooleanAnnotationValue(psiAnnotation, "callSuper", false);
final boolean doNotUseGetters = PsiAnnotationUtil.getBooleanAnnotationValue(psiAnnotation, "doNotUseGetters", false);

final StringBuilder builder = StringBuilderSpinAllocator.alloc();
try {
Expand Down
Expand Up @@ -39,17 +39,16 @@ public GetterProcessor() {

@Override
protected boolean validate(@NotNull PsiAnnotation psiAnnotation, @NotNull PsiClass psiClass, @NotNull ProblemBuilder builder) {
final boolean result = validateAnnotationOnRigthType(psiClass, builder) && validateVisibility(psiAnnotation);
final boolean result = validateAnnotationOnRightType(psiClass, builder) && validateVisibility(psiAnnotation);

final Boolean lazy = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "lazy", Boolean.class);
if (null != lazy && lazy) {
if (PsiAnnotationUtil.getBooleanAnnotationValue(psiAnnotation, "lazy", false)) {
builder.addWarning("'lazy' is not supported for @Getter on a type");
}

return result;
}

protected boolean validateAnnotationOnRigthType(@NotNull PsiClass psiClass, @NotNull ProblemBuilder builder) {
protected boolean validateAnnotationOnRightType(@NotNull PsiClass psiClass, @NotNull ProblemBuilder builder) {
boolean result = true;
if (psiClass.isAnnotationType() || psiClass.isInterface()) {
builder.addError("'@Getter' is only supported on a class, enum or field type");
Expand Down
Expand Up @@ -115,7 +115,7 @@ public PsiMethod createToStringMethod(@NotNull PsiClass psiClass, @NotNull Colle
}

private String createParamString(@NotNull PsiClass psiClass, @NotNull Collection<PsiField> psiFields, @NotNull PsiAnnotation psiAnnotation) {
final boolean callSuper = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "callSuper", Boolean.class, Boolean.FALSE);
final boolean callSuper = PsiAnnotationUtil.getBooleanAnnotationValue(psiAnnotation, "callSuper", false);
final boolean doNotUseGetters = readAnnotationOrConfigProperty(psiAnnotation, psiClass, "doNotUseGetters", ConfigKeys.TOSTRING_DO_NOT_USE_GETTERS);
final boolean includeFieldNames = readAnnotationOrConfigProperty(psiAnnotation, psiClass, "includeFieldNames", ConfigKeys.TOSTRING_INCLUDE_FIELD_NAMES);

Expand Down
Expand Up @@ -92,7 +92,7 @@ protected void generatePsiElements(@NotNull PsiClass psiClass, @NotNull PsiAnnot
if (definedConstructors.isEmpty()) {
final AllArgsConstructorProcessor allArgsConstructorProcessor = new AllArgsConstructorProcessor();

final String staticName = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "staticConstructor", String.class);
final String staticName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "staticConstructor");
final Collection<PsiField> requiredFields = allArgsConstructorProcessor.getAllFields(psiClass);

if (allArgsConstructorProcessor.validateIsConstructorDefined(psiClass, staticName, requiredFields, ProblemEmptyBuilder.getInstance())) {
Expand Down
Expand Up @@ -165,7 +165,7 @@ protected Collection<PsiMethod> createConstructorMethod(@NotNull PsiClass psiCla
}

protected String getStaticConstructorName(@NotNull PsiAnnotation psiAnnotation) {
return PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "staticName", String.class);
return PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "staticName");
}

protected boolean isStaticConstructor(@Nullable String staticName) {
Expand Down
Expand Up @@ -102,7 +102,7 @@ private LombokLightFieldBuilder createLoggerField(@NotNull PsiClass psiClass, @N
@NotNull
private String createLoggerInitializeParameter(@NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation) {
final String loggerInitializerParameter;
final String topic = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "topic", String.class);
final String topic = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "topic");
if (StringUtil.isEmptyOrSpaces(topic)) {
loggerInitializerParameter = String.format(loggerCategory, psiClass.getName());
} else {
Expand Down
Expand Up @@ -63,7 +63,7 @@ private static AccessorsInfo buildFromAnnotation(PsiAnnotation accessorsAnnotati
final boolean isFluent = AbstractProcessor.readAnnotationOrConfigProperty(accessorsAnnotation, psiClass, "fluent", ConfigKeys.ACCESSORS_FLUENT);
final boolean isChained = AbstractProcessor.readAnnotationOrConfigProperty(accessorsAnnotation, psiClass, "chain", ConfigKeys.ACCESSORS_CHAIN);

Boolean chainDeclaredValue = PsiAnnotationUtil.getDeclaredAnnotationValue(accessorsAnnotation, "chain", Boolean.class);
Boolean chainDeclaredValue = PsiAnnotationUtil.getDeclaredBooleanAnnotationValue(accessorsAnnotation, "chain");
Collection<String> prefixes = PsiAnnotationUtil.getAnnotationValues(accessorsAnnotation, "prefix", String.class);

final boolean dontUseIsPrefix = ConfigDiscovery.getInstance().getBooleanLombokConfigProperty(ConfigKeys.GETTER_NO_IS_PREFIX, psiClass);
Expand Down
Expand Up @@ -84,8 +84,7 @@ protected boolean validate(@NotNull PsiAnnotation psiAnnotation, @NotNull PsiFie
}

protected boolean isLazyGetter(@NotNull PsiAnnotation psiAnnotation) {
final Boolean lazyObj = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, "lazy", Boolean.class);
return null != lazyObj && lazyObj;
return PsiAnnotationUtil.getBooleanAnnotationValue(psiAnnotation, "lazy", false);
}

protected boolean validateExistingMethods(@NotNull PsiField psiField, @NotNull ProblemBuilder builder) {
Expand Down
Expand Up @@ -166,19 +166,19 @@ public PsiType getBuilderType(@NotNull PsiClass psiClass, @Nullable PsiMethod ps

@NotNull
public static String getBuildMethodName(@NotNull PsiAnnotation psiAnnotation) {
final String buildMethodName = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, ANNOTATION_BUILD_METHOD_NAME, String.class);
final String buildMethodName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, ANNOTATION_BUILD_METHOD_NAME);
return StringUtil.isEmptyOrSpaces(buildMethodName) ? BUILD_METHOD_NAME : buildMethodName;
}

@NotNull
public static String getBuilderMethodName(@NotNull PsiAnnotation psiAnnotation) {
final String builderMethodName = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, ANNOTATION_BUILDER_METHOD_NAME, String.class);
final String builderMethodName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, ANNOTATION_BUILDER_METHOD_NAME);
return StringUtil.isEmptyOrSpaces(builderMethodName) ? BUILDER_METHOD_NAME : builderMethodName;
}

@NotNull
public String getBuilderClassName(@NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation, @NotNull PsiType psiBuilderType) {
String builderClassName = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, ANNOTATION_BUILDER_CLASS_NAME, String.class);
String builderClassName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, ANNOTATION_BUILDER_CLASS_NAME);
if (StringUtil.isEmptyOrSpaces(builderClassName)) {
if (PsiType.VOID.equals(psiBuilderType)) {
return StringUtil.capitalize(PsiType.VOID.getCanonicalText()) + BUILDER_CLASS_NAME;
Expand Down Expand Up @@ -476,8 +476,7 @@ private String joinParameters(PsiField[] psiFields) {
public static final String SETTER_PREFIX = "set";

private boolean isFluentBuilder(@NotNull PsiAnnotation psiAnnotation) {
Boolean fluentAnnotationValue = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, ANNOTATION_FLUENT, Boolean.class);
return fluentAnnotationValue != null ? fluentAnnotationValue : true;
return PsiAnnotationUtil.getBooleanAnnotationValue(psiAnnotation, ANNOTATION_FLUENT, true);
}

@NotNull
Expand All @@ -487,8 +486,7 @@ private String createSetterName(@NotNull String fieldName, boolean isFluent) {

@NotNull
private PsiType createSetterReturnType(@NotNull PsiAnnotation psiAnnotation, @NotNull PsiType fieldType) {
Boolean chainAnnotationValue = PsiAnnotationUtil.getAnnotationValue(psiAnnotation, ANNOTATION_CHAIN, Boolean.class);
final boolean isChain = chainAnnotationValue != null ? chainAnnotationValue : true;
final boolean isChain = PsiAnnotationUtil.getBooleanAnnotationValue(psiAnnotation, ANNOTATION_CHAIN, true);
return isChain ? fieldType : PsiType.VOID;
}
}
Expand Up @@ -20,36 +20,32 @@ public class LombokProcessorUtil {

@Nullable
public static String getMethodModifier(@NotNull PsiAnnotation psiAnnotation) {
return convertAccessLevelToJavaModifier(getAnnotationValue(psiAnnotation, "value"));
return convertAccessLevelToJavaModifier(PsiAnnotationUtil.getAccessLevelAnnotationValue(psiAnnotation, "value"));
}

@Nullable
public static String getAccessVisibility(@NotNull PsiAnnotation psiAnnotation) {
return convertAccessLevelToJavaModifier(getAnnotationValue(psiAnnotation, "access"));
}

private static String getAnnotationValue(final PsiAnnotation psiAnnotation, final String parameterName) {
return PsiAnnotationUtil.getAnnotationValue(psiAnnotation, parameterName, String.class);
return convertAccessLevelToJavaModifier(PsiAnnotationUtil.getAccessLevelAnnotationValue(psiAnnotation, "access"));
}

@Nullable
private static String convertAccessLevelToJavaModifier(String value) {
if (null == value || value.isEmpty() || value.equals("PUBLIC")) {
private static String convertAccessLevelToJavaModifier(AccessLevel value) {
if (null == value || AccessLevel.PUBLIC.equals(value)) {
return PsiModifier.PUBLIC;
}
if (value.equals("MODULE")) {
if (AccessLevel.MODULE.equals(value)) {
return PsiModifier.PACKAGE_LOCAL;
}
if (value.equals("PROTECTED")) {
if (AccessLevel.PROTECTED.equals(value)) {
return PsiModifier.PROTECTED;
}
if (value.equals("PACKAGE")) {
if (AccessLevel.PACKAGE.equals(value)) {
return PsiModifier.PACKAGE_LOCAL;
}
if (value.equals("PRIVATE")) {
if (AccessLevel.PRIVATE.equals(value)) {
return PsiModifier.PRIVATE;
}
if (value.equals("NONE")) {
if (AccessLevel.NONE.equals(value)) {
return null;
} else {
return null;
Expand Down

0 comments on commit 62b42c1

Please sign in to comment.