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

Side by Side Diff: pkg/analysis_server/lib/src/services/refactoring/rename.dart

Issue 1380253003: Issue 24420. Don't allow renaming in pub packages. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 2 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
« no previous file with comments | « no previous file | pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 services.src.refactoring.rename; 5 library services.src.refactoring.rename;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 8
9 import 'package:analysis_server/src/protocol_server.dart' hide Element; 9 import 'package:analysis_server/src/protocol_server.dart' hide Element;
10 import 'package:analysis_server/src/services/correction/source_range.dart'; 10 import 'package:analysis_server/src/services/correction/source_range.dart';
11 import 'package:analysis_server/src/services/correction/status.dart'; 11 import 'package:analysis_server/src/services/correction/status.dart';
12 import 'package:analysis_server/src/services/correction/util.dart'; 12 import 'package:analysis_server/src/services/correction/util.dart';
13 import 'package:analysis_server/src/services/refactoring/refactoring.dart'; 13 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
14 import 'package:analysis_server/src/services/refactoring/refactoring_internal.da rt'; 14 import 'package:analysis_server/src/services/refactoring/refactoring_internal.da rt';
15 import 'package:analysis_server/src/services/search/search_engine.dart'; 15 import 'package:analysis_server/src/services/search/search_engine.dart';
16 import 'package:analyzer/src/generated/element.dart'; 16 import 'package:analyzer/src/generated/element.dart';
17 import 'package:analyzer/src/generated/engine.dart'; 17 import 'package:analyzer/src/generated/engine.dart';
18 import 'package:analyzer/src/generated/java_core.dart'; 18 import 'package:analyzer/src/generated/java_core.dart';
19 import 'package:analyzer/src/generated/source.dart'; 19 import 'package:analyzer/src/generated/source.dart';
20 import 'package:path/path.dart' as pathos;
20 21
21 /** 22 /**
22 * Returns `true` if two given [Element]s are [LocalElement]s and have 23 * Returns `true` if two given [Element]s are [LocalElement]s and have
23 * intersecting with visibility ranges. 24 * intersecting with visibility ranges.
24 */ 25 */
25 bool haveIntersectingRanges(LocalElement localElement, Element element) { 26 bool haveIntersectingRanges(LocalElement localElement, Element element) {
26 if (element is! LocalElement) { 27 if (element is! LocalElement) {
27 return false; 28 return false;
28 } 29 }
29 LocalElement localElement2 = element as LocalElement; 30 LocalElement localElement2 = element as LocalElement;
(...skipping 15 matching lines...) Expand all
45 // should be the same AnalysisContext 46 // should be the same AnalysisContext
46 if (!isInContext(element, context)) { 47 if (!isInContext(element, context)) {
47 return false; 48 return false;
48 } 49 }
49 // private elements are visible only in their library 50 // private elements are visible only in their library
50 List<Source> librarySourcesOfSource = context.getLibrariesContaining(source); 51 List<Source> librarySourcesOfSource = context.getLibrariesContaining(source);
51 Source librarySourceOfElement = element.library.source; 52 Source librarySourceOfElement = element.library.source;
52 return librarySourcesOfSource.contains(librarySourceOfElement); 53 return librarySourcesOfSource.contains(librarySourceOfElement);
53 } 54 }
54 55
56 bool isElementInPubCache(Element element) {
57 Source source = element.source;
58 String path = source.fullName;
59 return isPathInPubCache(path);
60 }
61
62 bool isElementInSdkOrPubCache(Element element) {
63 Source source = element.source;
64 String path = source.fullName;
65 return source.isInSystemLibrary || isPathInPubCache(path);
66 }
67
55 /** 68 /**
56 * Checks if the given [Element] is in the given [AnalysisContext]. 69 * Checks if the given [Element] is in the given [AnalysisContext].
57 */ 70 */
58 bool isInContext(Element element, AnalysisContext context) { 71 bool isInContext(Element element, AnalysisContext context) {
59 return element.context == context; 72 return element.context == context;
60 } 73 }
61 74
75 bool isPathInPubCache(String path) {
76 List<String> parts = pathos.split(path);
77 if (parts.contains('.pub-cache')) {
78 return true;
79 }
80 for (int i = 0; i < parts.length - 1; i++) {
81 if (parts[i] == 'Pub' && parts[i + 1] == 'Cache') {
82 return true;
83 }
84 if (parts[i] == 'third_party' &&
85 (parts[i + 1] == 'pkg' || parts[i + 1] == 'pkg_tested')) {
86 return true;
87 }
88 }
89 return false;
90 }
91
62 /** 92 /**
63 * Checks if the given unqualified [SearchMatch] intersects with visibility 93 * Checks if the given unqualified [SearchMatch] intersects with visibility
64 * range of [localElement]. 94 * range of [localElement].
65 */ 95 */
66 bool isReferenceInLocalRange(LocalElement localElement, SearchMatch reference) { 96 bool isReferenceInLocalRange(LocalElement localElement, SearchMatch reference) {
67 if (reference.isQualified) { 97 if (reference.isQualified) {
68 return false; 98 return false;
69 } 99 }
70 Source localSource = localElement.source; 100 Source localSource = localElement.source;
71 Source referenceSource = reference.element.source; 101 Source referenceSource = reference.element.source;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 @override 168 @override
139 Future<RefactoringStatus> checkInitialConditions() { 169 Future<RefactoringStatus> checkInitialConditions() {
140 RefactoringStatus result = new RefactoringStatus(); 170 RefactoringStatus result = new RefactoringStatus();
141 if (element.source.isInSystemLibrary) { 171 if (element.source.isInSystemLibrary) {
142 String message = format( 172 String message = format(
143 "The {0} '{1}' is defined in the SDK, so cannot be renamed.", 173 "The {0} '{1}' is defined in the SDK, so cannot be renamed.",
144 getElementKindName(element), 174 getElementKindName(element),
145 getElementQualifiedName(element)); 175 getElementQualifiedName(element));
146 result.addFatalError(message); 176 result.addFatalError(message);
147 } 177 }
178 if (isElementInPubCache(element)) {
179 String message = format(
180 "The {0} '{1}' is defined in a pub package, so cannot be renamed.",
181 getElementKindName(element),
182 getElementQualifiedName(element));
183 result.addFatalError(message);
184 }
148 return new Future.value(result); 185 return new Future.value(result);
149 } 186 }
150 187
151 @override 188 @override
152 RefactoringStatus checkNewName() { 189 RefactoringStatus checkNewName() {
153 RefactoringStatus result = new RefactoringStatus(); 190 RefactoringStatus result = new RefactoringStatus();
154 if (newName == oldName) { 191 if (newName == oldName) {
155 result.addFatalError( 192 result.addFatalError(
156 "The new name must be different than the current name."); 193 "The new name must be different than the current name.");
157 } 194 }
(...skipping 22 matching lines...) Expand all
180 if (element is ImportElement) { 217 if (element is ImportElement) {
181 PrefixElement prefix = element.prefix; 218 PrefixElement prefix = element.prefix;
182 if (prefix != null) { 219 if (prefix != null) {
183 return prefix.displayName; 220 return prefix.displayName;
184 } 221 }
185 return ''; 222 return '';
186 } 223 }
187 return element.displayName; 224 return element.displayName;
188 } 225 }
189 } 226 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698