| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library edit.domain; | 5 library edit.domain; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 | 8 |
| 9 import 'package:analysis_server/plugin/edit/assist/assist_core.dart'; | 9 import 'package:analysis_server/plugin/edit/assist/assist_core.dart'; |
| 10 import 'package:analysis_server/plugin/edit/assist/assist_dart.dart'; | 10 import 'package:analysis_server/plugin/edit/assist/assist_dart.dart'; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 import 'package:analysis_server/src/services/correction/sort_members.dart'; | 22 import 'package:analysis_server/src/services/correction/sort_members.dart'; |
| 23 import 'package:analysis_server/src/services/correction/status.dart'; | 23 import 'package:analysis_server/src/services/correction/status.dart'; |
| 24 import 'package:analysis_server/src/services/refactoring/refactoring.dart'; | 24 import 'package:analysis_server/src/services/refactoring/refactoring.dart'; |
| 25 import 'package:analysis_server/src/services/search/search_engine.dart'; | 25 import 'package:analysis_server/src/services/search/search_engine.dart'; |
| 26 import 'package:analyzer/dart/ast/ast.dart'; | 26 import 'package:analyzer/dart/ast/ast.dart'; |
| 27 import 'package:analyzer/dart/ast/standard_resolution_map.dart'; | 27 import 'package:analyzer/dart/ast/standard_resolution_map.dart'; |
| 28 import 'package:analyzer/dart/element/element.dart'; | 28 import 'package:analyzer/dart/element/element.dart'; |
| 29 import 'package:analyzer/error/error.dart' as engine; | 29 import 'package:analyzer/error/error.dart' as engine; |
| 30 import 'package:analyzer/file_system/file_system.dart'; | 30 import 'package:analyzer/file_system/file_system.dart'; |
| 31 import 'package:analyzer/src/dart/analysis/driver.dart'; | 31 import 'package:analyzer/src/dart/analysis/driver.dart'; |
| 32 import 'package:analyzer/src/dart/element/ast_provider.dart'; |
| 32 import 'package:analyzer/src/dart/scanner/scanner.dart' as engine; | 33 import 'package:analyzer/src/dart/scanner/scanner.dart' as engine; |
| 33 import 'package:analyzer/src/error/codes.dart' as engine; | 34 import 'package:analyzer/src/error/codes.dart' as engine; |
| 34 import 'package:analyzer/src/generated/engine.dart' as engine; | 35 import 'package:analyzer/src/generated/engine.dart' as engine; |
| 35 import 'package:analyzer/src/generated/parser.dart' as engine; | 36 import 'package:analyzer/src/generated/parser.dart' as engine; |
| 36 import 'package:analyzer/src/generated/source.dart'; | 37 import 'package:analyzer/src/generated/source.dart'; |
| 37 import 'package:analyzer/task/dart.dart'; | 38 import 'package:analyzer/task/dart.dart'; |
| 38 import 'package:dart_style/dart_style.dart'; | 39 import 'package:dart_style/dart_style.dart'; |
| 39 | 40 |
| 40 int test_resetCount = 0; | 41 int test_resetCount = 0; |
| 41 | 42 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 CompilationUnit unit = result.unit; | 189 CompilationUnit unit = result.unit; |
| 189 LineInfo lineInfo = result.lineInfo; | 190 LineInfo lineInfo = result.lineInfo; |
| 190 int requestLine = lineInfo.getLocation(offset).lineNumber; | 191 int requestLine = lineInfo.getLocation(offset).lineNumber; |
| 191 for (engine.AnalysisError error in result.errors) { | 192 for (engine.AnalysisError error in result.errors) { |
| 192 int errorLine = lineInfo.getLocation(error.offset).lineNumber; | 193 int errorLine = lineInfo.getLocation(error.offset).lineNumber; |
| 193 if (errorLine == requestLine) { | 194 if (errorLine == requestLine) { |
| 194 var context = new _DartFixContextImpl( | 195 var context = new _DartFixContextImpl( |
| 195 server.resourceProvider, | 196 server.resourceProvider, |
| 196 result.driver.getTopLevelNameDeclarations, | 197 result.driver.getTopLevelNameDeclarations, |
| 197 resolutionMap.elementDeclaredByCompilationUnit(unit).context, | 198 resolutionMap.elementDeclaredByCompilationUnit(unit).context, |
| 199 server.getAstProvider(file), |
| 198 unit, | 200 unit, |
| 199 error); | 201 error); |
| 200 List<Fix> fixes = | 202 List<Fix> fixes = |
| 201 await new DefaultFixContributor().internalComputeFixes(context); | 203 await new DefaultFixContributor().internalComputeFixes(context); |
| 202 if (fixes.isNotEmpty) { | 204 if (fixes.isNotEmpty) { |
| 203 fixes.sort(Fix.SORT_BY_RELEVANCE); | 205 fixes.sort(Fix.SORT_BY_RELEVANCE); |
| 204 AnalysisError serverError = | 206 AnalysisError serverError = |
| 205 newAnalysisError_fromEngine(lineInfo, error); | 207 newAnalysisError_fromEngine(lineInfo, error); |
| 206 AnalysisErrorFixes errorFixes = | 208 AnalysisErrorFixes errorFixes = |
| 207 new AnalysisErrorFixes(serverError); | 209 new AnalysisErrorFixes(serverError); |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 kinds.add(RefactoringKind.EXTRACT_LOCAL_VARIABLE); | 415 kinds.add(RefactoringKind.EXTRACT_LOCAL_VARIABLE); |
| 414 kinds.add(RefactoringKind.EXTRACT_METHOD); | 416 kinds.add(RefactoringKind.EXTRACT_METHOD); |
| 415 } | 417 } |
| 416 // check elements | 418 // check elements |
| 417 { | 419 { |
| 418 Element element = await server.getElementAtOffset(file, offset); | 420 Element element = await server.getElementAtOffset(file, offset); |
| 419 if (element != null) { | 421 if (element != null) { |
| 420 // try CONVERT_METHOD_TO_GETTER | 422 // try CONVERT_METHOD_TO_GETTER |
| 421 if (element is ExecutableElement) { | 423 if (element is ExecutableElement) { |
| 422 Refactoring refactoring = new ConvertMethodToGetterRefactoring( | 424 Refactoring refactoring = new ConvertMethodToGetterRefactoring( |
| 423 searchEngine, _getResolvedUnit, element); | 425 searchEngine, server.getAstProvider(file), element); |
| 424 RefactoringStatus status = await refactoring.checkInitialConditions(); | 426 RefactoringStatus status = await refactoring.checkInitialConditions(); |
| 425 if (!status.hasFatalError) { | 427 if (!status.hasFatalError) { |
| 426 kinds.add(RefactoringKind.CONVERT_METHOD_TO_GETTER); | 428 kinds.add(RefactoringKind.CONVERT_METHOD_TO_GETTER); |
| 427 } | 429 } |
| 428 } | 430 } |
| 429 // try RENAME | 431 // try RENAME |
| 430 { | 432 { |
| 431 RenameRefactoring renameRefactoring = | 433 RenameRefactoring renameRefactoring = new RenameRefactoring( |
| 432 new RenameRefactoring(searchEngine, element); | 434 searchEngine, server.getAstProvider(file), element); |
| 433 if (renameRefactoring != null) { | 435 if (renameRefactoring != null) { |
| 434 kinds.add(RefactoringKind.RENAME); | 436 kinds.add(RefactoringKind.RENAME); |
| 435 } | 437 } |
| 436 } | 438 } |
| 437 } | 439 } |
| 438 } | 440 } |
| 439 // respond | 441 // respond |
| 440 var result = new EditGetAvailableRefactoringsResult(kinds); | 442 var result = new EditGetAvailableRefactoringsResult(kinds); |
| 441 server.sendResponse(result.toResponse(request.id)); | 443 server.sendResponse(result.toResponse(request.id)); |
| 442 } | 444 } |
| 443 | 445 |
| 444 Response _getRefactoring(Request request) { | 446 Response _getRefactoring(Request request) { |
| 445 if (searchEngine == null) { | 447 if (searchEngine == null) { |
| 446 return new Response.noIndexGenerated(request); | 448 return new Response.noIndexGenerated(request); |
| 447 } | 449 } |
| 448 if (refactoringManager.hasPendingRequest) { | 450 if (refactoringManager.hasPendingRequest) { |
| 449 refactoringManager.cancel(); | 451 refactoringManager.cancel(); |
| 450 _newRefactoringManager(); | 452 _newRefactoringManager(); |
| 451 } | 453 } |
| 452 refactoringManager.getRefactoring(request); | 454 refactoringManager.getRefactoring(request); |
| 453 return Response.DELAYED_RESPONSE; | 455 return Response.DELAYED_RESPONSE; |
| 454 } | 456 } |
| 455 | 457 |
| 456 Future<CompilationUnit> _getResolvedUnit(Element element) { | |
| 457 String path = element.source.fullName; | |
| 458 return server.getResolvedCompilationUnit(path); | |
| 459 } | |
| 460 | |
| 461 /** | 458 /** |
| 462 * Initializes [refactoringManager] with a new instance. | 459 * Initializes [refactoringManager] with a new instance. |
| 463 */ | 460 */ |
| 464 void _newRefactoringManager() { | 461 void _newRefactoringManager() { |
| 465 refactoringManager = | 462 refactoringManager = new _RefactoringManager(server, searchEngine); |
| 466 new _RefactoringManager(server, _getResolvedUnit, searchEngine); | |
| 467 } | 463 } |
| 468 | 464 |
| 469 static int _getNumberOfScanParseErrors(List<engine.AnalysisError> errors) { | 465 static int _getNumberOfScanParseErrors(List<engine.AnalysisError> errors) { |
| 470 int numScanParseErrors = 0; | 466 int numScanParseErrors = 0; |
| 471 for (engine.AnalysisError error in errors) { | 467 for (engine.AnalysisError error in errors) { |
| 472 if (error.errorCode is engine.ScannerErrorCode || | 468 if (error.errorCode is engine.ScannerErrorCode || |
| 473 error.errorCode is engine.ParserErrorCode) { | 469 error.errorCode is engine.ParserErrorCode) { |
| 474 numScanParseErrors++; | 470 numScanParseErrors++; |
| 475 } | 471 } |
| 476 } | 472 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 @override | 505 @override |
| 510 final ResourceProvider resourceProvider; | 506 final ResourceProvider resourceProvider; |
| 511 | 507 |
| 512 @override | 508 @override |
| 513 final GetTopLevelDeclarations getTopLevelDeclarations; | 509 final GetTopLevelDeclarations getTopLevelDeclarations; |
| 514 | 510 |
| 515 @override | 511 @override |
| 516 final engine.AnalysisContext analysisContext; | 512 final engine.AnalysisContext analysisContext; |
| 517 | 513 |
| 518 @override | 514 @override |
| 515 final AstProvider astProvider; |
| 516 |
| 517 @override |
| 519 final CompilationUnit unit; | 518 final CompilationUnit unit; |
| 520 | 519 |
| 521 @override | 520 @override |
| 522 final engine.AnalysisError error; | 521 final engine.AnalysisError error; |
| 523 | 522 |
| 524 _DartFixContextImpl(this.resourceProvider, this.getTopLevelDeclarations, | 523 _DartFixContextImpl(this.resourceProvider, this.getTopLevelDeclarations, |
| 525 this.analysisContext, this.unit, this.error); | 524 this.analysisContext, this.astProvider, this.unit, this.error); |
| 526 } | 525 } |
| 527 | 526 |
| 528 /** | 527 /** |
| 529 * An object managing a single [Refactoring] instance. | 528 * An object managing a single [Refactoring] instance. |
| 530 * | 529 * |
| 531 * The instance is identified by its kind, file, offset and length. | 530 * The instance is identified by its kind, file, offset and length. |
| 532 * It is initialized when the a set of parameters is given for the first time. | 531 * It is initialized when the a set of parameters is given for the first time. |
| 533 * All subsequent requests are performed on this [Refactoring] instance. | 532 * All subsequent requests are performed on this [Refactoring] instance. |
| 534 * | 533 * |
| 535 * Once new set of parameters is received, the previous [Refactoring] instance | 534 * Once new set of parameters is received, the previous [Refactoring] instance |
| 536 * is invalidated and a new one is created and initialized. | 535 * is invalidated and a new one is created and initialized. |
| 537 */ | 536 */ |
| 538 class _RefactoringManager { | 537 class _RefactoringManager { |
| 539 static const List<RefactoringProblem> EMPTY_PROBLEM_LIST = | 538 static const List<RefactoringProblem> EMPTY_PROBLEM_LIST = |
| 540 const <RefactoringProblem>[]; | 539 const <RefactoringProblem>[]; |
| 541 | 540 |
| 542 final AnalysisServer server; | 541 final AnalysisServer server; |
| 543 final GetResolvedUnit getResolvedUnit; | |
| 544 final SearchEngine searchEngine; | 542 final SearchEngine searchEngine; |
| 545 StreamSubscription subscriptionToReset; | 543 StreamSubscription subscriptionToReset; |
| 546 | 544 |
| 547 RefactoringKind kind; | 545 RefactoringKind kind; |
| 548 String file; | 546 String file; |
| 549 int offset; | 547 int offset; |
| 550 int length; | 548 int length; |
| 551 Refactoring refactoring; | 549 Refactoring refactoring; |
| 552 RefactoringFeedback feedback; | 550 RefactoringFeedback feedback; |
| 553 RefactoringStatus initStatus; | 551 RefactoringStatus initStatus; |
| 554 RefactoringStatus optionsStatus; | 552 RefactoringStatus optionsStatus; |
| 555 RefactoringStatus finalStatus; | 553 RefactoringStatus finalStatus; |
| 556 | 554 |
| 557 Request request; | 555 Request request; |
| 558 EditGetRefactoringResult result; | 556 EditGetRefactoringResult result; |
| 559 | 557 |
| 560 _RefactoringManager(this.server, this.getResolvedUnit, this.searchEngine) { | 558 _RefactoringManager(this.server, this.searchEngine) { |
| 561 _reset(); | 559 _reset(); |
| 562 } | 560 } |
| 563 | 561 |
| 564 /** | 562 /** |
| 565 * Returns `true` if a response for the current request has not yet been sent. | 563 * Returns `true` if a response for the current request has not yet been sent. |
| 566 */ | 564 */ |
| 567 bool get hasPendingRequest => request != null; | 565 bool get hasPendingRequest => request != null; |
| 568 | 566 |
| 569 bool get _hasFatalError { | 567 bool get _hasFatalError { |
| 570 return initStatus.hasFatalError || | 568 return initStatus.hasFatalError || |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 734 // simulate an exception | 732 // simulate an exception |
| 735 if (test_simulateRefactoringException_init) { | 733 if (test_simulateRefactoringException_init) { |
| 736 throw 'A simulated refactoring exception - init.'; | 734 throw 'A simulated refactoring exception - init.'; |
| 737 } | 735 } |
| 738 // create a new Refactoring instance | 736 // create a new Refactoring instance |
| 739 if (kind == RefactoringKind.CONVERT_GETTER_TO_METHOD) { | 737 if (kind == RefactoringKind.CONVERT_GETTER_TO_METHOD) { |
| 740 Element element = await server.getElementAtOffset(file, offset); | 738 Element element = await server.getElementAtOffset(file, offset); |
| 741 if (element != null) { | 739 if (element != null) { |
| 742 if (element is ExecutableElement) { | 740 if (element is ExecutableElement) { |
| 743 _resetOnAnalysisStarted(); | 741 _resetOnAnalysisStarted(); |
| 744 refactoring = | 742 refactoring = new ConvertGetterToMethodRefactoring( |
| 745 new ConvertGetterToMethodRefactoring(searchEngine, element); | 743 searchEngine, server.getAstProvider(file), element); |
| 746 } | 744 } |
| 747 } | 745 } |
| 748 } | 746 } |
| 749 if (kind == RefactoringKind.CONVERT_METHOD_TO_GETTER) { | 747 if (kind == RefactoringKind.CONVERT_METHOD_TO_GETTER) { |
| 750 Element element = await server.getElementAtOffset(file, offset); | 748 Element element = await server.getElementAtOffset(file, offset); |
| 751 if (element != null) { | 749 if (element != null) { |
| 752 if (element is ExecutableElement) { | 750 if (element is ExecutableElement) { |
| 753 _resetOnAnalysisStarted(); | 751 _resetOnAnalysisStarted(); |
| 754 refactoring = new ConvertMethodToGetterRefactoring( | 752 refactoring = new ConvertMethodToGetterRefactoring( |
| 755 searchEngine, getResolvedUnit, element); | 753 searchEngine, server.getAstProvider(file), element); |
| 756 } | 754 } |
| 757 } | 755 } |
| 758 } | 756 } |
| 759 if (kind == RefactoringKind.EXTRACT_LOCAL_VARIABLE) { | 757 if (kind == RefactoringKind.EXTRACT_LOCAL_VARIABLE) { |
| 760 CompilationUnit unit = await server.getResolvedCompilationUnit(file); | 758 CompilationUnit unit = await server.getResolvedCompilationUnit(file); |
| 761 if (unit != null) { | 759 if (unit != null) { |
| 762 _resetOnFileResolutionChanged(file); | 760 _resetOnFileResolutionChanged(file); |
| 763 refactoring = new ExtractLocalRefactoring(unit, offset, length); | 761 refactoring = new ExtractLocalRefactoring(unit, offset, length); |
| 764 feedback = new ExtractLocalVariableFeedback( | 762 feedback = new ExtractLocalVariableFeedback( |
| 765 <String>[], <int>[], <int>[], | 763 <String>[], <int>[], <int>[], |
| 766 coveringExpressionOffsets: <int>[], | 764 coveringExpressionOffsets: <int>[], |
| 767 coveringExpressionLengths: <int>[]); | 765 coveringExpressionLengths: <int>[]); |
| 768 } | 766 } |
| 769 } | 767 } |
| 770 if (kind == RefactoringKind.EXTRACT_METHOD) { | 768 if (kind == RefactoringKind.EXTRACT_METHOD) { |
| 771 CompilationUnit unit = await server.getResolvedCompilationUnit(file); | 769 CompilationUnit unit = await server.getResolvedCompilationUnit(file); |
| 772 if (unit != null) { | 770 if (unit != null) { |
| 773 _resetOnAnalysisStarted(); | 771 _resetOnAnalysisStarted(); |
| 774 refactoring = | 772 refactoring = |
| 775 new ExtractMethodRefactoring(searchEngine, unit, offset, length); | 773 new ExtractMethodRefactoring(searchEngine, unit, offset, length); |
| 776 feedback = new ExtractMethodFeedback(offset, length, '', <String>[], | 774 feedback = new ExtractMethodFeedback(offset, length, '', <String>[], |
| 777 false, <RefactoringMethodParameter>[], <int>[], <int>[]); | 775 false, <RefactoringMethodParameter>[], <int>[], <int>[]); |
| 778 } | 776 } |
| 779 } | 777 } |
| 780 if (kind == RefactoringKind.INLINE_LOCAL_VARIABLE) { | 778 if (kind == RefactoringKind.INLINE_LOCAL_VARIABLE) { |
| 781 CompilationUnit unit = await server.getResolvedCompilationUnit(file); | 779 CompilationUnit unit = await server.getResolvedCompilationUnit(file); |
| 782 if (unit != null) { | 780 if (unit != null) { |
| 783 _resetOnFileResolutionChanged(file); | 781 _resetOnFileResolutionChanged(file); |
| 784 refactoring = new InlineLocalRefactoring(searchEngine, unit, offset); | 782 refactoring = new InlineLocalRefactoring( |
| 783 searchEngine, server.getAstProvider(file), unit, offset); |
| 785 } | 784 } |
| 786 } | 785 } |
| 787 if (kind == RefactoringKind.INLINE_METHOD) { | 786 if (kind == RefactoringKind.INLINE_METHOD) { |
| 788 CompilationUnit unit = await server.getResolvedCompilationUnit(file); | 787 CompilationUnit unit = await server.getResolvedCompilationUnit(file); |
| 789 if (unit != null) { | 788 if (unit != null) { |
| 790 _resetOnAnalysisStarted(); | 789 _resetOnAnalysisStarted(); |
| 791 refactoring = new InlineMethodRefactoring( | 790 refactoring = new InlineMethodRefactoring( |
| 792 searchEngine, getResolvedUnit, unit, offset); | 791 searchEngine, server.getAstProvider(file), unit, offset); |
| 793 } | 792 } |
| 794 } | 793 } |
| 795 if (kind == RefactoringKind.MOVE_FILE) { | 794 if (kind == RefactoringKind.MOVE_FILE) { |
| 796 _resetOnAnalysisStarted(); | 795 _resetOnAnalysisStarted(); |
| 797 ContextSourcePair contextSource = server.getContextSourcePair(file); | 796 ContextSourcePair contextSource = server.getContextSourcePair(file); |
| 798 engine.AnalysisContext context = contextSource.context; | 797 engine.AnalysisContext context = contextSource.context; |
| 799 Source source = contextSource.source; | 798 Source source = contextSource.source; |
| 800 refactoring = new MoveFileRefactoring( | 799 refactoring = new MoveFileRefactoring( |
| 801 server.resourceProvider, searchEngine, context, source, file); | 800 server.resourceProvider, searchEngine, context, source, file); |
| 802 } | 801 } |
| 803 if (kind == RefactoringKind.RENAME) { | 802 if (kind == RefactoringKind.RENAME) { |
| 804 AstNode node = await server.getNodeAtOffset(file, offset); | 803 AstNode node = await server.getNodeAtOffset(file, offset); |
| 805 Element element = server.getElementOfNode(node); | 804 Element element = server.getElementOfNode(node); |
| 806 if (node != null && element != null) { | 805 if (node != null && element != null) { |
| 807 if (element is FieldFormalParameterElement) { | 806 if (element is FieldFormalParameterElement) { |
| 808 element = (element as FieldFormalParameterElement).field; | 807 element = (element as FieldFormalParameterElement).field; |
| 809 } | 808 } |
| 810 // climb from "Class" in "new Class.named()" to "Class.named" | 809 // climb from "Class" in "new Class.named()" to "Class.named" |
| 811 if (node.parent is TypeName && node.parent.parent is ConstructorName) { | 810 if (node.parent is TypeName && node.parent.parent is ConstructorName) { |
| 812 ConstructorName constructor = node.parent.parent; | 811 ConstructorName constructor = node.parent.parent; |
| 813 node = constructor; | 812 node = constructor; |
| 814 element = constructor.staticElement; | 813 element = constructor.staticElement; |
| 815 } | 814 } |
| 816 // do create the refactoring | 815 // do create the refactoring |
| 817 _resetOnAnalysisStarted(); | 816 _resetOnAnalysisStarted(); |
| 818 refactoring = new RenameRefactoring(searchEngine, element); | 817 refactoring = new RenameRefactoring( |
| 818 searchEngine, server.getAstProvider(file), element); |
| 819 feedback = | 819 feedback = |
| 820 new RenameFeedback(node.offset, node.length, 'kind', 'oldName'); | 820 new RenameFeedback(node.offset, node.length, 'kind', 'oldName'); |
| 821 } | 821 } |
| 822 } | 822 } |
| 823 if (refactoring == null) { | 823 if (refactoring == null) { |
| 824 initStatus = | 824 initStatus = |
| 825 new RefactoringStatus.fatal('Unable to create a refactoring'); | 825 new RefactoringStatus.fatal('Unable to create a refactoring'); |
| 826 return; | 826 return; |
| 827 } | 827 } |
| 828 // check initial conditions | 828 // check initial conditions |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 971 } | 971 } |
| 972 return new RefactoringStatus(); | 972 return new RefactoringStatus(); |
| 973 } | 973 } |
| 974 } | 974 } |
| 975 | 975 |
| 976 /** | 976 /** |
| 977 * [_RefactoringManager] throws instances of this class internally to stop | 977 * [_RefactoringManager] throws instances of this class internally to stop |
| 978 * processing in a manager that was reset. | 978 * processing in a manager that was reset. |
| 979 */ | 979 */ |
| 980 class _ResetError {} | 980 class _ResetError {} |
| OLD | NEW |