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

Side by Side Diff: pkg/analysis_server/lib/src/edit/edit_domain.dart

Issue 2669353002: Stop using Element.computeNode() in refactorings and fixes. (Closed)
Patch Set: documentation comments Created 3 years, 10 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 unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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 {}
OLDNEW
« no previous file with comments | « pkg/analysis_server/lib/src/analysis_server.dart ('k') | pkg/analysis_server/lib/src/services/correction/fix_internal.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698