eric6/QScintilla/DocstringGenerator/PyDocstringGenerator.py

Fri, 22 Jan 2021 16:48:43 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 22 Jan 2021 16:48:43 +0100
changeset 7998
cd41c844862f
child 8000
47b15df088e4
permissions
-rw-r--r--

Editor
- added functionality to insert docstring templates via the context menu (cursor placed on first line of function definition) or after entering the docstring start string (e.g. """ for Python)

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

eric ide

mercurial