Skip to content

Commit dfa661d

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Add AnalysisSessionHelper.getTopLevelPropertyAccessor().
[email protected] Change-Id: I37c172ff087e1f4a6a859abb1304d18aedd34dfe Reviewed-on: https://dart-review.googlesource.com/53686 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 58f41fd commit dfa661d

File tree

2 files changed

+108
-0
lines changed

2 files changed

+108
-0
lines changed

pkg/analyzer/lib/src/dart/analysis/session_helper.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,18 @@ class AnalysisSessionHelper {
2929
return null;
3030
}
3131
}
32+
33+
/// Return the [PropertyAccessorElement] with the given [name] that is
34+
/// exported from the library with the given [uri], or `null` if the
35+
/// library does not export a top-level accessor with such name.
36+
Future<PropertyAccessorElement> getTopLevelPropertyAccessor(
37+
String uri, String name) async {
38+
var libraryElement = await session.getLibraryByUri(uri);
39+
var element = libraryElement.exportNamespace.get(name);
40+
if (element is PropertyAccessorElement) {
41+
return element;
42+
} else {
43+
return null;
44+
}
45+
}
3246
}

pkg/analyzer/test/src/dart/analysis/session_helper_test.dart

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:analyzer/dart/element/element.dart';
56
import 'package:analyzer/src/dart/analysis/session_helper.dart';
67
import 'package:test/test.dart';
78
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -79,6 +80,99 @@ import 'a.dart';
7980
expect(element, isNull);
8081
}
8182

83+
test_getTopLevelPropertyAccessor_defined_getter() async {
84+
var path = _p('/test.dart');
85+
var file = provider.newFile(path, r'''
86+
int get a => 0;
87+
''');
88+
String uri = file.toUri().toString();
89+
90+
var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a');
91+
expect(element, isNotNull);
92+
expect(element.kind, ElementKind.GETTER);
93+
expect(element.displayName, 'a');
94+
}
95+
96+
test_getTopLevelPropertyAccessor_defined_setter() async {
97+
var path = _p('/test.dart');
98+
var file = provider.newFile(path, r'''
99+
set a(_) {}
100+
''');
101+
String uri = file.toUri().toString();
102+
103+
var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a=');
104+
expect(element, isNotNull);
105+
expect(element.kind, ElementKind.SETTER);
106+
expect(element.displayName, 'a');
107+
}
108+
109+
test_getTopLevelPropertyAccessor_defined_variable() async {
110+
var path = _p('/test.dart');
111+
var file = provider.newFile(path, r'''
112+
int a;
113+
''');
114+
String uri = file.toUri().toString();
115+
116+
var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a');
117+
expect(element, isNotNull);
118+
expect(element.kind, ElementKind.GETTER);
119+
expect(element.displayName, 'a');
120+
}
121+
122+
test_getTopLevelPropertyAccessor_exported() async {
123+
var a = _p('/a.dart');
124+
var b = _p('/b.dart');
125+
provider.newFile(a, r'''
126+
int a;
127+
''');
128+
var bFile = provider.newFile(b, r'''
129+
export 'a.dart';
130+
''');
131+
String bUri = bFile.toUri().toString();
132+
133+
var element = await sessionHelper.getTopLevelPropertyAccessor(bUri, 'a');
134+
expect(element, isNotNull);
135+
expect(element.kind, ElementKind.GETTER);
136+
expect(element.displayName, 'a');
137+
}
138+
139+
test_getTopLevelPropertyAccessor_imported() async {
140+
var a = _p('/a.dart');
141+
var b = _p('/b.dart');
142+
provider.newFile(a, r'''
143+
int a;
144+
''');
145+
var bFile = provider.newFile(b, r'''
146+
import 'a.dart';
147+
''');
148+
String bUri = bFile.toUri().toString();
149+
150+
var element = await sessionHelper.getTopLevelPropertyAccessor(bUri, 'a');
151+
expect(element, isNull);
152+
}
153+
154+
test_getTopLevelPropertyAccessor_notDefined() async {
155+
var path = _p('/test.dart');
156+
var file = provider.newFile(path, r'''
157+
int a;
158+
''');
159+
String uri = file.toUri().toString();
160+
161+
var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'b');
162+
expect(element, isNull);
163+
}
164+
165+
test_getTopLevelPropertyAccessor_notPropertyAccessor() async {
166+
var path = _p('/test.dart');
167+
var file = provider.newFile(path, r'''
168+
int a() {}
169+
''');
170+
String uri = file.toUri().toString();
171+
172+
var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a');
173+
expect(element, isNull);
174+
}
175+
82176
/// Return the [provider] specific path for the given Posix [path].
83177
String _p(String path) => provider.convertPath(path);
84178
}

0 commit comments

Comments
 (0)