b7c6ad117f
Now that we have an AST and visitor support for the FunctionReference structure (which represents `Expression<TypeArguments>` for various kinds of expressions), we no longer need to error recover this as a FunctionExpressionInvocation with synthetic arguments. The resolver still doesn't resolve the syntax properly, but that's ok because it's not permitted in valid code (for now we just treat it as having type `dynamic`). Fixes #46150. Change-Id: I357175cc16bcf2f9027be2e1da66bb6ca70a9400 Bug: https://github.com/dart-lang/sdk/issues/46020 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/199682 Commit-Queue: Paul Berry <paulberry@google.com> Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
117 lines
3.8 KiB
Dart
117 lines
3.8 KiB
Dart
// Copyright (c) 2018, 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.
|
|
|
|
class Foo<X> {
|
|
const Foo();
|
|
const Foo.bar();
|
|
const Foo.baz();
|
|
}
|
|
|
|
main() {
|
|
new Foo();
|
|
new Foo.bar();
|
|
new Foo.bar.baz();
|
|
// ^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
|
|
// ^
|
|
// [cfe] Method not found: 'Foo.bar.baz'.
|
|
new Foo<int>();
|
|
new Foo<int>.bar();
|
|
new Foo<int>.bar.baz();
|
|
// ^^^
|
|
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
|
|
// [cfe] Expected '(' after this.
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
|
|
// [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
|
|
new Foo.bar<int>();
|
|
// ^
|
|
// [cfe] A constructor invocation can't have type arguments on the constructor name.
|
|
// ^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
|
|
new Foo.bar<int>.baz();
|
|
// ^
|
|
// [cfe] A constructor invocation can't have type arguments on the constructor name.
|
|
// ^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
|
|
// ^
|
|
// [cfe] Method not found: 'Foo.bar.baz'.
|
|
new Foo.bar.baz<int>();
|
|
// ^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
|
|
// [cfe] A constructor invocation can't have type arguments on the constructor name.
|
|
// ^
|
|
// [cfe] Method not found: 'Foo.bar.baz'.
|
|
|
|
const Foo();
|
|
const Foo.bar();
|
|
const Foo.bar.baz();
|
|
// ^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
|
|
// ^
|
|
// [cfe] Method not found: 'Foo.bar.baz'.
|
|
const Foo<int>();
|
|
const Foo<int>.bar();
|
|
const Foo<int>.bar.baz();
|
|
// ^^^
|
|
// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
|
|
// [cfe] Expected '(' after this.
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_METHOD
|
|
// [cfe] The method 'baz' isn't defined for the class 'Foo<int>'.
|
|
const Foo.bar<int>();
|
|
// ^
|
|
// [cfe] A constructor invocation can't have type arguments on the constructor name.
|
|
// ^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
|
|
const Foo.bar<int>.baz();
|
|
// ^
|
|
// [cfe] A constructor invocation can't have type arguments on the constructor name.
|
|
// ^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
|
|
// ^
|
|
// [cfe] Method not found: 'Foo.bar.baz'.
|
|
const Foo.bar.baz<int>();
|
|
// ^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
|
|
// [cfe] A constructor invocation can't have type arguments on the constructor name.
|
|
// ^
|
|
// [cfe] Method not found: 'Foo.bar.baz'.
|
|
|
|
Foo();
|
|
Foo.bar();
|
|
Foo.bar.baz();
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
|
|
// [cfe] Getter not found: 'bar'.
|
|
Foo<int>();
|
|
Foo<int>.bar();
|
|
Foo<int>.bar.baz();
|
|
// ^^^^^
|
|
// [analyzer] SYNTACTIC_ERROR.EXPERIMENT_NOT_ENABLED
|
|
// [cfe] This requires the 'constructor-tearoffs' language feature to be enabled.
|
|
// ^
|
|
// [cfe] Getter not found: 'bar'.
|
|
Foo.bar<int>();
|
|
// ^
|
|
// [cfe] A constructor invocation can't have type arguments on the constructor name.
|
|
// ^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR
|
|
Foo.bar<int>.baz();
|
|
// ^
|
|
// [cfe] A constructor invocation can't have type arguments on the constructor name.
|
|
//^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.CREATION_WITH_NON_TYPE
|
|
// ^
|
|
// [cfe] Method not found: 'Foo.bar.baz'.
|
|
Foo.bar.baz<int>();
|
|
// ^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.UNDEFINED_GETTER
|
|
// [cfe] Getter not found: 'bar'.
|
|
}
|