diff --git a/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart b/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart index 710ecfe0669..f5a9e16f725 100644 --- a/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart +++ b/pkg/analysis_server/lib/src/services/completion/dart/in_scope_completion_pass.dart @@ -772,8 +772,11 @@ class InScopeCompletionPass extends SimpleAstVisitor { @override void visitConstructorDeclaration(ConstructorDeclaration node) { - // TODO(scheglov): support primary constructors - if (offset <= node.typeName!.end) { + if (offset <= + (node.typeName?.end ?? + node.newKeyword?.end ?? + node.factoryKeyword?.end ?? + node.beginToken.offset)) { collector.completionLocation = 'ClassDeclaration_member'; var parent = node.parent?.parent; if (parent != null) { diff --git a/pkg/analysis_server/test/services/completion/dart/location/constructor_declaration_test.dart b/pkg/analysis_server/test/services/completion/dart/location/constructor_declaration_test.dart index 0f031ecc4cd..e3f20e5f6ec 100644 --- a/pkg/analysis_server/test/services/completion/dart/location/constructor_declaration_test.dart +++ b/pkg/analysis_server/test/services/completion/dart/location/constructor_declaration_test.dart @@ -17,6 +17,136 @@ class ConstructorDeclarationTest extends AbstractCompletionDriverTest with ConstructorDeclarationTestCases {} mixin ConstructorDeclarationTestCases on AbstractCompletionDriverTest { + Future test_beforeFactory() async { + await computeSuggestions(''' +class C { + ^factory (); +} +'''); + assertResponse(r''' +replacement + right: 7 +suggestions + @override + // TODO: implement hashCode + int get hashCode => [!super.hashCode!]; + kind: override + @override + // TODO: implement runtimeType + Type get runtimeType => [!super.runtimeType!]; + kind: override + @override + String toString() { + // TODO: implement toString + [!return super.toString();!] + } + kind: override + @override + bool operator ==(Object other) { + // TODO: implement == + [!return super == other;!] + } + kind: override + @override + noSuchMethod(Invocation invocation) { + // TODO: implement noSuchMethod + [!return super.noSuchMethod(invocation);!] + } + kind: override + final + kind: keyword + static + kind: keyword + void + kind: keyword + const + kind: keyword + set + kind: keyword + factory + kind: keyword + covariant + kind: keyword + dynamic + kind: keyword + get + kind: keyword + late + kind: keyword + new + kind: keyword + operator + kind: keyword + var + kind: keyword +'''); + } + + Future test_beforeNew() async { + await computeSuggestions(''' +class C { + ^new (); +} +'''); + assertResponse(r''' +replacement + right: 3 +suggestions + @override + // TODO: implement hashCode + int get hashCode => [!super.hashCode!]; + kind: override + @override + // TODO: implement runtimeType + Type get runtimeType => [!super.runtimeType!]; + kind: override + @override + String toString() { + // TODO: implement toString + [!return super.toString();!] + } + kind: override + @override + bool operator ==(Object other) { + // TODO: implement == + [!return super == other;!] + } + kind: override + @override + noSuchMethod(Invocation invocation) { + // TODO: implement noSuchMethod + [!return super.noSuchMethod(invocation);!] + } + kind: override + final + kind: keyword + static + kind: keyword + void + kind: keyword + const + kind: keyword + set + kind: keyword + factory + kind: keyword + covariant + kind: keyword + dynamic + kind: keyword + get + kind: keyword + late + kind: keyword + new + kind: keyword + operator + kind: keyword + var + kind: keyword +'''); + } + Future test_factory_noInstanceValues() async { await computeSuggestions(''' class A {