mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-17 21:43:33 +07:00
replace diamond with type on inline when after inline diamond won't be inferred (IDEA-66142)
This commit is contained in:
@@ -53,7 +53,7 @@ public class InlineUtil {
|
||||
initializer = RefactoringUtil.convertInitializerToNormalExpression(initializer, varType);
|
||||
|
||||
ChangeContextUtil.encodeContextInfo(initializer, false);
|
||||
PsiExpression expr = (PsiExpression)ref.replace(initializer);
|
||||
PsiExpression expr = (PsiExpression)replaceDiamondWithInferredTypesIfNeeded(initializer, ref);
|
||||
PsiType exprType = expr.getType();
|
||||
if (exprType != null && (!varType.equals(exprType) && varType instanceof PsiPrimitiveType
|
||||
|| !TypeConversionUtil.isAssignable(varType, exprType))) {
|
||||
@@ -315,6 +315,46 @@ public class InlineUtil {
|
||||
});
|
||||
}
|
||||
|
||||
private static PsiElement replaceDiamondWithInferredTypesIfNeeded(PsiExpression initializer, PsiElement ref) {
|
||||
if (initializer instanceof PsiNewExpression) {
|
||||
final PsiJavaCodeReferenceElement classReference = ((PsiNewExpression)initializer).getClassOrAnonymousClassReference();
|
||||
if (classReference != null) {
|
||||
final PsiReferenceParameterList parameterList = classReference.getParameterList();
|
||||
if (parameterList != null) {
|
||||
final PsiTypeElement[] typeParameterElements = parameterList.getTypeParameterElements();
|
||||
if (typeParameterElements.length == 1) {
|
||||
final PsiType type = typeParameterElements[0].getType();
|
||||
if (type instanceof PsiDiamondType) {
|
||||
final PsiDiamondType.DiamondInferenceResult inferenceResult = ((PsiDiamondType)type).resolveInferredTypes();
|
||||
if (inferenceResult.getErrorMessage() == null) {
|
||||
final PsiElement copy = ref.copy();
|
||||
final PsiElement parent = ref.replace(initializer);
|
||||
final PsiDiamondType.DiamondInferenceResult result = PsiDiamondType.resolveInferredTypes((PsiNewExpression)initializer, parent);
|
||||
ref = parent.replace(copy);
|
||||
if (!result.equals(inferenceResult)) {
|
||||
final String inferredTypeText = StringUtil.join(inferenceResult.getTypes(),
|
||||
new Function<PsiType, String>() {
|
||||
@Override
|
||||
public String fun(PsiType psiType) {
|
||||
return psiType.getCanonicalText();
|
||||
}
|
||||
}, ", ");
|
||||
final PsiExpressionList argumentList = ((PsiNewExpression)initializer).getArgumentList();
|
||||
if (argumentList != null) {
|
||||
final PsiExpression expression = JavaPsiFacade.getElementFactory(initializer.getProject())
|
||||
.createExpressionFromText("new " + classReference.getReferenceName() + "<" + inferredTypeText + ">" + argumentList.getText(), initializer);
|
||||
return ref.replace(expression);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ref.replace(initializer);
|
||||
}
|
||||
|
||||
public enum TailCallType {
|
||||
None, Simple, Return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user