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/navigation_core.dart'; |
(...skipping 19 matching lines...) Expand all Loading... |
30 | 30 |
31 /** | 31 /** |
32 * This test uses [SET_ANALYSIS_DOMAIN_EXTENSION_POINT_ID] and | 32 * This test uses [SET_ANALYSIS_DOMAIN_EXTENSION_POINT_ID] and |
33 * [NAVIGATION_CONTRIBUTOR_EXTENSION_POINT_ID] extension points to validate | 33 * [NAVIGATION_CONTRIBUTOR_EXTENSION_POINT_ID] extension points to validate |
34 * that plugins can listen for analysis and force sending navigation | 34 * that plugins can listen for analysis and force sending navigation |
35 * notifications. | 35 * notifications. |
36 */ | 36 */ |
37 @reflectiveTest | 37 @reflectiveTest |
38 class SetAnalysisDomainTest extends AbstractAnalysisTest { | 38 class SetAnalysisDomainTest extends AbstractAnalysisTest { |
39 final Set<String> parsedUnitFiles = new Set<String>(); | 39 final Set<String> parsedUnitFiles = new Set<String>(); |
40 bool contributorMayAddRegion = false; | |
41 | 40 |
42 List<NavigationRegion> regions; | 41 List<NavigationRegion> regions; |
43 List<NavigationTarget> targets; | 42 List<NavigationTarget> targets; |
44 List<String> targetFiles; | 43 List<String> targetFiles; |
45 | 44 |
46 @override | 45 @override |
47 void addServerPlugins(List<Plugin> plugins) { | 46 void addServerPlugins(List<Plugin> plugins) { |
48 var plugin = new TestSetAnalysisDomainPlugin(this); | 47 var plugin = new TestSetAnalysisDomainPlugin(this); |
49 plugins.add(plugin); | 48 plugins.add(plugin); |
50 } | 49 } |
51 | 50 |
52 @override | 51 @override |
53 void processNotification(Notification notification) { | 52 void processNotification(Notification notification) { |
54 if (notification.event == ANALYSIS_NAVIGATION) { | 53 if (notification.event == ANALYSIS_NAVIGATION) { |
55 var params = new AnalysisNavigationParams.fromNotification(notification); | 54 var params = new AnalysisNavigationParams.fromNotification(notification); |
56 // TODO(scheglov) we check for "params.regions.isNotEmpty" because | 55 if (params.file == testFile) { |
57 // normal, Dart only, navigation notifications are scheduled as | |
58 // operations, but plugins use "notificationSite.scheduleNavigation" | |
59 // which is not scheduled yet. So, it comes *before* the Dart one, and | |
60 // gets lost. | |
61 if (params.file == testFile && params.regions.isNotEmpty) { | |
62 regions = params.regions; | 56 regions = params.regions; |
63 targets = params.targets; | 57 targets = params.targets; |
64 targetFiles = params.files; | 58 targetFiles = params.files; |
65 } | 59 } |
66 } | 60 } |
67 } | 61 } |
68 | 62 |
69 Future test_contributorIsInvoked() async { | 63 Future test_contributorIsInvoked() async { |
70 createProject(); | 64 createProject(); |
71 addAnalysisSubscription(AnalysisService.NAVIGATION, testFile); | 65 addAnalysisSubscription(AnalysisService.NAVIGATION, testFile); |
(...skipping 22 matching lines...) Expand all Loading... |
94 } | 88 } |
95 | 89 |
96 class TestNavigationContributor implements NavigationContributor { | 90 class TestNavigationContributor implements NavigationContributor { |
97 final SetAnalysisDomainTest test; | 91 final SetAnalysisDomainTest test; |
98 | 92 |
99 TestNavigationContributor(this.test); | 93 TestNavigationContributor(this.test); |
100 | 94 |
101 @override | 95 @override |
102 void computeNavigation(NavigationHolder holder, AnalysisContext context, | 96 void computeNavigation(NavigationHolder holder, AnalysisContext context, |
103 Source source, int offset, int length) { | 97 Source source, int offset, int length) { |
104 if (test.contributorMayAddRegion) { | 98 holder.addRegion(1, 5, ElementKind.CLASS, |
105 holder.addRegion(1, 5, ElementKind.CLASS, | 99 new Location('/testLocation.dart', 1, 2, 3, 4)); |
106 new Location('/testLocation.dart', 1, 2, 3, 4)); | |
107 } | |
108 } | 100 } |
109 } | 101 } |
110 | 102 |
111 class TestSetAnalysisDomainPlugin implements Plugin { | 103 class TestSetAnalysisDomainPlugin implements Plugin { |
112 final SetAnalysisDomainTest test; | 104 final SetAnalysisDomainTest test; |
113 | 105 |
114 TestSetAnalysisDomainPlugin(this.test); | 106 TestSetAnalysisDomainPlugin(this.test); |
115 | 107 |
116 @override | 108 @override |
117 String get uniqueIdentifier => 'test'; | 109 String get uniqueIdentifier => 'test'; |
118 | 110 |
119 @override | 111 @override |
120 void registerExtensionPoints(RegisterExtensionPoint register) {} | 112 void registerExtensionPoints(RegisterExtensionPoint register) {} |
121 | 113 |
122 @override | 114 @override |
123 void registerExtensions(RegisterExtension register) { | 115 void registerExtensions(RegisterExtension register) { |
124 register(SET_ANALYSIS_DOMAIN_EXTENSION_POINT_ID, _setAnalysisDomain); | 116 register(SET_ANALYSIS_DOMAIN_EXTENSION_POINT_ID, _setAnalysisDomain); |
125 register(NAVIGATION_CONTRIBUTOR_EXTENSION_POINT_ID, | 117 register(NAVIGATION_CONTRIBUTOR_EXTENSION_POINT_ID, |
126 new TestNavigationContributor(test)); | 118 new TestNavigationContributor(test)); |
127 } | 119 } |
128 | 120 |
129 void _setAnalysisDomain(AnalysisDomain domain) { | 121 void _setAnalysisDomain(AnalysisDomain domain) { |
130 domain.onResultComputed(PARSED_UNIT).listen((result) { | 122 domain.onResultComputed(PARSED_UNIT).listen((result) { |
131 expect(result.context, isNotNull); | 123 expect(result.context, isNotNull); |
132 expect(result.target, isNotNull); | 124 expect(result.target, isNotNull); |
133 expect(result.value, isNotNull); | 125 expect(result.value, isNotNull); |
134 Source source = result.target.source; | 126 Source source = result.target.source; |
135 test.parsedUnitFiles.add(source.fullName); | 127 test.parsedUnitFiles.add(source.fullName); |
136 // let the navigation contributor to work | 128 domain.scheduleNotification( |
137 test.contributorMayAddRegion = true; | 129 result.context, source, AnalysisService.NAVIGATION); |
138 try { | |
139 domain.scheduleNotification( | |
140 result.context, source, AnalysisService.NAVIGATION); | |
141 } finally { | |
142 test.contributorMayAddRegion = false; | |
143 } | |
144 }); | 130 }); |
145 } | 131 } |
146 } | 132 } |
OLD | NEW |