PsiExpression (String text, int startOffset, int endOffset, PsiCallExpression parent) { if (text == null || parent == null) return null; if (text.contains(",")) { PsiExpressionList argumentList = parent.getArgumentList(); assert argumentList != null; // checked at call site final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(parent.getProject()); final JavaResolveResult resolveResult = parent.resolveMethodGenerics(); final PsiMethod psiMethod = (PsiMethod)resolveResult.getElement(); if (psiMethod == null || !psiMethod.isVarArgs()) return null; final PsiParameter[] parameters = psiMethod.getParameterList().getParameters(); final PsiParameter varargParameter = parameters[parameters.length - 1]; final PsiType type = varargParameter.getType(); LOG.assertTrue(type instanceof PsiEllipsisType); final PsiArrayType psiType = (PsiArrayType)((PsiEllipsisType)type).toArrayType(); final PsiExpression[] args = argumentList.getExpressions(); final PsiSubstitutor psiSubstitutor = resolveResult.getSubstitutor(); if (args.length < parameters.length || startOffset < args[parameters.length - 1].getTextRange().getStartOffset()) return null; final PsiFile containingFile = parent.getContainingFile(); PsiElement startElement = containingFile.findElementAt(startOffset); while (startElement != null && startElement.getParent() != argumentList) { startElement = startElement.getParent(); } if (!(startElement instanceof PsiExpression) || startOffset > startElement.getTextOffset()) return null; PsiElement endElement = containingFile.findElementAt(endOffset - 1); while (endElement != null && endElement.getParent() != argumentList) { endElement = endElement.getParent(); } if (!(endElement instanceof PsiExpression) || endOffset < endElement.getTextRange().getEndOffset()) return null; final PsiType componentType = TypeConversionUtil.erasure(psiSubstitutor.substitute(psiType.getComponentType())); try { final PsiExpression expressionFromText = elementFactory.createExpressionFromText("new " + componentType.getCanonicalText() + "[]{" + text + "}", parent); final RangeMarker rangeMarker = FileDocumentManager.getInstance().getDocument(containingFile.getVirtualFile()).createRangeMarker(startOffset, endOffset); expressionFromText.putUserData(ElementToWorkOn.TEXT_RANGE, rangeMarker); expressionFromText.putUserData(ElementToWorkOn.PARENT, parent); return expressionFromText; } catch (IncorrectOperationException e) { return null; } } return null; }