40b6741778
This CL modifies the Dart source used from test.py such that it takes `syntax error` into account as an expected outcome in test files (so that we can have `//# 01: syntax error` with a similar meaning as `//# 01: compile-time error`). For all tools except the spec_parser, `syntax error` is the same outcome as `compile-time error`; that is, nobody else will see the difference. For the spec_parser, `syntax error` is the outcome where parsing has failed; `compile-time error` is taken to mean some other compile-time error, i.e., the spec_parser is expected to _succeed_ when the expected outcome is `compile-time error`. Test files in language and language_2 have been adjusted to use the outcome `syntax error` where appropriate. The status files in language and language_2 for the spec_parser have been adjusted such that they fit all the new `syntax error` outcomes in test files. Other status files have been adjusted in a few cases where tests were corrected (because a compile-time error which was clearly not intended to be a syntax error turned out to be caused by a typo, which means that the actual compile-time error has never been tested). The spec grammar Dart.g was adjusted in a few cases, when some bugs were discovered. In particular, the treatment of Function has been changed: It is now known by the parser that Function does not take any type arguments. This makes no difference for developers, because they cannot declare a type named Function anyway, but it means that a number of tricky parsing issues were resolved. Dart.g was also adjusted to allow `qualified` to contain three identifiers, which is an old bug (preventing things like metadata on the form `@p.C.myConst`). Change-Id: Ie420887d45c882ef97c84143365219f8aa0d2933 Reviewed-on: https://dart-review.googlesource.com/18262 Commit-Queue: Erik Ernst <eernst@google.com> Reviewed-by: Bob Nystrom <rnystrom@google.com> Reviewed-by: Lasse R.H. Nielsen <lrn@google.com>
164 lines
6.4 KiB
Dart
164 lines
6.4 KiB
Dart
// 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.
|
|
|
|
// Tests that malformed types are handled as dynamic, and that types with the
|
|
// wrong number of type arguments are handled as raw types.
|
|
|
|
import 'package:expect/expect.dart';
|
|
import 'package:expect/expect.dart' as prefix; // Define 'prefix'.
|
|
|
|
checkIsUnresolved(var v) {
|
|
Expect.throws(() => v is Unresolved, (e) => e is TypeError);
|
|
Expect.throws(() => v is Unresolved<int>, (e) => e is TypeError);
|
|
Expect.throws(() => v is prefix.Unresolved, (e) => e is TypeError);
|
|
Expect.throws(() => v is prefix.Unresolved<int>, (e) => e is TypeError);
|
|
}
|
|
|
|
checkIsListUnresolved(bool expect, var v) {
|
|
Expect.equals(expect, v is List<Unresolved>);
|
|
Expect.equals(expect, v is List<Unresolved<int>>);
|
|
Expect.equals(expect, v is List<prefix.Unresolved>);
|
|
Expect.equals(expect, v is List<prefix.Unresolved<int>>);
|
|
Expect.equals(expect, v is List<int, String>);
|
|
}
|
|
|
|
checkIsListDynamic(bool expect, var v) {
|
|
checkIsListUnresolved(true, v);
|
|
Expect.equals(expect, v is List<int> && v is List<String>);
|
|
}
|
|
|
|
checkAsUnresolved(var v) {
|
|
Expect.throws(() => v as Unresolved, (e) => e is TypeError);
|
|
Expect.throws(() => v as Unresolved<int>, (e) => e is TypeError);
|
|
Expect.throws(() => v as prefix.Unresolved, (e) => e is TypeError);
|
|
Expect.throws(() => v as prefix.Unresolved<int>, (e) => e is TypeError);
|
|
}
|
|
|
|
checkAsListUnresolved(bool expect, var v) {
|
|
if (expect) {
|
|
Expect.equals(v, v as List<Unresolved>);
|
|
Expect.equals(v, v as List<Unresolved<int>>);
|
|
Expect.equals(v, v as List<prefix.Unresolved>);
|
|
Expect.equals(v, v as List<prefix.Unresolved<int>>);
|
|
Expect.equals(v, v as List<int, String>);
|
|
} else {
|
|
Expect.throws(() => v as List<Unresolved>, (e) => e is CastError);
|
|
Expect.throws(() => v as List<Unresolved<int>>, (e) => e is CastError);
|
|
Expect.throws(() => v as List<prefix.Unresolved>, (e) => e is CastError);
|
|
Expect.throws(
|
|
() => v as List<prefix.Unresolved<int>>, (e) => e is CastError);
|
|
Expect.throws(() => v as List<int, String>, (e) => e is CastError);
|
|
}
|
|
}
|
|
|
|
checkIsMapDynamic(bool first, bool second, var v) {
|
|
Expect.equals(first, v is Map<String, Object> && v is Map<int, Object>);
|
|
Expect.equals(second, v is Map<Object, int> && v is Map<Object, String>);
|
|
}
|
|
|
|
void main() {
|
|
checkIsUnresolved('');
|
|
checkIsUnresolved(0);
|
|
checkIsListUnresolved(false, '');
|
|
checkIsListUnresolved(true, new List());
|
|
checkIsListUnresolved(true, new List<int>());
|
|
checkIsListUnresolved(true, new List<String>());
|
|
checkIsListUnresolved(true, new List<int, String>());
|
|
|
|
checkAsUnresolved('');
|
|
checkAsUnresolved(0);
|
|
checkAsListUnresolved(false, '');
|
|
checkAsListUnresolved(true, new List());
|
|
checkAsListUnresolved(true, new List<int>());
|
|
checkAsListUnresolved(true, new List<String>());
|
|
checkAsListUnresolved(true, new List<int, String>());
|
|
|
|
checkIsListDynamic(true, []);
|
|
checkIsListDynamic(true, <>[]); //# 01: syntax error
|
|
checkIsListDynamic(false, <int>[]);
|
|
checkIsListDynamic(true, <Unresolved>[]);
|
|
checkIsListDynamic(true, <Unresolved<int>>[]);
|
|
checkIsListDynamic(true, <prefix.Unresolved>[]);
|
|
checkIsListDynamic(true, <prefix.Unresolved<int>>[]);
|
|
checkIsListDynamic(true, <int, String>[]);
|
|
|
|
checkIsListDynamic(true, new List());
|
|
checkIsListDynamic(true, new List<>()); //# 02: syntax error
|
|
checkIsListDynamic(true, new List<Unresolved>());
|
|
checkIsListDynamic(true, new List<Unresolved<int>>());
|
|
checkIsListDynamic(true, new List<prefix.Unresolved>());
|
|
checkIsListDynamic(true, new List<prefix.Unresolved<int>>());
|
|
checkIsListDynamic(true, new List<int, String>());
|
|
|
|
checkIsMapDynamic(true, true, <dynamic, dynamic>{});
|
|
checkIsMapDynamic(true, true, {});
|
|
checkIsMapDynamic(true, true, <>{}); //# 03: syntax error
|
|
checkIsMapDynamic(true, true, <int>{});
|
|
checkIsMapDynamic(false, false, <String, int>{});
|
|
checkIsMapDynamic(true, true, <String, int, String>{});
|
|
checkIsMapDynamic(true, false, <Unresolved, int>{});
|
|
checkIsMapDynamic(false, true, <String, Unresolved<int>>{});
|
|
checkIsMapDynamic(true, false, <prefix.Unresolved, int>{});
|
|
checkIsMapDynamic(false, true, <String, prefix.Unresolved<int>>{});
|
|
|
|
checkIsMapDynamic(true, true, new Map());
|
|
checkIsMapDynamic(true, true, new Map<>); //# 04: syntax error
|
|
checkIsMapDynamic(true, true, new Map<int>());
|
|
checkIsMapDynamic(false, false, new Map<String, int>());
|
|
checkIsMapDynamic(true, true, new Map<String, int, String>());
|
|
checkIsMapDynamic(true, false, new Map<Unresolved, int>());
|
|
checkIsMapDynamic(false, true, new Map<String, Unresolved<int>>());
|
|
checkIsMapDynamic(true, false, new Map<prefix.Unresolved, int>());
|
|
checkIsMapDynamic(false, true, new Map<String, prefix.Unresolved<int>>());
|
|
|
|
Expect.throws(() => new Unresolved(), (e) => true);
|
|
Expect.throws(() => new Unresolved<int>(), (e) => true);
|
|
Expect.throws(() => new prefix.Unresolved(), (e) => true);
|
|
Expect.throws(() => new prefix.Unresolved<int>(), (e) => true);
|
|
|
|
// The expression 'undeclared_prefix.Unresolved()' is parsed as the invocation
|
|
// of the named constructor 'Unresolved' on the type 'undeclared_prefix'.
|
|
Expect.throws(() => new undeclared_prefix.Unresolved(), (e) => true);
|
|
// The expression 'undeclared_prefix.Unresolved<int>' is a malformed type.
|
|
Expect.throws(() => new undeclared_prefix.Unresolved<int>(), (e) => true);
|
|
|
|
try {
|
|
try {
|
|
throw 'foo';
|
|
} on Unresolved catch (e) {
|
|
Expect.fail("This code shouldn't be executed");
|
|
}
|
|
Expect.fail("This code shouldn't be executed");
|
|
} on TypeError catch (e) {}
|
|
try {
|
|
try {
|
|
throw 'foo';
|
|
} on Unresolved<int> catch (e) {
|
|
Expect.fail("This code shouldn't be executed");
|
|
}
|
|
Expect.fail("This code shouldn't be executed");
|
|
} on TypeError catch (e) {}
|
|
try {
|
|
try {
|
|
throw 'foo';
|
|
} on prefix.Unresolved catch (e) {
|
|
Expect.fail("This code shouldn't be executed");
|
|
}
|
|
Expect.fail("This code shouldn't be executed");
|
|
} on TypeError catch (e) {}
|
|
try {
|
|
try {
|
|
throw 'foo';
|
|
} on prefix.Unresolved<int> catch (e) {
|
|
Expect.fail("This code shouldn't be executed");
|
|
}
|
|
Expect.fail("This code shouldn't be executed");
|
|
} on TypeError catch (e) {}
|
|
try {
|
|
throw 'foo';
|
|
}
|
|
on undeclared_prefix.Unresolved<int> // //# 06: runtime error
|
|
catch (e) {}
|
|
}
|