diff --git a/python/pluginResources/intellij.python.community.impl.xml b/python/pluginResources/intellij.python.community.impl.xml
index af6ca344ac0e..056ffd73859b 100644
--- a/python/pluginResources/intellij.python.community.impl.xml
+++ b/python/pluginResources/intellij.python.community.impl.xml
@@ -278,8 +278,6 @@
-
diff --git a/python/python-ast/src/com/jetbrains/python/ast/impl/PyPsiUtilsCore.java b/python/python-ast/src/com/jetbrains/python/ast/impl/PyPsiUtilsCore.java
index 4dd6446e9664..5a1ba6c1f597 100644
--- a/python/python-ast/src/com/jetbrains/python/ast/impl/PyPsiUtilsCore.java
+++ b/python/python-ast/src/com/jetbrains/python/ast/impl/PyPsiUtilsCore.java
@@ -140,4 +140,15 @@ public final class PyPsiUtilsCore {
}
return expr;
}
+
+ /**
+ * Returns ancestor of the element that is also direct child of the given super parent.
+ *
+ * @param element element to start search from
+ * @param superParent direct parent of the desired ancestor
+ * @return described element or {@code null} if it doesn't exist
+ */
+ public static @Nullable PsiElement getParentRightBefore(@NotNull PsiElement element, final @NotNull PsiElement superParent) {
+ return PsiTreeUtil.findFirstParent(element, false, element1 -> element1.getParent() == superParent);
+ }
}
diff --git a/python/python-ast/src/com/jetbrains/python/ast/impl/PyUtilCore.java b/python/python-ast/src/com/jetbrains/python/ast/impl/PyUtilCore.java
index 76e3f5f4c396..d93944cf4244 100644
--- a/python/python-ast/src/com/jetbrains/python/ast/impl/PyUtilCore.java
+++ b/python/python-ast/src/com/jetbrains/python/ast/impl/PyUtilCore.java
@@ -303,4 +303,50 @@ public final class PyUtilCore {
}
return null;
}
+
+ public static @Nullable PsiElement findPrevAtOffset(PsiFile psiFile, int caretOffset, @NotNull Class extends PsiElement> @NotNull ... toSkip) {
+ PsiElement element;
+ if (caretOffset < 0) {
+ return null;
+ }
+ int lineStartOffset = 0;
+ final Document document = PsiDocumentManager.getInstance(psiFile.getProject()).getDocument(psiFile);
+ if (document != null) {
+ int lineNumber = document.getLineNumber(caretOffset);
+ lineStartOffset = document.getLineStartOffset(lineNumber);
+ }
+ do {
+ caretOffset--;
+ element = psiFile.findElementAt(caretOffset);
+ }
+ while (caretOffset >= lineStartOffset && PsiTreeUtil.instanceOf(element, toSkip));
+ return PsiTreeUtil.instanceOf(element, toSkip) ? null : element;
+ }
+
+ public static @Nullable PsiElement findNonWhitespaceAtOffset(PsiFile psiFile, int caretOffset) {
+ PsiElement element = findNextAtOffset(psiFile, caretOffset, PsiWhiteSpace.class);
+ if (element == null) {
+ element = findPrevAtOffset(psiFile, caretOffset - 1, PsiWhiteSpace.class);
+ }
+ return element;
+ }
+
+ public static @Nullable PsiElement findNextAtOffset(final @NotNull PsiFile psiFile, int caretOffset, @NotNull Class extends PsiElement> @NotNull ... toSkip) {
+ PsiElement element = psiFile.findElementAt(caretOffset);
+ if (element == null) {
+ return null;
+ }
+
+ final Document document = PsiDocumentManager.getInstance(psiFile.getProject()).getDocument(psiFile);
+ int lineEndOffset = 0;
+ if (document != null) {
+ int lineNumber = document.getLineNumber(caretOffset);
+ lineEndOffset = document.getLineEndOffset(lineNumber);
+ }
+ while (caretOffset < lineEndOffset && PsiTreeUtil.instanceOf(element, toSkip)) {
+ caretOffset++;
+ element = psiFile.findElementAt(caretOffset);
+ }
+ return PsiTreeUtil.instanceOf(element, toSkip) ? null : element;
+ }
}
diff --git a/python/python-ast/src/com/jetbrains/python/psi/PyAstElementGenerator.java b/python/python-ast/src/com/jetbrains/python/psi/PyAstElementGenerator.java
index c0f233efa19d..944dbc0d4415 100644
--- a/python/python-ast/src/com/jetbrains/python/psi/PyAstElementGenerator.java
+++ b/python/python-ast/src/com/jetbrains/python/psi/PyAstElementGenerator.java
@@ -11,8 +11,7 @@ import com.intellij.testFramework.LightVirtualFile;
import com.intellij.util.IncorrectOperationException;
import com.jetbrains.python.PythonFileType;
import com.jetbrains.python.PythonLanguage;
-import com.jetbrains.python.ast.PyAstExpression;
-import com.jetbrains.python.ast.PyAstExpressionStatement;
+import com.jetbrains.python.ast.*;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -122,6 +121,12 @@ public class PyAstElementGenerator {
PyAstExpressionStatement.class, content + "\n");
}
+ public PyAstPassStatement createPassStatement() {
+ final PyAstFunction function = createFromText(LanguageLevel.getDefault(), PyAstFunction.class, "def foo():\n\tpass");
+ final PyAstStatementList statementList = function.getStatementList();
+ return (PyAstPassStatement)statementList.getStatements()[0];
+ }
+
protected void specifyFileLanguageLevel(@NotNull VirtualFile virtualFile, @Nullable LanguageLevel langLevel) { }
public @NotNull PyAstExpression createExpressionFromText(@NotNull LanguageLevel languageLevel, @NotNull String text)
diff --git a/python/python-psi-api/src/com/jetbrains/python/psi/PyElementGenerator.java b/python/python-psi-api/src/com/jetbrains/python/psi/PyElementGenerator.java
index 324902a5fabe..026f2e863cc6 100644
--- a/python/python-psi-api/src/com/jetbrains/python/psi/PyElementGenerator.java
+++ b/python/python-psi-api/src/com/jetbrains/python/psi/PyElementGenerator.java
@@ -107,7 +107,10 @@ public abstract class PyElementGenerator extends PyAstElementGenerator {
return (PyExpressionStatement)super.createDocstring(content);
}
- public abstract PyPassStatement createPassStatement();
+ @Override
+ public PyPassStatement createPassStatement() {
+ return (PyPassStatement)super.createPassStatement();
+ }
public abstract @NotNull PyDecoratorList createDecoratorList(final String @NotNull ... decoratorTexts);
diff --git a/python/python-psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java b/python/python-psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java
index 9137bd2e58d0..0d0c2a3b58bf 100644
--- a/python/python-psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java
+++ b/python/python-psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java
@@ -229,7 +229,7 @@ public final class PyPsiUtils {
* @return described element or {@code null} if it doesn't exist
*/
public static @Nullable PsiElement getParentRightBefore(@NotNull PsiElement element, final @NotNull PsiElement superParent) {
- return PsiTreeUtil.findFirstParent(element, false, element1 -> element1.getParent() == superParent);
+ return PyPsiUtilsCore.getParentRightBefore(element, superParent);
}
public static int getElementIndentation(final PsiElement element) {
diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/PyUtil.java b/python/python-psi-impl/src/com/jetbrains/python/psi/PyUtil.java
index c4d1270b1218..b066f1eb071e 100644
--- a/python/python-psi-impl/src/com/jetbrains/python/psi/PyUtil.java
+++ b/python/python-psi-impl/src/com/jetbrains/python/psi/PyUtil.java
@@ -1287,30 +1287,11 @@ public final class PyUtil {
}
public static @Nullable PsiElement findPrevAtOffset(PsiFile psiFile, int caretOffset, @NotNull Class extends PsiElement> @NotNull ... toSkip) {
- PsiElement element;
- if (caretOffset < 0) {
- return null;
- }
- int lineStartOffset = 0;
- final Document document = PsiDocumentManager.getInstance(psiFile.getProject()).getDocument(psiFile);
- if (document != null) {
- int lineNumber = document.getLineNumber(caretOffset);
- lineStartOffset = document.getLineStartOffset(lineNumber);
- }
- do {
- caretOffset--;
- element = psiFile.findElementAt(caretOffset);
- }
- while (caretOffset >= lineStartOffset && PsiTreeUtil.instanceOf(element, toSkip));
- return PsiTreeUtil.instanceOf(element, toSkip) ? null : element;
+ return PyUtilCore.findPrevAtOffset(psiFile, caretOffset, toSkip);
}
public static @Nullable PsiElement findNonWhitespaceAtOffset(PsiFile psiFile, int caretOffset) {
- PsiElement element = findNextAtOffset(psiFile, caretOffset, PsiWhiteSpace.class);
- if (element == null) {
- element = findPrevAtOffset(psiFile, caretOffset - 1, PsiWhiteSpace.class);
- }
- return element;
+ return PyUtilCore.findNonWhitespaceAtOffset(psiFile, caretOffset);
}
public static @Nullable PsiElement findElementAtOffset(PsiFile psiFile, int caretOffset) {
@@ -1322,22 +1303,7 @@ public final class PyUtil {
}
public static @Nullable PsiElement findNextAtOffset(final @NotNull PsiFile psiFile, int caretOffset, @NotNull Class extends PsiElement> @NotNull ... toSkip) {
- PsiElement element = psiFile.findElementAt(caretOffset);
- if (element == null) {
- return null;
- }
-
- final Document document = PsiDocumentManager.getInstance(psiFile.getProject()).getDocument(psiFile);
- int lineEndOffset = 0;
- if (document != null) {
- int lineNumber = document.getLineNumber(caretOffset);
- lineEndOffset = document.getLineEndOffset(lineNumber);
- }
- while (caretOffset < lineEndOffset && PsiTreeUtil.instanceOf(element, toSkip)) {
- caretOffset++;
- element = psiFile.findElementAt(caretOffset);
- }
- return PsiTreeUtil.instanceOf(element, toSkip) ? null : element;
+ return PyUtilCore.findNextAtOffset(psiFile, caretOffset, toSkip);
}
diff --git a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyElementGeneratorImpl.java b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyElementGeneratorImpl.java
index 90e43ad398c4..ca531850f4a0 100644
--- a/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyElementGeneratorImpl.java
+++ b/python/python-psi-impl/src/com/jetbrains/python/psi/impl/PyElementGeneratorImpl.java
@@ -318,12 +318,6 @@ public final class PyElementGeneratorImpl extends PyElementGenerator {
return (PyKeywordArgument)callExpression.getArguments()[0];
}
- @Override
- public PyPassStatement createPassStatement() {
- final PyStatementList statementList = createPassStatementList();
- return (PyPassStatement)statementList.getStatements()[0];
- }
-
@Override
public @NotNull PyDecoratorList createDecoratorList(final String @NotNull ... decoratorTexts) {
assert decoratorTexts.length > 0;
@@ -339,11 +333,6 @@ public final class PyElementGeneratorImpl extends PyElementGenerator {
return decoratorList;
}
- private PyStatementList createPassStatementList() {
- final PyFunction function = createFromText(LanguageLevel.getDefault(), PyFunction.class, "def foo():\n\tpass");
- return function.getStatementList();
- }
-
@Override
public @NotNull PsiElement createNewLine() {
return createFromText(LanguageLevel.getDefault(), PsiWhiteSpace.class, " \n\n ");
diff --git a/python/python-syntax/resources/intellij.python.syntax.xml b/python/python-syntax/resources/intellij.python.syntax.xml
index 63bb9ab8264a..9f61f0a0fb39 100644
--- a/python/python-syntax/resources/intellij.python.syntax.xml
+++ b/python/python-syntax/resources/intellij.python.syntax.xml
@@ -21,6 +21,8 @@
+
diff --git a/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java b/python/python-syntax/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java
similarity index 85%
rename from python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java
rename to python/python-syntax/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java
index ebef43c65bfb..50093ddeb553 100644
--- a/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java
+++ b/python/python-syntax/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java
@@ -13,8 +13,11 @@ import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.impl.source.PostprocessReformattingAspect;
import com.intellij.psi.util.PsiTreeUtil;
-import com.jetbrains.python.psi.*;
-import com.jetbrains.python.psi.impl.PyPsiUtils;
+import com.jetbrains.python.ast.*;
+import com.jetbrains.python.ast.impl.PyPsiUtilsCore;
+import com.jetbrains.python.ast.impl.PyUtilCore;
+import com.jetbrains.python.psi.PyAstElementGenerator;
+import com.jetbrains.python.psi.PyStringLiteralCoreUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -24,7 +27,7 @@ import org.jetbrains.annotations.Nullable;
public class PyStatementMover extends LineMover {
@Override
public boolean checkAvailable(@NotNull Editor editor, @NotNull PsiFile file, @NotNull MoveInfo info, boolean down) {
- if (!(file instanceof PyFile)) return false;
+ if (!(file instanceof PyAstFile)) return false;
final int offset = editor.getCaretModel().getOffset();
final SelectionModel selectionModel = editor.getSelectionModel();
final Document document = editor.getDocument();
@@ -38,8 +41,8 @@ public class PyStatementMover extends LineMover {
final int selectionEnd = selectionModel.getSelectionEnd();
end = selectionEnd == 0 ? 0 : selectionEnd - 1;
}
- PsiElement elementToMove1 = PyUtil.findNonWhitespaceAtOffset(file, start);
- PsiElement elementToMove2 = PyUtil.findNonWhitespaceAtOffset(file, end);
+ PsiElement elementToMove1 = PyUtilCore.findNonWhitespaceAtOffset(file, start);
+ PsiElement elementToMove2 = PyUtilCore.findNonWhitespaceAtOffset(file, end);
if (elementToMove1 == null || elementToMove2 == null) return false;
if (ifInsideString(document, lineNumber, elementToMove1, down)) return false;
@@ -56,8 +59,8 @@ public class PyStatementMover extends LineMover {
else {
PsiElement commonParent = PsiTreeUtil.findCommonParent(elementToMove1, elementToMove2);
if (commonParent == null) return false;
- elementToMove1 = PyPsiUtils.getParentRightBefore(elementToMove1, commonParent);
- elementToMove2 = PyPsiUtils.getParentRightBefore(elementToMove2, commonParent);
+ elementToMove1 = PyPsiUtilsCore.getParentRightBefore(elementToMove1, commonParent);
+ elementToMove2 = PyPsiUtilsCore.getParentRightBefore(elementToMove2, commonParent);
assert elementToMove1 != null && elementToMove2 != null;
}
@@ -75,7 +78,7 @@ public class PyStatementMover extends LineMover {
final int end = document.getLineEndOffset(lineNumber);
int nearLine = down ? lineNumber + 1 : lineNumber - 1;
if (nearLine >= document.getLineCount() || nearLine <= 0) return false;
- final PyStringLiteralExpression stringLiteralExpression = PsiTreeUtil.getParentOfType(elementToMove1, PyStringLiteralExpression.class);
+ final PyAstStringLiteralExpression stringLiteralExpression = PsiTreeUtil.getParentOfType(elementToMove1, PyAstStringLiteralExpression.class);
if (stringLiteralExpression != null) {
final Pair quotes = PyStringLiteralCoreUtil.getQuotes(stringLiteralExpression.getText());
if (quotes != null && (quotes.first.equals("'''") || quotes.first.equals("\"\"\""))) {
@@ -99,7 +102,7 @@ public class PyStatementMover extends LineMover {
int lineEndOffset = document.getLineEndOffset(lineNumber);
final int startOffset = document.getLineStartOffset(lineNumber);
- final PyStatementList statementList = getStatementList(elementToMove);
+ final PyAstStatementList statementList = getStatementList(elementToMove);
final PsiElement destination = getDestinationElement(elementToMove, document, lineEndOffset, down);
@@ -108,8 +111,8 @@ public class PyStatementMover extends LineMover {
final int startLine = document.getLineNumber(start);
final int endLine = document.getLineNumber(end);
- if (elementToMove instanceof PyClass || elementToMove instanceof PyFunction) {
- PyElement scope = statementList == null ? (PyElement)elementToMove.getContainingFile() : statementList;
+ if (elementToMove instanceof PyAstClass || elementToMove instanceof PyAstFunction) {
+ PyAstElement scope = statementList == null ? (PyAstElement)elementToMove.getContainingFile() : statementList;
if (destination != null)
return new ScopeRange(scope, destination, !down, true);
}
@@ -127,8 +130,8 @@ public class PyStatementMover extends LineMover {
return new LineRange(lineNumber, lineNumber + 1);
}
- final PyElement scope = statementList == null ? (PyElement)elementToMove.getContainingFile() : statementList;
- if ((elementToMove instanceof PyClass) || (elementToMove instanceof PyFunction))
+ final PyAstElement scope = statementList == null ? (PyAstElement)elementToMove.getContainingFile() : statementList;
+ if ((elementToMove instanceof PyAstClass) || (elementToMove instanceof PyAstFunction))
return new ScopeRange(scope, scope.getFirstChild(), !down, true);
return new LineRange(startLine, endLine + 1);
}
@@ -138,11 +141,11 @@ public class PyStatementMover extends LineMover {
}
private static boolean moveToEmptyLine(final @NotNull PsiElement elementToMove, boolean down) {
- final PyStatementList statementList = getStatementList(elementToMove);
+ final PyAstStatementList statementList = getStatementList(elementToMove);
if (statementList != null) {
if (down) {
final PsiElement child = statementList.getLastChild();
- if (elementToMove == child && PsiTreeUtil.getNextSiblingOfType(statementList.getParent(), PyStatementPart.class) != null
+ if (elementToMove == child && PsiTreeUtil.getNextSiblingOfType(statementList.getParent(), PyAstStatementPart.class) != null
|| child != elementToMove) {
return true;
}
@@ -154,14 +157,14 @@ public class PyStatementMover extends LineMover {
return statementList == null;
}
- private static PyStatementList getStatementList(final @NotNull PsiElement elementToMove) {
- return PsiTreeUtil.getParentOfType(elementToMove, PyStatementList.class, true,
- PyStatementWithElse.class, PyLoopStatement.class,
- PyFunction.class, PyClass.class);
+ private static PyAstStatementList getStatementList(final @NotNull PsiElement elementToMove) {
+ return PsiTreeUtil.getParentOfType(elementToMove, PyAstStatementList.class, true,
+ PyAstStatementWithElse.class, PyAstLoopStatement.class,
+ PyAstFunction.class, PyAstClass.class);
}
private static @Nullable ScopeRange moveOut(final @NotNull PsiElement elementToMove, final @NotNull Editor editor, boolean down) {
- final PyStatementList statementList = getStatementList(elementToMove);
+ final PyAstStatementList statementList = getStatementList(elementToMove);
if (statementList == null) return null;
if ((!down || statementList.getLastChild() != elementToMove) && (down || statementList.getFirstChild() != elementToMove)) {
@@ -169,33 +172,33 @@ public class PyStatementMover extends LineMover {
}
boolean addBefore = !down;
final PsiElement parent = statementList.getParent();
- final PyStatementPart sibling = down ? PsiTreeUtil.getNextSiblingOfType(parent, PyStatementPart.class)
- : PsiTreeUtil.getPrevSiblingOfType(parent, PyStatementPart.class);
+ final PyAstStatementPart sibling = down ? PsiTreeUtil.getNextSiblingOfType(parent, PyAstStatementPart.class)
+ : PsiTreeUtil.getPrevSiblingOfType(parent, PyAstStatementPart.class);
if (sibling != null) {
- final PyStatementList list = sibling.getStatementList();
+ final PyAstStatementList list = sibling.getStatementList();
return new ScopeRange(list, down ? list.getFirstChild() : list.getLastChild(), !addBefore);
}
else {
PsiElement scope = getScopeForComment(elementToMove, editor, parent, !down);
- PsiElement anchor = PsiTreeUtil.getParentOfType(statementList, PyStatement.class);
+ PsiElement anchor = PsiTreeUtil.getParentOfType(statementList, PyAstStatement.class);
return scope == null || anchor == null ? null : new ScopeRange(scope, anchor, addBefore);
}
}
private static PsiElement getScopeForComment(final @NotNull PsiElement elementToMove, final @NotNull Editor editor,
@Nullable PsiElement parent, boolean down) {
- PsiElement scope = PsiTreeUtil.getParentOfType(parent, PyStatementList.class, PyFile.class);
+ PsiElement scope = PsiTreeUtil.getParentOfType(parent, PyAstStatementList.class, PyAstFile.class);
final int offset = elementToMove.getTextOffset();
PsiElement sibling = elementToMove;
while (scope != null && elementToMove instanceof PsiComment) { // stupid workaround for PY-6408. Related to PSI structure
- final PsiElement prevSibling = down ? PsiTreeUtil.getNextSiblingOfType(sibling, PyStatement.class) :
- PsiTreeUtil.getPrevSiblingOfType(sibling, PyStatement.class);
+ final PsiElement prevSibling = down ? PsiTreeUtil.getNextSiblingOfType(sibling, PyAstStatement.class) :
+ PsiTreeUtil.getPrevSiblingOfType(sibling, PyAstStatement.class);
if (prevSibling == null) break;
if (editor.offsetToLogicalPosition(prevSibling.getTextOffset()).column ==
editor.offsetToLogicalPosition(offset).column) break;
sibling = scope;
- scope = PsiTreeUtil.getParentOfType(scope, PyStatementList.class, PyFile.class);
+ scope = PsiTreeUtil.getParentOfType(scope, PyAstStatementList.class, PyAstFile.class);
}
return scope;
}
@@ -203,7 +206,7 @@ public class PyStatementMover extends LineMover {
private static @Nullable LineRange moveInto(final @NotNull PsiElement elementToMove, final @NotNull PsiFile file,
final @NotNull Editor editor, boolean down, int offset) {
- PsiElement rawElement = PyUtil.findNonWhitespaceAtOffset(file, offset);
+ PsiElement rawElement = PyUtilCore.findNonWhitespaceAtOffset(file, offset);
if (rawElement == null) return null;
return down ? moveDownInto(editor.getDocument(), rawElement) : moveUpInto(elementToMove, editor, rawElement, false);
@@ -213,18 +216,18 @@ public class PyStatementMover extends LineMover {
final @NotNull PsiElement rawElement, boolean down) {
final Document document = editor.getDocument();
PsiElement element = getCommentOrStatement(document, rawElement);
- final PyStatementList statementList = getStatementList(elementToMove);
+ final PyAstStatementList statementList = getStatementList(elementToMove);
final PsiElement scopeForComment = statementList == null ? null :
getScopeForComment(elementToMove, editor, elementToMove, down);
- PyStatementList statementList2 = getStatementList(element);
+ PyAstStatementList statementList2 = getStatementList(element);
final int start1 = elementToMove.getTextOffset() - document.getLineStartOffset(document.getLineNumber(elementToMove.getTextOffset()));
final int start2 = element.getTextOffset() - document.getLineStartOffset(document.getLineNumber(element.getTextOffset()));
if (start1 != start2) {
- PyStatementList parent2 = PsiTreeUtil.getParentOfType(statementList2, PyStatementList.class);
+ PyAstStatementList parent2 = PsiTreeUtil.getParentOfType(statementList2, PyAstStatementList.class);
while (parent2 != scopeForComment && parent2 != null) {
- element = PsiTreeUtil.getParentOfType(statementList2, PyStatement.class);
+ element = PsiTreeUtil.getParentOfType(statementList2, PyAstStatement.class);
statementList2 = parent2;
- parent2 = PsiTreeUtil.getParentOfType(parent2, PyStatementList.class);
+ parent2 = PsiTreeUtil.getParentOfType(parent2, PyAstStatementList.class);
}
}
@@ -237,7 +240,7 @@ public class PyStatementMover extends LineMover {
private static @Nullable LineRange moveDownInto(final @NotNull Document document, final @NotNull PsiElement rawElement) {
PsiElement element = getCommentOrStatement(document, rawElement);
- PyStatementList statementList2 = getStatementList(element);
+ PyAstStatementList statementList2 = getStatementList(element);
if (statementList2 != null) { // move to one-line conditional/loop statement
final int number = document.getLineNumber(element.getTextOffset());
final int number2 = document.getLineNumber(statementList2.getParent().getTextOffset());
@@ -245,13 +248,13 @@ public class PyStatementMover extends LineMover {
return new ScopeRange(statementList2, statementList2.getFirstChild(), true);
}
}
- final PyStatementPart statementPart = PsiTreeUtil.getParentOfType(rawElement, PyStatementPart.class, true, PyStatement.class,
- PyStatementList.class);
- final PyFunction functionDefinition = PsiTreeUtil.getParentOfType(rawElement, PyFunction.class, true, PyStatement.class,
- PyStatementList.class);
- final PyClass classDefinition = PsiTreeUtil.getParentOfType(rawElement, PyClass.class, true, PyStatement.class,
- PyStatementList.class);
- PyStatementList list = null;
+ final PyAstStatementPart statementPart = PsiTreeUtil.getParentOfType(rawElement, PyAstStatementPart.class, true, PyAstStatement.class,
+ PyAstStatementList.class);
+ final PyAstFunction functionDefinition = PsiTreeUtil.getParentOfType(rawElement, PyAstFunction.class, true, PyAstStatement.class,
+ PyAstStatementList.class);
+ final PyAstClass classDefinition = PsiTreeUtil.getParentOfType(rawElement, PyAstClass.class, true, PyAstStatement.class,
+ PyAstStatementList.class);
+ PyAstStatementList list = null;
if (statementPart != null) list = statementPart.getStatementList();
else if (functionDefinition != null) list = functionDefinition.getStatementList();
else if (classDefinition != null) list = classDefinition.getStatementList();
@@ -263,15 +266,15 @@ public class PyStatementMover extends LineMover {
private static PsiElement getDestinationElement(final @NotNull PsiElement elementToMove, final @NotNull Document document,
int lineEndOffset, boolean down) {
- PsiElement destination = PyUtil.findPrevAtOffset(elementToMove.getContainingFile(), lineEndOffset, PsiWhiteSpace.class);
- PsiElement sibling = down ? PsiTreeUtil.getNextSiblingOfType(elementToMove, PyStatement.class) :
- PsiTreeUtil.getPrevSiblingOfType(elementToMove, PyStatement.class);
+ PsiElement destination = PyUtilCore.findPrevAtOffset(elementToMove.getContainingFile(), lineEndOffset, PsiWhiteSpace.class);
+ PsiElement sibling = down ? PsiTreeUtil.getNextSiblingOfType(elementToMove, PyAstStatement.class) :
+ PsiTreeUtil.getPrevSiblingOfType(elementToMove, PyAstStatement.class);
if (destination == null) {
- if (elementToMove instanceof PyClass) {
+ if (elementToMove instanceof PyAstClass) {
destination = sibling;
}
- else if (elementToMove instanceof PyFunction) {
- if (!(sibling instanceof PyClass))
+ else if (elementToMove instanceof PyAstFunction) {
+ if (!(sibling instanceof PyAstClass))
destination = sibling;
else destination = null;
}
@@ -280,11 +283,11 @@ public class PyStatementMover extends LineMover {
}
}
if (destination instanceof PsiComment) return destination;
- if (elementToMove instanceof PyClass) {
+ if (elementToMove instanceof PyAstClass) {
destination = sibling;
}
- else if (elementToMove instanceof PyFunction) {
- if (!(sibling instanceof PyClass))
+ else if (elementToMove instanceof PyAstFunction) {
+ if (!(sibling instanceof PyAstClass))
destination = sibling;
else destination = null;
}
@@ -295,7 +298,7 @@ public class PyStatementMover extends LineMover {
}
private static @NotNull PsiElement getCommentOrStatement(final @NotNull Document document, @NotNull PsiElement destination) {
- final PsiElement statement = PsiTreeUtil.getParentOfType(destination, PyStatement.class, false);
+ final PsiElement statement = PsiTreeUtil.getParentOfType(destination, PyAstStatement.class, false);
if (statement == null) return destination;
if (destination instanceof PsiComment) {
if (document.getLineNumber(destination.getTextOffset()) == document.getLineNumber(statement.getTextOffset()))
@@ -503,9 +506,9 @@ public class PyStatementMover extends LineMover {
final PsiElement endElement = toMove.myEndElement;
PsiElement parent = startElement.getParent();
- if (scope instanceof PyStatementList && !(startElement == endElement && startElement instanceof PsiComment)) {
- final PyStatement[] statements = ((PyStatementList)scope).getStatements();
- if (statements.length == 1 && statements[0] == anchor && statements[0] instanceof PyPassStatement) {
+ if (scope instanceof PyAstStatementList && !(startElement == endElement && startElement instanceof PsiComment)) {
+ final PyAstStatement[] statements = ((PyAstStatementList)scope).getStatements();
+ if (statements.length == 1 && statements[0] == anchor && statements[0] instanceof PyAstPassStatement) {
removePass = true;
}
}
@@ -554,7 +557,7 @@ public class PyStatementMover extends LineMover {
int offset = addedElement.getTextRange().getStartOffset();
int newLine = editor.getDocument().getLineNumber(offset);
if (newLine != addedElementLine && !removePass) { // PsiComment gets broken after adjust indent
- PsiElement psiElement = PyUtil.findNonWhitespaceAtOffset(file, editor.getDocument().getLineEndOffset(addedElementLine) - 1);
+ PsiElement psiElement = PyUtilCore.findNonWhitespaceAtOffset(file, editor.getDocument().getLineEndOffset(addedElementLine) - 1);
if (psiElement != null) {
psiElement = getCommentOrStatement(editor.getDocument(), psiElement);
offset = psiElement.getTextRange().getStartOffset();
@@ -593,11 +596,11 @@ public class PyStatementMover extends LineMover {
private static void addPassStatement(final @NotNull MyLineRange toMove, final @NotNull Project project) {
final PsiElement startElement = toMove.myStartElement;
final PsiElement endElement = toMove.myEndElement;
- final PyStatementList initialScope = getStatementList(startElement);
+ final PyAstStatementList initialScope = getStatementList(startElement);
if (initialScope != null && !(startElement == endElement && startElement instanceof PsiComment)) {
if (initialScope.getStatements().length == toMove.statementsSize) {
- final PyPassStatement passStatement = PyElementGenerator.getInstance(project).createPassStatement();
+ final PyAstPassStatement passStatement = PyAstElementGenerator.getInstance(project).createPassStatement();
initialScope.addAfter(passStatement, initialScope.getStatements()[initialScope.getStatements().length - 1]);
}
}
@@ -670,7 +673,7 @@ public class PyStatementMover extends LineMover {
addBefore = before;
}
- ScopeRange(PyElement scope, @NotNull PsiElement anchor, boolean before, boolean b) {
+ ScopeRange(PyAstElement scope, @NotNull PsiElement anchor, boolean before, boolean b) {
super(scope);
myScope = scope;
myAnchor = anchor;