17
17
import com .intellij .openapi .wm .IdeFocusManager ;
18
18
import com .intellij .openapi .wm .ToolWindow ;
19
19
import com .intellij .psi .PsiDocumentManager ;
20
- import com .intellij .psi .PsiElement ;
21
20
import com .intellij .psi .PsiFile ;
22
- import com .intellij .psi .PsiWhiteSpace ;
23
- import com .intellij .psi .util .PsiTreeUtil ;
24
21
import com .intellij .ui .content .Content ;
25
22
import com .intellij .ui .content .ContentManager ;
26
23
import com .intellij .util .Consumer ;
27
- import com .intellij .util .DocumentUtil ;
28
24
import com .intellij .xdebugger .XDebugSession ;
29
25
import com .intellij .xdebugger .XDebuggerManager ;
30
- import com .jetbrains .python .PyTokenTypes ;
31
26
import com .jetbrains .python .console .*;
32
- import com .jetbrains .python .psi .*;
33
- import com .jetbrains .python .psi .impl .PyIfPartElifImpl ;
27
+ import com .jetbrains .python .psi .PyFile ;
34
28
import com .jetbrains .python .run .PythonRunConfiguration ;
35
29
import org .jetbrains .annotations .NotNull ;
36
30
import org .jetbrains .annotations .Nullable ;
@@ -46,106 +40,6 @@ public PyExecuteSelectionAction() {
46
40
super (EXECUTE_SELECTION_IN_CONSOLE );
47
41
}
48
42
49
-
50
- private static String getNLinesAfterCaret (Editor editor , int N ) {
51
- VisualPosition caretPos = editor .getCaretModel ().getVisualPosition ();
52
-
53
- Pair <LogicalPosition , LogicalPosition > lines = EditorUtil .calcSurroundingRange (editor , caretPos , caretPos );
54
-
55
- LogicalPosition lineStart = lines .first ;
56
- int start = editor .logicalPositionToOffset (lineStart );
57
- int end = DocumentUtil .getLineTextRange (editor .getDocument (), caretPos .getLine () + N ).getEndOffset ();
58
- return editor .getDocument ().getCharsSequence ().subSequence (start , end ).toString ();
59
- }
60
-
61
- /*
62
- returns true if PsiElement not an evaluable Python statement
63
- */
64
- private static boolean isPartialStatement (PsiElement psiElement ) {
65
- return psiElement instanceof PyElsePart ||
66
- psiElement instanceof PyIfPartElifImpl ||
67
- psiElement instanceof PyIfPart ||
68
- psiElement instanceof PyWhilePart ||
69
- psiElement instanceof PyExceptPart ||
70
- psiElement instanceof PyFinallyPart ||
71
- psiElement instanceof PyStatementPart ||
72
- psiElement instanceof PyStatementList ;
73
- }
74
-
75
- /*
76
- closest parent that is evaluable
77
- */
78
- private static PsiElement getEvaluableParent (PsiElement psiElement ) {
79
- if (psiElement .getNode ().getElementType () == PyTokenTypes .ELSE_KEYWORD ||
80
- psiElement .getNode ().getElementType () == PyTokenTypes .ELIF_KEYWORD ||
81
- psiElement .getNode ().getElementType () == PyTokenTypes .EXCEPT_KEYWORD ||
82
- psiElement .getNode ().getElementType () == PyTokenTypes .FINALLY_KEYWORD ) {
83
- psiElement = psiElement .getParent ();
84
- }
85
- return isPartialStatement (psiElement ) ? psiElement .getParent () : psiElement ;
86
- }
87
-
88
- private static void syntaxErrorAction (final AnActionEvent e ) {
89
- showConsoleAndExecuteCode (e , "# syntax error" );
90
- }
91
-
92
- private static void smartExecuteCode (final AnActionEvent e , final Editor editor ) {
93
- final Document document = editor .getDocument ();
94
- final PsiDocumentManager psiDocumentManager = PsiDocumentManager .getInstance (e .getProject ());
95
- psiDocumentManager .commitDocument (document );
96
- final PsiFile psiFile = psiDocumentManager .getPsiFile (document );
97
-
98
- final VisualPosition caretPos = editor .getCaretModel ().getVisualPosition ();
99
- final int line = caretPos .getLine ();
100
-
101
- final int offset = DocumentUtil .getFirstNonSpaceCharOffset (document , line );
102
- final PsiElement psiElement = psiFile .findElementAt (offset );
103
- int numLinesToSubmit = document .getLineCount () - line ;
104
- PsiElement lastCommonParent = null ;
105
- for (int i = 0 ; line + i < document .getLineCount (); ++i ) {
106
- final int lineStartOffset = DocumentUtil .getFirstNonSpaceCharOffset (document , line + i );
107
- final PsiElement pe = psiFile .findElementAt (lineStartOffset );
108
- final PsiElement commonParentRaw = pe == null ? pe .getContainingFile () : PsiTreeUtil .findCommonParent (psiElement , pe );
109
- final PsiElement commonParent = getEvaluableParent (commonParentRaw );
110
- if (commonParent .getTextOffset () < offset ||
111
- commonParent instanceof PyFile ) { // at new statement
112
- numLinesToSubmit = i ;
113
- break ;
114
- }
115
- lastCommonParent = commonParent ;
116
- }
117
- if (lastCommonParent == null ) {
118
- if (psiElement instanceof PsiWhiteSpace ) { // if we are at a blank line
119
- moveCaretDown (editor );
120
- return ;
121
- }
122
- syntaxErrorAction (e );
123
- return ;
124
- }
125
-
126
- String codeToSend =
127
- numLinesToSubmit == 0 ? "" :
128
- getNLinesAfterCaret (editor , numLinesToSubmit - 1 );
129
- if (PsiTreeUtil .hasErrorElements (lastCommonParent ) ||
130
- psiElement .getTextOffset () < offset ) {
131
- codeToSend = null ;
132
- }
133
- codeToSend = codeToSend == null ? null : codeToSend .trim ();
134
-
135
- if (codeToSend != null && !codeToSend .isEmpty ()) {
136
- showConsoleAndExecuteCode (e , codeToSend );
137
- }
138
- if (codeToSend != null ) {
139
- for (int i = 0 ; i < numLinesToSubmit ; ++i ) {
140
- moveCaretDown (editor );
141
- }
142
- }
143
- else {
144
- syntaxErrorAction (e );
145
- return ;
146
- }
147
- }
148
-
149
43
@ Override
150
44
public void actionPerformed (@ NotNull AnActionEvent e ) {
151
45
Editor editor = CommonDataKeys .EDITOR .getData (e .getDataContext ());
@@ -155,12 +49,16 @@ public void actionPerformed(@NotNull AnActionEvent e) {
155
49
showConsoleAndExecuteCode (e , selectionText );
156
50
}
157
51
else {
158
- smartExecuteCode (e , editor );
52
+ String line = getLineUnderCaret (editor );
53
+ if (line != null ) {
54
+ showConsoleAndExecuteCode (e , line .trim ());
55
+ moveCaretDown (editor );
56
+ }
159
57
}
160
58
}
161
59
}
162
60
163
- private static void moveCaretDown (Editor editor ) {
61
+ static void moveCaretDown (Editor editor ) {
164
62
VisualPosition pos = editor .getCaretModel ().getVisualPosition ();
165
63
Pair <LogicalPosition , LogicalPosition > lines = EditorUtil .calcSurroundingRange (editor , pos , pos );
166
64
int offset = editor .getCaretModel ().getOffset ();
@@ -232,7 +130,7 @@ private static String getLineUnderCaret(Editor editor) {
232
130
}
233
131
234
132
@ Nullable
235
- private static String getSelectionText (@ NotNull Editor editor ) {
133
+ static String getSelectionText (@ NotNull Editor editor ) {
236
134
if (editor .getSelectionModel ().hasSelection ()) {
237
135
SelectionModel model = editor .getSelectionModel ();
238
136
0 commit comments