void (int segmentNumber, boolean isQuick, Expression expressionNode, Expression defaultValue) { if (isDisposed()) return; String oldValue = getExpressionString(segmentNumber); int start = getSegments().getSegmentStart(segmentNumber); int end = getSegments().getSegmentEnd(segmentNumber); boolean commitDocument = !isQuick || expressionNode.requiresCommittedPSI(); if(commitDocument) { PsiDocumentManager.getInstance(myProject).commitDocument(getDocument()); } PsiFile psiFile = getPsiFile(); PsiElement element = psiFile != null ? psiFile.findElementAt(start) : null; if (element != null && commitDocument) { PsiUtilCore.ensureValid(element); } ExpressionContext context = createExpressionContext(start); Result result = isQuick ? expressionNode.calculateQuickResult(context) : expressionNode.calculateResult(context); if (isQuick && result == null) { if (!oldValue.isEmpty()) { return; } } final boolean resultIsNullOrEmpty = result == null || result.equalsToText("", element); // do not update default value of neighbour segment if (resultIsNullOrEmpty && myCurrentSegmentNumber >= 0 && (getSegments().getSegmentStart(segmentNumber) == getSegments().getSegmentEnd(myCurrentSegmentNumber) || getSegments().getSegmentEnd(segmentNumber) == getSegments().getSegmentStart(myCurrentSegmentNumber))) { return; } if (defaultValue != null && resultIsNullOrEmpty) { result = defaultValue.calculateResult(context); } if (element != null && commitDocument) { PsiUtilCore.ensureValid(element); } if (result == null || result.equalsToText(oldValue, element)) return; replaceString(StringUtil.notNullize(result.toString()), start, end, segmentNumber); if (result instanceof RecalculatableResult) { IntList indices = initEmptyVariables(); shortenReferences(); PsiDocumentManager.getInstance(myProject).commitDocument(getDocument()); ((RecalculatableResult)result) .handleRecalc(psiFile, getDocument(), getSegments().getSegmentStart(segmentNumber), getSegments().getSegmentEnd(segmentNumber)); restoreEmptyVariables(indices); } }