Fix for named arguments for InstanceCreationExpression.

R=brianwilkerson@google.com, paulberry@google.com

Bug:
Change-Id: Ie9433fdd0f1ea2dfd65fa6bd1f44b9356d0a402e
Reviewed-on: https://dart-review.googlesource.com/28364
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
This commit is contained in:
Konstantin Shcheglov 2017-12-11 22:50:33 +00:00 committed by commit-bot@chromium.org
parent fbe4151da4
commit b8b9073e24
3 changed files with 91 additions and 41 deletions

View file

@ -327,8 +327,18 @@ class ResolutionApplier extends GeneralizingAstVisitor {
constructorName.name.staticElement = element;
}
node.argumentList?.accept(this);
_associateArgumentsWithParameters(element?.parameters, node.argumentList);
ArgumentList argumentList = node.argumentList;
_associateArgumentsWithParameters(element?.parameters, argumentList);
// Apply resolution to arguments.
// Skip names of named arguments.
for (var argument in argumentList.arguments) {
if (argument is NamedExpression) {
argument.expression.accept(this);
} else {
argument.accept(this);
}
}
}
@override

View file

@ -128,13 +128,6 @@ class NonErrorResolverTest_Kernel extends NonErrorResolverTest_Driver {
return super.test_commentReference_setter();
}
@override
@failingTest
@potentialAnalyzerProblem
test_const_constructor_with_named_generic_parameter() async {
return super.test_const_constructor_with_named_generic_parameter();
}
@override
@failingTest
@potentialAnalyzerProblem

View file

@ -1416,6 +1416,53 @@ var b = new C.named();
}
}
test_instanceCreation_namedArgument() async {
addTestFile(r'''
class X {
X(int a, {bool b, double c});
}
var v = new X(1, b: true, c: 3.0);
''');
AnalysisResult result = await driver.getResult(testFile);
CompilationUnit unit = result.unit;
ClassDeclaration xNode = unit.declarations[0];
ClassElement xElement = xNode.element;
ConstructorElement constructorElement = xElement.constructors[0];
TopLevelVariableDeclaration vDeclaration = unit.declarations[1];
VariableDeclaration vNode = vDeclaration.variables.variables[0];
InstanceCreationExpression creation = vNode.initializer;
List<Expression> arguments = creation.argumentList.arguments;
expect(creation.staticElement, constructorElement);
expect(creation.staticType, xElement.type);
TypeName typeName = creation.constructorName.type;
expect(typeName.typeArguments, isNull);
Identifier typeIdentifier = typeName.name;
expect(typeIdentifier.staticElement, xElement);
expect(typeIdentifier.staticType, xElement.type);
expect(creation.constructorName.name, isNull);
Expression aArgument = arguments[0];
ParameterElement aElement = constructorElement.parameters[0];
expect(aArgument.staticParameterElement, same(aElement));
NamedExpression bArgument = arguments[1];
ParameterElement bElement = constructorElement.parameters[1];
expect(bArgument.name.label.staticElement, same(bElement));
expect(bArgument.staticParameterElement, same(bElement));
NamedExpression cArgument = arguments[2];
ParameterElement cElement = constructorElement.parameters[2];
expect(cArgument.name.label.staticElement, same(cElement));
expect(cArgument.staticParameterElement, same(cElement));
}
test_instanceCreation_noTypeArguments() async {
String content = r'''
class C {
@ -2578,6 +2625,38 @@ class C<T> {
}
}
test_methodInvocation_namedArgument() async {
addTestFile(r'''
void main() {
foo(1, b: true, c: 3.0);
}
void foo(int a, {bool b, double c}) {}
''');
AnalysisResult result = await driver.getResult(testFile);
List<Statement> mainStatements = _getMainStatements(result);
FunctionDeclaration foo = result.unit.declarations[1];
ExecutableElement fooElement = foo.element;
ExpressionStatement statement = mainStatements[0];
MethodInvocation invocation = statement.expression;
List<Expression> arguments = invocation.argumentList.arguments;
Expression aArgument = arguments[0];
ParameterElement aElement = fooElement.parameters[0];
expect(aArgument.staticParameterElement, same(aElement));
NamedExpression bArgument = arguments[1];
ParameterElement bElement = fooElement.parameters[1];
expect(bArgument.name.label.staticElement, same(bElement));
expect(bArgument.staticParameterElement, same(bElement));
NamedExpression cArgument = arguments[2];
ParameterElement cElement = fooElement.parameters[2];
expect(cArgument.name.label.staticElement, same(cElement));
expect(cArgument.staticParameterElement, same(cElement));
}
test_methodInvocation_staticMethod() async {
addTestFile(r'''
main() {
@ -2796,38 +2875,6 @@ void f<T, U>(T a, U b) {}
}
}
test_namedArgument() async {
addTestFile(r'''
void main() {
foo(1, b: true, c: 3.0);
}
void foo(int a, {bool b, double c}) {}
''');
AnalysisResult result = await driver.getResult(testFile);
List<Statement> mainStatements = _getMainStatements(result);
FunctionDeclaration foo = result.unit.declarations[1];
ExecutableElement fooElement = foo.element;
ExpressionStatement statement = mainStatements[0];
MethodInvocation invocation = statement.expression;
List<Expression> arguments = invocation.argumentList.arguments;
Expression aArgument = arguments[0];
ParameterElement aElement = fooElement.parameters[0];
expect(aArgument.staticParameterElement, same(aElement));
NamedExpression bArgument = arguments[1];
ParameterElement bElement = fooElement.parameters[1];
expect(bArgument.name.label.staticElement, same(bElement));
expect(bArgument.staticParameterElement, same(bElement));
NamedExpression cArgument = arguments[2];
ParameterElement cElement = fooElement.parameters[2];
expect(cArgument.name.label.staticElement, same(cElement));
expect(cArgument.staticParameterElement, same(cElement));
}
test_postfixExpression_local() async {
String content = r'''
main() {