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.plugin.analysis_contributor; | 5 library test.plugin.analysis_contributor; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 | 8 |
9 import 'package:analysis_server/analysis/analysis_domain.dart'; | 9 import 'package:analysis_server/analysis/analysis_domain.dart'; |
10 import 'package:analysis_server/analysis/navigation/navigation_core.dart'; | 10 import 'package:analysis_server/analysis/navigation_core.dart'; |
| 11 import 'package:analysis_server/analysis/occurrences_core.dart'; |
11 import 'package:analysis_server/plugin/navigation.dart'; | 12 import 'package:analysis_server/plugin/navigation.dart'; |
| 13 import 'package:analysis_server/plugin/occurrences.dart'; |
12 import 'package:analysis_server/src/constants.dart'; | 14 import 'package:analysis_server/src/constants.dart'; |
13 import 'package:analysis_server/src/protocol.dart'; | 15 import 'package:analysis_server/src/protocol.dart'; |
14 import 'package:analyzer/src/generated/engine.dart'; | 16 import 'package:analyzer/src/generated/engine.dart'; |
15 import 'package:analyzer/src/generated/source.dart'; | 17 import 'package:analyzer/src/generated/source.dart'; |
16 import 'package:analyzer/task/dart.dart'; | 18 import 'package:analyzer/task/dart.dart'; |
17 import 'package:plugin/plugin.dart'; | 19 import 'package:plugin/plugin.dart'; |
18 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 20 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
19 import 'package:unittest/unittest.dart'; | 21 import 'package:unittest/unittest.dart'; |
20 | 22 |
21 import '../analysis_abstract.dart'; | 23 import '../analysis_abstract.dart'; |
22 import '../utils.dart'; | 24 import '../utils.dart'; |
23 | 25 |
24 main() { | 26 main() { |
25 initializeTestEnvironment(); | 27 initializeTestEnvironment(); |
26 if (AnalysisEngine.instance.useTaskModel) { | 28 if (AnalysisEngine.instance.useTaskModel) { |
27 defineReflectiveTests(SetAnalysisDomainTest); | 29 defineReflectiveTests(SetAnalysisDomainTest); |
28 } | 30 } |
29 } | 31 } |
30 | 32 |
31 /** | 33 /** |
32 * This test uses [SET_ANALYSIS_DOMAIN_EXTENSION_POINT_ID] and | 34 * This test uses [SET_ANALYSIS_DOMAIN_EXTENSION_POINT_ID] and |
33 * [NAVIGATION_CONTRIBUTOR_EXTENSION_POINT_ID] extension points to validate | 35 * [NAVIGATION_CONTRIBUTOR_EXTENSION_POINT_ID] extension points to validate |
34 * that plugins can listen for analysis and force sending navigation | 36 * that plugins can listen for analysis and force sending navigation |
35 * notifications. | 37 * notifications. |
36 */ | 38 */ |
37 @reflectiveTest | 39 @reflectiveTest |
38 class SetAnalysisDomainTest extends AbstractAnalysisTest { | 40 class SetAnalysisDomainTest extends AbstractAnalysisTest { |
39 final Set<String> parsedUnitFiles = new Set<String>(); | 41 final Set<String> parsedUnitFiles = new Set<String>(); |
40 | 42 |
41 List<NavigationRegion> regions; | 43 AnalysisNavigationParams navigationParams; |
42 List<NavigationTarget> targets; | 44 AnalysisOccurrencesParams occurrencesParams; |
43 List<String> targetFiles; | |
44 | 45 |
45 @override | 46 @override |
46 void addServerPlugins(List<Plugin> plugins) { | 47 void addServerPlugins(List<Plugin> plugins) { |
47 var plugin = new TestSetAnalysisDomainPlugin(this); | 48 var plugin = new TestSetAnalysisDomainPlugin(this); |
48 plugins.add(plugin); | 49 plugins.add(plugin); |
49 } | 50 } |
50 | 51 |
51 @override | 52 @override |
52 void processNotification(Notification notification) { | 53 void processNotification(Notification notification) { |
53 if (notification.event == ANALYSIS_NAVIGATION) { | 54 if (notification.event == ANALYSIS_NAVIGATION) { |
54 var params = new AnalysisNavigationParams.fromNotification(notification); | 55 var params = new AnalysisNavigationParams.fromNotification(notification); |
55 if (params.file == testFile) { | 56 if (params.file == testFile) { |
56 regions = params.regions; | 57 navigationParams = params; |
57 targets = params.targets; | 58 } |
58 targetFiles = params.files; | 59 } |
| 60 if (notification.event == ANALYSIS_OCCURRENCES) { |
| 61 var params = new AnalysisOccurrencesParams.fromNotification(notification); |
| 62 if (params.file == testFile) { |
| 63 occurrencesParams = params; |
59 } | 64 } |
60 } | 65 } |
61 } | 66 } |
62 | 67 |
63 Future test_contributorIsInvoked() async { | 68 Future test_contributorIsInvoked() async { |
64 createProject(); | 69 createProject(); |
65 addAnalysisSubscription(AnalysisService.NAVIGATION, testFile); | 70 addAnalysisSubscription(AnalysisService.NAVIGATION, testFile); |
| 71 addAnalysisSubscription(AnalysisService.OCCURRENCES, testFile); |
66 addTestFile('// usually no navigation'); | 72 addTestFile('// usually no navigation'); |
67 await server.onAnalysisComplete; | 73 await server.onAnalysisComplete; |
68 // we have PARSED_UNIT | 74 // we have PARSED_UNIT |
69 expect(parsedUnitFiles, contains(testFile)); | 75 expect(parsedUnitFiles, contains(testFile)); |
70 // we have an additional navigation region/target | 76 // we have an additional navigation region/target |
71 expect(regions, hasLength(1)); | |
72 { | 77 { |
73 NavigationRegion region = regions.single; | 78 expect(navigationParams.regions, hasLength(1)); |
74 expect(region.offset, 1); | 79 { |
75 expect(region.length, 5); | 80 NavigationRegion region = navigationParams.regions.single; |
76 expect(region.targets.single, 0); | 81 expect(region.offset, 1); |
| 82 expect(region.length, 5); |
| 83 expect(region.targets.single, 0); |
| 84 } |
| 85 { |
| 86 NavigationTarget target = navigationParams.targets.single; |
| 87 expect(target.fileIndex, 0); |
| 88 expect(target.offset, 1); |
| 89 expect(target.length, 2); |
| 90 expect(target.startLine, 3); |
| 91 expect(target.startColumn, 4); |
| 92 } |
| 93 expect(navigationParams.files.single, '/testLocation.dart'); |
77 } | 94 } |
| 95 // we have additional occurrences |
78 { | 96 { |
79 NavigationTarget target = targets.single; | 97 expect(occurrencesParams.occurrences, hasLength(1)); |
80 expect(target.fileIndex, 0); | 98 Occurrences occurrences = occurrencesParams.occurrences.single; |
81 expect(target.offset, 1); | 99 expect(occurrences.element.name, 'TestElement'); |
82 expect(target.length, 2); | 100 expect(occurrences.length, 5); |
83 expect(target.startLine, 3); | 101 expect(occurrences.offsets, unorderedEquals([1, 2, 3])); |
84 expect(target.startColumn, 4); | |
85 } | 102 } |
86 expect(targetFiles.single, '/testLocation.dart'); | |
87 } | 103 } |
88 } | 104 } |
89 | 105 |
90 class TestNavigationContributor implements NavigationContributor { | 106 class TestNavigationContributor implements NavigationContributor { |
91 final SetAnalysisDomainTest test; | 107 final SetAnalysisDomainTest test; |
92 | 108 |
93 TestNavigationContributor(this.test); | 109 TestNavigationContributor(this.test); |
94 | 110 |
95 @override | 111 @override |
96 void computeNavigation(NavigationCollector collector, AnalysisContext context, | 112 void computeNavigation(NavigationCollector collector, AnalysisContext context, |
97 Source source, int offset, int length) { | 113 Source source, int offset, int length) { |
98 collector.addRegion(1, 5, ElementKind.CLASS, | 114 collector.addRegion(1, 5, ElementKind.CLASS, |
99 new Location('/testLocation.dart', 1, 2, 3, 4)); | 115 new Location('/testLocation.dart', 1, 2, 3, 4)); |
100 } | 116 } |
101 } | 117 } |
102 | 118 |
| 119 class TestOccurrencesContributor implements OccurrencesContributor { |
| 120 final SetAnalysisDomainTest test; |
| 121 |
| 122 TestOccurrencesContributor(this.test); |
| 123 |
| 124 @override |
| 125 void computeOccurrences( |
| 126 OccurrencesCollector collector, AnalysisContext context, Source source) { |
| 127 collector.addOccurrences(new Occurrences( |
| 128 new Element(ElementKind.UNKNOWN, 'TestElement', 0), <int>[1, 2, 3], 5)); |
| 129 } |
| 130 } |
| 131 |
103 class TestSetAnalysisDomainPlugin implements Plugin { | 132 class TestSetAnalysisDomainPlugin implements Plugin { |
104 final SetAnalysisDomainTest test; | 133 final SetAnalysisDomainTest test; |
105 | 134 |
106 TestSetAnalysisDomainPlugin(this.test); | 135 TestSetAnalysisDomainPlugin(this.test); |
107 | 136 |
108 @override | 137 @override |
109 String get uniqueIdentifier => 'test'; | 138 String get uniqueIdentifier => 'test'; |
110 | 139 |
111 @override | 140 @override |
112 void registerExtensionPoints(RegisterExtensionPoint register) {} | 141 void registerExtensionPoints(RegisterExtensionPoint register) {} |
113 | 142 |
114 @override | 143 @override |
115 void registerExtensions(RegisterExtension register) { | 144 void registerExtensions(RegisterExtension register) { |
116 register(SET_ANALYSIS_DOMAIN_EXTENSION_POINT_ID, _setAnalysisDomain); | 145 register(SET_ANALYSIS_DOMAIN_EXTENSION_POINT_ID, _setAnalysisDomain); |
117 register(NAVIGATION_CONTRIBUTOR_EXTENSION_POINT_ID, | 146 register(NAVIGATION_CONTRIBUTOR_EXTENSION_POINT_ID, |
118 new TestNavigationContributor(test)); | 147 new TestNavigationContributor(test)); |
| 148 register(OCCURRENCES_CONTRIBUTOR_EXTENSION_POINT_ID, |
| 149 new TestOccurrencesContributor(test)); |
119 } | 150 } |
120 | 151 |
121 void _setAnalysisDomain(AnalysisDomain domain) { | 152 void _setAnalysisDomain(AnalysisDomain domain) { |
122 domain.onResultComputed(PARSED_UNIT).listen((result) { | 153 domain.onResultComputed(PARSED_UNIT).listen((result) { |
123 expect(result.context, isNotNull); | 154 expect(result.context, isNotNull); |
124 expect(result.target, isNotNull); | 155 expect(result.target, isNotNull); |
125 expect(result.value, isNotNull); | 156 expect(result.value, isNotNull); |
126 Source source = result.target.source; | 157 Source source = result.target.source; |
127 test.parsedUnitFiles.add(source.fullName); | 158 test.parsedUnitFiles.add(source.fullName); |
128 domain.scheduleNotification( | 159 domain.scheduleNotification( |
129 result.context, source, AnalysisService.NAVIGATION); | 160 result.context, source, AnalysisService.NAVIGATION); |
| 161 domain.scheduleNotification( |
| 162 result.context, source, AnalysisService.OCCURRENCES); |
130 }); | 163 }); |
131 } | 164 } |
132 } | 165 } |
OLD | NEW |