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);
 }