Skip to content

Commit 7c8b558

Browse files
committed
handle rope library writing to stdErr stream #220
1 parent 2ade46d commit 7c8b558

File tree

3 files changed

+31
-24
lines changed

3 files changed

+31
-24
lines changed

pythonFiles/refactor.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ class ExtractVariableRefactor(BaseRefactoring):
121121

122122
def __init__(self, project, resource, name="Extract Variable", progressCallback=None, startOffset=None, endOffset=None, newName="new_Name", similar=False, global_=False):
123123
BaseRefactoring.__init__(self, project, resource,
124-
name, progressCallback)
124+
name, progressCallback)
125125
self._newName = newName
126126
self._startOffset = startOffset
127127
self._endOffset = endOffset
@@ -145,7 +145,8 @@ class ExtractMethodRefactor(ExtractVariableRefactor):
145145

146146
def __init__(self, project, resource, name="Extract Method", progressCallback=None, startOffset=None, endOffset=None, newName="new_Name", similar=False, global_=False):
147147
ExtractVariableRefactor.__init__(self, project, resource,
148-
name, progressCallback, startOffset=startOffset, endOffset=endOffset, newName=newName, similar=similar, global_=global_)
148+
name, progressCallback, startOffset=startOffset, endOffset=endOffset, newName=newName, similar=similar, global_=global_)
149+
149150
def onRefactor(self):
150151
renamed = ExtractMethod(
151152
self.project, self.resource, self._startOffset, self._endOffset)
@@ -169,30 +170,34 @@ def _extractVariable(self, filePath, start, end, newName):
169170
"""
170171
Extracts a variale
171172
"""
172-
project = rope.base.project.Project(WORKSPACE_ROOT, ropefolder=ROPE_PROJECT_FOLDER, save_history=False)
173+
project = rope.base.project.Project(
174+
WORKSPACE_ROOT, ropefolder=ROPE_PROJECT_FOLDER, save_history=False)
173175
resourceToRefactor = libutils.path_to_resource(project, filePath)
174-
refactor = ExtractVariableRefactor(project, resourceToRefactor, startOffset=start, endOffset=end, newName=newName)
176+
refactor = ExtractVariableRefactor(
177+
project, resourceToRefactor, startOffset=start, endOffset=end, newName=newName)
175178
refactor.refactor()
176179
changes = refactor.changes
177180
project.close()
178181
valueToReturn = []
179182
for change in changes:
180-
valueToReturn.append({'diff':change.diff})
183+
valueToReturn.append({'diff': change.diff})
181184
return valueToReturn
182185

183186
def _extractMethod(self, filePath, start, end, newName):
184187
"""
185188
Extracts a method
186189
"""
187-
project = rope.base.project.Project(WORKSPACE_ROOT, ropefolder=ROPE_PROJECT_FOLDER, save_history=False)
190+
project = rope.base.project.Project(
191+
WORKSPACE_ROOT, ropefolder=ROPE_PROJECT_FOLDER, save_history=False)
188192
resourceToRefactor = libutils.path_to_resource(project, filePath)
189-
refactor = ExtractMethodRefactor(project, resourceToRefactor, startOffset=start, endOffset=end, newName=newName)
193+
refactor = ExtractMethodRefactor(
194+
project, resourceToRefactor, startOffset=start, endOffset=end, newName=newName)
190195
refactor.refactor()
191196
changes = refactor.changes
192197
project.close()
193198
valueToReturn = []
194199
for change in changes:
195-
valueToReturn.append({'diff':change.diff})
200+
valueToReturn.append({'diff': change.diff})
196201
return valueToReturn
197202

198203
def _serialize(self, identifier, results):
@@ -221,10 +226,12 @@ def _process_request(self, request):
221226
if lookup == '':
222227
pass
223228
elif lookup == 'extract_variable':
224-
changes = self._extractVariable(request['file'], int(request['start']), int(request['end']), request['name'])
229+
changes = self._extractVariable(request['file'], int(
230+
request['start']), int(request['end']), request['name'])
225231
return self._write_response(self._serialize(request['id'], changes))
226232
elif lookup == 'extract_method':
227-
changes = self._extractMethod(request['file'], int(request['start']), int(request['end']), request['name'])
233+
changes = self._extractMethod(request['file'], int(
234+
request['start']), int(request['end']), request['name'])
228235
return self._write_response(self._serialize(request['id'], changes))
229236

230237
def _write_response(self, response):
@@ -238,7 +245,7 @@ def watch(self):
238245
self._process_request(self._input.readline())
239246
except Exception as ex:
240247
message = ex.message + ' \n' + traceback.format_exc()
241-
sys.stderr.write(str(len(message)) + ':' + message)
248+
sys.stderr.write('$ERROR' + str(len(message)) + ':' + message)
242249
sys.stderr.flush()
243250

