Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(342)

Unified Diff: tools/telemetry/third_party/rope/rope/refactor/localtofield.py

Issue 1132103009: Example of refactoring using rope library. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/telemetry/third_party/rope/rope/refactor/localtofield.py
diff --git a/tools/telemetry/third_party/rope/rope/refactor/localtofield.py b/tools/telemetry/third_party/rope/rope/refactor/localtofield.py
new file mode 100644
index 0000000000000000000000000000000000000000..f276070f71fab99a7efadeed8e91c2437c201328
--- /dev/null
+++ b/tools/telemetry/third_party/rope/rope/refactor/localtofield.py
@@ -0,0 +1,49 @@
+from rope.base import pynames, evaluate, exceptions, worder
+from rope.refactor.rename import Rename
+
+
+class LocalToField(object):
+
+ def __init__(self, project, resource, offset):
+ self.project = project
+ self.resource = resource
+ self.offset = offset
+
+ def get_changes(self):
+ name = worder.get_name_at(self.resource, self.offset)
+ this_pymodule = self.project.get_pymodule(self.resource)
+ pyname = evaluate.eval_location(this_pymodule, self.offset)
+ if not self._is_a_method_local(pyname):
+ raise exceptions.RefactoringError(
+ 'Convert local variable to field should be performed on \n'
+ 'a local variable of a method.')
+
+ pymodule, lineno = pyname.get_definition_location()
+ function_scope = pymodule.get_scope().get_inner_scope_for_line(lineno)
+ # Not checking redefinition
+ #self._check_redefinition(name, function_scope)
+
+ new_name = self._get_field_name(function_scope.pyobject, name)
+ changes = Rename(self.project, self.resource, self.offset).\
+ get_changes(new_name, resources=[self.resource])
+ return changes
+
+ def _check_redefinition(self, name, function_scope):
+ class_scope = function_scope.parent
+ if name in class_scope.pyobject:
+ raise exceptions.RefactoringError(
+ 'The field %s already exists' % name)
+
+ def _get_field_name(self, pyfunction, name):
+ self_name = pyfunction.get_param_names()[0]
+ new_name = self_name + '.' + name
+ return new_name
+
+ def _is_a_method_local(self, pyname):
+ pymodule, lineno = pyname.get_definition_location()
+ holding_scope = pymodule.get_scope().get_inner_scope_for_line(lineno)
+ parent = holding_scope.parent
+ return isinstance(pyname, pynames.AssignedName) and \
+ pyname in holding_scope.get_names().values() and \
+ holding_scope.get_kind() == 'Function' and \
+ parent is not None and parent.get_kind() == 'Class'

Powered by Google App Engine
This is Rietveld 408576698