| 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 test.services.refactoring.rename_unit_member; | 5 library test.services.refactoring.rename_unit_member; |
| 6 | 6 |
| 7 import 'package:analysis_server/plugin/protocol/protocol.dart'; | 7 import 'package:analysis_server/plugin/protocol/protocol.dart'; |
| 8 import 'package:analysis_server/src/services/correction/status.dart'; | 8 import 'package:analysis_server/src/services/correction/status.dart'; |
| 9 import 'package:test/test.dart'; | 9 import 'package:test/test.dart'; |
| 10 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 10 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 11 | 11 |
| 12 import 'abstract_rename.dart'; | 12 import 'abstract_rename.dart'; |
| 13 | 13 |
| 14 main() { | 14 main() { |
| 15 defineReflectiveSuite(() { | 15 defineReflectiveSuite(() { |
| 16 defineReflectiveTests(RenameUnitMemberTest); | 16 defineReflectiveTests(RenameUnitMemberTest); |
| 17 }); | 17 }); |
| 18 } | 18 } |
| 19 | 19 |
| 20 @reflectiveTest | 20 @reflectiveTest |
| 21 class RenameUnitMemberTest extends RenameRefactoringTest { | 21 class RenameUnitMemberTest extends RenameRefactoringTest { |
| 22 test_checkFinalConditions_hasTopLevel_ClassElement() async { | 22 test_checkFinalConditions_hasTopLevel_ClassElement() async { |
| 23 indexTestUnit(''' | 23 await indexTestUnit(''' |
| 24 class Test {} | 24 class Test {} |
| 25 class NewName {} // existing | 25 class NewName {} // existing |
| 26 '''); | 26 '''); |
| 27 createRenameRefactoringAtString('Test {}'); | 27 createRenameRefactoringAtString('Test {}'); |
| 28 // check status | 28 // check status |
| 29 refactoring.newName = 'NewName'; | 29 refactoring.newName = 'NewName'; |
| 30 RefactoringStatus status = await refactoring.checkFinalConditions(); | 30 RefactoringStatus status = await refactoring.checkFinalConditions(); |
| 31 assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR, | 31 assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR, |
| 32 expectedMessage: "Library already declares class with name 'NewName'.", | 32 expectedMessage: "Library already declares class with name 'NewName'.", |
| 33 expectedContextSearch: 'NewName {} // existing'); | 33 expectedContextSearch: 'NewName {} // existing'); |
| 34 } | 34 } |
| 35 | 35 |
| 36 test_checkFinalConditions_hasTopLevel_FunctionTypeAliasElement() async { | 36 test_checkFinalConditions_hasTopLevel_FunctionTypeAliasElement() async { |
| 37 indexTestUnit(''' | 37 await indexTestUnit(''' |
| 38 class Test {} | 38 class Test {} |
| 39 typedef NewName(); // existing | 39 typedef NewName(); // existing |
| 40 '''); | 40 '''); |
| 41 createRenameRefactoringAtString('Test {}'); | 41 createRenameRefactoringAtString('Test {}'); |
| 42 // check status | 42 // check status |
| 43 refactoring.newName = 'NewName'; | 43 refactoring.newName = 'NewName'; |
| 44 RefactoringStatus status = await refactoring.checkFinalConditions(); | 44 RefactoringStatus status = await refactoring.checkFinalConditions(); |
| 45 assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR, | 45 assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR, |
| 46 expectedMessage: | 46 expectedMessage: |
| 47 "Library already declares function type alias with name 'NewName'.", | 47 "Library already declares function type alias with name 'NewName'.", |
| 48 expectedContextSearch: 'NewName(); // existing'); | 48 expectedContextSearch: 'NewName(); // existing'); |
| 49 } | 49 } |
| 50 | 50 |
| 51 test_checkFinalConditions_OK_qualifiedSuper_MethodElement() async { | 51 test_checkFinalConditions_OK_qualifiedSuper_MethodElement() async { |
| 52 indexTestUnit(''' | 52 await indexTestUnit(''' |
| 53 class Test {} | 53 class Test {} |
| 54 class A { | 54 class A { |
| 55 NewName() {} | 55 NewName() {} |
| 56 } | 56 } |
| 57 class B extends A { | 57 class B extends A { |
| 58 main() { | 58 main() { |
| 59 super.NewName(); // super-ref | 59 super.NewName(); // super-ref |
| 60 } | 60 } |
| 61 } | 61 } |
| 62 '''); | 62 '''); |
| 63 createRenameRefactoringAtString('Test {}'); | 63 createRenameRefactoringAtString('Test {}'); |
| 64 // check status | 64 // check status |
| 65 refactoring.newName = 'NewName'; | 65 refactoring.newName = 'NewName'; |
| 66 RefactoringStatus status = await refactoring.checkFinalConditions(); | 66 RefactoringStatus status = await refactoring.checkFinalConditions(); |
| 67 assertRefactoringStatusOK(status); | 67 assertRefactoringStatusOK(status); |
| 68 } | 68 } |
| 69 | 69 |
| 70 test_checkFinalConditions_publicToPrivate_usedInOtherLibrary() async { | 70 test_checkFinalConditions_publicToPrivate_usedInOtherLibrary() async { |
| 71 indexTestUnit(''' | 71 await indexTestUnit(''' |
| 72 class Test {} | 72 class Test {} |
| 73 '''); | 73 '''); |
| 74 indexUnit( | 74 await indexUnit( |
| 75 '/lib.dart', | 75 '/lib.dart', |
| 76 ''' | 76 ''' |
| 77 library my.lib; | 77 library my.lib; |
| 78 import 'test.dart'; | 78 import 'test.dart'; |
| 79 | 79 |
| 80 main() { | 80 main() { |
| 81 new Test(); | 81 new Test(); |
| 82 } | 82 } |
| 83 '''); | 83 '''); |
| 84 createRenameRefactoringAtString('Test {}'); | 84 createRenameRefactoringAtString('Test {}'); |
| 85 // check status | 85 // check status |
| 86 refactoring.newName = '_NewName'; | 86 refactoring.newName = '_NewName'; |
| 87 RefactoringStatus status = await refactoring.checkFinalConditions(); | 87 RefactoringStatus status = await refactoring.checkFinalConditions(); |
| 88 assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR, | 88 assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR, |
| 89 expectedMessage: "Renamed class will be invisible in 'my.lib'."); | 89 expectedMessage: "Renamed class will be invisible in 'my.lib'."); |
| 90 } | 90 } |
| 91 | 91 |
| 92 test_checkFinalConditions_shadowedBy_MethodElement() async { | 92 test_checkFinalConditions_shadowedBy_MethodElement() async { |
| 93 indexTestUnit(''' | 93 await indexTestUnit(''' |
| 94 class Test {} | 94 class Test {} |
| 95 class A { | 95 class A { |
| 96 void NewName() {} | 96 void NewName() {} |
| 97 main() { | 97 main() { |
| 98 new Test(); | 98 new Test(); |
| 99 } | 99 } |
| 100 } | 100 } |
| 101 '''); | 101 '''); |
| 102 createRenameRefactoringAtString('Test {}'); | 102 createRenameRefactoringAtString('Test {}'); |
| 103 // check status | 103 // check status |
| 104 refactoring.newName = 'NewName'; | 104 refactoring.newName = 'NewName'; |
| 105 RefactoringStatus status = await refactoring.checkFinalConditions(); | 105 RefactoringStatus status = await refactoring.checkFinalConditions(); |
| 106 assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR, | 106 assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR, |
| 107 expectedMessage: | 107 expectedMessage: |
| 108 "Reference to renamed class will be shadowed by method 'A.NewName'."
, | 108 "Reference to renamed class will be shadowed by method 'A.NewName'."
, |
| 109 expectedContextSearch: 'NewName() {}'); | 109 expectedContextSearch: 'NewName() {}'); |
| 110 } | 110 } |
| 111 | 111 |
| 112 test_checkFinalConditions_shadowsInSubClass_importedLib() async { | 112 test_checkFinalConditions_shadowsInSubClass_importedLib() async { |
| 113 indexTestUnit(''' | 113 await indexTestUnit(''' |
| 114 class Test {} | 114 class Test {} |
| 115 '''); | 115 '''); |
| 116 indexUnit( | 116 await indexUnit( |
| 117 '/lib.dart', | 117 '/lib.dart', |
| 118 ''' | 118 ''' |
| 119 library my.lib; | 119 library my.lib; |
| 120 import 'test.dart'; | 120 import 'test.dart'; |
| 121 class A { | 121 class A { |
| 122 NewName() {} | 122 NewName() {} |
| 123 } | 123 } |
| 124 class B extends A { | 124 class B extends A { |
| 125 main() { | 125 main() { |
| 126 NewName(); // super-ref | 126 NewName(); // super-ref |
| 127 }", | 127 }", |
| 128 } | 128 } |
| 129 '''); | 129 '''); |
| 130 createRenameRefactoringAtString('Test {}'); | 130 createRenameRefactoringAtString('Test {}'); |
| 131 // check status | 131 // check status |
| 132 refactoring.newName = 'NewName'; | 132 refactoring.newName = 'NewName'; |
| 133 RefactoringStatus status = await refactoring.checkFinalConditions(); | 133 RefactoringStatus status = await refactoring.checkFinalConditions(); |
| 134 assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR, | 134 assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR, |
| 135 expectedMessage: "Renamed class will shadow method 'A.NewName'."); | 135 expectedMessage: "Renamed class will shadow method 'A.NewName'."); |
| 136 } | 136 } |
| 137 | 137 |
| 138 test_checkFinalConditions_shadowsInSubClass_importedLib_hideCombinator() async
{ | 138 test_checkFinalConditions_shadowsInSubClass_importedLib_hideCombinator() async
{ |
| 139 indexTestUnit(''' | 139 await indexTestUnit(''' |
| 140 class Test {} | 140 class Test {} |
| 141 '''); | 141 '''); |
| 142 indexUnit( | 142 await indexUnit( |
| 143 '/lib.dart', | 143 '/lib.dart', |
| 144 ''' | 144 ''' |
| 145 library my.lib; | 145 library my.lib; |
| 146 import 'test.dart' hide Test; | 146 import 'test.dart' hide Test; |
| 147 class A { | 147 class A { |
| 148 NewName() {} | 148 NewName() {} |
| 149 } | 149 } |
| 150 class B extends A { | 150 class B extends A { |
| 151 main() { | 151 main() { |
| 152 NewName(); // super-ref | 152 NewName(); // super-ref |
| 153 }", | 153 }", |
| 154 } | 154 } |
| 155 '''); | 155 '''); |
| 156 createRenameRefactoringAtString('Test {}'); | 156 createRenameRefactoringAtString('Test {}'); |
| 157 // check status | 157 // check status |
| 158 refactoring.newName = 'NewName'; | 158 refactoring.newName = 'NewName'; |
| 159 RefactoringStatus status = await refactoring.checkFinalConditions(); | 159 RefactoringStatus status = await refactoring.checkFinalConditions(); |
| 160 assertRefactoringStatusOK(status); | 160 assertRefactoringStatusOK(status); |
| 161 } | 161 } |
| 162 | 162 |
| 163 test_checkFinalConditions_shadowsInSubClass_MethodElement() async { | 163 test_checkFinalConditions_shadowsInSubClass_MethodElement() async { |
| 164 indexTestUnit(''' | 164 await indexTestUnit(''' |
| 165 class Test {} | 165 class Test {} |
| 166 class A { | 166 class A { |
| 167 NewName() {} | 167 NewName() {} |
| 168 } | 168 } |
| 169 class B extends A { | 169 class B extends A { |
| 170 main() { | 170 main() { |
| 171 NewName(); // super-ref | 171 NewName(); // super-ref |
| 172 } | 172 } |
| 173 } | 173 } |
| 174 '''); | 174 '''); |
| 175 createRenameRefactoringAtString('Test {}'); | 175 createRenameRefactoringAtString('Test {}'); |
| 176 // check status | 176 // check status |
| 177 refactoring.newName = 'NewName'; | 177 refactoring.newName = 'NewName'; |
| 178 RefactoringStatus status = await refactoring.checkFinalConditions(); | 178 RefactoringStatus status = await refactoring.checkFinalConditions(); |
| 179 assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR, | 179 assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR, |
| 180 expectedMessage: "Renamed class will shadow method 'A.NewName'.", | 180 expectedMessage: "Renamed class will shadow method 'A.NewName'.", |
| 181 expectedContextSearch: 'NewName(); // super-ref'); | 181 expectedContextSearch: 'NewName(); // super-ref'); |
| 182 } | 182 } |
| 183 | 183 |
| 184 test_checkFinalConditions_shadowsInSubClass_notImportedLib() async { | 184 test_checkFinalConditions_shadowsInSubClass_notImportedLib() async { |
| 185 indexUnit( | 185 await indexUnit( |
| 186 '/lib.dart', | 186 '/lib.dart', |
| 187 ''' | 187 ''' |
| 188 library my.lib; | 188 library my.lib; |
| 189 class A { | 189 class A { |
| 190 NewName() {} | 190 NewName() {} |
| 191 } | 191 } |
| 192 class B extends A { | 192 class B extends A { |
| 193 main() { | 193 main() { |
| 194 NewName(); // super-ref | 194 NewName(); // super-ref |
| 195 }", | 195 }", |
| 196 } | 196 } |
| 197 '''); | 197 '''); |
| 198 indexTestUnit(''' | 198 await indexTestUnit(''' |
| 199 class Test {} | 199 class Test {} |
| 200 '''); | 200 '''); |
| 201 createRenameRefactoringAtString('Test {}'); | 201 createRenameRefactoringAtString('Test {}'); |
| 202 // check status | 202 // check status |
| 203 refactoring.newName = 'NewName'; | 203 refactoring.newName = 'NewName'; |
| 204 RefactoringStatus status = await refactoring.checkFinalConditions(); | 204 RefactoringStatus status = await refactoring.checkFinalConditions(); |
| 205 assertRefactoringStatusOK(status); | 205 assertRefactoringStatusOK(status); |
| 206 } | 206 } |
| 207 | 207 |
| 208 test_checkFinalConditions_shadowsInSubClass_notSubClass() async { | 208 test_checkFinalConditions_shadowsInSubClass_notSubClass() async { |
| 209 indexTestUnit(''' | 209 await indexTestUnit(''' |
| 210 class Test {} | 210 class Test {} |
| 211 class A { | 211 class A { |
| 212 NewName() {} | 212 NewName() {} |
| 213 } | 213 } |
| 214 class B { | 214 class B { |
| 215 main(A a) { | 215 main(A a) { |
| 216 a.NewName(); | 216 a.NewName(); |
| 217 } | 217 } |
| 218 } | 218 } |
| 219 '''); | 219 '''); |
| 220 createRenameRefactoringAtString('Test {}'); | 220 createRenameRefactoringAtString('Test {}'); |
| 221 // check status | 221 // check status |
| 222 refactoring.newName = 'NewName'; | 222 refactoring.newName = 'NewName'; |
| 223 RefactoringStatus status = await refactoring.checkFinalConditions(); | 223 RefactoringStatus status = await refactoring.checkFinalConditions(); |
| 224 assertRefactoringStatusOK(status); | 224 assertRefactoringStatusOK(status); |
| 225 } | 225 } |
| 226 | 226 |
| 227 test_checkInitialConditions_inPubCache_posix() async { | 227 test_checkInitialConditions_inPubCache_posix() async { |
| 228 addSource( | 228 addSource( |
| 229 '/.pub-cache/lib.dart', | 229 '/.pub-cache/lib.dart', |
| 230 r''' | 230 r''' |
| 231 class A {} | 231 class A {} |
| 232 '''); | 232 '''); |
| 233 indexTestUnit(''' | 233 await indexTestUnit(''' |
| 234 import '/.pub-cache/lib.dart'; | 234 import '/.pub-cache/lib.dart'; |
| 235 main() { | 235 main() { |
| 236 A a; | 236 A a; |
| 237 } | 237 } |
| 238 '''); | 238 '''); |
| 239 createRenameRefactoringAtString('A a'); | 239 createRenameRefactoringAtString('A a'); |
| 240 // check status | 240 // check status |
| 241 refactoring.newName = 'NewName'; | 241 refactoring.newName = 'NewName'; |
| 242 RefactoringStatus status = await refactoring.checkInitialConditions(); | 242 RefactoringStatus status = await refactoring.checkInitialConditions(); |
| 243 assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL, | 243 assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL, |
| 244 expectedMessage: | 244 expectedMessage: |
| 245 "The class 'A' is defined in a pub package, so cannot be renamed."); | 245 "The class 'A' is defined in a pub package, so cannot be renamed."); |
| 246 } | 246 } |
| 247 | 247 |
| 248 test_checkInitialConditions_inPubCache_windows() async { | 248 test_checkInitialConditions_inPubCache_windows() async { |
| 249 addSource( | 249 addSource( |
| 250 '/Pub/Cache/lib.dart', | 250 '/Pub/Cache/lib.dart', |
| 251 r''' | 251 r''' |
| 252 class A {} | 252 class A {} |
| 253 '''); | 253 '''); |
| 254 indexTestUnit(''' | 254 await indexTestUnit(''' |
| 255 import '/Pub/Cache/lib.dart'; | 255 import '/Pub/Cache/lib.dart'; |
| 256 main() { | 256 main() { |
| 257 A a; | 257 A a; |
| 258 } | 258 } |
| 259 '''); | 259 '''); |
| 260 createRenameRefactoringAtString('A a'); | 260 createRenameRefactoringAtString('A a'); |
| 261 // check status | 261 // check status |
| 262 refactoring.newName = 'NewName'; | 262 refactoring.newName = 'NewName'; |
| 263 RefactoringStatus status = await refactoring.checkInitialConditions(); | 263 RefactoringStatus status = await refactoring.checkInitialConditions(); |
| 264 assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL, | 264 assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL, |
| 265 expectedMessage: | 265 expectedMessage: |
| 266 "The class 'A' is defined in a pub package, so cannot be renamed."); | 266 "The class 'A' is defined in a pub package, so cannot be renamed."); |
| 267 } | 267 } |
| 268 | 268 |
| 269 test_checkInitialConditions_inSDK() async { | 269 test_checkInitialConditions_inSDK() async { |
| 270 indexTestUnit(''' | 270 await indexTestUnit(''' |
| 271 main() { | 271 main() { |
| 272 String s; | 272 String s; |
| 273 } | 273 } |
| 274 '''); | 274 '''); |
| 275 createRenameRefactoringAtString('String s'); | 275 createRenameRefactoringAtString('String s'); |
| 276 // check status | 276 // check status |
| 277 refactoring.newName = 'NewName'; | 277 refactoring.newName = 'NewName'; |
| 278 RefactoringStatus status = await refactoring.checkInitialConditions(); | 278 RefactoringStatus status = await refactoring.checkInitialConditions(); |
| 279 assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL, | 279 assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL, |
| 280 expectedMessage: | 280 expectedMessage: |
| 281 "The class 'String' is defined in the SDK, so cannot be renamed."); | 281 "The class 'String' is defined in the SDK, so cannot be renamed."); |
| 282 } | 282 } |
| 283 | 283 |
| 284 test_checkNewName_ClassElement() { | 284 test_checkNewName_ClassElement() async { |
| 285 indexTestUnit(''' | 285 await indexTestUnit(''' |
| 286 class Test {} | 286 class Test {} |
| 287 '''); | 287 '''); |
| 288 createRenameRefactoringAtString('Test {}'); | 288 createRenameRefactoringAtString('Test {}'); |
| 289 // null | 289 // null |
| 290 refactoring.newName = null; | 290 refactoring.newName = null; |
| 291 assertRefactoringStatus( | 291 assertRefactoringStatus( |
| 292 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, | 292 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, |
| 293 expectedMessage: "Class name must not be null."); | 293 expectedMessage: "Class name must not be null."); |
| 294 // empty | 294 // empty |
| 295 refactoring.newName = ''; | 295 refactoring.newName = ''; |
| 296 assertRefactoringStatus( | 296 assertRefactoringStatus( |
| 297 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, | 297 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, |
| 298 expectedMessage: "Class name must not be empty."); | 298 expectedMessage: "Class name must not be empty."); |
| 299 // same | 299 // same |
| 300 refactoring.newName = 'Test'; | 300 refactoring.newName = 'Test'; |
| 301 assertRefactoringStatus( | 301 assertRefactoringStatus( |
| 302 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, | 302 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, |
| 303 expectedMessage: | 303 expectedMessage: |
| 304 "The new name must be different than the current name."); | 304 "The new name must be different than the current name."); |
| 305 // OK | 305 // OK |
| 306 refactoring.newName = 'NewName'; | 306 refactoring.newName = 'NewName'; |
| 307 assertRefactoringStatusOK(refactoring.checkNewName()); | 307 assertRefactoringStatusOK(refactoring.checkNewName()); |
| 308 } | 308 } |
| 309 | 309 |
| 310 test_checkNewName_FunctionElement() { | 310 test_checkNewName_FunctionElement() async { |
| 311 indexTestUnit(''' | 311 await indexTestUnit(''' |
| 312 test() {} | 312 test() {} |
| 313 '''); | 313 '''); |
| 314 createRenameRefactoringAtString('test() {}'); | 314 createRenameRefactoringAtString('test() {}'); |
| 315 // null | 315 // null |
| 316 refactoring.newName = null; | 316 refactoring.newName = null; |
| 317 assertRefactoringStatus( | 317 assertRefactoringStatus( |
| 318 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, | 318 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, |
| 319 expectedMessage: "Function name must not be null."); | 319 expectedMessage: "Function name must not be null."); |
| 320 // empty | 320 // empty |
| 321 refactoring.newName = ''; | 321 refactoring.newName = ''; |
| 322 assertRefactoringStatus( | 322 assertRefactoringStatus( |
| 323 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, | 323 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, |
| 324 expectedMessage: "Function name must not be empty."); | 324 expectedMessage: "Function name must not be empty."); |
| 325 // OK | 325 // OK |
| 326 refactoring.newName = 'newName'; | 326 refactoring.newName = 'newName'; |
| 327 assertRefactoringStatusOK(refactoring.checkNewName()); | 327 assertRefactoringStatusOK(refactoring.checkNewName()); |
| 328 } | 328 } |
| 329 | 329 |
| 330 test_checkNewName_FunctionTypeAliasElement() { | 330 test_checkNewName_FunctionTypeAliasElement() async { |
| 331 indexTestUnit(''' | 331 await indexTestUnit(''' |
| 332 typedef Test(); | 332 typedef Test(); |
| 333 '''); | 333 '''); |
| 334 createRenameRefactoringAtString('Test();'); | 334 createRenameRefactoringAtString('Test();'); |
| 335 // null | 335 // null |
| 336 refactoring.newName = null; | 336 refactoring.newName = null; |
| 337 assertRefactoringStatus( | 337 assertRefactoringStatus( |
| 338 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, | 338 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, |
| 339 expectedMessage: "Function type alias name must not be null."); | 339 expectedMessage: "Function type alias name must not be null."); |
| 340 // OK | 340 // OK |
| 341 refactoring.newName = 'NewName'; | 341 refactoring.newName = 'NewName'; |
| 342 assertRefactoringStatusOK(refactoring.checkNewName()); | 342 assertRefactoringStatusOK(refactoring.checkNewName()); |
| 343 } | 343 } |
| 344 | 344 |
| 345 test_checkNewName_TopLevelVariableElement() { | 345 test_checkNewName_TopLevelVariableElement() async { |
| 346 indexTestUnit(''' | 346 await indexTestUnit(''' |
| 347 var test; | 347 var test; |
| 348 '''); | 348 '''); |
| 349 createRenameRefactoringAtString('test;'); | 349 createRenameRefactoringAtString('test;'); |
| 350 // null | 350 // null |
| 351 refactoring.newName = null; | 351 refactoring.newName = null; |
| 352 assertRefactoringStatus( | 352 assertRefactoringStatus( |
| 353 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, | 353 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, |
| 354 expectedMessage: "Variable name must not be null."); | 354 expectedMessage: "Variable name must not be null."); |
| 355 // empty | 355 // empty |
| 356 refactoring.newName = ''; | 356 refactoring.newName = ''; |
| 357 assertRefactoringStatus( | 357 assertRefactoringStatus( |
| 358 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, | 358 refactoring.checkNewName(), RefactoringProblemSeverity.FATAL, |
| 359 expectedMessage: "Variable name must not be empty."); | 359 expectedMessage: "Variable name must not be empty."); |
| 360 // OK | 360 // OK |
| 361 refactoring.newName = 'newName'; | 361 refactoring.newName = 'newName'; |
| 362 assertRefactoringStatusOK(refactoring.checkNewName()); | 362 assertRefactoringStatusOK(refactoring.checkNewName()); |
| 363 } | 363 } |
| 364 | 364 |
| 365 test_createChange_ClassElement() { | 365 test_createChange_ClassElement() async { |
| 366 indexTestUnit(''' | 366 await indexTestUnit(''' |
| 367 class Test implements Other { | 367 class Test implements Other { |
| 368 Test() {} | 368 Test() {} |
| 369 Test.named() {} | 369 Test.named() {} |
| 370 } | 370 } |
| 371 class Other { | 371 class Other { |
| 372 factory Other.a() = Test; | 372 factory Other.a() = Test; |
| 373 factory Other.b() = Test.named; | 373 factory Other.b() = Test.named; |
| 374 } | 374 } |
| 375 main() { | 375 main() { |
| 376 Test t1 = new Test(); | 376 Test t1 = new Test(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 393 factory Other.a() = NewName; | 393 factory Other.a() = NewName; |
| 394 factory Other.b() = NewName.named; | 394 factory Other.b() = NewName.named; |
| 395 } | 395 } |
| 396 main() { | 396 main() { |
| 397 NewName t1 = new NewName(); | 397 NewName t1 = new NewName(); |
| 398 NewName t2 = new NewName.named(); | 398 NewName t2 = new NewName.named(); |
| 399 } | 399 } |
| 400 '''); | 400 '''); |
| 401 } | 401 } |
| 402 | 402 |
| 403 test_createChange_ClassElement_invocation() { | 403 test_createChange_ClassElement_invocation() async { |
| 404 verifyNoTestUnitErrors = false; | 404 verifyNoTestUnitErrors = false; |
| 405 indexTestUnit(''' | 405 await indexTestUnit(''' |
| 406 class Test { | 406 class Test { |
| 407 } | 407 } |
| 408 main() { | 408 main() { |
| 409 Test(); // invalid code, but still a reference | 409 Test(); // invalid code, but still a reference |
| 410 } | 410 } |
| 411 '''); | 411 '''); |
| 412 // configure refactoring | 412 // configure refactoring |
| 413 createRenameRefactoringAtString('Test();'); | 413 createRenameRefactoringAtString('Test();'); |
| 414 expect(refactoring.refactoringName, 'Rename Class'); | 414 expect(refactoring.refactoringName, 'Rename Class'); |
| 415 expect(refactoring.elementKindName, 'class'); | 415 expect(refactoring.elementKindName, 'class'); |
| 416 expect(refactoring.oldName, 'Test'); | 416 expect(refactoring.oldName, 'Test'); |
| 417 refactoring.newName = 'NewName'; | 417 refactoring.newName = 'NewName'; |
| 418 // validate change | 418 // validate change |
| 419 return assertSuccessfulRefactoring(''' | 419 return assertSuccessfulRefactoring(''' |
| 420 class NewName { | 420 class NewName { |
| 421 } | 421 } |
| 422 main() { | 422 main() { |
| 423 NewName(); // invalid code, but still a reference | 423 NewName(); // invalid code, but still a reference |
| 424 } | 424 } |
| 425 '''); | 425 '''); |
| 426 } | 426 } |
| 427 | 427 |
| 428 test_createChange_ClassElement_parameterTypeNested() { | 428 test_createChange_ClassElement_parameterTypeNested() async { |
| 429 indexTestUnit(''' | 429 await indexTestUnit(''' |
| 430 class Test { | 430 class Test { |
| 431 } | 431 } |
| 432 main(f(Test p)) { | 432 main(f(Test p)) { |
| 433 } | 433 } |
| 434 '''); | 434 '''); |
| 435 // configure refactoring | 435 // configure refactoring |
| 436 createRenameRefactoringAtString('Test {'); | 436 createRenameRefactoringAtString('Test {'); |
| 437 expect(refactoring.refactoringName, 'Rename Class'); | 437 expect(refactoring.refactoringName, 'Rename Class'); |
| 438 expect(refactoring.oldName, 'Test'); | 438 expect(refactoring.oldName, 'Test'); |
| 439 refactoring.newName = 'NewName'; | 439 refactoring.newName = 'NewName'; |
| 440 // validate change | 440 // validate change |
| 441 return assertSuccessfulRefactoring(''' | 441 return assertSuccessfulRefactoring(''' |
| 442 class NewName { | 442 class NewName { |
| 443 } | 443 } |
| 444 main(f(NewName p)) { | 444 main(f(NewName p)) { |
| 445 } | 445 } |
| 446 '''); | 446 '''); |
| 447 } | 447 } |
| 448 | 448 |
| 449 test_createChange_ClassElement_typeAlias() { | 449 test_createChange_ClassElement_typeAlias() async { |
| 450 indexTestUnit(''' | 450 await indexTestUnit(''' |
| 451 class A {} | 451 class A {} |
| 452 class Test = Object with A; | 452 class Test = Object with A; |
| 453 main(Test t) { | 453 main(Test t) { |
| 454 } | 454 } |
| 455 '''); | 455 '''); |
| 456 // configure refactoring | 456 // configure refactoring |
| 457 createRenameRefactoringAtString('Test ='); | 457 createRenameRefactoringAtString('Test ='); |
| 458 expect(refactoring.refactoringName, 'Rename Class'); | 458 expect(refactoring.refactoringName, 'Rename Class'); |
| 459 expect(refactoring.elementKindName, 'class'); | 459 expect(refactoring.elementKindName, 'class'); |
| 460 expect(refactoring.oldName, 'Test'); | 460 expect(refactoring.oldName, 'Test'); |
| 461 refactoring.newName = 'NewName'; | 461 refactoring.newName = 'NewName'; |
| 462 // validate change | 462 // validate change |
| 463 return assertSuccessfulRefactoring(''' | 463 return assertSuccessfulRefactoring(''' |
| 464 class A {} | 464 class A {} |
| 465 class NewName = Object with A; | 465 class NewName = Object with A; |
| 466 main(NewName t) { | 466 main(NewName t) { |
| 467 } | 467 } |
| 468 '''); | 468 '''); |
| 469 } | 469 } |
| 470 | 470 |
| 471 test_createChange_FunctionElement() { | 471 test_createChange_FunctionElement() async { |
| 472 indexTestUnit(''' | 472 await indexTestUnit(''' |
| 473 test() {} | 473 test() {} |
| 474 foo() {} | 474 foo() {} |
| 475 main() { | 475 main() { |
| 476 print(test); | 476 print(test); |
| 477 print(test()); | 477 print(test()); |
| 478 foo(); | 478 foo(); |
| 479 } | 479 } |
| 480 '''); | 480 '''); |
| 481 // configure refactoring | 481 // configure refactoring |
| 482 createRenameRefactoringAtString('test() {}'); | 482 createRenameRefactoringAtString('test() {}'); |
| 483 expect(refactoring.refactoringName, 'Rename Top-Level Function'); | 483 expect(refactoring.refactoringName, 'Rename Top-Level Function'); |
| 484 expect(refactoring.elementKindName, 'function'); | 484 expect(refactoring.elementKindName, 'function'); |
| 485 expect(refactoring.oldName, 'test'); | 485 expect(refactoring.oldName, 'test'); |
| 486 refactoring.newName = 'newName'; | 486 refactoring.newName = 'newName'; |
| 487 // validate change | 487 // validate change |
| 488 return assertSuccessfulRefactoring(''' | 488 return assertSuccessfulRefactoring(''' |
| 489 newName() {} | 489 newName() {} |
| 490 foo() {} | 490 foo() {} |
| 491 main() { | 491 main() { |
| 492 print(newName); | 492 print(newName); |
| 493 print(newName()); | 493 print(newName()); |
| 494 foo(); | 494 foo(); |
| 495 } | 495 } |
| 496 '''); | 496 '''); |
| 497 } | 497 } |
| 498 | 498 |
| 499 test_createChange_FunctionElement_imported() async { | 499 test_createChange_FunctionElement_imported() async { |
| 500 indexUnit( | 500 await indexUnit( |
| 501 '/foo.dart', | 501 '/foo.dart', |
| 502 r''' | 502 r''' |
| 503 test() {} | 503 test() {} |
| 504 foo() {} | 504 foo() {} |
| 505 '''); | 505 '''); |
| 506 indexTestUnit(''' | 506 await indexTestUnit(''' |
| 507 import 'foo.dart'; | 507 import 'foo.dart'; |
| 508 main() { | 508 main() { |
| 509 print(test); | 509 print(test); |
| 510 print(test()); | 510 print(test()); |
| 511 foo(); | 511 foo(); |
| 512 } | 512 } |
| 513 '''); | 513 '''); |
| 514 // configure refactoring | 514 // configure refactoring |
| 515 createRenameRefactoringAtString('test);'); | 515 createRenameRefactoringAtString('test);'); |
| 516 expect(refactoring.refactoringName, 'Rename Top-Level Function'); | 516 expect(refactoring.refactoringName, 'Rename Top-Level Function'); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 527 } | 527 } |
| 528 '''); | 528 '''); |
| 529 assertFileChangeResult( | 529 assertFileChangeResult( |
| 530 '/foo.dart', | 530 '/foo.dart', |
| 531 ''' | 531 ''' |
| 532 newName() {} | 532 newName() {} |
| 533 foo() {} | 533 foo() {} |
| 534 '''); | 534 '''); |
| 535 } | 535 } |
| 536 | 536 |
| 537 test_createChange_PropertyAccessorElement_getter_declaration() { | 537 test_createChange_PropertyAccessorElement_getter_declaration() async { |
| 538 return _test_createChange_PropertyAccessorElement("test {}"); | 538 await _test_createChange_PropertyAccessorElement("test {}"); |
| 539 } | 539 } |
| 540 | 540 |
| 541 test_createChange_PropertyAccessorElement_getter_usage() { | 541 test_createChange_PropertyAccessorElement_getter_usage() async { |
| 542 return _test_createChange_PropertyAccessorElement("test);"); | 542 await _test_createChange_PropertyAccessorElement("test);"); |
| 543 } | 543 } |
| 544 | 544 |
| 545 test_createChange_PropertyAccessorElement_mix() { | 545 test_createChange_PropertyAccessorElement_mix() async { |
| 546 return _test_createChange_PropertyAccessorElement("test += 2"); | 546 await _test_createChange_PropertyAccessorElement("test += 2"); |
| 547 } | 547 } |
| 548 | 548 |
| 549 test_createChange_PropertyAccessorElement_setter_declaration() { | 549 test_createChange_PropertyAccessorElement_setter_declaration() async { |
| 550 return _test_createChange_PropertyAccessorElement("test(x) {}"); | 550 await _test_createChange_PropertyAccessorElement("test(x) {}"); |
| 551 } | 551 } |
| 552 | 552 |
| 553 test_createChange_PropertyAccessorElement_setter_usage() { | 553 test_createChange_PropertyAccessorElement_setter_usage() async { |
| 554 return _test_createChange_PropertyAccessorElement("test = 1"); | 554 await _test_createChange_PropertyAccessorElement("test = 1"); |
| 555 } | 555 } |
| 556 | 556 |
| 557 test_createChange_TopLevelVariableElement_field() { | 557 test_createChange_TopLevelVariableElement_field() async { |
| 558 return _test_createChange_TopLevelVariableElement("test = 0"); | 558 await _test_createChange_TopLevelVariableElement("test = 0"); |
| 559 } | 559 } |
| 560 | 560 |
| 561 test_createChange_TopLevelVariableElement_getter() { | 561 test_createChange_TopLevelVariableElement_getter() async { |
| 562 return _test_createChange_TopLevelVariableElement("test);"); | 562 await _test_createChange_TopLevelVariableElement("test);"); |
| 563 } | 563 } |
| 564 | 564 |
| 565 test_createChange_TopLevelVariableElement_mix() { | 565 test_createChange_TopLevelVariableElement_mix() async { |
| 566 return _test_createChange_TopLevelVariableElement("test += 2"); | 566 await _test_createChange_TopLevelVariableElement("test += 2"); |
| 567 } | 567 } |
| 568 | 568 |
| 569 test_createChange_TopLevelVariableElement_setter() { | 569 test_createChange_TopLevelVariableElement_setter() async { |
| 570 return _test_createChange_TopLevelVariableElement("test = 1"); | 570 await _test_createChange_TopLevelVariableElement("test = 1"); |
| 571 } | 571 } |
| 572 | 572 |
| 573 _test_createChange_PropertyAccessorElement(String search) { | 573 _test_createChange_PropertyAccessorElement(String search) async { |
| 574 indexTestUnit(''' | 574 await indexTestUnit(''' |
| 575 get test {} | 575 get test {} |
| 576 set test(x) {} | 576 set test(x) {} |
| 577 main() { | 577 main() { |
| 578 print(test); | 578 print(test); |
| 579 test = 1; | 579 test = 1; |
| 580 test += 2; | 580 test += 2; |
| 581 } | 581 } |
| 582 '''); | 582 '''); |
| 583 // configure refactoring | 583 // configure refactoring |
| 584 createRenameRefactoringAtString(search); | 584 createRenameRefactoringAtString(search); |
| 585 expect(refactoring.refactoringName, 'Rename Top-Level Variable'); | 585 expect(refactoring.refactoringName, 'Rename Top-Level Variable'); |
| 586 expect(refactoring.oldName, 'test'); | 586 expect(refactoring.oldName, 'test'); |
| 587 refactoring.newName = 'newName'; | 587 refactoring.newName = 'newName'; |
| 588 // validate change | 588 // validate change |
| 589 return assertSuccessfulRefactoring(''' | 589 return assertSuccessfulRefactoring(''' |
| 590 get newName {} | 590 get newName {} |
| 591 set newName(x) {} | 591 set newName(x) {} |
| 592 main() { | 592 main() { |
| 593 print(newName); | 593 print(newName); |
| 594 newName = 1; | 594 newName = 1; |
| 595 newName += 2; | 595 newName += 2; |
| 596 } | 596 } |
| 597 '''); | 597 '''); |
| 598 } | 598 } |
| 599 | 599 |
| 600 _test_createChange_TopLevelVariableElement(String search) { | 600 _test_createChange_TopLevelVariableElement(String search) async { |
| 601 indexTestUnit(''' | 601 await indexTestUnit(''' |
| 602 int test = 0; | 602 int test = 0; |
| 603 main() { | 603 main() { |
| 604 print(test); | 604 print(test); |
| 605 test = 1; | 605 test = 1; |
| 606 test += 2; | 606 test += 2; |
| 607 } | 607 } |
| 608 '''); | 608 '''); |
| 609 // configure refactoring | 609 // configure refactoring |
| 610 createRenameRefactoringAtString(search); | 610 createRenameRefactoringAtString(search); |
| 611 expect(refactoring.refactoringName, 'Rename Top-Level Variable'); | 611 expect(refactoring.refactoringName, 'Rename Top-Level Variable'); |
| 612 expect(refactoring.elementKindName, 'top level variable'); | 612 expect(refactoring.elementKindName, 'top level variable'); |
| 613 expect(refactoring.oldName, 'test'); | 613 expect(refactoring.oldName, 'test'); |
| 614 refactoring.newName = 'newName'; | 614 refactoring.newName = 'newName'; |
| 615 // validate change | 615 // validate change |
| 616 return assertSuccessfulRefactoring(''' | 616 return assertSuccessfulRefactoring(''' |
| 617 int newName = 0; | 617 int newName = 0; |
| 618 main() { | 618 main() { |
| 619 print(newName); | 619 print(newName); |
| 620 newName = 1; | 620 newName = 1; |
| 621 newName += 2; | 621 newName += 2; |
| 622 } | 622 } |
| 623 '''); | 623 '''); |
| 624 } | 624 } |
| 625 } | 625 } |
| OLD | NEW |