244251
if __name__ == '__main__':

src/client/refactor/proxy.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ import {execPythonFile} from '../common/utils';
99
import {PythonSettings} from '../common/configSettings';
1010

1111
const ROPE_PYTHON_VERSION = 'Refactor requires Python 2.x. Set \'python.pythonRopePath\' in Settings.json';
12+
const ERROR_PREFIX = '$ERROR';
1213

1314
export class RefactorProxy extends vscode.Disposable {
1415
private _process: child_process.ChildProcess;
1516
private _extensionDir: string;
1617
private _previousOutData: string = '';
18+
private _previousStdErrData: string = '';
1719
private _startedSuccessfully: boolean = false;
1820
private _commandResolve: (value?: any | PromiseLike<any>) => void;
1921
private _commandReject: (reason?: any) => void;
@@ -117,17 +119,21 @@ export class RefactorProxy extends vscode.Disposable {
117119
});
118120
}
119121
private handleStdError(data: string) {
120-
console.log('handleStdError');
121-
let dataStr = this._previousOutData = this._previousOutData + data + '';
122-
console.log('handleStdError - ' + dataStr);
122+
let dataStr = this._previousStdErrData = this._previousStdErrData + data + '';
123123
if (this._startedSuccessfully) {
124+
// The Rope library can send other (warning) messages in the stderr stream
125+
// Hence look for the prefix, if we don't have the prefix ignore them
126+
if (!dataStr.startsWith(ERROR_PREFIX)) {
127+
this._previousStdErrData = '';
128+
return;
129+
}
124130
let lengthOfHeader = dataStr.indexOf(':') + 1;
125-
let lengthOfMessage = parseInt(dataStr.substring(0, lengthOfHeader - 1));
131+
let lengthOfMessage = parseInt(dataStr.substring(ERROR_PREFIX.length, lengthOfHeader - 1));
126132
if (dataStr.length === lengthOfMessage + lengthOfHeader) {
127-
this._previousOutData = '';
133+
this._previousStdErrData = '';
128134
this.dispose();
129135

130-
let errorLines = dataStr.substring(lengthOfHeader + 1).split(/\r?\n/g);
136+
let errorLines = dataStr.substring(lengthOfHeader).split(/\r?\n/g);
131137
let hasErrorMessage = errorLines[0].trim().length > 0;
132138
errorLines = errorLines.filter(line => line.length > 0);
133139
let errorMessage = errorLines.join('\n');
@@ -155,7 +161,7 @@ export class RefactorProxy extends vscode.Disposable {
155161
}
156162
private onData(data: string) {
157163
if (!this._commandResolve) { return; }
158-
console.log('onData - ' + data);
164+
159165
// Possible there was an exception in parsing the data returned
160166
// So append the data then parse it
161167
let dataStr = this._previousOutData = this._previousOutData + data + '';
@@ -168,7 +174,6 @@ export class RefactorProxy extends vscode.Disposable {
168174
// Possible we've only received part of the data, hence don't clear previousData
169175
return;
170176
}
171-
console.log('onData - ' + response);
172177
this.dispose();
173178
this._commandResolve(response[0]);
174179
this._commandResolve = null;

src/test/extension.simpleRefactor.test.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,19 +87,14 @@ suite('Simple Refactor', () => {
8787
textEditor = editor;
8888
return;
8989
}).then(() => {
90-
console.log('Started Variable Extraction');
91-
console.log(EXTENSION_DIR);
92-
console.log(path.dirname(refactorTargetFile));
9390
return extractVariable(EXTENSION_DIR, textEditor, rangeOfTextToExtract, ch, path.dirname(refactorTargetFile), false).then(() => {
9491
assert.equal(textDocument.lineAt(234).text.trim().indexOf('newvariable'), 0, 'New Variable not created');
9592
assert.equal(textDocument.lineAt(234).text.trim().endsWith('= "STARTED"'), true, 'Started Text Assigned to variable');
9693
assert.equal(textDocument.lineAt(235).text.indexOf('(newvariable') >= 0, true, 'New Variable not being used');
9794
}).catch(error => {
98-
console.log('Error in Variable Extraction.1');
9995
assert.fail(error + '', null, 'Variable extraction failed\n' + ch.output);
10096
});
10197
}, error => {
102-
console.log('Error in Variable Extraction.2');
10398
assert.fail(error + '', null, 'Variable extraction failed\n' + ch.output);
10499
});
105100
});

0 commit comments

Comments
 (0)