(self, code: str)
| 1206 | _ATTR_MATCH_RE = re.compile(r"(.+)\.(\w*)$") |
| 1207 | |
| 1208 | def _strip_code_before_operator(self, code: str) -> str: |
| 1209 | o_parens = {"(", "[", "{"} |
| 1210 | c_parens = {")", "]", "}"} |
| 1211 | |
| 1212 | # Dry-run tokenize to catch errors |
| 1213 | try: |
| 1214 | _ = list(tokenize.generate_tokens(iter(code.splitlines()).__next__)) |
| 1215 | except tokenize.TokenError: |
| 1216 | # Try trimming the expression and retrying |
| 1217 | trimmed_code = self._trim_expr(code) |
| 1218 | try: |
| 1219 | _ = list( |
| 1220 | tokenize.generate_tokens(iter(trimmed_code.splitlines()).__next__) |
| 1221 | ) |
| 1222 | code = trimmed_code |
| 1223 | except tokenize.TokenError: |
| 1224 | return code |
| 1225 | |
| 1226 | tokens = _parse_tokens(code) |
| 1227 | encountered_operator = False |
| 1228 | after_operator = [] |
| 1229 | nesting_level = 0 |
| 1230 | |
| 1231 | for t in tokens: |
| 1232 | if t.type == tokenize.OP: |
| 1233 | if t.string in o_parens: |
| 1234 | nesting_level += 1 |
| 1235 | elif t.string in c_parens: |
| 1236 | nesting_level -= 1 |
| 1237 | elif t.string != "." and nesting_level == 0: |
| 1238 | encountered_operator = True |
| 1239 | after_operator = [] |
| 1240 | continue |
| 1241 | |
| 1242 | if encountered_operator: |
| 1243 | after_operator.append(t.string) |
| 1244 | |
| 1245 | if encountered_operator: |
| 1246 | return "".join(after_operator) |
| 1247 | else: |
| 1248 | return code |
| 1249 | |
| 1250 | def _extract_code(self, line: str): |
| 1251 | """No-op in Completer, but can be used in subclasses to customise behaviour""" |
no test coverage detected