[java] adds PsiModifierList.hasModifierProperty() augmentation point (IDEA-153706)

This commit is contained in:
Roman Shevchenko
2016-04-08 10:36:41 +02:00
parent 17292ad970
commit 3c6b40759b
4 changed files with 89 additions and 31 deletions
@@ -69,38 +69,34 @@ public class PsiAugmentProviderTest extends LightCodeInsightFixtureTestCase {
@Override
protected PsiType inferType(@NotNull PsiTypeElement typeElement) {
PsiElement parent = typeElement.getParent();
if (parent instanceof PsiLocalVariable && ((PsiLocalVariable)parent).getInitializer() != null ||
parent instanceof PsiParameter && ((PsiParameter)parent).getDeclarationScope() instanceof PsiForeachStatement) {
String text = typeElement.getText();
if (LOMBOK_VAL_SHORT_NAME.equals(text) || LOMBOK_VAL_FQN.equals(text)) {
PsiJavaCodeReferenceElement referenceElement = typeElement.getInnermostComponentReferenceElement();
if (referenceElement != null) {
PsiElement resolve = referenceElement.resolve();
if (resolve instanceof PsiClass) {
if (parent instanceof PsiLocalVariable) {
PsiExpression initializer = ((PsiVariable)parent).getInitializer();
assertNotNull(initializer);
PsiType initializerType = initializer.getType();
if (initializer instanceof PsiNewExpression) {
PsiJavaCodeReferenceElement reference = ((PsiNewExpression)initializer).getClassOrAnonymousClassReference();
if (reference != null) {
PsiReferenceParameterList parameterList = reference.getParameterList();
if (parameterList != null) {
PsiTypeElement[] elements = parameterList.getTypeParameterElements();
if (elements.length == 1 && elements[0].getType() instanceof PsiDiamondType) {
return TypeConversionUtil.erasure(initializerType);
}
if (isLombokVal(parent)) {
PsiJavaCodeReferenceElement referenceElement = typeElement.getInnermostComponentReferenceElement();
if (referenceElement != null) {
PsiElement resolve = referenceElement.resolve();
if (resolve instanceof PsiClass) {
if (parent instanceof PsiLocalVariable) {
PsiExpression initializer = ((PsiVariable)parent).getInitializer();
assertNotNull(initializer);
PsiType initializerType = initializer.getType();
if (initializer instanceof PsiNewExpression) {
PsiJavaCodeReferenceElement reference = ((PsiNewExpression)initializer).getClassOrAnonymousClassReference();
if (reference != null) {
PsiReferenceParameterList parameterList = reference.getParameterList();
if (parameterList != null) {
PsiTypeElement[] elements = parameterList.getTypeParameterElements();
if (elements.length == 1 && elements[0].getType() instanceof PsiDiamondType) {
return TypeConversionUtil.erasure(initializerType);
}
}
}
return initializerType;
}
return initializerType;
}
PsiForeachStatement foreachStatement = (PsiForeachStatement)((PsiParameter)parent).getDeclarationScope();
PsiExpression iteratedValue = foreachStatement.getIteratedValue();
if (iteratedValue != null) {
return JavaGenericsUtil.getCollectionItemType(iteratedValue);
}
PsiForeachStatement foreachStatement = (PsiForeachStatement)((PsiParameter)parent).getDeclarationScope();
PsiExpression iteratedValue = foreachStatement.getIteratedValue();
if (iteratedValue != null) {
return JavaGenericsUtil.getCollectionItemType(iteratedValue);
}
}
}
@@ -108,5 +104,26 @@ public class PsiAugmentProviderTest extends LightCodeInsightFixtureTestCase {
return null;
}
@Nullable
@Override
protected Boolean hasModifierProperty(@NotNull PsiModifierList modifierList, @NotNull String name) {
return (PsiModifier.FINAL.equals(name) && isLombokVal(modifierList.getParent())) ? Boolean.TRUE : null;
}
private static boolean isLombokVal(PsiElement variable) {
if (variable instanceof PsiLocalVariable && ((PsiLocalVariable)variable).getInitializer() != null ||
variable instanceof PsiParameter && ((PsiParameter)variable).getDeclarationScope() instanceof PsiForeachStatement) {
PsiTypeElement typeElement = ((PsiVariable)variable).getTypeElement();
if (typeElement != null) {
String text = typeElement.getText();
if (LOMBOK_VAL_SHORT_NAME.equals(text) || LOMBOK_VAL_FQN.equals(text)) {
return true;
}
}
}
return false;
}
}
}