@@ -199,6 +199,9 @@ def format(self, filename):
199
199
return filename
200
200
201
201
202
+ attr_matches_re = LazyReCompile (r"(\w+(\.\w+)*)\.(\w*)" )
203
+
204
+
202
205
class AttrCompletion (BaseCompletionType ):
203
206
204
207
def matches (self , cursor_offset , line , ** kwargs ):
@@ -222,7 +225,7 @@ def matches(self, cursor_offset, line, **kwargs):
222
225
break
223
226
methodtext = text [- i :]
224
227
matches = set ('' .join ([text [:- i ], m ])
225
- for m in attr_matches (methodtext , locals_ ))
228
+ for m in self . attr_matches (methodtext , locals_ ))
226
229
227
230
# TODO add open paren for methods via _callable_prefix (or decide not
228
231
# to) unless the first character is a _ filter out all attributes
@@ -238,6 +241,51 @@ def locate(self, current_offset, line):
238
241
def format (self , word ):
239
242
return after_last_dot (word )
240
243
244
+ def attr_matches (self , text , namespace ):
245
+ """Taken from rlcompleter.py and bent to my will.
246
+ """
247
+
248
+ # Gna, Py 2.6's rlcompleter searches for __call__ inside the
249
+ # instance instead of the type, so we monkeypatch to prevent
250
+ # side-effects (__getattr__/__getattribute__)
251
+ m = attr_matches_re .match (text )
252
+ if not m :
253
+ return []
254
+
255
+ expr , attr = m .group (1 , 3 )
256
+ if expr .isdigit ():
257
+ # Special case: float literal, using attrs here will result in
258
+ # a SyntaxError
259
+ return []
260
+ try :
261
+ obj = safe_eval (expr , namespace )
262
+ except EvaluationError :
263
+ return []
264
+ with inspection .AttrCleaner (obj ):
265
+ matches = self .attr_lookup (obj , expr , attr )
266
+ return matches
267
+
268
+ def attr_lookup (self , obj , expr , attr ):
269
+ """Second half of original attr_matches method factored out so it can
270
+ be wrapped in a safe try/finally block in case anything bad happens to
271
+ restore the original __getattribute__ method."""
272
+ words = dir (obj )
273
+ if hasattr (obj , '__class__' ):
274
+ words .append ('__class__' )
275
+ words = words + rlcompleter .get_class_members (obj .__class__ )
276
+ if not isinstance (obj .__class__ , abc .ABCMeta ):
277
+ try :
278
+ words .remove ('__abstractmethods__' )
279
+ except ValueError :
280
+ pass
281
+
282
+ matches = []
283
+ n = len (attr )
284
+ for word in words :
285
+ if method_match (word , n , attr ) and word != "__builtins__" :
286
+ matches .append ("%s.%s" % (expr , word ))
287
+ return matches
288
+
241
289
242
290
class DictKeyCompletion (BaseCompletionType ):
243
291
@@ -498,56 +546,6 @@ def safe_eval(expr, namespace):
498
546
raise EvaluationError
499
547
500
548
501
- attr_matches_re = LazyReCompile (r"(\w+(\.\w+)*)\.(\w*)" )
502
-
503
-
504
- def attr_matches (text , namespace ):
505
- """Taken from rlcompleter.py and bent to my will.
506
- """
507
-
508
- # Gna, Py 2.6's rlcompleter searches for __call__ inside the
509
- # instance instead of the type, so we monkeypatch to prevent
510
- # side-effects (__getattr__/__getattribute__)
511
- m = attr_matches_re .match (text )
512
- if not m :
513
- return []
514
-
515
- expr , attr = m .group (1 , 3 )
516
- if expr .isdigit ():
517
- # Special case: float literal, using attrs here will result in
518
- # a SyntaxError
519
- return []
520
- try :
521
- obj = safe_eval (expr , namespace )
522
- except EvaluationError :
523
- return []
524
- with inspection .AttrCleaner (obj ):
525
- matches = attr_lookup (obj , expr , attr )
526
- return matches
527
-
528
-
529
- def attr_lookup (obj , expr , attr ):
530
- """Second half of original attr_matches method factored out so it can
531
- be wrapped in a safe try/finally block in case anything bad happens to
532
- restore the original __getattribute__ method."""
533
- words = dir (obj )
534
- if hasattr (obj , '__class__' ):
535
- words .append ('__class__' )
536
- words = words + rlcompleter .get_class_members (obj .__class__ )
537
- if not isinstance (obj .__class__ , abc .ABCMeta ):
538
- try :
539
- words .remove ('__abstractmethods__' )
540
- except ValueError :
541
- pass
542
-
543
- matches = []
544
- n = len (attr )
545
- for word in words :
546
- if method_match (word , n , attr ) and word != "__builtins__" :
547
- matches .append ("%s.%s" % (expr , word ))
548
- return matches
549
-
550
-
551
549
def _callable_postfix (value , word ):
552
550
"""rlcompleter's _callable_postfix done right."""
553
551
with inspection .AttrCleaner (value ):
0 commit comments