Add AnalysisSessionHelper.getTopLevelPropertyAccessor().
R=paulberry@google.com
Change-Id: I37c172ff087e1f4a6a859abb1304d18aedd34dfe
Reviewed-on: https://dart-review.googlesource.com/53686
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/analysis/session_helper.dart b/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
index 1644e8f..758fe29 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
@@ -29,4 +29,18 @@
return null;
}
}
+
+ /// Return the [PropertyAccessorElement] with the given [name] that is
+ /// exported from the library with the given [uri], or `null` if the
+ /// library does not export a top-level accessor with such name.
+ Future<PropertyAccessorElement> getTopLevelPropertyAccessor(
+ String uri, String name) async {
+ var libraryElement = await session.getLibraryByUri(uri);
+ var element = libraryElement.exportNamespace.get(name);
+ if (element is PropertyAccessorElement) {
+ return element;
+ } else {
+ return null;
+ }
+ }
}
diff --git a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
index 47c5338..81e7cbb 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
@@ -2,6 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/analysis/session_helper.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -79,6 +80,99 @@
expect(element, isNull);
}
+ test_getTopLevelPropertyAccessor_defined_getter() async {
+ var path = _p('/test.dart');
+ var file = provider.newFile(path, r'''
+int get a => 0;
+''');
+ String uri = file.toUri().toString();
+
+ var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a');
+ expect(element, isNotNull);
+ expect(element.kind, ElementKind.GETTER);
+ expect(element.displayName, 'a');
+ }
+
+ test_getTopLevelPropertyAccessor_defined_setter() async {
+ var path = _p('/test.dart');
+ var file = provider.newFile(path, r'''
+set a(_) {}
+''');
+ String uri = file.toUri().toString();
+
+ var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a=');
+ expect(element, isNotNull);
+ expect(element.kind, ElementKind.SETTER);
+ expect(element.displayName, 'a');
+ }
+
+ test_getTopLevelPropertyAccessor_defined_variable() async {
+ var path = _p('/test.dart');
+ var file = provider.newFile(path, r'''
+int a;
+''');
+ String uri = file.toUri().toString();
+
+ var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a');
+ expect(element, isNotNull);
+ expect(element.kind, ElementKind.GETTER);
+ expect(element.displayName, 'a');
+ }
+
+ test_getTopLevelPropertyAccessor_exported() async {
+ var a = _p('/a.dart');
+ var b = _p('/b.dart');
+ provider.newFile(a, r'''
+int a;
+''');
+ var bFile = provider.newFile(b, r'''
+export 'a.dart';
+''');
+ String bUri = bFile.toUri().toString();
+
+ var element = await sessionHelper.getTopLevelPropertyAccessor(bUri, 'a');
+ expect(element, isNotNull);
+ expect(element.kind, ElementKind.GETTER);
+ expect(element.displayName, 'a');
+ }
+
+ test_getTopLevelPropertyAccessor_imported() async {
+ var a = _p('/a.dart');
+ var b = _p('/b.dart');
+ provider.newFile(a, r'''
+int a;
+''');
+ var bFile = provider.newFile(b, r'''
+import 'a.dart';
+''');
+ String bUri = bFile.toUri().toString();
+
+ var element = await sessionHelper.getTopLevelPropertyAccessor(bUri, 'a');
+ expect(element, isNull);
+ }
+
+ test_getTopLevelPropertyAccessor_notDefined() async {
+ var path = _p('/test.dart');
+ var file = provider.newFile(path, r'''
+int a;
+''');
+ String uri = file.toUri().toString();
+
+ var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'b');
+ expect(element, isNull);
+ }
+
+ test_getTopLevelPropertyAccessor_notPropertyAccessor() async {
+ var path = _p('/test.dart');
+ var file = provider.newFile(path, r'''
+int a() {}
+''');
+ String uri = file.toUri().toString();
+
+ var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a');
+ expect(element, isNull);
+ }
+
/// Return the [provider] specific path for the given Posix [path].
String _p(String path) => provider.convertPath(path);
}