diff --git a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart index c836fb5d853d5..d7f8154e18997 100644 --- a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart +++ b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart @@ -19,48 +19,58 @@ class StaticMemberContributor extends DartCompletionContributor { @override Future> computeSuggestions( DartCompletionRequest request, SuggestionBuilder builder) async { - if (request.libraryElement == null) { + var library = request.libraryElement; + if (library == null) { // Gracefully degrade if the library could not be determined, such as a // detached part file or source change. // TODO(brianwilkerson) Consider testing for this before invoking _any_ of // the contributors. return const []; } + bool isVisible(Element element) => element.isAccessibleIn(library); var targetId = request.dotTarget; if (targetId is Identifier && !request.target.isCascade) { var element = targetId.staticElement; if (element is ClassElement) { for (var accessor in element.accessors) { - if (accessor.isStatic) { + if (accessor.isStatic && + !accessor.isSynthetic && + isVisible(accessor)) { builder.suggestAccessor(accessor, inheritanceDistance: -1.0); } } for (var constructor in element.constructors) { - builder.suggestConstructor(constructor, hasClassName: true); + if (isVisible(constructor)) { + builder.suggestConstructor(constructor, hasClassName: true); + } } for (var field in element.fields) { - if (field.isStatic && (!field.isSynthetic || element.isEnum)) { + if (field.isStatic && + (!field.isSynthetic || element.isEnum) && + isVisible(field)) { builder.suggestField(field, inheritanceDistance: -1.0); } } for (var method in element.methods) { - if (method.isStatic) { + if (method.isStatic && isVisible(method)) { builder.suggestMethod(method, inheritanceDistance: -1.0); } } } else if (element is ExtensionElement) { for (var accessor in element.accessors) { - if (accessor.isStatic) { + if (accessor.isStatic && + !accessor.isSynthetic && + isVisible(accessor)) { builder.suggestAccessor(accessor, inheritanceDistance: -1.0); } } for (var field in element.fields) { - if (field.isStatic) { + if (field.isStatic && !field.isSynthetic && isVisible(field)) { builder.suggestField(field, inheritanceDistance: -1.0); } } for (var method in element.methods) { - if (method.isStatic) { + if (method.isStatic && isVisible(method)) { builder.suggestMethod(method, inheritanceDistance: -1.0); } } diff --git a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart index ba32930a36131..0ee70bf15f526 100644 --- a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart +++ b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart @@ -22,6 +22,30 @@ class StaticMemberContributorTest extends DartCompletionContributorTest { return StaticMemberContributor(); } + Future test_class_static_notPrivate() async { + addSource('/home/test/lib/a.dart', ''' +class A { + static int _f; + static String get _g => ''; + static int _m() {} + static set _s(v) {} + A._(); +} +'''); + addTestSource(''' +import 'a.dart'; +void f() { + A.^; +} +'''); + await computeSuggestions(); + assertNotSuggested('_f'); + assertNotSuggested('_g'); + assertNotSuggested('_m'); + assertNotSuggested('_s'); + assertNotSuggested('A._'); + } + Future test_enumConst() async { addTestSource('enum E { one, two } main() {E.^}'); await computeSuggestions(); @@ -108,6 +132,28 @@ main() {E.^} assertSuggestField('s', 'String'); } + Future test_extension_static_notPrivate() async { + addSource('/home/test/lib/a.dart', ''' +extension E { + static int _f; + static String get _g => ''; + static int _m() {} + static set _s(v) {} +} +'''); + addTestSource(''' +import 'a.dart'; +void f() { + E.^; +} +'''); + await computeSuggestions(); + assertNotSuggested('_f'); + assertNotSuggested('_g'); + assertNotSuggested('_m'); + assertNotSuggested('_s'); + } + Future test_implicitCreation() async { addSource('/home/test/lib/a.dart', ''' class A {