178 |
178 |
179 class Class(ClbrBaseClasses.Class, VisibilityMixin): |
179 class Class(ClbrBaseClasses.Class, VisibilityMixin): |
180 """ |
180 """ |
181 Class to represent a Ruby class. |
181 Class to represent a Ruby class. |
182 """ |
182 """ |
183 def __init__(self, module, name, super, file, lineno): |
183 def __init__(self, module, name, superClasses, file, lineno): |
184 """ |
184 """ |
185 Constructor |
185 Constructor |
186 |
186 |
187 @param module name of the module containing this class |
187 @param module name of the module containing this class |
188 @param name name of this class |
188 @param name name of this class |
189 @param super list of class names this class is inherited from |
189 @param superClasses list of class names this class is inherited from |
190 @param file filename containing this class |
190 @param file filename containing this class |
191 @param lineno linenumber of the class definition |
191 @param lineno linenumber of the class definition |
192 """ |
192 """ |
193 ClbrBaseClasses.Class.__init__(self, module, name, super, file, lineno) |
193 ClbrBaseClasses.Class.__init__(self, module, name, superClasses, file, |
|
194 lineno) |
194 VisibilityMixin.__init__(self) |
195 VisibilityMixin.__init__(self) |
195 |
196 |
196 |
197 |
197 class Module(ClbrBaseClasses.Module, VisibilityMixin): |
198 class Module(ClbrBaseClasses.Module, VisibilityMixin): |
198 """ |
199 """ |
258 @param path path the file should be searched in (list of strings) |
259 @param path path the file should be searched in (list of strings) |
259 @return the resulting dictionary |
260 @return the resulting dictionary |
260 """ |
261 """ |
261 global _modules |
262 global _modules |
262 |
263 |
263 dict = {} |
264 dictionary = {} |
264 dict_counts = {} |
265 dict_counts = {} |
265 |
266 |
266 if module in _modules: |
267 if module in _modules: |
267 # we've seen this file before... |
268 # we've seen this file before... |
268 return _modules[module] |
269 return _modules[module] |
273 f, file, (suff, mode, type) = ClassBrowsers.find_module(module, fullpath) |
274 f, file, (suff, mode, type) = ClassBrowsers.find_module(module, fullpath) |
274 if f: |
275 if f: |
275 f.close() |
276 f.close() |
276 if type not in SUPPORTED_TYPES: |
277 if type not in SUPPORTED_TYPES: |
277 # not Ruby source, can't do anything with this module |
278 # not Ruby source, can't do anything with this module |
278 _modules[module] = dict |
279 _modules[module] = dictionary |
279 return dict |
280 return dictionary |
280 |
281 |
281 _modules[module] = dict |
282 _modules[module] = dictionary |
282 classstack = [] # stack of (class, indent) pairs |
283 classstack = [] # stack of (class, indent) pairs |
283 acstack = [] # stack of (access control, indent) pairs |
284 acstack = [] # stack of (access control, indent) pairs |
284 indent = 0 |
285 indent = 0 |
285 try: |
286 try: |
286 src = Utilities.readEncodedFile(file)[0] |
287 src = Utilities.readEncodedFile(file)[0] |
287 except (UnicodeError, IOError): |
288 except (UnicodeError, IOError): |
288 # can't do anything with this module |
289 # can't do anything with this module |
289 _modules[module] = dict |
290 _modules[module] = dictionary |
290 return dict |
291 return dictionary |
291 |
292 |
292 lineno, last_lineno_pos = 1, 0 |
293 lineno, last_lineno_pos = 1, 0 |
293 cur_obj = None |
294 cur_obj = None |
294 lastGlobalEntry = None |
295 lastGlobalEntry = None |
295 i = 0 |
296 i = 0 |
354 dict_counts[meth_name] += 1 |
355 dict_counts[meth_name] += 1 |
355 meth_name = "{0}_{1:d}".format( |
356 meth_name = "{0}_{1:d}".format( |
356 meth_name, dict_counts[meth_name]) |
357 meth_name, dict_counts[meth_name]) |
357 else: |
358 else: |
358 dict_counts[meth_name] = 0 |
359 dict_counts[meth_name] = 0 |
359 dict[meth_name] = f |
360 dictionary[meth_name] = f |
360 if not classstack: |
361 if not classstack: |
361 if lastGlobalEntry: |
362 if lastGlobalEntry: |
362 lastGlobalEntry.setEndLine(lineno - 1) |
363 lastGlobalEntry.setEndLine(lineno - 1) |
363 lastGlobalEntry = f |
364 lastGlobalEntry = f |
364 if cur_obj and isinstance(cur_obj, Function): |
365 if cur_obj and isinstance(cur_obj, Function): |
396 inherit = [_commentsub('', inherit)] |
397 inherit = [_commentsub('', inherit)] |
397 # remember this class |
398 # remember this class |
398 cur_class = Class(module, class_name, inherit, |
399 cur_class = Class(module, class_name, inherit, |
399 file, lineno) |
400 file, lineno) |
400 if not classstack: |
401 if not classstack: |
401 if class_name in dict: |
402 if class_name in dictionary: |
402 cur_class = dict[class_name] |
403 cur_class = dictionary[class_name] |
403 else: |
404 else: |
404 dict[class_name] = cur_class |
405 dictionary[class_name] = cur_class |
405 else: |
406 else: |
406 cls = classstack[-1][0] |
407 cls = classstack[-1][0] |
407 if class_name in cls.classes: |
408 if class_name in cls.classes: |
408 cur_class = cls.classes[class_name] |
409 cur_class = cls.classes[class_name] |
409 elif cls.name == class_name or class_name == "self": |
410 elif cls.name == class_name or class_name == "self": |
437 del classstack[-1] |
438 del classstack[-1] |
438 module_name = m.group("ModuleName") |
439 module_name = m.group("ModuleName") |
439 # remember this class |
440 # remember this class |
440 cur_class = Module(module, module_name, file, lineno) |
441 cur_class = Module(module, module_name, file, lineno) |
441 if not classstack: |
442 if not classstack: |
442 if module_name in dict: |
443 if module_name in dictionary: |
443 cur_class = dict[module_name] |
444 cur_class = dictionary[module_name] |
444 else: |
445 else: |
445 dict[module_name] = cur_class |
446 dictionary[module_name] = cur_class |
446 else: |
447 else: |
447 cls = classstack[-1][0] |
448 cls = classstack[-1][0] |
448 if module_name in cls.classes: |
449 if module_name in cls.classes: |
449 cur_class = cls.classes[module_name] |
450 cur_class = cls.classes[module_name] |
450 elif cls.name == module_name: |
451 elif cls.name == module_name: |
580 elif m.start("CodingLine") >= 0: |
581 elif m.start("CodingLine") >= 0: |
581 # a coding statement |
582 # a coding statement |
582 coding = m.group("Coding") |
583 coding = m.group("Coding") |
583 lineno = lineno + src.count('\n', last_lineno_pos, start) |
584 lineno = lineno + src.count('\n', last_lineno_pos, start) |
584 last_lineno_pos = start |
585 last_lineno_pos = start |
585 if "@@Coding@@" not in dict: |
586 if "@@Coding@@" not in dictionary: |
586 dict["@@Coding@@"] = ClbrBaseClasses.Coding( |
587 dictionary["@@Coding@@"] = ClbrBaseClasses.Coding( |
587 module, file, lineno, coding) |
588 module, file, lineno, coding) |
588 |
589 |
589 else: |
590 else: |
590 assert 0, "regexp _getnext found something unexpected" |
591 assert 0, "regexp _getnext found something unexpected" |
591 |
592 |
592 return dict |
593 return dictionary |