| // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| // 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:analysis_server/src/provisional/completion/dart/completion_dart.dart'; |
| import 'package:analysis_server/src/services/completion/dart/arglist_contributor.dart'; |
| import 'package:analysis_server/src/services/completion/dart/completion_manager.dart'; |
| import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart'; |
| import 'package:analyzer_utilities/check/check.dart'; |
| import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| |
| import 'completion_check.dart'; |
| import 'completion_contributor_util.dart'; |
| |
| void main() { |
| defineReflectiveSuite(() { |
| defineReflectiveTests(ArgListContributorTest); |
| }); |
| } |
| |
| mixin ArgListContributorMixin on DartCompletionContributorTest { |
| @override |
| DartCompletionContributor createContributor( |
| DartCompletionRequest request, |
| SuggestionBuilder builder, |
| ) { |
| return ArgListContributor(request, builder); |
| } |
| } |
| |
| @reflectiveTest |
| class ArgListContributorTest extends DartCompletionContributorTest |
| with ArgListContributorMixin { |
| Future<void> test_fieldFormal_documentation() async { |
| var content = ''' |
| class A { |
| /// aaa |
| /// |
| /// bbb |
| /// ccc |
| int fff; |
| A({this.fff}); |
| } |
| void f() { |
| new A(^); |
| } |
| '''; |
| addTestSource(content); |
| |
| var response = await computeSuggestions2(); |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('fff: ') |
| ..docComplete.isEqualTo('aaa\n\nbbb\nccc') |
| ..docSummary.isEqualTo('aaa') |
| ..hasSelection(offset: 5) |
| ..element.isNotNull.which((e) => e |
| ..kind.isParameter |
| ..name.isEqualTo('fff')) |
| ]); |
| } |
| |
| Future<void> test_fieldFormal_noDocumentation() async { |
| addTestSource(''' |
| class A { |
| int fff; |
| A({this.fff}); |
| } |
| void f() { |
| new A(^); |
| } |
| '''); |
| |
| var response = await computeSuggestions2(); |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('fff: ') |
| ..docComplete.isNull |
| ..docSummary.isNull |
| ..hasSelection(offset: 5) |
| ..element.isNotNull.which((e) => e |
| ..kind.isParameter |
| ..name.isEqualTo('fff')) |
| ]); |
| } |
| |
| Future<void> test_flutter_InstanceCreationExpression_0() async { |
| writeTestPackageConfig(flutter: true); |
| |
| addTestSource(''' |
| import 'package:flutter/widgets.dart'; |
| |
| build() => new Row( |
| ^ |
| ); |
| '''); |
| |
| var response = await computeSuggestions2(); |
| _checkNamedArguments(response).containsMatch((suggestion) { |
| suggestion |
| ..completion.isEqualTo('children: [],') |
| ..defaultArgumentListString.isNull |
| ..hasSelection(offset: 11); |
| }); |
| } |
| |
| Future<void> test_flutter_InstanceCreationExpression_01() async { |
| writeTestPackageConfig(flutter: true); |
| |
| addTestSource(''' |
| import 'package:flutter/material.dart'; |
| |
| build() => new Scaffold( |
| appBar: new AppBar( |
| ^ |
| ), |
| ); |
| '''); |
| |
| var response = await computeSuggestions2(); |
| _checkNamedArguments(response).containsMatch((suggestion) { |
| suggestion |
| ..completion.isEqualTo('backgroundColor: ,') |
| ..defaultArgumentListString.isNull |
| ..hasSelection(offset: 17); |
| }); |
| } |
| |
| Future<void> test_flutter_InstanceCreationExpression_1() async { |
| writeTestPackageConfig(flutter: true); |
| |
| addTestSource(''' |
| import 'package:flutter/material.dart'; |
| |
| build() => new Row( |
| key: null, |
| ^ |
| ); |
| '''); |
| |
| var response = await computeSuggestions2(); |
| _checkNamedArguments(response).containsMatch((suggestion) { |
| suggestion |
| ..completion.isEqualTo('children: [],') |
| ..defaultArgumentListString.isNull |
| ..hasSelection(offset: 11); |
| }); |
| } |
| |
| Future<void> test_flutter_InstanceCreationExpression_2() async { |
| writeTestPackageConfig(flutter: true); |
| |
| addTestSource(''' |
| import 'package:flutter/material.dart'; |
| |
| build() => new Row( |
| ^ |
| key: null, |
| ); |
| '''); |
| |
| var response = await computeSuggestions2(); |
| _checkNamedArguments(response).containsMatch((suggestion) { |
| suggestion |
| ..completion.isEqualTo('children: [],') |
| ..defaultArgumentListString.isNull |
| ..hasSelection(offset: 11); |
| }); |
| } |
| |
| Future<void> test_flutter_InstanceCreationExpression_3() async { |
| // Ensure a trailing comma is not added when only replacing the name. |
| writeTestPackageConfig(flutter: true); |
| |
| addTestSource(''' |
| import 'package:flutter/material.dart'; |
| |
| build() => new Row( |
| ke^: null, |
| ); |
| '''); |
| |
| var response = await computeSuggestions2(); |
| _checkNamedArguments(response).containsMatch((suggestion) { |
| suggestion |
| ..completion.isEqualTo('key') |
| ..defaultArgumentListString.isNull |
| ..hasSelection(offset: 3); |
| }); |
| } |
| |
| Future<void> |
| test_flutter_InstanceCreationExpression_children_dynamic() async { |
| // Ensure we don't generate unneeded <dynamic> param if a future API doesn't |
| // type it's children. |
| writeTestPackageConfig(flutter: true); |
| |
| addTestSource(''' |
| import 'package:flutter/material.dart'; |
| |
| build() => new Container( |
| child: new DynamicRow(^); |
| ); |
| |
| class DynamicRow extends Widget { |
| DynamicRow({List children: null}); |
| } |
| '''); |
| |
| var response = await computeSuggestions2(); |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('children: [],') |
| ..defaultArgumentListString.isNull |
| ..hasSelection(offset: 11), |
| ]); |
| } |
| |
| Future<void> |
| test_flutter_InstanceCreationExpression_children_existingValue() async { |
| // Ensure we don't include list markers if there's already a value. |
| writeTestPackageConfig(flutter: true); |
| |
| addTestSource(''' |
| import 'package:flutter/material.dart'; |
| |
| build() => new Row( |
| ch^: [] |
| ); |
| '''); |
| |
| var response = await computeSuggestions2(); |
| _checkNamedArguments(response).containsMatch( |
| (suggestion) => suggestion |
| ..completion.isEqualTo('children') |
| ..defaultArgumentListString.isNull |
| ..hasSelection(offset: 8), |
| ); |
| } |
| |
| Future<void> test_flutter_InstanceCreationExpression_children_Map() async { |
| // Ensure we don't generate Map params for a future API |
| writeTestPackageConfig(flutter: true); |
| |
| addTestSource(''' |
| import 'package:flutter/material.dart'; |
| |
| build() => new Container( |
| child: new MapRow(^); |
| ); |
| |
| class MapRow extends Widget { |
| MapRow({Map<Object, Object> children: null}); |
| } |
| '''); |
| |
| var response = await computeSuggestions2(); |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('children: ,') |
| ..defaultArgumentListString.isNull |
| ..hasSelection(offset: 10), |
| ]); |
| } |
| |
| Future<void> test_flutter_InstanceCreationExpression_slivers() async { |
| writeTestPackageConfig(flutter: true); |
| |
| addTestSource(''' |
| import 'package:flutter/material.dart'; |
| |
| build() => new CustomScrollView( |
| ^ |
| ); |
| |
| class CustomScrollView extends Widget { |
| CustomScrollView({List<Widget> slivers}); |
| } |
| '''); |
| |
| var response = await computeSuggestions2(); |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('slivers: [],') |
| ..defaultArgumentListString.isNull |
| ..hasSelection(offset: 10), |
| ]); |
| } |
| |
| Future<void> test_flutter_MethodExpression_children() async { |
| // Ensure we don't generate params for a method call |
| // TODO(brianwilkerson) This test has been changed so that it no longer has |
| // anything to do with Flutter (by moving the declaration of `foo` out of |
| // the 'material' library). Determine whether the test is still valid. |
| writeTestPackageConfig(flutter: true); |
| |
| addTestSource(''' |
| import 'package:flutter/material.dart'; |
| |
| void f() { |
| foo(^); |
| } |
| |
| foo({String children}) {} |
| '''); |
| |
| var response = await computeSuggestions2(); |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('children: ') |
| ..defaultArgumentListString.isNull |
| ..defaultArgumentListTextRanges.isNull, |
| ]); |
| } |
| |
| Future<void> test_named_01() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(^)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('one: ') |
| ..parameterType.isEqualTo('bool') |
| ..hasEmptyReplacement() |
| ..hasSelection(offset: 5), |
| (suggestion) => suggestion |
| ..completion.isEqualTo('two: ') |
| ..parameterType.isEqualTo('int') |
| ..hasEmptyReplacement() |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_02() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(o^)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('one: ') |
| ..parameterType.isEqualTo('bool') |
| ..hasReplacement(left: 1) |
| ..hasSelection(offset: 5), |
| (suggestion) => suggestion |
| ..completion.isEqualTo('two: ') |
| ..parameterType.isEqualTo('int') |
| ..hasReplacement(left: 1) |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_03() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(o^ two: 2)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('one: ,') |
| ..parameterType.isEqualTo('bool') |
| ..hasReplacement(left: 1) |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_04() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(o^, two: 2)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('one: ') |
| ..parameterType.isEqualTo('bool') |
| ..hasReplacement(left: 1) |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_05() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(o^ , two: 2)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('one: ') |
| ..parameterType.isEqualTo('bool') |
| ..hasReplacement(left: 1) |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_06() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(^o,)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('one: ') |
| ..parameterType.isEqualTo('bool') |
| ..hasEmptyReplacement() |
| ..hasSelection(offset: 5), |
| (suggestion) => suggestion |
| ..completion.isEqualTo('two: ') |
| ..parameterType.isEqualTo('int') |
| ..hasEmptyReplacement() |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_07() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(^ two: 2)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('one: ,') |
| ..parameterType.isEqualTo('bool') |
| ..hasEmptyReplacement() |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_08() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(^two: 2)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('one: ,') |
| ..parameterType.isEqualTo('bool') |
| ..hasReplacement(right: 3) |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_09() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(^, two: 2)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('one: ') |
| ..parameterType.isEqualTo('bool') |
| ..hasEmptyReplacement() |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_10() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(^ , two: 2)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('one: ') |
| ..parameterType.isEqualTo('bool') |
| ..hasEmptyReplacement() |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_11() async { |
| await _tryParametersArguments( |
| parameters: '(int one, {bool two, int three})', |
| arguments: '(1, ^, three: 3)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('two: ') |
| ..parameterType.isEqualTo('bool') |
| ..hasEmptyReplacement() |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_12() async { |
| await _tryParametersArguments( |
| parameters: '(int one, {bool two, int three})', |
| arguments: '(1, ^ three: 3)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('two: ,') |
| ..parameterType.isEqualTo('bool') |
| ..hasEmptyReplacement() |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_13() async { |
| await _tryParametersArguments( |
| parameters: '(int one, {bool two, int three})', |
| arguments: '(1, ^three: 3)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('two: ,') |
| ..parameterType.isEqualTo('bool') |
| ..hasReplacement(right: 5) |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| @failingTest |
| Future<void> test_named_14() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(two: 2^)', |
| check: (response) { |
| _checkNamedArguments(response).isEmpty; |
| }, |
| ); |
| } |
| |
| @failingTest |
| Future<void> test_named_15() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(two: 2 ^)', |
| check: (response) { |
| _checkNamedArguments(response).isEmpty; |
| }, |
| ); |
| } |
| |
| Future<void> test_named_16() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(two: 2, ^)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('one: ') |
| ..parameterType.isEqualTo('bool') |
| ..hasEmptyReplacement() |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_17() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(two: 2, o^)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('one: ') |
| ..parameterType.isEqualTo('bool') |
| ..hasReplacement(left: 1) |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_18() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(two: 2, o^,)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('one: ') |
| ..parameterType.isEqualTo('bool') |
| ..hasReplacement(left: 1) |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_19() async { |
| await _tryParametersArguments( |
| parameters: '(int one, int two, int three, {int four, int five})', |
| arguments: '(1, ^, 3)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('four: ') |
| ..parameterType.isEqualTo('int') |
| ..hasEmptyReplacement() |
| ..hasSelection(offset: 6), |
| (suggestion) => suggestion |
| ..completion.isEqualTo('five: ') |
| ..parameterType.isEqualTo('int') |
| ..hasEmptyReplacement() |
| ..hasSelection(offset: 6), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_20() async { |
| await _tryParametersArguments( |
| languageVersion: '2.15', |
| parameters: '(int one, int two, int three, {int four, int five})', |
| arguments: '(1, ^, 3)', |
| check: (response) { |
| _checkNamedArguments(response).isEmpty; |
| }, |
| ); |
| } |
| |
| Future<void> test_named_21() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(o^: false)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('one') |
| ..parameterType.isEqualTo('bool') |
| ..hasReplacement(left: 1) |
| ..hasSelection(offset: 3), |
| (suggestion) => suggestion |
| ..completion.isEqualTo('two') |
| ..parameterType.isEqualTo('int') |
| ..hasReplacement(left: 1) |
| ..hasSelection(offset: 3), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_22() async { |
| await _tryParametersArguments( |
| parameters: '(bool one, {int two, double three})', |
| arguments: '(false, ^t: 2)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('two: ,') |
| ..parameterType.isEqualTo('int') |
| ..hasReplacement(right: 1) |
| ..hasSelection(offset: 5), |
| (suggestion) => suggestion |
| ..completion.isEqualTo('three: ,') |
| ..parameterType.isEqualTo('double') |
| ..hasReplacement(right: 1) |
| ..hasSelection(offset: 7), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_23() async { |
| await _tryParametersArguments( |
| parameters: '(bool one, {int two})', |
| arguments: '(false, foo^ba: 2)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('two') |
| ..parameterType.isEqualTo('int') |
| ..hasReplacement(left: 3, right: 2) |
| ..hasSelection(offset: 3), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_24() async { |
| await _tryParametersArguments( |
| parameters: '(bool one, {int two, double three})', |
| arguments: '(false, ^: 2)', |
| check: (response) { |
| _checkNamedArguments(response).matchesInAnyOrder([ |
| (suggestion) => suggestion |
| ..completion.isEqualTo('two') |
| ..parameterType.isEqualTo('int') |
| ..hasEmptyReplacement() |
| ..hasSelection(offset: 3), |
| (suggestion) => suggestion |
| ..completion.isEqualTo('three') |
| ..parameterType.isEqualTo('double') |
| ..hasEmptyReplacement() |
| ..hasSelection(offset: 5), |
| ]); |
| }, |
| ); |
| } |
| |
| Future<void> test_named_25() async { |
| await _tryParametersArguments( |
| parameters: '({bool one, int two})', |
| arguments: '(one: ^)', |
| check: (response) { |
| _checkNamedArguments(response).isEmpty; |
| }, |
| ); |
| } |
| |
| Future<void> _tryParametersArguments({ |
| String? languageVersion, |
| required String parameters, |
| required String arguments, |
| required void Function(CompletionResponseForTesting response) check, |
| }) async { |
| var languageVersionLine = languageVersion != null |
| ? '// @dart = $languageVersion' |
| : '// no language version override'; |
| |
| Future<void> computeAndCheck() async { |
| var response = await computeSuggestions2(); |
| check(response); |
| } |
| |
| // Annotation, local class. |
| addTestSource2(''' |
| $languageVersionLine |
| class A { |
| const A$parameters; |
| } |
| @A$arguments |
| void f() {} |
| '''); |
| await computeAndCheck(); |
| |
| // Annotation, imported class. |
| newFile('$testPackageLibPath/a.dart', ''' |
| class A { |
| const A$parameters; |
| } |
| '''); |
| addTestSource2(''' |
| $languageVersionLine |
| import 'a.dart'; |
| @A$arguments |
| void f() {} |
| '''); |
| await computeAndCheck(); |
| |
| // Annotation, imported class, prefixed. |
| newFile('$testPackageLibPath/a.dart', ''' |
| class A { |
| const A$parameters; |
| } |
| '''); |
| addTestSource2(''' |
| $languageVersionLine |
| import 'a.dart' as p; |
| @p.A$arguments |
| void f() {} |
| '''); |
| await computeAndCheck(); |
| |
| // Enum constant. |
| addTestSource2(''' |
| $languageVersionLine |
| enum E { |
| v$arguments; |
| const E$parameters; |
| } |
| '''); |
| await computeAndCheck(); |
| |
| // Function expression invocation. |
| addTestSource2(''' |
| $languageVersionLine |
| import 'a.dart'; |
| void f$parameters() {} |
| var v = (f)$arguments; |
| '''); |
| await computeAndCheck(); |
| |
| // Instance creation, local class, generative. |
| addTestSource2(''' |
| $languageVersionLine |
| class A { |
| A$parameters; |
| } |
| var v = A$arguments; |
| '''); |
| await computeAndCheck(); |
| |
| // Instance creation, imported class, generative. |
| newFile('$testPackageLibPath/a.dart', ''' |
| class A { |
| A$parameters; |
| } |
| '''); |
| addTestSource2(''' |
| $languageVersionLine |
| import 'a.dart'; |
| var v = A$arguments; |
| '''); |
| await computeAndCheck(); |
| |
| // Instance creation, imported class, factory. |
| newFile('$testPackageLibPath/a.dart', ''' |
| class A { |
| factory A$parameters => throw 0; |
| } |
| '''); |
| addTestSource2(''' |
| $languageVersionLine |
| import 'a.dart'; |
| var v = A$arguments; |
| '''); |
| await computeAndCheck(); |
| |
| // Method invocation, local method. |
| addTestSource2(''' |
| $languageVersionLine |
| class A { |
| void foo$parameters() {} |
| } |
| var v = A().foo$arguments; |
| '''); |
| await computeAndCheck(); |
| |
| // Method invocation, local function. |
| addTestSource2(''' |
| $languageVersionLine |
| void f$parameters() {} |
| var v = f$arguments; |
| '''); |
| await computeAndCheck(); |
| |
| // Method invocation, imported function. |
| newFile('$testPackageLibPath/a.dart', ''' |
| void f$parameters() {} |
| '''); |
| addTestSource2(''' |
| $languageVersionLine |
| import 'a.dart'; |
| var v = f$arguments; |
| '''); |
| await computeAndCheck(); |
| |
| // Super constructor invocation. |
| addTestSource2(''' |
| $languageVersionLine |
| class A { |
| A$parameters; |
| } |
| class B extends A { |
| B() : super$arguments; |
| } |
| '''); |
| await computeAndCheck(); |
| |
| // This constructor invocation. |
| addTestSource2(''' |
| $languageVersionLine |
| class A { |
| A$parameters; |
| A.named() : this$arguments; |
| } |
| '''); |
| await computeAndCheck(); |
| |
| // Invalid: getter invocation. |
| // Parameters not used. Check not used. |
| addTestSource2(''' |
| $languageVersionLine |
| int get foo => 0; |
| var v = foo$arguments; |
| '''); |
| await computeSuggestions(); |
| assertNoSuggestions(); |
| } |
| |
| static CheckTarget<Iterable<CompletionSuggestionForTesting>> |
| _checkNamedArguments(CompletionResponseForTesting response) { |
| return check(response).suggestions.namedArguments; |
| } |
| } |