def occurred_outside_skip(self, change_collector, occurrence): start, end = occurrence.get_primary_range() # we remove out of date imports later if occurrence.is_in_import_statement(): return # the function is referenced outside an import statement if not occurrence.is_called(): raise rope.base.exceptions.RefactoringError( 'Reference to inlining function other than function call' ' in <file: %s, offset: %d>' % (self.resource.path, start)) if self.aim is not None and (self.aim < start or self.aim > end): return end_parens = self._find_end_parens(self.source, end - 1) lineno = self.lines.get_line_number(start) start_line, end_line = self.pymodule.logical_lines.\ logical_line_in(lineno) line_start = self.lines.get_line_start(start_line) line_end = self.lines.get_line_end(end_line) returns = self.source[line_start:start].strip() != '' or \ self.source[end_parens:line_end].strip() != '' indents = sourceutils.get_indents(self.lines, start_line) primary, pyname = occurrence.get_primary_and_pyname() definition, returned = self.generator.get_definition( primary, pyname, self.source[start:end_parens], returns=returns) end = min(line_end + 1, len(self.source)) change_collector.add_change( line_start, end, sourceutils.fix_indentation(definition, indents)) if returns: name = returned if name is None: name = 'None' change_collector.add_change( line_end, end, self.source[line_start:start] + name + self.source[end_parens:end])
def get_insertion_lineno(self): lines = self.goal_pymodule.lines if self.goal_scope == self.source_scope: line_finder = self.goal_pymodule.logical_lines lineno = lines.get_line_number(self.offset) lineno = line_finder.logical_line_in(lineno)[0] root = suites.ast_suite_tree(self.goal_scope.pyobject.get_ast()) suite = root.find_suite(lineno) indents = sourceutils.get_indents(lines, lineno) while self.get_scope_indents() < indents: lineno = suite.get_start() indents = sourceutils.get_indents(lines, lineno) suite = suite.parent return lineno else: return min(self.goal_scope.get_end() + 1, lines.length())
def get_changes(self, classname=None, new_class_name=None): if new_class_name is not None: warnings.warn( "new_class_name parameter is deprecated; use classname", DeprecationWarning, stacklevel=2, ) classname = new_class_name collector = codeanalyze.ChangeCollector(self.pymodule.source_code) start, end = sourceutils.get_body_region(self.pyfunction) indents = sourceutils.get_indents( self.pymodule.lines, self.pyfunction.get_scope().get_start()) + sourceutils.get_indent( self.project) new_contents = " " * indents + "return %s(%s)()\n" % ( classname, ", ".join(self._get_parameter_names()), ) collector.add_change(start, end, new_contents) insertion = self._get_class_insertion_point() collector.add_change(insertion, insertion, "\n\n" + self.get_new_class(classname)) changes = change.ChangeSet( "Replace method with method object refactoring") changes.add_change( change.ChangeContents(self.resource, collector.get_changed())) return changes
def _get_method_replacement(self): if self._is_the_last_method_of_a_class(): indents = sourceutils.get_indents( self.pymodule.lines, self.pyfunction.get_scope().get_start()) return ' ' * indents + 'pass\n' return ''
def occurred_outside_skip(self, change_collector, occurrence): start, end = occurrence.get_primary_range() if not occurrence.is_called(): raise rope.base.exceptions.RefactoringError( 'Reference to inlining function other than function call' ' in <file: %s, offset: %d>' % (self.resource.path, start)) if self.aim is not None and (self.aim < start or self.aim > end): return end_parens = self._find_end_parens(self.source, end - 1) lineno = self.lines.get_line_number(start) start_line, end_line = self.pymodule.logical_lines.\ logical_line_in(lineno) line_start = self.lines.get_line_start(start_line) line_end = self.lines.get_line_end(end_line) returns = self.source[line_start:start].strip() != '' or \ self.source[end_parens:line_end].strip() != '' indents = sourceutils.get_indents(self.lines, start_line) primary, pyname = occurrence.get_primary_and_pyname() definition, returned = self.generator.get_definition( primary, pyname, self.source[start:end_parens], returns=returns) end = min(line_end + 1, len(self.source)) change_collector.add_change( line_start, end, sourceutils.fix_indentation(definition, indents)) if returns: name = returned if name is None: name = 'None' change_collector.add_change( line_end, end, self.source[line_start:start] + name + self.source[end_parens:end])
def find_indents(self): if self.info.variable and not self.info.make_global: return sourceutils.get_indents(self.info.lines, self._get_before_line()) else: if self.info.global_ or self.info.make_global: return 0 return self.info.scope_indents
def _auto_indent(self, offset, text): lineno = self.lines.get_line_number(offset) indents = sourceutils.get_indents(self.lines, lineno) result = [] for index, line in enumerate(text.splitlines(True)): if index != 0 and line.strip(): result.append(' ' * indents) result.append(line) return ''.join(result)
def get_changes(self, classname=None, new_class_name=None): if new_class_name is not None: warnings.warn( 'new_class_name parameter is deprecated; use classname', DeprecationWarning, stacklevel=2) classname = new_class_name collector = codeanalyze.ChangeCollector(self.pymodule.source_code) start, end = sourceutils.get_body_region(self.pyfunction) indents = sourceutils.get_indents( self.pymodule.lines, self.pyfunction.get_scope().get_start()) + \ sourceutils.get_indent(self.pycore) new_contents = ' ' * indents + 'return %s(%s)()\n' % \ (classname, ', '.join(self._get_parameter_names())) collector.add_change(start, end, new_contents) insertion = self._get_class_insertion_point() collector.add_change(insertion, insertion, '\n\n' + self.get_new_class(classname)) changes = change.ChangeSet('Replace method with method object refactoring') changes.add_change(change.ChangeContents(self.resource, collector.get_changed())) return changes
def occurred_outside_skip(self, change_collector, occurrence): start, end = occurrence.get_primary_range() # we remove out of date imports later if occurrence.is_in_import_statement(): return # the function is referenced outside an import statement if not occurrence.is_called(): raise rope.base.exceptions.RefactoringError( "Reference to inlining function other than function call" " in <file: %s, offset: %d>" % (self.resource.path, start) ) if self.aim is not None and (self.aim < start or self.aim > end): return end_parens = self._find_end_parens(self.source, end - 1) lineno = self.lines.get_line_number(start) start_line, end_line = self.pymodule.logical_lines.logical_line_in(lineno) line_start = self.lines.get_line_start(start_line) line_end = self.lines.get_line_end(end_line) returns = self.source[line_start:start].strip() != "" or self.source[end_parens:line_end].strip() != "" indents = sourceutils.get_indents(self.lines, start_line) primary, pyname = occurrence.get_primary_and_pyname() host = self.pymodule scope = host.scope.get_inner_scope_for_line(lineno) definition, returned = self.generator.get_definition( primary, pyname, self.source[start:end_parens], scope.get_names(), returns=returns ) end = min(line_end + 1, len(self.source)) change_collector.add_change(line_start, end, sourceutils.fix_indentation(definition, indents)) if returns: name = returned if name is None: name = "None" change_collector.add_change( line_end, end, self.source[line_start:start] + name + self.source[end_parens:end] )
def indents(self): return sourceutils.get_indents(self.pymodule.lines, self.region_lines[0])
def _get_scope_indents(self, lines, scope): return sourceutils.get_indents(lines, scope.get_start())
def get_scope_indents(self): if self.goal_scope.get_kind() == "Module": return 0 return (sourceutils.get_indents(self.goal_pymodule.lines, self.goal_scope.get_start()) + 4)
def _get_scope_indents(self, pyobject): pymodule = pyobject.get_module() return sourceutils.get_indents( pymodule.lines, pyobject.get_scope().get_start()) + \ sourceutils.get_indent(self.project)
def _get_scope_indents(self, pyobject): pymodule = pyobject.get_module() return sourceutils.get_indents(pymodule.lines, pyobject.get_scope().get_start()) + sourceutils.get_indent( self.project )
def scope_indents(self): if self.global_: return 0 return sourceutils.get_indents(self.pymodule.lines, self.scope.get_start())
def get_scope_indents(self): if self.goal_scope.get_kind() == 'Module': return 0 return sourceutils.get_indents(self.goal_pymodule.lines, self.goal_scope.get_start()) + 4