blob: 93d37a4d02d225ac9e88f3ab93419f86b00fc247 [file] [log] [blame]
// Copyright (c) 2012, 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 '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart';
import 'compiler_helper.dart';
import 'parser_helper.dart';
// Source names used throughout the tests.
const SourceString x = const SourceString("x");
const SourceString p1 = const SourceString("p1");
const SourceString p2 = const SourceString("p2");
const SourceString p3 = const SourceString("p3");
// Lists of types.
List<HType> B;
List<HType> I;
List<HType> II;
List<HType> IBS;
List<HType> IIS;
List<HType> BII;
List<HType> IBI;
List<HType> IIB;
List<HType> III;
FunctionSignature compileAndFindSignature(String code,
String className,
String memberName) {
Uri uri = new Uri.fromComponents(scheme: 'source');
var compiler = compilerFor(code, uri);
compiler.runCompiler(uri);
var cls = findElement(compiler, className);
var member = cls.lookupLocalMember(buildSourceString(memberName));
var signature = member.computeSignature(compiler);
return signature;
}
HTypeList createHTypeList(List<HType> types) {
HTypeList result = new HTypeList(types.length);
result.types.setRange(0, result.length, types);
return result;
}
HTypeList createHTypeListWithNamed(List<HType> types,
List<SourceString> namedArguments) {
HTypeList result = new HTypeList.withNamedArguments(types.length,
namedArguments);
result.types.setRange(0, result.length, types);
return result;
}
void checkHTypeList(HTypeList types, List<HType> expected) {
Expect.equals(expected.length, types.length);
for (int i = 0; i < expected.length; i++) {
Expect.equals(expected[i], types.types[i]);
}
}
const String TEST_1 = r"""
class A {
x(p) => null;
}
main() {
new A().x(1);
}
""";
test1() {
FunctionSignature signature = compileAndFindSignature(TEST_1, "A", "x");
HTypeList types = createHTypeList(I);
Selector s = new Selector.call(x, null, 1);
types = types.unionWithOptionalParameters(s, signature, null);
checkHTypeList(types, I);
}
const String TEST_2 = r"""
class A {
x(p1, [p2, p3]) => null;
}
main() {
new A().x(1);
}
""";
test2_1() {
FunctionSignature signature = compileAndFindSignature(TEST_2, "A", "x");
HTypeList types = createHTypeList(<HType>[HType.INTEGER]);
Selector s = new Selector.call(x, null, 1);
OptionalParameterTypes defaultTypes;
defaultTypes = new OptionalParameterTypes(2);
defaultTypes.update(0, p2, HType.BOOLEAN);
defaultTypes.update(1, p3, HType.STRING);
HTypeList t2 = types.unionWithOptionalParameters(s, signature, defaultTypes);
checkHTypeList(t2, IBS);
}
test2_2() {
FunctionSignature signature = compileAndFindSignature(TEST_2, "A", "x");
HTypeList types = createHTypeList(II);
Selector s = new Selector.call(x, null, 2);
OptionalParameterTypes defaultTypes;
defaultTypes = new OptionalParameterTypes(2);
defaultTypes.update(0, p2, HType.BOOLEAN);
defaultTypes.update(1, p3, HType.STRING);
HTypeList t2 = types.unionWithOptionalParameters(s, signature, defaultTypes);
checkHTypeList(t2, IIS);
}
test2_3() {
FunctionSignature signature = compileAndFindSignature(TEST_2, "A", "x");
HTypeList types = createHTypeList(III);
Selector s = new Selector.call(x, null, 3);
OptionalParameterTypes defaultTypes;
defaultTypes = new OptionalParameterTypes(2);
defaultTypes.update(0, p2, HType.BOOLEAN);
defaultTypes.update(1, p3, HType.STRING);
HTypeList t2 = types.unionWithOptionalParameters(s, signature, defaultTypes);
checkHTypeList(t2, III);
}
const String TEST_3 = r"""
class A {
x(p1, [p2, p3]) => null;
}
main() {
new A().x(1);
}
""";
test3_1() {
FunctionSignature signature = compileAndFindSignature(TEST_3, "A", "x");
OptionalParameterTypes defaultTypes;
defaultTypes = new OptionalParameterTypes(2);
defaultTypes.update(0, p2, HType.BOOLEAN);
defaultTypes.update(1, p3, HType.STRING);
HTypeList types;
Selector s;
HTypeList result;
s = new Selector.call(x, null, 2, <SourceString>[p2]);
types = createHTypeListWithNamed(II, <SourceString>[p2]);
result = types.unionWithOptionalParameters(s, signature, defaultTypes);
checkHTypeList(result, IIS);
s = new Selector.call(x, null, 2, <SourceString>[p3]);
types = createHTypeListWithNamed(II, <SourceString>[p3]);
result = types.unionWithOptionalParameters(s, signature, defaultTypes);
checkHTypeList(result, IBI);
}
test3_2() {
FunctionSignature signature = compileAndFindSignature(TEST_2, "A", "x");
OptionalParameterTypes defaultTypes;
defaultTypes = new OptionalParameterTypes(2);
defaultTypes.update(0, p2, HType.BOOLEAN);
defaultTypes.update(1, p3, HType.STRING);
HTypeList types;
Selector s;
HTypeList result;
s = new Selector.call(x, null, 2, <SourceString>[p2, p3]);
types = createHTypeListWithNamed(III, <SourceString>[p2, p3]);
result = types.unionWithOptionalParameters(s1, signature, defaultTypes);
checkHTypeList(result, III);
s = new Selector.call(x, null, 2, <SourceString>[p3, p3]);
types = createHTypeListWithNamed(III, <SourceString>[p2, p3]);
result = types.unionWithOptionalParameters(s2, signature, defaultTypes);
checkHTypeList(result, III);
}
const String TEST_4 = r"""
class A {
x([p1, p2, p3]) => null;
}
main() {
new A().x();
}
""";
test4() {
FunctionSignature signature = compileAndFindSignature(TEST_4, "A", "x");
OptionalParameterTypes defaultTypes;
defaultTypes = new OptionalParameterTypes(3);
defaultTypes.update(0, p1, HType.INTEGER);
defaultTypes.update(1, p2, HType.INTEGER);
defaultTypes.update(2, p3, HType.INTEGER);
HTypeList types;
Selector s;
HTypeList result;
s = new Selector.call(x, null, 1, <SourceString>[p1]);
types = createHTypeListWithNamed(B, <SourceString>[p1]);
result = types.unionWithOptionalParameters(s, signature, defaultTypes);
checkHTypeList(result, BII);
s = new Selector.call(x, null, 1, <SourceString>[p2]);
types = createHTypeListWithNamed(B, <SourceString>[p2]);
result = types.unionWithOptionalParameters(s, signature, defaultTypes);
checkHTypeList(result, IBI);
s = new Selector.call(x, null, 1, <SourceString>[p3]);
types = createHTypeListWithNamed(B, <SourceString>[p3]);
result = types.unionWithOptionalParameters(s, signature, defaultTypes);
checkHTypeList(result, IIB);
}
main() {
B = <HType>[HType.BOOLEAN];
I = <HType>[HType.INTEGER];
II = <HType>[HType.INTEGER, HType.INTEGER];
IBS = <HType>[HType.INTEGER, HType.BOOLEAN, HType.STRING];
IIS = <HType>[HType.INTEGER, HType.INTEGER, HType.STRING];
BII = <HType>[HType.BOOLEAN, HType.INTEGER, HType.INTEGER];
IBI = <HType>[HType.INTEGER, HType.BOOLEAN, HType.INTEGER];
IIB = <HType>[HType.INTEGER, HType.INTEGER, HType.BOOLEAN];
III = <HType>[HType.INTEGER, HType.INTEGER, HType.INTEGER];
test1();
test2_1();
test2_2();
test2_3();
test3_1();
test4();
}