package com.jetbrains.lang.dart.ide.surroundWith.expression;
import com.intellij.lang.surroundWith.Surrounder;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.util.IncorrectOperationException;
import com.jetbrains.lang.dart.psi.DartExpression;
import com.jetbrains.lang.dart.util.DartElementGenerator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author: Fedor.Korotkov
*/
public abstract class DartWithExpressionSurrounder implements Surrounder {
public boolean isApplicable(@NotNull PsiElement[] elements) {
return elements.length == 1 && elements[0] instanceof DartExpression;
}
@Nullable
protected DartExpression getSurroundedNode(@NotNull final PsiElement element) {
return DartElementGenerator.createExpressionFromText(
element.getProject(),
getTemplateText(element)
);
}
@Nullable
public TextRange surroundElements(@NotNull Project project, @NotNull Editor editor, @NotNull PsiElement[] elements)
throws IncorrectOperationException {
PsiElement source = elements[0];
final DartExpression parenthExprNode = getSurroundedNode(source);
if (parenthExprNode == null) {
throw new IncorrectOperationException("Can't create expression for: " + source.getText());
}
final PsiElement replace = source.replace(parenthExprNode);
final int endOffset = replace.getTextRange().getEndOffset();
return TextRange.create(endOffset, endOffset);
}
protected abstract String getTemplateText(PsiElement expr);
}