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

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

Issue 1015513003: Issue 22757. Create pubspec.yaml file change on project rename. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 9 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
Index: pkg/analysis_server/lib/src/services/refactoring/move_file.dart
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
index fe1cbe03a31495cbae33a58ddf50605643fef4fd..6547d184f576d75963dd2306ddf3e8c1f3e0b200 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -11,16 +11,20 @@ import 'package:analysis_server/src/services/correction/status.dart';
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/search/search_engine.dart';
+import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/generated/element.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:path/path.dart' as pathos;
+import 'package:source_span/src/span.dart';
+import 'package:yaml/yaml.dart';
/**
* [ExtractLocalRefactoring] implementation.
*/
class MoveFileRefactoringImpl extends RefactoringImpl
implements MoveFileRefactoring {
+ final ResourceProvider resourceProvider;
final pathos.Context pathContext;
final SearchEngine searchEngine;
final AnalysisContext context;
@@ -34,9 +38,13 @@ class MoveFileRefactoringImpl extends RefactoringImpl
String oldLibraryDir;
String newLibraryDir;
- MoveFileRefactoringImpl(
- this.pathContext, this.searchEngine, this.context, this.source) {
- oldFile = source.fullName;
+ MoveFileRefactoringImpl(ResourceProvider resourceProvider, this.searchEngine,
+ this.context, this.source, this.oldFile)
+ : resourceProvider = resourceProvider,
+ pathContext = resourceProvider.pathContext {
+ if (source != null) {
+ oldFile = source.fullName;
+ }
}
@override
@@ -56,6 +64,45 @@ class MoveFileRefactoringImpl extends RefactoringImpl
@override
Future<SourceChange> createChange() async {
+ // move file
+ if (source != null) {
+ return _createFileChange();
+ }
+ // rename project
+ if (oldFile != null) {
+ Resource projectFolder = resourceProvider.getResource(oldFile);
+ if (projectFolder is Folder && projectFolder.exists) {
+ Resource pubspecFile = projectFolder.getChild('pubspec.yaml');
+ if (pubspecFile is File && pubspecFile.exists) {
+ return _createProjectChange(projectFolder, pubspecFile);
+ }
+ }
+ }
+ // no change
+ return null;
+ }
+
+ @override
+ bool requiresPreview() => false;
+
+ /**
+ * Computes the URI to use to reference [newFile] from [reference].
+ */
+ String _computeNewUri(SourceReference reference) {
+ String refDir = pathContext.dirname(reference.file);
+ // try to keep package: URI
+ if (_isPackageReference(reference)) {
+ Source newSource = new NonExistingSource(newFile, UriKind.FILE_URI);
+ Uri restoredUri = context.sourceFactory.restoreUri(newSource);
+ if (restoredUri != null) {
+ return restoredUri.toString();
+ }
+ }
+ // if no package: URI, prepare relative
+ return _getRelativeUri(newFile, refDir);
+ }
+
+ Future<SourceChange> _createFileChange() async {
change = new SourceChange('Update File References');
List<Source> librarySources = context.getLibrariesContaining(source);
await Future.forEach(librarySources, (Source librarySource) async {
@@ -84,24 +131,24 @@ class MoveFileRefactoringImpl extends RefactoringImpl
return change;
}
- @override
- bool requiresPreview() => false;
-
- /**
- * Computes the URI to use to reference [newFile] from [reference].
- */
- String _computeNewUri(SourceReference reference) {
- String refDir = pathContext.dirname(reference.file);
- // try to keep package: URI
- if (_isPackageReference(reference)) {
- Source newSource = new NonExistingSource(newFile, UriKind.FILE_URI);
- Uri restoredUri = context.sourceFactory.restoreUri(newSource);
- if (restoredUri != null) {
- return restoredUri.toString();
- }
+ Future<SourceChange> _createProjectChange(
+ Folder project, File pubspecFile) async {
+ // prepare "name" field value location
+ SourceSpan nameSpan;
+ {
+ String pubspecString = pubspecFile.readAsStringSync();
+ YamlMap pubspecNode = loadYamlNode(pubspecString);
+ YamlNode nameNode = pubspecNode.nodes['name'];
+ nameSpan = nameNode.span;
}
- // if no package: URI, prepare relative
- return _getRelativeUri(newFile, refDir);
+ int nameOffset = nameSpan.start.offset;
+ int nameLength = nameSpan.length;
+ // create Change
+ change = new SourceChange('Rename project');
+ String newPackageName = pathContext.basename(newFile);
+ change.addEdit(pubspecFile.path, pubspecFile.modificationStamp,
+ new SourceEdit(nameOffset, nameLength, newPackageName));
+ return change;
}
String _getRelativeUri(String path, String from) {
« no previous file with comments | « pkg/analysis_server/lib/src/edit/edit_domain.dart ('k') | pkg/analysis_server/lib/src/services/refactoring/refactoring.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698