@@ -8,13 +8,11 @@ import 'package:devtools_app_shared/utils.dart';
8
8
import 'package:dtd/dtd.dart' ;
9
9
import 'package:flutter/foundation.dart' ;
10
10
import 'package:json_rpc_2/json_rpc_2.dart' ;
11
- import 'package:logging/logging.dart' ;
12
11
13
12
import '../analytics/constants.dart' ;
13
+ import '../framework/app_error_handling.dart' ;
14
14
import 'api_classes.dart' ;
15
15
16
- final _log = Logger ('editor_client' );
17
-
18
16
/// A client wrapper that connects to an editor over DTD.
19
17
///
20
18
/// Changes made to the editor services/events should be considered carefully to
@@ -262,18 +260,47 @@ class EditorClient extends DisposableController
262
260
}) async {
263
261
final method = editableArgumentsMethodName.value;
264
262
if (method == null ) return null ;
265
- final response = await _callLspApi (
266
- method,
267
- params: {
268
- 'type' : 'Object' , // This is required by DTD.
269
- 'textDocument' : textDocument.toJson (),
270
- 'position' : position.toJson (),
271
- },
272
- );
273
- final result = response.result[Field .result];
274
- return result != null
275
- ? EditableArgumentsResult .fromJson (result as Map <String , Object ?>)
276
- : null ;
263
+
264
+ String ? errorMessage;
265
+ StackTrace ? stack;
266
+ EditableArgumentsResult ? result;
267
+ try {
268
+ final response = await _callLspApi (
269
+ method,
270
+ params: {
271
+ 'type' : 'Object' , // This is required by DTD.
272
+ 'textDocument' : textDocument.toJson (),
273
+ 'position' : position.toJson (),
274
+ },
275
+ );
276
+ final rawResult = response.result[Field .result];
277
+ result =
278
+ rawResult != null
279
+ ? EditableArgumentsResult .fromJson (
280
+ rawResult as Map <String , Object ?>,
281
+ )
282
+ : null ;
283
+ } on RpcException catch (e, st) {
284
+ // We expect content modified errors if a user edits their code before the
285
+ // request completes. Therefore it is safe to ignore.
286
+ if (e.code != AnalysisServerError .contentModifiedError.code) {
287
+ errorMessage = e.message;
288
+ stack = st;
289
+ }
290
+ } catch (e, st) {
291
+ errorMessage = 'Unknown error: $e ' ;
292
+ stack = st;
293
+ } finally {
294
+ if (errorMessage != null ) {
295
+ reportError (
296
+ errorMessage,
297
+ errorType: PropertyEditorSidebar .getEditableArgumentsIdentifier,
298
+ stack: stack,
299
+ );
300
+ }
301
+ }
302
+
303
+ return result;
277
304
}
278
305
279
306
/// Requests that the Analysis Server makes a code edit for an argument.
@@ -290,6 +317,9 @@ class EditorClient extends DisposableController
290
317
errorMessage: 'API is unavailable.' ,
291
318
);
292
319
}
320
+
321
+ String ? errorMessage;
322
+ StackTrace ? stack;
293
323
try {
294
324
await _callLspApi (
295
325
method,
@@ -301,22 +331,22 @@ class EditorClient extends DisposableController
301
331
},
302
332
);
303
333
return EditArgumentResponse (success: true );
304
- } on RpcException catch (e) {
305
- final errorMessage = e.message;
306
- _log.severe (errorMessage);
307
- return EditArgumentResponse (
308
- success: false ,
309
- errorCode: e.code,
310
- errorMessage: errorMessage,
311
- );
312
- } catch (e) {
313
- final errorMessage = 'Unknown error: $e ' ;
314
- _log.severe (errorMessage);
315
- return EditArgumentResponse (
316
- success: false ,
317
- errorMessage: 'Unknown error: $e ' ,
318
- );
334
+ } on RpcException catch (e, st) {
335
+ errorMessage = e.message;
336
+ stack = st;
337
+ } catch (e, st) {
338
+ errorMessage = 'Unknown error: $e ' ;
339
+ stack = st;
340
+ } finally {
341
+ if (errorMessage != null ) {
342
+ reportError (
343
+ errorMessage,
344
+ errorType: PropertyEditorSidebar .editArgumentIdentifier,
345
+ stack: stack,
346
+ );
347
+ }
319
348
}
349
+ return EditArgumentResponse (success: false , errorMessage: errorMessage);
320
350
}
321
351
322
352
Future <DTDResponse > _call (
0 commit comments