PsiExpression (final Project project, PsiFile file, int startOffset, int endOffset) { final InjectedLanguageManager injectedLanguageManager = InjectedLanguageManager.getInstance(project); PsiElement elementAtStart = file.findElementAt(startOffset); if (elementAtStart == null || elementAtStart instanceof PsiWhiteSpace || elementAtStart instanceof PsiComment) { final PsiElement element = PsiTreeUtil.skipWhitespacesAndCommentsForward(elementAtStart); if (element != null) { startOffset = element.getTextOffset(); elementAtStart = file.findElementAt(startOffset); } if (elementAtStart == null) { if (injectedLanguageManager.isInjectedFragment(file)) { return getSelectionFromInjectedHost(project, file, injectedLanguageManager, startOffset, endOffset); } else { return null; } } startOffset = elementAtStart.getTextOffset(); } PsiElement elementAtEnd = file.findElementAt(endOffset - 1); if (elementAtEnd == null || elementAtEnd instanceof PsiWhiteSpace || elementAtEnd instanceof PsiComment) { elementAtEnd = PsiTreeUtil.skipWhitespacesAndCommentsBackward(elementAtEnd); if (elementAtEnd == null) return null; endOffset = elementAtEnd.getTextRange().getEndOffset(); } if (endOffset <= startOffset) return null; PsiElement elementAt = PsiTreeUtil.findCommonParent(elementAtStart, elementAtEnd); if (elementAt instanceof PsiExpressionStatement) { return ((PsiExpressionStatement)elementAt).getExpression(); } final PsiExpression containingExpression = PsiTreeUtil.getParentOfType(elementAt, PsiExpression.class, false); if (containingExpression != null && containingExpression == elementAtEnd && startOffset == containingExpression.getTextOffset()) { return containingExpression; } if (containingExpression == null || containingExpression instanceof PsiLambdaExpression) { if (injectedLanguageManager.isInjectedFragment(file)) { return getSelectionFromInjectedHost(project, file, injectedLanguageManager, startOffset, endOffset); } elementAt = null; } final PsiLiteralExpression literalExpression = PsiTreeUtil.getParentOfType(elementAt, PsiLiteralExpression.class); final PsiLiteralExpression startLiteralExpression = PsiTreeUtil.getParentOfType(elementAtStart, PsiLiteralExpression.class); final PsiLiteralExpression endLiteralExpression = PsiTreeUtil.getParentOfType(file.findElementAt(endOffset), PsiLiteralExpression.class); final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(project); String text = null; PsiExpression tempExpr; try { text = file.getText().subSequence(startOffset, endOffset).toString(); String prefix = null; if (startLiteralExpression != null) { final int startExpressionOffset = startLiteralExpression.getTextOffset(); if (startOffset == startExpressionOffset + 1) { text = "\"" + text; } else if (startOffset > startExpressionOffset + 1){ prefix = "\" + "; text = "\"" + text; } } String suffix = null; if (endLiteralExpression != null) { final int endExpressionOffset = endLiteralExpression.getTextOffset() + endLiteralExpression.getTextLength(); if (endOffset == endExpressionOffset - 1) { text += "\""; } else if (endOffset < endExpressionOffset - 1) { suffix = " + \""; text += "\""; } } if (startLiteralExpression == null && endLiteralExpression == null && StringUtil.endsWithChar(text, ';')) { text = text.substring(0, text.length() - 1); } if (literalExpression != null && text.equals(literalExpression.getText())) return literalExpression; final PsiElement parent = literalExpression != null ? literalExpression : elementAt; PsiElement commonParent = PsiTreeUtil.findCommonParent(elementAtStart, elementAtEnd); PsiElement context = Objects.requireNonNullElse(parent, commonParent); if (TextRange.create(startOffset, endOffset).contains(context.getTextRange())){ context = context.getParent(); } tempExpr = elementFactory.createExpressionFromText(text, context); if (ErrorUtil.containsDeepError(tempExpr)) return null; tempExpr.putUserData(ElementToWorkOn.PREFIX, prefix); tempExpr.putUserData(ElementToWorkOn.SUFFIX, suffix); Document document = PsiDocumentManager.getInstance(project).getDocument(file); RangeMarker rangeMarker = document != null ? document.createRangeMarker(startOffset, endOffset) : null; tempExpr.putUserData(ElementToWorkOn.TEXT_RANGE, rangeMarker); if (parent != null) { tempExpr.putUserData(ElementToWorkOn.PARENT, parent); } else { PsiElement errorElement = elementAtStart instanceof PsiErrorElement ? (PsiErrorElement)elementAtStart : PsiTreeUtil.getNextSiblingOfType(elementAtStart, PsiErrorElement.class); if (errorElement == null) { errorElement = PsiTreeUtil.getParentOfType(elementAtStart, PsiErrorElement.class); } if (commonParent instanceof PsiMethod method && isIncompleteMethod(method)) { errorElement = method; } if (errorElement == null) return null; if (errorElement.getParent() instanceof PsiMethod method && isIncompleteMethod(method)) { errorElement = method; } if (!(errorElement.getParent() instanceof PsiClass)) return null; tempExpr.putUserData(ElementToWorkOn.PARENT, errorElement); tempExpr.putUserData(ElementToWorkOn.OUT_OF_CODE_BLOCK, Boolean.TRUE); } final String fakeInitializer = "intellijidearulezzz"; final int[] refIdx = new int[1]; final PsiElement toBeExpression = createReplacement(fakeInitializer, project, prefix, suffix, parent, TextRange.create(startOffset, endOffset), refIdx); if (ErrorUtil.containsDeepError(toBeExpression)) return null; if (literalExpression != null && toBeExpression instanceof PsiExpression) { PsiType type = ((PsiExpression)toBeExpression).getType(); if (type != null && !type.equals(literalExpression.getType())) { return null; } } else if (containingExpression != null) { PsiType containingExpressionType = containingExpression.getType(); PsiType tempExprType = tempExpr.getType(); if (containingExpressionType != null && (tempExprType == null || !TypeConversionUtil.isAssignable(containingExpressionType, tempExprType))) { return null; } } final PsiReferenceExpression refExpr = PsiTreeUtil.getParentOfType(toBeExpression.findElementAt(refIdx[0]), PsiReferenceExpression.class); if (refExpr == null) return null; if (toBeExpression == refExpr && refIdx[0] > 0) { return null; } if (ReplaceExpressionUtil.isNeedParenthesis(refExpr.getNode(), tempExpr.getNode())) { tempExpr.putCopyableUserData(NEED_PARENTHESIS, Boolean.TRUE); return tempExpr; } } catch (IncorrectOperationException e) { if (elementAt instanceof PsiExpressionList) { final PsiElement parent = elementAt.getParent(); return parent instanceof PsiCallExpression ? createArrayCreationExpression(text, startOffset, endOffset, (PsiCallExpression)parent) : null; } return null; } return tempExpr; }