Skip to content

Commit 0346acf

Browse files
committed
Don't suggest generative constructors of abstract classes.
So, we don't suggest EdgeInsetsGeometry for 'padding: ', even though it is the type of the parameters. But we still suggest its subclasses EdgeInsets and EdgeInsetsDirectional. [email protected], [email protected] Bug: flutter/flutter-intellij#998 Change-Id: If2d7ba550ec76e4f66cb81e1346466b5f1a30464 Reviewed-on: https://dart-review.googlesource.com/42888 Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 5c4140a commit 0346acf

File tree

4 files changed

+104
-31
lines changed

4 files changed

+104
-31
lines changed

pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ class _Visitor extends LocalDeclarationVisitor {
106106
void _addSuggestion(
107107
ClassDeclaration classDecl, ConstructorDeclaration constructorDecl) {
108108
String completion = classDecl.name.name;
109-
SimpleIdentifier elemId;
110109

111110
ClassElement classElement =
112111
resolutionMap.elementDeclaredByClassDeclaration(classDecl);
@@ -116,29 +115,30 @@ class _Visitor extends LocalDeclarationVisitor {
116115
return;
117116
}
118117

119-
// Build a suggestion for explicitly declared constructor
120118
if (constructorDecl != null) {
121-
elemId = constructorDecl.name;
122-
ConstructorElement elem = constructorDecl.element;
123-
if (elemId != null) {
124-
String name = elemId.name;
125-
if (name != null && name.length > 0) {
126-
completion = '$completion.$name';
127-
}
119+
// Build a suggestion for explicitly declared constructor
120+
ConstructorElement element = constructorDecl.element;
121+
if (element == null) {
122+
return;
128123
}
129-
if (elem != null) {
130-
CompletionSuggestion suggestion = createSuggestion(elem,
131-
completion: completion, relevance: relevance);
132-
if (suggestion != null) {
133-
suggestions.add(suggestion);
134-
}
124+
if (classElement.isAbstract && !element.isFactory) {
125+
return;
126+
}
127+
128+
String name = constructorDecl.name?.name;
129+
if (name != null && name.length > 0) {
130+
completion = '$completion.$name';
135131
}
136-
}
137132

138-
// Build a suggestion for an implicit constructor
139-
else {
133+
CompletionSuggestion suggestion = createSuggestion(element,
134+
completion: completion, relevance: relevance);
135+
if (suggestion != null) {
136+
suggestions.add(suggestion);
137+
}
138+
} else if (!classElement.isAbstract) {
139+
// Build a suggestion for an implicit constructor
140140
protocol.Element element = createLocalElement(
141-
request.source, protocol.ElementKind.CONSTRUCTOR, elemId,
141+
request.source, protocol.ElementKind.CONSTRUCTOR, null,
142142
parameters: '()');
143143
element.returnType = classDecl.name.name;
144144
CompletionSuggestion suggestion = new CompletionSuggestion(

pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -147,19 +147,24 @@ class LibraryElementSuggestionBuilder extends GeneralizingElementVisitor
147147
void _addConstructorSuggestions(ClassElement classElem, int relevance) {
148148
String className = classElem.name;
149149
for (ConstructorElement constructor in classElem.constructors) {
150-
if (!constructor.isPrivate) {
151-
CompletionSuggestion suggestion =
152-
createSuggestion(constructor, relevance: relevance);
153-
if (suggestion != null) {
154-
String name = suggestion.completion;
155-
name = name.length > 0 ? '$className.$name' : className;
156-
if (prefix != null && prefix.length > 0) {
157-
name = '$prefix.$name';
158-
}
159-
suggestion.completion = name;
160-
suggestion.selectionOffset = suggestion.completion.length;
161-
suggestions.add(suggestion);
150+
if (constructor.isPrivate) {
151+
continue;
152+
}
153+
if (classElem.isAbstract && !constructor.isFactory) {
154+
continue;
155+
}
156+
157+
CompletionSuggestion suggestion =
158+
createSuggestion(constructor, relevance: relevance);
159+
if (suggestion != null) {
160+
String name = suggestion.completion;
161+
name = name.length > 0 ? '$className.$name' : className;
162+
if (prefix != null && prefix.length > 0) {
163+
name = '$prefix.$name';
162164
}
165+
suggestion.completion = name;
166+
suggestion.selectionOffset = suggestion.completion.length;
167+
suggestions.add(suggestion);
163168
}
164169
}
165170
}

pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2486,6 +2486,44 @@ main() {new ^ String x = "hello";}''');
24862486
assertNotSuggested('math');
24872487
}
24882488

2489+
test_InstanceCreationExpression_abstractClass() async {
2490+
addSource('/a.dart', '''
2491+
abstract class A {
2492+
A();
2493+
A.generative();
2494+
factory A.factory() => null;
2495+
}
2496+
''');
2497+
addTestSource('''
2498+
import 'a.dart';
2499+
2500+
main() {
2501+
new ^;
2502+
}
2503+
''');
2504+
await computeSuggestions();
2505+
2506+
assertNotSuggested('A');
2507+
assertNotSuggested('A.generative');
2508+
assertSuggestConstructor('A.factory');
2509+
}
2510+
2511+
test_InstanceCreationExpression_abstractClass_implicitConstructor() async {
2512+
addSource('/a.dart', '''
2513+
abstract class A {}
2514+
''');
2515+
addTestSource('''
2516+
import 'a.dart';
2517+
2518+
main() {
2519+
new ^;
2520+
}
2521+
''');
2522+
await computeSuggestions();
2523+
2524+
assertNotSuggested('A');
2525+
}
2526+
24892527
test_InstanceCreationExpression_imported() async {
24902528
// SimpleIdentifier TypeName ConstructorName InstanceCreationExpression
24912529
addSource('/testA.dart', '''

pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2289,6 +2289,36 @@ main() {new ^ String x = "hello";}''');
22892289
expect(suggestion.hasNamedParameters, true);
22902290
}
22912291

2292+
test_InstanceCreationExpression_abstractClass() async {
2293+
addTestSource('''
2294+
abstract class A {
2295+
A();
2296+
A.generative();
2297+
factory A.factory() => null;
2298+
}
2299+
2300+
main() {
2301+
new ^;
2302+
}''');
2303+
await computeSuggestions();
2304+
2305+
assertNotSuggested('A');
2306+
assertNotSuggested('A.generative');
2307+
assertSuggestConstructor('A.factory');
2308+
}
2309+
2310+
test_InstanceCreationExpression_abstractClass_implicitConstructor() async {
2311+
addTestSource('''
2312+
abstract class A {}
2313+
2314+
main() {
2315+
new ^;
2316+
}''');
2317+
await computeSuggestions();
2318+
2319+
assertNotSuggested('A');
2320+
}
2321+
22922322
test_InstanceCreationExpression_assignment_expression_filter() async {
22932323
addTestSource('''
22942324
class A {} class B extends A {} class C implements A {} class D {}

0 commit comments

Comments
 (0)