from bike.parsing.load import getSourceNode
from bike.transformer.undo import getUndoStack
from bike.transformer.save import queueFileToSave
import re
# This class maintains a set of changed lines to the original source
# nodes. This is important because the act of changing a line messes
# up the coordinates on which renames are done.
# Commit writes the changes back to the source nodes
class WordRewriter:
def __init__(self):
self.modifiedsrc = {}
def rewriteString(self, srcnode, lineno, colno, newname):
filename = srcnode.filename
if not self.modifiedsrc.has_key(filename):
getUndoStack().addSource(filename,srcnode.getSource())
self.modifiedsrc[filename] = {}
if not self.modifiedsrc[filename].has_key(lineno):
line = srcnode.getLines()[lineno-1]
self.modifiedsrc[filename][lineno] = self._lineToDict(line)
self.modifiedsrc[filename][lineno][colno] = newname
# writes all the changes back to the src nodes
def commit(self):
for filename in self.modifiedsrc.keys():
srcnode = getSourceNode(filename)
for lineno in self.modifiedsrc[filename]:
lines = srcnode.getLines()
lines[lineno-1] = self._dictToLine(self.modifiedsrc[filename][lineno])
queueFileToSave(filename,"".join(srcnode.getLines()))
# this function creates a dictionary with each word referenced by
# its column position in the original line
def _lineToDict(self, line):
words = re.split("(\w+)", line)
h = {};i = 0
for word in words:
h[i] = word
i+=len(word)
return h
def _dictToLine(self, d):
cols = d.keys()
cols.sort()
return "".join([d[colno]for colno in cols])
|