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

Unified Diff: pkg/analysis_server/lib/src/services/refactoring/extract_method.dart

Issue 530123002: Impements 'names', 'offsets' and 'lengths' for ExtractMethodRefactoring. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/analysis_server/test/services/refactoring/extract_method_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index 30c0c5538536db0d534841a23d6b73778c1ce662..f3373c4991e6fd20ce052ed94eb5b9e8287ee5f0 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -7,6 +7,7 @@ library services.src.refactoring.extract_method;
import 'dart:async';
import 'package:analysis_server/src/protocol.dart' hide Element;
+import 'package:analysis_server/src/services/correction/name_suggestion.dart';
import 'package:analysis_server/src/services/correction/selection_analyzer.dart';
import 'package:analysis_server/src/services/correction/source_range.dart';
import 'package:analysis_server/src/services/correction/statement_analyzer.dart';
@@ -17,6 +18,7 @@ import 'package:analysis_server/src/services/refactoring/refactoring.dart';
import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
import 'package:analysis_server/src/services/refactoring/rename_class_member.dart';
import 'package:analysis_server/src/services/refactoring/rename_unit_member.dart';
+import 'package:analysis_server/src/services/search/element_visitors.dart';
import 'package:analysis_server/src/services/search/search_engine.dart';
import 'package:analyzer/src/generated/ast.dart';
import 'package:analyzer/src/generated/element.dart';
@@ -72,6 +74,7 @@ class ExtractMethodRefactoringImpl extends RefactoringImpl implements
final List<int> lengths = <int>[];
Set<String> _usedNames = new Set<String>();
+ Set<String> _excludedNames = new Set<String>();
List<RefactoringMethodParameter> _parameters = <RefactoringMethodParameter>[];
Map<String, RefactoringMethodParameter> _parametersMap = <String,
RefactoringMethodParameter>{};
@@ -183,8 +186,13 @@ class ExtractMethodRefactoringImpl extends RefactoringImpl implements
// prepare parts
result.addStatus(_initializeParameters());
_initializeReturnType();
- _initializeOccurrences();
_initializeGetter();
+ // occurrences
+ _initializeOccurrences();
+ _prepareOffsetsLengths();
+ // names
+ _prepareExcludedNames();
+ _prepareNames();
// closure cannot have parameters
if (_selectionFunctionExpression != null && !_parameters.isEmpty) {
String message = format(
@@ -449,7 +457,8 @@ class ExtractMethodRefactoringImpl extends RefactoringImpl implements
}
/**
- * @return the selected [DartExpression] source, with applying new parameter names.
+ * Returns the selected [Expression] source, with applying new parameter
+ * names.
*/
String _getMethodBodySource() {
String source = utils.getRangeText(selectionRange);
@@ -642,6 +651,47 @@ class ExtractMethodRefactoringImpl extends RefactoringImpl implements
}
/**
+ * Prepare names that are used in the enclosing function, so should not be
+ * proposed as names of the extracted method.
+ */
+ void _prepareExcludedNames() {
+ _excludedNames.clear();
+ ExecutableElement enclosingExecutable =
+ getEnclosingExecutableElement(_parentMember);
+ if (enclosingExecutable != null) {
+ visitChildren(enclosingExecutable, (Element element) {
+ if (element is LocalElement) {
+ SourceRange elementRange = element.visibleRange;
+ if (elementRange != null) {
+ _excludedNames.add(element.displayName);
+ }
+ }
+ return true;
+ });
+ }
+ }
+
+ void _prepareNames() {
+ names.clear();
+ if (_selectionExpression != null) {
+ names.addAll(
+ getVariableNameSuggestionsForExpression(
+ _selectionExpression.staticType,
+ _selectionExpression,
+ _excludedNames));
+ }
+ }
+
+ void _prepareOffsetsLengths() {
+ offsets.clear();
+ lengths.clear();
+ for (_Occurrence occurrence in _occurrences) {
+ offsets.add(occurrence.range.offset);
+ lengths.add(occurrence.range.length);
+ }
+ }
+
+ /**
* Checks if [node] has a [MethodInvocation].
*/
static bool _hasMethodInvocation(AstNode node) {
« no previous file with comments | « no previous file | pkg/analysis_server/test/services/refactoring/extract_method_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698