src/eric7/QScintilla/DocstringGenerator/PyDocstringGenerator.py

Mon, 07 Nov 2022 17:19:58 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 07 Nov 2022 17:19:58 +0100
branch
eric7
changeset 9482
a2bc06a54d9d
parent 9473
3f23dbf37dbe
child 9653
e67609152c5e
permissions
-rw-r--r--

Corrected/acknowledged some bad import style and removed some obsolete code.

7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
8881
54e42bc2437a Updated copyright for 2022.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
3 # Copyright (c) 2021 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing a docstring generator for Python.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
9473
3f23dbf37dbe Resorted the import statements using isort.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9453
diff changeset
10 import collections
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 import re
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
13 from .BaseDocstringGenerator import BaseDocstringGenerator, FunctionInfo, getIndentStr
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 class PyDocstringGenerator(BaseDocstringGenerator):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 Class implementing a docstring generator for Python.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
20
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 def __init__(self, editor):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 Constructor
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
24
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 @param editor reference to the editor widget
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 @type Editor
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 """
8218
7c09585bd960 Applied some more code simplifications suggested by the new Simplify checker (super(Foo, self) => super()).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8205
diff changeset
28 super().__init__(editor)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
29
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 self.__quote3 = '"""'
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 self.__quote3Alternate = "'''"
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
32
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 def isFunctionStart(self, text):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 Public method to test, if a text is the start of a function or method
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 definition.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
37
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 @param text line of text to be tested
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 @return flag indicating that the given text starts a function or
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 method definition
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 @rtype bool
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 if isinstance(text, str):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 text = text.lstrip()
9237
03c714bd4ebf Fixed an issue in the docstring generator searching for the start of a function/method definition.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
46 if text.startswith(("def ", "async def ")):
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 return True
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
48
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 return False
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
50
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 def hasFunctionDefinition(self, cursorPosition):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 Public method to test, if the cursor is right below a function
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 definition.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
55
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 @param cursorPosition current cursor position (line and column)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 @type tuple of (int, int)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 @return flag indicating cursor is right below a function definition
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 @rtype bool
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
61 return self.__getFunctionDefinitionFromBelow(cursorPosition) is not None
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
62
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 def isDocstringIntro(self, cursorPosition):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 Public function to test, if the line up to the cursor position might be
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 introducing a docstring.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
67
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 @param cursorPosition current cursor position (line and column)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 @type tuple of (int, int)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 @return flag indicating a potential start of a docstring
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 @rtype bool
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 cline, cindex = cursorPosition
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 lineToCursor = self.editor.text(cline)[:cindex]
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 return self.__isTripleQuotesStart(lineToCursor)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
76
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 def __isTripleQuotesStart(self, text):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 Private method to test, if the given text is the start of a triple
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 quoted string.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
81
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 @param text text to be inspected
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 @return flag indicating a triple quote start
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 @rtype bool
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 docstringTriggers = ('"""', 'r"""', "'''", "r'''")
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 if text.lstrip() in docstringTriggers:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 return True
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 return False
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
92
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 def insertDocstring(self, cursorPosition, fromStart=True):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 Public method to insert a docstring for the function at the cursor
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 position.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
97
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 @param cursorPosition position of the cursor (line and index)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 @type tuple of (int, int)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 @param fromStart flag indicating that the editor text cursor is placed
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 on the line starting the function definition
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 @type bool
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 if fromStart:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 self.__functionStartLine = cursorPosition[0]
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
106 docstring, insertPos, newCursorLine = self.__generateDocstringFromStart()
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 else:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
108 docstring, insertPos, newCursorLine = self.__generateDocstringFromBelow(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
109 cursorPosition
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
110 )
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
111
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 if docstring:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 self.editor.beginUndoAction()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 self.editor.insertAt(docstring, *insertPos)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
115
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
116 if not fromStart:
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
117 # correct triple quote indentation if neccessary
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
118 functionIndent = self.editor.indentation(self.__functionStartLine)
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
119 quoteIndent = self.editor.indentation(insertPos[0])
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
120
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
121 # step 1: unindent quote line until indentation is zero
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
122 while quoteIndent > 0:
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
123 self.editor.unindent(insertPos[0])
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
124 quoteIndent = self.editor.indentation(insertPos[0])
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
125
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
126 # step 2: indent quote line until indentation is one greater
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
127 # than function definition line
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
128 while quoteIndent <= functionIndent:
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
129 self.editor.indent(insertPos[0])
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
130 quoteIndent = self.editor.indentation(insertPos[0])
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
131
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 self.editor.endUndoAction()
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
133 self.editor.setCursorPosition(
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
134 newCursorLine, len(self.editor.text(newCursorLine)) - 1
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
135 )
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
136
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
137 def insertDocstringFromShortcut(self, cursorPosition):
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
138 """
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
139 Public method to insert a docstring for the function at the cursor
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
140 position initiated via a keyboard shortcut.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
141
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
142 @param cursorPosition position of the cursor (line and index)
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
143 @type tuple of (int, int)
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
144 """
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
145 result = self.__getFunctionDefinitionFromBelow(cursorPosition)
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
146 if result is not None:
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
147 # cursor is on the line after the function definition
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
148 cline = cursorPosition[0] - 1
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
149 while not self.isFunctionStart(self.editor.text(cline)):
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
150 cline -= 1
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
151 self.__functionStartLine = cline
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
152 elif self.isFunctionStart(self.editor.text(cursorPosition[0])):
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
153 # cursor is on the start line of the function definition
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
154 self.__functionStartLine = cursorPosition[0]
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
155 else:
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
156 # neither after the function definition nor at the start
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
157 # just do nothing
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
158 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
159
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
160 docstring, insertPos, newCursorLine = self.__generateDocstringFromStart()
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
161 if docstring:
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
162 self.editor.beginUndoAction()
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
163 self.editor.insertAt(docstring, *insertPos)
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
164 self.editor.endUndoAction()
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
165 self.editor.setCursorPosition(
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
166 newCursorLine, len(self.editor.text(newCursorLine)) - 1
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
167 )
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
168
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169 def __getIndentationInsertString(self, text):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 Private method to create the indentation string for the docstring.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
172
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 @param text text to based the indentation on
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 @return indentation string for docstring
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 @rtype str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 indent = getIndentStr(text)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 indentWidth = self.editor.indentationWidth()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 if indentWidth == 0:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 indentWidth = self.editor.tabWidth()
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
182
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 return indent + indentWidth * " "
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
184
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 #######################################################################
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 ## Methods to generate the docstring when the text cursor is on the
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 ## line starting the function definition.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 #######################################################################
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
189
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 def __generateDocstringFromStart(self):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 Private method to generate a docstring based on the cursor being
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 placed on the first line of the definition.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
194
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 @return tuple containing the docstring and a tuple containing the
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 insertion line and index
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 @rtype tuple of (str, tuple(int, int))
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 result = self.__getFunctionDefinitionFromStart()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 if result:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201 functionDefinition, functionDefinitionLength = result
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
202
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203 insertLine = self.__functionStartLine + functionDefinitionLength
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204 indentation = self.__getIndentationInsertString(functionDefinition)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 sep = self.editor.getLineSeparator()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 bodyStart = insertLine
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
207
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
208 docstringList = self.__generateDocstring('"', functionDefinition, bodyStart)
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 if docstringList:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 if self.getDocstringType() == "ericdoc":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211 docstringList.insert(0, self.__quote3)
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
212 newCursorLine = insertLine + 1
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 docstringList[0] = self.__quote3 + docstringList[0]
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
215 newCursorLine = insertLine
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 docstringList.append(self.__quote3)
9422
cf2ea9c6316a Changed the PydocstringGenerator to adhere to the formatting rule of the 'Black' tool.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9237
diff changeset
217 for index, line in enumerate(docstringList):
cf2ea9c6316a Changed the PydocstringGenerator to adhere to the formatting rule of the 'Black' tool.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9237
diff changeset
218 docstringList[index] = (
9453
e5065dde905d Code Formatting
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9422
diff changeset
219 indentation + line if bool(line.strip()) else ""
9422
cf2ea9c6316a Changed the PydocstringGenerator to adhere to the formatting rule of the 'Black' tool.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9237
diff changeset
220 )
cf2ea9c6316a Changed the PydocstringGenerator to adhere to the formatting rule of the 'Black' tool.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9237
diff changeset
221 return sep.join(docstringList) + sep, (insertLine, 0), newCursorLine
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
222
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
223 return "", (0, 0), 0
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
224
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 def __getFunctionDefinitionFromStart(self):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227 Private method to extract the function definition based on the cursor
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 being placed on the first line of the definition.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
229
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 @return text containing the function definition
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231 @rtype str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 startLine = self.__functionStartLine
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 endLine = startLine + min(
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
235 self.editor.lines() - startLine, 20 # max. 20 lines of definition allowed
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 )
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
237 isFirstLine = True
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238 functionIndent = ""
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 functionTextList = []
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
240
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241 for lineNo in range(startLine, endLine):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 text = self.editor.text(lineNo).rstrip()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 if isFirstLine:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 if not self.isFunctionStart(text):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245 return None
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
246
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247 functionIndent = getIndentStr(text)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 isFirstLine = False
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 currentIndent = getIndentStr(text)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
251 if currentIndent <= functionIndent or self.isFunctionStart(text):
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 # no function body exists
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253 return None
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 if text.strip() == "":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 # empty line, illegal/incomplete function definition
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 return None
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
257
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258 if text.endswith("\\"):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 text = text[:-1]
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
260
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 functionTextList.append(text)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
262
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 if text.endswith(":"):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264 # end of function definition reached
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 functionDefinitionLength = len(functionTextList)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
266
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267 # check, if function is decorated with a supported one
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 if startLine > 0:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269 decoratorLine = self.editor.text(startLine - 1)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 if (
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
271 "@classmethod" in decoratorLine
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
272 or "@staticmethod" in decoratorLine
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
273 or "pyqtSlot" in decoratorLine
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
274 or "Slot" in decoratorLine # PyQt slot # PySide slot
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 ):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276 functionTextList.insert(0, decoratorLine)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
277
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278 return "".join(functionTextList), functionDefinitionLength
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
279
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280 return None
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
281
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282 #######################################################################
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 ## Methods to generate the docstring when the text cursor is on the
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 ## line after the function definition (e.g. after a triple quote).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 #######################################################################
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
286
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 def __generateDocstringFromBelow(self, cursorPosition):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 """
9422
cf2ea9c6316a Changed the PydocstringGenerator to adhere to the formatting rule of the 'Black' tool.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9237
diff changeset
289 Private method to generate a docstring when the given position is on
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290 the line below the end of the definition.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
291
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 @param cursorPosition position of the cursor (line and index)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293 @type tuple of (int, int)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 @return tuple containing the docstring and a tuple containing the
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 insertion line and index
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296 @rtype tuple of (str, tuple(int, int))
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
297 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
298 functionDefinition = self.__getFunctionDefinitionFromBelow(cursorPosition)
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 if functionDefinition:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
300 lineTextToCursor = self.editor.text(cursorPosition[0])[: cursorPosition[1]]
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
301 insertLine = cursorPosition[0]
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
302 indentation = self.__getIndentationInsertString(functionDefinition)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
303 sep = self.editor.getLineSeparator()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304 bodyStart = insertLine
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
305
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
306 docstringList = self.__generateDocstring('"', functionDefinition, bodyStart)
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307 if docstringList:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
308 if self.__isTripleQuotesStart(lineTextToCursor):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
309 if self.getDocstringType() == "ericdoc":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
310 docstringList.insert(0, "")
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
311 newCursorLine = cursorPosition[0] + 1
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
312 else:
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
313 newCursorLine = cursorPosition[0]
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
314 docstringList.append("")
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
316 if self.getDocstringType() == "ericdoc":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317 docstringList.insert(0, self.__quote3)
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
318 newCursorLine = cursorPosition[0] + 1
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 docstringList[0] = self.__quote3 + docstringList[0]
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
321 newCursorLine = cursorPosition[0]
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322 docstringList.append(self.__quote3)
9422
cf2ea9c6316a Changed the PydocstringGenerator to adhere to the formatting rule of the 'Black' tool.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9237
diff changeset
323 for index, line in enumerate(docstringList):
cf2ea9c6316a Changed the PydocstringGenerator to adhere to the formatting rule of the 'Black' tool.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9237
diff changeset
324 docstringList[index] = (
9453
e5065dde905d Code Formatting
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9422
diff changeset
325 indentation + line if bool(line.strip()) else ""
9422
cf2ea9c6316a Changed the PydocstringGenerator to adhere to the formatting rule of the 'Black' tool.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9237
diff changeset
326 )
cf2ea9c6316a Changed the PydocstringGenerator to adhere to the formatting rule of the 'Black' tool.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9237
diff changeset
327 docstring = sep.join(docstringList) + indentation
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
328 return docstring, cursorPosition, newCursorLine
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
329
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
330 return "", (0, 0), 0
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
331
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
332 def __getFunctionDefinitionFromBelow(self, cursorPosition):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
333 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
334 Private method to extract the function definition based on the cursor
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
335 being placed on the first line after the definition.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
336
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
337 @param cursorPosition current cursor position (line and column)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
338 @type tuple of (int, int)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
339 @return text containing the function definition
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
340 @rtype str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342 startLine = cursorPosition[0] - 1
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
343 endLine = startLine - min(startLine, 20)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344 # max. 20 lines of definition allowed
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
345 isFirstLine = True
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
346 functionTextList = []
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
347
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348 for lineNo in range(startLine, endLine, -1):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
349 text = self.editor.text(lineNo).rstrip()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
350 if isFirstLine:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
351 if not text.endswith(":"):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
352 return None
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
353 isFirstLine = False
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
354 elif text.endswith(":") or text == "":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355 return None
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
356
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
357 if text.endswith("\\"):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
358 text = text[:-1]
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
359
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
360 functionTextList.insert(0, text)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
361
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
362 if self.isFunctionStart(text):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
363 # start of function definition reached
8000
47b15df088e4 Editor: extended the docstring functionality to be invocable via a keyboard shortcut (Ctrl+Alt+D).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7998
diff changeset
364 self.__functionStartLine = lineNo
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
365
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
366 # check, if function is decorated with a supported one
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
367 if lineNo > 0:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
368 decoratorLine = self.editor.text(lineNo - 1)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
369 if (
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
370 "@classmethod" in decoratorLine
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
371 or "@staticmethod" in decoratorLine
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
372 or "pyqtSlot" in decoratorLine
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
373 or "Slot" in decoratorLine # PyQt slot # PySide slot
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
374 ):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
375 functionTextList.insert(0, decoratorLine)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
376
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
377 return "".join(functionTextList)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
378
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
379 return None
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
380
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
381 #######################################################################
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
382 ## Methods to generate the docstring contents.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
383 #######################################################################
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
384
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
385 def __getFunctionBody(self, functionIndent, startLine):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
386 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
387 Private method to get the function body.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
388
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
389 @param functionIndent indentation string of the function definition
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
390 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
391 @param startLine starting line for the extraction process
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
392 @type int
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
393 @return text containing the function body
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
394 @rtype str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
395 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
396 bodyList = []
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
397
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
398 for line in range(startLine, self.editor.lines()):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
399 text = self.editor.text(line)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
400 textIndent = getIndentStr(text)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
401
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
402 if text.strip() == "":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
403 pass
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
404 elif len(textIndent) <= len(functionIndent):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
405 break
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
406
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
407 bodyList.append(text)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
408
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
409 return "".join(bodyList)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
410
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
411 def __generateDocstring(self, quote, functionDef, bodyStartLine):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
412 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
413 Private method to generate the list of docstring lines.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
414
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
415 @param quote quote string
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
416 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
417 @param functionDef text containing the function definition
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
418 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
419 @param bodyStartLine starting line of the function body
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
420 @type int
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
421 @return list of docstring lines
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
422 @rtype list of str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
423 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
424 quote3 = 3 * quote
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
425 if quote == '"':
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
426 quote3replace = 3 * "'"
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
427 elif quote == "'":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
428 quote3replace = 3 * '"'
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
429 functionInfo = PyFunctionInfo()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
430 functionInfo.parseDefinition(functionDef, quote3, quote3replace)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
431
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
432 if functionInfo.hasInfo:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
433 functionBody = self.__getFunctionBody(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
434 functionInfo.functionIndent, bodyStartLine
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
435 )
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
436
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
437 if functionBody:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
438 functionInfo.parseBody(functionBody)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
439
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
440 docstringType = self.getDocstringType()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
441 return self._generateDocstringList(functionInfo, docstringType)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
442
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
443 return []
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
444
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
445
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
446 class PyFunctionInfo(FunctionInfo):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
447 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
448 Class implementing an object to extract and store function information.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
449 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
450
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
451 def __init__(self):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
452 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
453 Constructor
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
454 """
8218
7c09585bd960 Applied some more code simplifications suggested by the new Simplify checker (super(Foo, self) => super()).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8205
diff changeset
455 super().__init__()
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
456
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
457 def __isCharInPairs(self, posChar, pairs):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
458 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
459 Private method to test, if the given character position is between
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
460 pairs of brackets or quotes.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
461
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
462 @param posChar character position to be tested
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
463 @type int
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
464 @param pairs list containing pairs of positions
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
465 @type list of tuple of (int, int)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
466 @return flag indicating the position is in between
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
467 @rtype bool
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
468 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
469 return any(posLeft < posChar < posRight for (posLeft, posRight) in pairs)
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
470
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
471 def __findQuotePosition(self, text):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
472 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
473 Private method to find the start and end position of pairs of quotes.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
474
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
475 @param text text to be parsed
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
476 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
477 @return list of tuple with start and end position of pairs of quotes
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
478 @rtype list of tuple of (int, int)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
479 @exception IndexError raised when a matching close quote is missing
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
480 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
481 pos = []
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
482 foundLeftQuote = False
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
483
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
484 for index, character in enumerate(text):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
485 if foundLeftQuote is False:
8205
4a0f1f896341 Applied some code simplifications suggested by the new Simplify checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8000
diff changeset
486 if character in ("'", '"'):
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
487 foundLeftQuote = True
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
488 quote = character
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
489 leftPos = index
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
490 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
491 if character == quote and text[index - 1] != "\\":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
492 pos.append((leftPos, index))
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
493 foundLeftQuote = False
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
494
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
495 if foundLeftQuote:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
496 raise IndexError("No matching close quote at: {0}".format(leftPos))
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
497
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
498 return pos
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
499
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
500 def __findBracketPosition(self, text, bracketLeft, bracketRight, posQuote):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
501 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
502 Private method to find the start and end position of pairs of brackets.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
503
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
504 https://stackoverflow.com/questions/29991917/
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
505 indices-of-matching-parentheses-in-python
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
506
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
507 @param text text to be parsed
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
508 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
509 @param bracketLeft character of the left bracket
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
510 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
511 @param bracketRight character of the right bracket
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
512 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
513 @param posQuote list of tuple with start and end position of pairs
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
514 of quotes
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
515 @type list of tuple of (int, int)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
516 @return list of tuple with start and end position of pairs of brackets
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
517 @rtype list of tuple of (int, int)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
518 @exception IndexError raised when a closing or opening bracket is
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
519 missing
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
520 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
521 pos = []
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
522 pstack = []
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
523
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
524 for index, character in enumerate(text):
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
525 if character == bracketLeft and not self.__isCharInPairs(index, posQuote):
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
526 pstack.append(index)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
527 elif character == bracketRight and not self.__isCharInPairs(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
528 index, posQuote
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
529 ):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
530 if len(pstack) == 0:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
531 raise IndexError("No matching closing parens at: {0}".format(index))
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
532 pos.append((pstack.pop(), index))
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
533
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
534 if len(pstack) > 0:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
535 raise IndexError("No matching opening parens at: {0}".format(pstack.pop()))
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
536
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
537 return pos
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
538
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
539 def __splitArgumentToNameTypeValue(self, argumentsList, quote, quoteReplace):
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
540 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
541 Private method to split some argument text to name, type and value.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
542
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
543 @param argumentsList list of function argument definitions
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
544 @type list of str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
545 @param quote quote string to be replaced
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
546 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
547 @param quoteReplace quote string to replace the original
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
548 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
549 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
550 for arg in argumentsList:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
551 hasType = False
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
552 hasValue = False
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
553
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
554 colonPosition = arg.find(":")
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
555 equalPosition = arg.find("=")
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
556
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
557 if equalPosition > -1:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
558 hasValue = True
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
559
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
560 if colonPosition > -1 and (not hasValue or equalPosition > colonPosition):
8229
6fa22aa4fc4a Applied some more code simplifications suggested by the new Simplify checker (Y102: use single if) (batch 2+).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8228
diff changeset
561 # exception for def foo(arg1=":")
6fa22aa4fc4a Applied some more code simplifications suggested by the new Simplify checker (Y102: use single if) (batch 2+).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8228
diff changeset
562 hasType = True
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
563
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
564 if hasValue and hasType:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
565 argName = arg[0:colonPosition].strip()
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
566 argType = arg[colonPosition + 1 : equalPosition].strip()
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
567 argValue = arg[equalPosition + 1 :].strip()
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
568 elif not hasValue and hasType:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
569 argName = arg[0:colonPosition].strip()
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
570 argType = arg[colonPosition + 1 :].strip()
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
571 argValue = None
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
572 elif hasValue and not hasType:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
573 argName = arg[0:equalPosition].strip()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
574 argType = None
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
575 argValue = arg[equalPosition + 1 :].strip()
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
576 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
577 argName = arg.strip()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
578 argType = None
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
579 argValue = None
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
580 if argValue and quote:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
581 # sanitize argValue with respect to quotes
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
582 argValue = argValue.replace(quote, quoteReplace)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
583
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
584 self.argumentsList.append((argName, argType, argValue))
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
585
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
586 def __splitArgumentsTextToList(self, argumentsText):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
587 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
588 Private method to split the given arguments text into a list of
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
589 arguments.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
590
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
591 This function uses a comma to separate arguments and ignores a comma in
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
592 brackets and quotes.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
593
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
594 @param argumentsText text containing the list of arguments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
595 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
596 @return list of individual argument texts
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
597 @rtype list of str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
598 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
599 argumentsList = []
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
600 indexFindStart = 0
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
601 indexArgStart = 0
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
602
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
603 try:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
604 posQuote = self.__findQuotePosition(argumentsText)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
605 posRound = self.__findBracketPosition(argumentsText, "(", ")", posQuote)
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
606 posCurly = self.__findBracketPosition(argumentsText, "{", "}", posQuote)
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
607 posSquare = self.__findBracketPosition(argumentsText, "[", "]", posQuote)
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
608 except IndexError:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
609 return None
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
610
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
611 while True:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
612 posComma = argumentsText.find(",", indexFindStart)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
613
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
614 if posComma == -1:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
615 break
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
616
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
617 indexFindStart = posComma + 1
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
618
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
619 if (
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
620 self.__isCharInPairs(posComma, posRound)
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
621 or self.__isCharInPairs(posComma, posCurly)
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
622 or self.__isCharInPairs(posComma, posSquare)
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
623 or self.__isCharInPairs(posComma, posQuote)
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
624 ):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
625 continue
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
626
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
627 argumentsList.append(argumentsText[indexArgStart:posComma])
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
628 indexArgStart = posComma + 1
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
629
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
630 if indexArgStart < len(argumentsText):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
631 argumentsList.append(argumentsText[indexArgStart:])
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
632
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
633 return argumentsList
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
634
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
635 def parseDefinition(self, text, quote, quoteReplace):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
636 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
637 Public method to parse the function definition text.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
638
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
639 @param text text containing the function definition
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
640 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
641 @param quote quote string to be replaced
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
642 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
643 @param quoteReplace quote string to replace the original
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
644 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
645 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
646 self.functionIndent = getIndentStr(text)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
647
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
648 textList = text.splitlines()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
649 if textList[0].lstrip().startswith("@"):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
650 # first line of function definition is a decorator
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
651 decorator = textList.pop(0).strip()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
652 if decorator == "@staticmethod":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
653 self.functionType = "staticmethod"
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
654 elif decorator == "@classmethod":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
655 self.functionType = "classmethod"
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
656 elif re.match(r"@(PyQt[456]\.)?(QtCore\.)?pyqtSlot", decorator) or re.match(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
657 r"@(PySide[26]\.)?(QtCore\.)?Slot", decorator
8228
772103b14c18 Applied some more code simplifications suggested by the new Simplify checker (Y114: use logical or for multiple if).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8222
diff changeset
658 ):
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
659 self.functionType = "qtslot"
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
660
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
661 text = "".join(textList).strip()
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
662
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
663 if text.startswith("async def "):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
664 self.isAsync = True
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
665
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
666 returnType = re.search(r"->[ ]*([a-zA-Z0-9_,()\[\] ]*):$", text)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
667 if returnType:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
668 self.returnTypeAnnotated = returnType.group(1)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
669 textEnd = text.rfind(returnType.group(0))
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
670 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
671 self.returnTypeAnnotated = None
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
672 textEnd = len(text)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
673
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
674 positionArgumentsStart = text.find("(") + 1
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
675 positionArgumentsEnd = text.rfind(")", positionArgumentsStart, textEnd)
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
676
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
677 self.argumentsText = text[positionArgumentsStart:positionArgumentsEnd]
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
678
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
679 argumentsList = self.__splitArgumentsTextToList(self.argumentsText)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
680 if argumentsList is not None:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
681 self.hasInfo = True
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
682 self.__splitArgumentToNameTypeValue(argumentsList, quote, quoteReplace)
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
683
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
684 functionName = (
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
685 text[: positionArgumentsStart - 1]
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
686 .replace("async def ", "")
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
687 .replace("def ", "")
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
688 )
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
689 if functionName == "__init__":
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
690 self.functionType = "constructor"
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
691 elif functionName.startswith("__"):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
692 if functionName.endswith("__"):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
693 self.visibility = "special"
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
694 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
695 self.visibility = "private"
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
696 elif functionName.startswith("_"):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
697 self.visibility = "protected"
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
698 else:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
699 self.visibility = "public"
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
700
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
701 def parseBody(self, text):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
702 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
703 Public method to parse the function body text.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
704
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
705 @param text function body text
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
706 @type str
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
707 """
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
708 raiseRe = re.findall(r"[ \t]raise ([a-zA-Z0-9_]*)", text)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
709 if len(raiseRe) > 0:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
710 self.raiseList = [x.strip() for x in raiseRe]
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
711 # remove duplicates from list while keeping it in the order
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
712 self.raiseList = list(collections.OrderedDict.fromkeys(self.raiseList))
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
713
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
714 yieldRe = re.search(r"[ \t]yield ", text)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
715 if yieldRe:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
716 self.hasYield = True
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
717
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
718 # get return value
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
719 returnPattern = r"return |yield "
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
720 lineList = text.splitlines()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
721 returnFound = False
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
722 returnTmpLine = ""
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
723
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
724 for line in lineList:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
725 line = line.strip()
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
726
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
727 if returnFound is False and re.match(returnPattern, line):
8222
5994b80b8760 Applied some more code simplifications suggested by the new Simplify checker (Y102: use single if) (batch 1).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8221
diff changeset
728 returnFound = True
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
729
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
730 if returnFound:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
731 returnTmpLine += line
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
732 # check the integrity of line
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
733 try:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
734 quotePos = self.__findQuotePosition(returnTmpLine)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
735
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
736 if returnTmpLine.endswith("\\"):
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
737 returnTmpLine = returnTmpLine[:-1]
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
738 continue
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
739
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
740 self.__findBracketPosition(returnTmpLine, "(", ")", quotePos)
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
741 self.__findBracketPosition(returnTmpLine, "{", "}", quotePos)
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
742 self.__findBracketPosition(returnTmpLine, "[", "]", quotePos)
7998
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
743 except IndexError:
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
744 continue
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
745
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
746 returnValue = re.sub(returnPattern, "", returnTmpLine)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
747 self.returnValueInBody.append(returnValue)
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
748
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
749 returnFound = False
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
750 returnTmpLine = ""

eric ide

mercurial