OLD | NEW |
---|---|
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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'; | 5 import 'dart:async'; |
6 | 6 |
7 import 'package:analyzer/dart/ast/ast.dart'; | 7 import 'package:analyzer/dart/ast/ast.dart'; |
8 import 'package:analyzer/dart/element/element.dart'; | 8 import 'package:analyzer/dart/element/element.dart'; |
9 import 'package:analyzer/src/dart/analysis/driver.dart'; | 9 import 'package:analyzer/src/dart/analysis/driver.dart'; |
10 import 'package:analyzer/src/dart/analysis/search.dart'; | 10 import 'package:analyzer/src/dart/analysis/search.dart'; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
74 buffer.write(isQualified); | 74 buffer.write(isQualified); |
75 buffer.write(")"); | 75 buffer.write(")"); |
76 return buffer.toString(); | 76 return buffer.toString(); |
77 } | 77 } |
78 } | 78 } |
79 | 79 |
80 @reflectiveTest | 80 @reflectiveTest |
81 class SearchTest extends BaseAnalysisDriverTest { | 81 class SearchTest extends BaseAnalysisDriverTest { |
82 static const testUri = 'package:test/test.dart'; | 82 static const testUri = 'package:test/test.dart'; |
83 | 83 |
84 test_searchReferences_Label() async { | 84 test_searchReferences_FunctionElement_local() async { |
85 addTestFile(''' | |
86 main() { | |
87 test() {} | |
88 test(); | |
89 print(test); | |
90 } | |
91 '''); | |
92 FunctionElement element = await _findElement('test'); | |
93 List<String> main = [testUri, 'main']; | |
94 var expected = [ | |
95 _expectId(main, SearchResultKind.INVOCATION, 'test();'), | |
96 _expectId(main, SearchResultKind.REFERENCE, 'test);') | |
97 ]; | |
98 await _verifyReferences(element, expected); | |
99 } | |
100 | |
101 test_searchReferences_LabelElement() async { | |
85 addTestFile(''' | 102 addTestFile(''' |
86 main() { | 103 main() { |
87 label: | 104 label: |
88 while (true) { | 105 while (true) { |
89 if (true) { | 106 if (true) { |
90 break label; // 1 | 107 break label; // 1 |
91 } | 108 } |
92 break label; // 2 | 109 break label; // 2 |
93 } | 110 } |
94 } | 111 } |
95 '''); | 112 '''); |
96 Element element = await _findElementAtString('label:'); | 113 Element element = await _findElement('label'); |
97 List<String> main = [testUri, 'main']; | 114 List<String> main = [testUri, 'main']; |
98 var expected = [ | 115 var expected = [ |
99 _expectId(main, SearchResultKind.REFERENCE, 'label; // 1'), | 116 _expectId(main, SearchResultKind.REFERENCE, 'label; // 1'), |
100 _expectId(main, SearchResultKind.REFERENCE, 'label; // 2') | 117 _expectId(main, SearchResultKind.REFERENCE, 'label; // 2') |
101 ]; | 118 ]; |
102 await _verifyReferences(element, expected); | 119 await _verifyReferences(element, expected); |
103 } | 120 } |
104 | 121 |
105 test_searchReferences_localVariable() async { | 122 test_searchReferences_LocalVariableElement() async { |
106 addTestFile(r''' | 123 addTestFile(r''' |
107 main() { | 124 main() { |
108 var v; | 125 var v; |
109 v = 1; | 126 v = 1; |
110 v += 2; | 127 v += 2; |
111 print(v); | 128 print(v); |
112 v(); | 129 v(); |
113 } | 130 } |
114 '''); | 131 '''); |
115 Element element = await _findElementAtString('v;'); | 132 Element element = await _findElement('v'); |
116 List<String> main = [testUri, 'main']; | 133 List<String> main = [testUri, 'main']; |
117 var expected = [ | 134 var expected = [ |
118 _expectId(main, SearchResultKind.WRITE, 'v = 1;'), | 135 _expectId(main, SearchResultKind.WRITE, 'v = 1;'), |
119 _expectId(main, SearchResultKind.READ_WRITE, 'v += 2;'), | 136 _expectId(main, SearchResultKind.READ_WRITE, 'v += 2;'), |
120 _expectId(main, SearchResultKind.READ, 'v);'), | 137 _expectId(main, SearchResultKind.READ, 'v);'), |
121 _expectId(main, SearchResultKind.INVOCATION, 'v();') | 138 _expectId(main, SearchResultKind.INVOCATION, 'v();') |
122 ]; | 139 ]; |
123 await _verifyReferences(element, expected); | 140 await _verifyReferences(element, expected); |
124 } | 141 } |
125 | 142 |
126 test_searchReferences_localVariable_inForEachLoop() async { | 143 test_searchReferences_localVariableElement_inForEachLoop() async { |
127 addTestFile(''' | 144 addTestFile(''' |
128 main() { | 145 main() { |
129 for (var v in []) { | 146 for (var v in []) { |
130 v = 1; | 147 v = 1; |
131 v += 2; | 148 v += 2; |
132 print(v); | 149 print(v); |
133 v(); | 150 v(); |
134 } | 151 } |
135 } | 152 } |
136 '''); | 153 '''); |
137 Element element = await _findElementAtString('v in []'); | 154 Element element = await _findElementAtString('v in []'); |
138 List<String> main = [testUri, 'main']; | 155 List<String> main = [testUri, 'main']; |
139 var expected = [ | 156 var expected = [ |
140 _expectId(main, SearchResultKind.WRITE, 'v = 1;'), | 157 _expectId(main, SearchResultKind.WRITE, 'v = 1;'), |
141 _expectId(main, SearchResultKind.READ_WRITE, 'v += 2;'), | 158 _expectId(main, SearchResultKind.READ_WRITE, 'v += 2;'), |
142 _expectId(main, SearchResultKind.READ, 'v);'), | 159 _expectId(main, SearchResultKind.READ, 'v);'), |
143 _expectId(main, SearchResultKind.INVOCATION, 'v();') | 160 _expectId(main, SearchResultKind.INVOCATION, 'v();') |
144 ]; | 161 ]; |
145 await _verifyReferences(element, expected); | 162 await _verifyReferences(element, expected); |
146 } | 163 } |
147 | 164 |
165 test_searchReferences_TypeParameterElement() async { | |
Brian Wilkerson
2016/11/22 20:25:40
Might also be good to have a test for a type param
scheglov
2016/11/22 20:47:55
Good idea.
Done.
| |
166 addTestFile(''' | |
167 class A<T> { | |
168 foo(T a) {} | |
169 bar(T b) {} | |
170 } | |
171 '''); | |
172 TypeParameterElement element = await _findElement('T'); | |
173 var expected = [ | |
174 _expectId([testUri, 'A', 'foo', 'a'], SearchResultKind.REFERENCE, 'T a'), | |
175 _expectId([testUri, 'A', 'bar', 'b'], SearchResultKind.REFERENCE, 'T b'), | |
176 ]; | |
177 await _verifyReferences(element, expected); | |
178 } | |
179 | |
148 ExpectedResult _expectId( | 180 ExpectedResult _expectId( |
149 List<String> enclosingComponents, SearchResultKind kind, String search, | 181 List<String> enclosingComponents, SearchResultKind kind, String search, |
150 {int length, bool isResolved: true, bool isQualified: false}) { | 182 {int length, bool isResolved: true, bool isQualified: false}) { |
151 int offset = findOffset(search); | 183 int offset = findOffset(search); |
152 if (length == null) { | 184 if (length == null) { |
153 length = getLeadingIdentifierLength(search); | 185 length = getLeadingIdentifierLength(search); |
154 } | 186 } |
155 return new ExpectedResult(enclosingComponents, kind, offset, length, | 187 return new ExpectedResult(enclosingComponents, kind, offset, length, |
156 isResolved: isResolved, isQualified: isQualified); | 188 isResolved: isResolved, isQualified: isQualified); |
157 } | 189 } |
158 | 190 |
191 Future<Element> _findElement(String name) async { | |
192 AnalysisResult result = await driver.getResult(testFile); | |
193 return findChildElement(result.unit.element, name); | |
194 } | |
195 | |
159 Future<Element> _findElementAtString(String search) async { | 196 Future<Element> _findElementAtString(String search) async { |
160 AnalysisResult result = await driver.getResult(testFile); | 197 AnalysisResult result = await driver.getResult(testFile); |
161 int offset = findOffset(search); | 198 int offset = findOffset(search); |
162 AstNode node = new NodeLocator(offset).searchWithin(result.unit); | 199 AstNode node = new NodeLocator(offset).searchWithin(result.unit); |
163 return ElementLocator.locate(node); | 200 return ElementLocator.locate(node); |
164 } | 201 } |
165 | 202 |
166 Future _verifyReferences( | 203 Future _verifyReferences( |
167 Element element, List<ExpectedResult> expectedMatches) async { | 204 Element element, List<ExpectedResult> expectedMatches) async { |
168 List<SearchResult> results = await driver.search.references(element); | 205 List<SearchResult> results = await driver.search.references(element); |
169 _assertResults(results, expectedMatches); | 206 _assertResults(results, expectedMatches); |
170 expect(results, hasLength(expectedMatches.length)); | 207 expect(results, hasLength(expectedMatches.length)); |
171 } | 208 } |
172 | 209 |
173 static void _assertResults( | 210 static void _assertResults( |
174 List<SearchResult> matches, List<ExpectedResult> expectedMatches) { | 211 List<SearchResult> matches, List<ExpectedResult> expectedMatches) { |
175 expect(matches, unorderedEquals(expectedMatches)); | 212 expect(matches, unorderedEquals(expectedMatches)); |
176 } | 213 } |
177 } | 214 } |
OLD | NEW |