blob: 6ae31748c1213c4d9b546d785094364b9e190eb6 [file] [log] [blame]
// Copyright (c) 2013, 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:expect/expect.dart';
import 'compiler_helper.dart';
import 'parser_helper.dart';
const String TEST = """
class A {
get foo => 'string';
set foo(value) {}
operator[](index) => 'string';
operator[]=(index, value) {}
returnDynamic1() => foo--;
returnNum1() => --foo;
returnNum2() => foo -= 42;
returnDynamic2() => this[index]--;
returnNum3() => --this[index];
returnNum4() => this[index] -= 42;
returnDynamic3() => this.bar--;
returnNum5() => --this.bar;
returnNum6() => this.bar -= 42;
}
class B extends A {
get foo => 42;
operator[](index) => 42;
returnString1() => super.foo--;
returnDynamic1() => --super.foo;
returnDynamic2() => super.foo -= 42;
returnString2() => super[index]--;
returnDynamic3() => --super[index];
returnDynamic4() => super[index] -= 42;
}
main() {
new A()..returnNum1()
..returnNum2()
..returnNum3()
..returnNum4()
..returnNum5()
..returnNum6()
..returnDynamic1()
..returnDynamic2()
..returnDynamic3();
new B()..returnString1()
..returnString2()
..returnDynamic1()
..returnDynamic2()
..returnDynamic3()
..returnDynamic4();
}
""";
void main() {
Uri uri = new Uri(scheme: 'source');
var compiler = compilerFor(TEST, uri);
compiler.runCompiler(uri);
var typesTask = compiler.typesTask;
var typesInferrer = typesTask.typesInferrer;
checkReturnInClass(String className, String methodName, type) {
var cls = findElement(compiler, className);
var element = cls.lookupLocalMember(buildSourceString(methodName));
Expect.equals(type,
typesInferrer.getReturnTypeOfElement(element).simplify(compiler));
}
var subclassOfInterceptor =
findTypeMask(compiler, 'Interceptor', 'nonNullSubclass');
checkReturnInClass('A', 'returnNum1', typesTask.numType);
checkReturnInClass('A', 'returnNum2', typesTask.numType);
checkReturnInClass('A', 'returnNum3', typesTask.numType);
checkReturnInClass('A', 'returnNum4', typesTask.numType);
checkReturnInClass('A', 'returnNum5', typesTask.numType);
checkReturnInClass('A', 'returnNum6', typesTask.numType);
checkReturnInClass('A', 'returnDynamic1', subclassOfInterceptor);
checkReturnInClass('A', 'returnDynamic2', subclassOfInterceptor);
checkReturnInClass('A', 'returnDynamic3', typesTask.dynamicType);
checkReturnInClass('B', 'returnString1', typesTask.stringType);
checkReturnInClass('B', 'returnString2', typesTask.stringType);
checkReturnInClass('B', 'returnDynamic1', typesTask.dynamicType);
checkReturnInClass('B', 'returnDynamic2', typesTask.dynamicType);
checkReturnInClass('B', 'returnDynamic3', typesTask.dynamicType);
checkReturnInClass('B', 'returnDynamic4', typesTask.dynamicType);
}