| OLD | NEW | 
|---|
| 1 // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 import 'dart:async'; | 
|  | 6 | 
| 5 import 'package:analysis_server/protocol/protocol_generated.dart'; | 7 import 'package:analysis_server/protocol/protocol_generated.dart'; | 
| 6 import 'package:analysis_server/src/computer/import_elements_computer.dart'; | 8 import 'package:analysis_server/src/computer/import_elements_computer.dart'; | 
| 7 import 'package:analyzer/dart/analysis/results.dart'; | 9 import 'package:analyzer/src/dart/analysis/driver.dart'; | 
| 8 import 'package:analyzer_plugin/protocol/protocol_common.dart'; | 10 import 'package:analyzer_plugin/protocol/protocol_common.dart'; | 
|  | 11 import 'package:front_end/src/base/source.dart'; | 
| 9 import 'package:test/test.dart'; | 12 import 'package:test/test.dart'; | 
| 10 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 13 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 
| 11 | 14 | 
| 12 import '../../abstract_context.dart'; | 15 import '../../abstract_context.dart'; | 
| 13 | 16 | 
| 14 main() { | 17 main() { | 
| 15   defineReflectiveSuite(() { | 18   defineReflectiveSuite(() { | 
| 16     defineReflectiveTests(ImportElementsComputerTest); | 19     defineReflectiveTests(ImportElementsComputerTest); | 
| 17   }); | 20   }); | 
| 18 } | 21 } | 
| 19 | 22 | 
| 20 /** |  | 
| 21  * Tests that the [ImportElementsComputer] will correctly update imports. The |  | 
| 22  * tests are generally labeled based on the kind of import in the source (from |  | 
| 23  * which the text was copied) and the kind of import in the target (into which |  | 
| 24  * the text was pasted). Kinds are a combination of "prefix", "hide", "show" and |  | 
| 25  * "deferred", or "bare" when there are none of the previous, or "none" when |  | 
| 26  * there is no import. |  | 
| 27  */ |  | 
| 28 @reflectiveTest | 23 @reflectiveTest | 
| 29 class ImportElementsComputerTest extends AbstractContextTest { | 24 class ImportElementsComputerTest extends AbstractContextTest { | 
| 30   String targetPath; | 25   String path; | 
| 31   String targetCode; | 26   String originalContent; | 
| 32 | 27   ImportElementsComputer computer; | 
| 33   ResolveResult result; | 28   SourceFileEdit sourceFileEdit; | 
| 34 | 29 | 
| 35   setUp() async { | 30   void assertChanges(String expectedContent) { | 
|  | 31     String resultCode = | 
|  | 32         SourceEdit.applySequence(originalContent, sourceFileEdit.edits); | 
|  | 33     expect(resultCode, expectedContent); | 
|  | 34   } | 
|  | 35 | 
|  | 36   void assertNoChanges() { | 
|  | 37     expect(sourceFileEdit.edits, isEmpty); | 
|  | 38   } | 
|  | 39 | 
|  | 40   Future<Null> computeChanges(List<ImportedElements> importedElements) async { | 
|  | 41     SourceChange change = await computer.createEdits(importedElements); | 
|  | 42     expect(change, isNotNull); | 
|  | 43     List<SourceFileEdit> edits = change.edits; | 
|  | 44     expect(edits, hasLength(1)); | 
|  | 45     sourceFileEdit = edits[0]; | 
|  | 46     expect(sourceFileEdit, isNotNull); | 
|  | 47   } | 
|  | 48 | 
|  | 49   Future<Null> createBuilder(String content) async { | 
|  | 50     originalContent = content; | 
|  | 51     provider.newFile(path, content); | 
|  | 52     AnalysisResult result = await driver.getResult(path); | 
|  | 53     computer = new ImportElementsComputer(provider, result); | 
|  | 54   } | 
|  | 55 | 
|  | 56   void setUp() { | 
| 36     super.setUp(); | 57     super.setUp(); | 
| 37     packageMap['p'] = [provider.newFolder(provider.convertPath('/p/lib'))]; | 58     path = provider.convertPath('/test.dart'); | 
| 38     targetPath = provider.convertPath('/p/lib/target.dart'); | 59   } | 
| 39     targetCode = ''' | 60 | 
| 40 main() {} | 61   test_createEdits_addImport_noPrefix() async { | 
| 41 '''; | 62     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
| 42     provider.newFile(targetPath, targetCode); | 63     await createBuilder(''' | 
| 43     result = await driver.getResult(targetPath); | 64 import 'package:pkg/foo.dart' as foo; | 
| 44   } | 65 '''); | 
| 45 | 66     await computeChanges(<ImportedElements>[ | 
| 46   @failingTest | 67       new ImportedElements(fooSource.fullName, '', <String>['A']) | 
| 47   test_bare_none() { | 68     ]); | 
| 48     List<ImportedElements> elements = <ImportedElements>[ | 69     assertChanges(''' | 
| 49       new ImportedElements( | 70 import 'package:pkg/foo.dart' as foo; | 
| 50           provider.convertPath('/p/lib/a.dart'), '', <String>['A']), | 71 import 'package:pkg/foo.dart'; | 
| 51     ]; | 72 '''); | 
| 52     List<SourceEdit> edits = _computeEditsFor(elements); | 73   } | 
| 53     expect(edits, hasLength(1)); | 74 | 
| 54     SourceEdit edit = edits[0]; | 75   test_createEdits_addImport_prefix() async { | 
| 55     expect(edit, isNotNull); | 76     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
| 56     expect(edit.offset, 0); | 77     await createBuilder(''' | 
| 57     expect(edit.length, 0); | 78 import 'package:pkg/foo.dart'; | 
| 58     expect(edit.apply(targetCode), """ | 79 '''); | 
| 59 import 'source.dart'; | 80     await computeChanges(<ImportedElements>[ | 
| 60 | 81       new ImportedElements(fooSource.fullName, 'foo', <String>['A']) | 
| 61 main() {} | 82     ]); | 
| 62 """); | 83     assertChanges(''' | 
| 63   } | 84 import 'package:pkg/foo.dart'; | 
| 64 | 85 import 'package:pkg/foo.dart' as foo; | 
| 65   test_none_none() { | 86 '''); | 
| 66     List<ImportedElements> elements = <ImportedElements>[]; | 87   } | 
| 67     List<SourceEdit> edits = _computeEditsFor(elements); | 88 | 
| 68     expect(edits, hasLength(0)); | 89   test_createEdits_addShow_multipleNames() async { | 
| 69   } | 90     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
| 70 | 91     await createBuilder(''' | 
| 71   List<SourceEdit> _computeEditsFor(List<ImportedElements> elements) { | 92 import 'package:pkg/foo.dart' show B; | 
| 72     ImportElementsComputer computer = | 93 import 'package:pkg/foo.dart' as foo; | 
| 73         new ImportElementsComputer(result, targetPath, elements); | 94 '''); | 
| 74     return computer.compute(); | 95     await computeChanges(<ImportedElements>[ | 
|  | 96       new ImportedElements(fooSource.fullName, '', <String>['A', 'C']) | 
|  | 97     ]); | 
|  | 98     assertChanges(''' | 
|  | 99 import 'package:pkg/foo.dart' show B, A, C; | 
|  | 100 import 'package:pkg/foo.dart' as foo; | 
|  | 101 '''); | 
|  | 102   } | 
|  | 103 | 
|  | 104   test_createEdits_addShow_removeHide() async { | 
|  | 105     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 106     await createBuilder(''' | 
|  | 107 import 'package:pkg/foo.dart' show A, B hide C, D; | 
|  | 108 '''); | 
|  | 109     await computeChanges(<ImportedElements>[ | 
|  | 110       new ImportedElements(fooSource.fullName, '', <String>['C']) | 
|  | 111     ]); | 
|  | 112     assertChanges(''' | 
|  | 113 import 'package:pkg/foo.dart' show A, B, C hide D; | 
|  | 114 '''); | 
|  | 115   } | 
|  | 116 | 
|  | 117   test_createEdits_addShow_singleName_noPrefix() async { | 
|  | 118     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 119     await createBuilder(''' | 
|  | 120 import 'package:pkg/foo.dart' show B; | 
|  | 121 '''); | 
|  | 122     await computeChanges(<ImportedElements>[ | 
|  | 123       new ImportedElements(fooSource.fullName, '', <String>['A']) | 
|  | 124     ]); | 
|  | 125     assertChanges(''' | 
|  | 126 import 'package:pkg/foo.dart' show B, A; | 
|  | 127 '''); | 
|  | 128   } | 
|  | 129 | 
|  | 130   test_createEdits_addShow_singleName_prefix() async { | 
|  | 131     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 132     await createBuilder(''' | 
|  | 133 import 'package:pkg/foo.dart' show C; | 
|  | 134 import 'package:pkg/foo.dart' as foo show B; | 
|  | 135 '''); | 
|  | 136     await computeChanges(<ImportedElements>[ | 
|  | 137       new ImportedElements(fooSource.fullName, 'foo', <String>['A']) | 
|  | 138     ]); | 
|  | 139     assertChanges(''' | 
|  | 140 import 'package:pkg/foo.dart' show C; | 
|  | 141 import 'package:pkg/foo.dart' as foo show B, A; | 
|  | 142 '''); | 
|  | 143   } | 
|  | 144 | 
|  | 145   test_createEdits_alreadyImported_noCombinators() async { | 
|  | 146     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 147     await createBuilder(''' | 
|  | 148 import 'package:pkg/foo.dart'; | 
|  | 149 '''); | 
|  | 150     await computeChanges(<ImportedElements>[ | 
|  | 151       new ImportedElements(fooSource.fullName, '', <String>['A', 'B']) | 
|  | 152     ]); | 
|  | 153     assertNoChanges(); | 
|  | 154   } | 
|  | 155 | 
|  | 156   test_createEdits_alreadyImported_withPrefix() async { | 
|  | 157     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 158     await createBuilder(''' | 
|  | 159 import 'package:pkg/foo.dart' as foo; | 
|  | 160 '''); | 
|  | 161     await computeChanges(<ImportedElements>[ | 
|  | 162       new ImportedElements(fooSource.fullName, 'foo', <String>['A', 'B']) | 
|  | 163     ]); | 
|  | 164     assertNoChanges(); | 
|  | 165   } | 
|  | 166 | 
|  | 167   test_createEdits_alreadyImported_withShow() async { | 
|  | 168     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 169     await createBuilder(''' | 
|  | 170 import 'package:pkg/foo.dart' show A; | 
|  | 171 '''); | 
|  | 172     await computeChanges(<ImportedElements>[ | 
|  | 173       new ImportedElements(fooSource.fullName, '', <String>['A']) | 
|  | 174     ]); | 
|  | 175     assertNoChanges(); | 
|  | 176   } | 
|  | 177 | 
|  | 178   test_createEdits_noElements() async { | 
|  | 179     await createBuilder(''); | 
|  | 180     await computeChanges(<ImportedElements>[]); | 
|  | 181     assertNoChanges(); | 
|  | 182   } | 
|  | 183 | 
|  | 184   test_createEdits_removeHide_firstInCombinator() async { | 
|  | 185     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 186     await createBuilder(''' | 
|  | 187 import 'package:pkg/foo.dart' hide A, B, C; | 
|  | 188 '''); | 
|  | 189     await computeChanges(<ImportedElements>[ | 
|  | 190       new ImportedElements(fooSource.fullName, '', <String>['A']) | 
|  | 191     ]); | 
|  | 192     assertChanges(''' | 
|  | 193 import 'package:pkg/foo.dart' hide B, C; | 
|  | 194 '''); | 
|  | 195   } | 
|  | 196 | 
|  | 197   test_createEdits_removeHide_lastInCombinator() async { | 
|  | 198     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 199     await createBuilder(''' | 
|  | 200 import 'package:pkg/foo.dart' hide A, B, C; | 
|  | 201 '''); | 
|  | 202     await computeChanges(<ImportedElements>[ | 
|  | 203       new ImportedElements(fooSource.fullName, '', <String>['C']) | 
|  | 204     ]); | 
|  | 205     assertChanges(''' | 
|  | 206 import 'package:pkg/foo.dart' hide A, B; | 
|  | 207 '''); | 
|  | 208   } | 
|  | 209 | 
|  | 210   test_createEdits_removeHide_middleInCombinator() async { | 
|  | 211     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 212     await createBuilder(''' | 
|  | 213 import 'package:pkg/foo.dart' hide A, B, C; | 
|  | 214 '''); | 
|  | 215     await computeChanges(<ImportedElements>[ | 
|  | 216       new ImportedElements(fooSource.fullName, '', <String>['B']) | 
|  | 217     ]); | 
|  | 218     assertChanges(''' | 
|  | 219 import 'package:pkg/foo.dart' hide A, C; | 
|  | 220 '''); | 
|  | 221   } | 
|  | 222 | 
|  | 223   test_createEdits_removeHide_multipleCombinators() async { | 
|  | 224     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 225     await createBuilder(''' | 
|  | 226 import 'package:pkg/foo.dart' hide A, B, C hide A, B, C; | 
|  | 227 '''); | 
|  | 228     await computeChanges(<ImportedElements>[ | 
|  | 229       new ImportedElements(fooSource.fullName, '', <String>['B']) | 
|  | 230     ]); | 
|  | 231     assertChanges(''' | 
|  | 232 import 'package:pkg/foo.dart' hide A, C hide A, C; | 
|  | 233 '''); | 
|  | 234   } | 
|  | 235 | 
|  | 236   test_createEdits_removeHide_multipleNames() async { | 
|  | 237     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 238     await createBuilder(''' | 
|  | 239 import 'package:pkg/foo.dart' hide A, B, C hide D, E, F hide G, H, I; | 
|  | 240 '''); | 
|  | 241     await computeChanges(<ImportedElements>[ | 
|  | 242       new ImportedElements(fooSource.fullName, '', <String>['A', 'E', 'I']) | 
|  | 243     ]); | 
|  | 244     assertChanges(''' | 
|  | 245 import 'package:pkg/foo.dart' hide B, C hide D, F hide G, H; | 
|  | 246 '''); | 
|  | 247   } | 
|  | 248 | 
|  | 249   test_createEdits_removeHideCombinator_first() async { | 
|  | 250     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 251     await createBuilder(''' | 
|  | 252 import 'package:pkg/foo.dart' hide A hide B hide C; | 
|  | 253 '''); | 
|  | 254     await computeChanges(<ImportedElements>[ | 
|  | 255       new ImportedElements(fooSource.fullName, '', <String>['A']) | 
|  | 256     ]); | 
|  | 257     assertChanges(''' | 
|  | 258 import 'package:pkg/foo.dart' hide B hide C; | 
|  | 259 '''); | 
|  | 260   } | 
|  | 261 | 
|  | 262   test_createEdits_removeHideCombinator_last() async { | 
|  | 263     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 264     await createBuilder(''' | 
|  | 265 import 'package:pkg/foo.dart' hide A hide B hide C; | 
|  | 266 '''); | 
|  | 267     await computeChanges(<ImportedElements>[ | 
|  | 268       new ImportedElements(fooSource.fullName, '', <String>['C']) | 
|  | 269     ]); | 
|  | 270     assertChanges(''' | 
|  | 271 import 'package:pkg/foo.dart' hide A hide B; | 
|  | 272 '''); | 
|  | 273   } | 
|  | 274 | 
|  | 275   test_createEdits_removeHideCombinator_middle() async { | 
|  | 276     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 277     await createBuilder(''' | 
|  | 278 import 'package:pkg/foo.dart' hide A hide B hide C; | 
|  | 279 '''); | 
|  | 280     await computeChanges(<ImportedElements>[ | 
|  | 281       new ImportedElements(fooSource.fullName, '', <String>['B']) | 
|  | 282     ]); | 
|  | 283     assertChanges(''' | 
|  | 284 import 'package:pkg/foo.dart' hide A hide C; | 
|  | 285 '''); | 
|  | 286   } | 
|  | 287 | 
|  | 288   test_createEdits_removeHideCombinator_only() async { | 
|  | 289     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 290     await createBuilder(''' | 
|  | 291 import 'package:pkg/foo.dart' hide A; | 
|  | 292 '''); | 
|  | 293     await computeChanges(<ImportedElements>[ | 
|  | 294       new ImportedElements(fooSource.fullName, '', <String>['A']) | 
|  | 295     ]); | 
|  | 296     assertChanges(''' | 
|  | 297 import 'package:pkg/foo.dart'; | 
|  | 298 '''); | 
|  | 299   } | 
|  | 300 | 
|  | 301   test_createEdits_removeHideCombinator_only_multiple() async { | 
|  | 302     Source fooSource = addPackageSource('pkg', 'foo.dart', ''); | 
|  | 303     await createBuilder(''' | 
|  | 304 import 'package:pkg/foo.dart' hide A, B; | 
|  | 305 '''); | 
|  | 306     await computeChanges(<ImportedElements>[ | 
|  | 307       new ImportedElements(fooSource.fullName, '', <String>['A', 'B']) | 
|  | 308     ]); | 
|  | 309     assertChanges(''' | 
|  | 310 import 'package:pkg/foo.dart'; | 
|  | 311 '''); | 
| 75   } | 312   } | 
| 76 } | 313 } | 
| OLD | NEW | 
|---|