Version 2.15.0-181.0.dev
Merge commit '82affd7ac6fe466a8b8cb51a4ddd0d59fc1110bb' into 'dev'
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 4a1e4c1..09c18e0 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -547,15 +547,13 @@
for (var driver in driverMap.values) {
var needsUriReset = false;
for (var event in fileEvents) {
- if (event.type == ChangeType.ADD) {
- driver.addFile(event.path);
+ driver.changeFile(event.path);
+ if (event.type == ChangeType.ADD || event.type == ChangeType.REMOVE) {
needsUriReset = true;
}
- if (event.type == ChangeType.MODIFY) driver.changeFile(event.path);
- if (event.type == ChangeType.REMOVE) driver.removeFile(event.path);
}
- // Since the file has been created after we've searched for it, the
- // URI resolution is likely wrong, so we need to reset it.
+ // If a file was created or removed, the URI resolution is likely wrong,
+ // so we need to reset it.
if (needsUriReset) driver.resetUriResolution();
}
}
diff --git a/pkg/analysis_server/test/benchmarks_test.dart b/pkg/analysis_server/test/benchmarks_test.dart
index 86b6e5f..ca9b731 100644
--- a/pkg/analysis_server/test/benchmarks_test.dart
+++ b/pkg/analysis_server/test/benchmarks_test.dart
@@ -7,15 +7,14 @@
import 'dart:convert';
import 'dart:io';
+import 'package:analyzer_utilities/package_root.dart';
import 'package:path/path.dart' as path;
import 'package:test/test.dart';
void main() => defineTests();
String get _serverSourcePath {
- var script = Platform.script.toFilePath(windows: Platform.isWindows);
- var pkgPath = path.normalize(path.join(path.dirname(script), '..', '..'));
- return path.join(pkgPath, 'analysis_server');
+ return path.join(packageRoot, 'analysis_server');
}
void defineTests() {
@@ -26,8 +25,14 @@
expect(benchmarks, isNotEmpty);
});
+ const benchmarkIdsToSkip = {
+ 'analysis-flutter-analyze',
+ 'das-flutter-completion',
+ 'lsp-flutter-completion'
+ };
+
for (var benchmarkId in benchmarks) {
- if (benchmarkId == 'analysis-flutter-analyze') {
+ if (benchmarkIdsToSkip.contains(benchmarkId)) {
continue;
}
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index 6d60a5f..84e0d7e 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -4,4 +4,4 @@
export 'package:_fe_analyzer_shared/src/scanner/errors.dart'
show ScannerErrorCode;
-export 'package:analyzer/src/dart/error/syntactic_errors.analyzer.g.dart';
+export 'package:analyzer/src/dart/error/syntactic_errors.g.dart';
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.analyzer.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
similarity index 100%
rename from pkg/analyzer/lib/src/dart/error/syntactic_errors.analyzer.g.dart
rename to pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
diff --git a/pkg/analyzer/lib/src/workspace/bazel.dart b/pkg/analyzer/lib/src/workspace/bazel.dart
index b75a215..aa3aec8 100644
--- a/pkg/analyzer/lib/src/workspace/bazel.dart
+++ b/pkg/analyzer/lib/src/workspace/bazel.dart
@@ -55,6 +55,7 @@
@override
void clearCache() {
_sourceCache.clear();
+ _workspace.clearCache();
}
@override
@@ -237,6 +238,10 @@
@override
UriResolver get packageUriResolver => BazelPackageUriResolver(this);
+ void clearCache() {
+ _directoryToPackage.clear();
+ }
+
@override
SourceFactory createSourceFactory(
DartSdk? sdk,
diff --git a/pkg/analyzer/tool/diagnostics/generate.dart b/pkg/analyzer/tool/diagnostics/generate.dart
index acc861c..9ed18ff 100644
--- a/pkg/analyzer/tool/diagnostics/generate.dart
+++ b/pkg/analyzer/tool/diagnostics/generate.dart
@@ -31,14 +31,7 @@
String analyzerPath = pathContext.join(packageRoot, 'analyzer');
return CodePath.from([
[analyzerPath, 'lib', 'src', 'dart', 'error', 'hint_codes.g.dart'],
- [
- analyzerPath,
- 'lib',
- 'src',
- 'dart',
- 'error',
- 'syntactic_errors.analyzer.g.dart'
- ],
+ [analyzerPath, 'lib', 'src', 'dart', 'error', 'syntactic_errors.g.dart'],
[analyzerPath, 'lib', 'src', 'error', 'codes.g.dart'],
[analyzerPath, 'lib', 'src', 'pubspec', 'pubspec_warning_code.g.dart'],
], [
diff --git a/pkg/analyzer/tool/messages/generate.dart b/pkg/analyzer/tool/messages/generate.dart
index ac733b9..f41653c 100644
--- a/pkg/analyzer/tool/messages/generate.dart
+++ b/pkg/analyzer/tool/messages/generate.dart
@@ -81,8 +81,7 @@
type: 'HINT',
extraImports: ['package:analyzer/src/error/analyzer_error_code.dart']),
_ErrorClassInfo(
- // TODO(paulberry): rename to `syntactic_errors.g.dart`.
- filePath: 'lib/src/dart/error/syntactic_errors.analyzer.g.dart',
+ filePath: 'lib/src/dart/error/syntactic_errors.g.dart',
name: 'ParserErrorCode',
type: 'SYNTACTIC_ERROR',
severity: 'ERROR',
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index ac7b321..29fa3a2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -364,8 +364,50 @@
ExpressionInferenceResult operandResult = inferrer.inferExpression(
node.expression, const UnknownType(), true,
isVoidAllowed: true);
- node.expression = operandResult.expression..parent = node;
+ Expression operand = operandResult.expression;
DartType operandType = operandResult.inferredType;
+ if (operandType is! FunctionType) {
+ ObjectAccessTarget callMember = inferrer.findInterfaceMember(
+ operandType, callName, operand.fileOffset,
+ callSiteAccessKind: CallSiteAccessKind.getterInvocation,
+ includeExtensionMethods: true);
+ switch (callMember.kind) {
+ case ObjectAccessTargetKind.instanceMember:
+ Member? target = callMember.member;
+ if (target is Procedure && target.kind == ProcedureKind.Method) {
+ operandType = inferrer.getGetterType(callMember, operandType);
+ operand = new InstanceTearOff(
+ InstanceAccessKind.Instance, operand, callName,
+ interfaceTarget: target, resultType: operandType)
+ ..fileOffset = operand.fileOffset;
+ }
+ break;
+ case ObjectAccessTargetKind.extensionMember:
+ if (callMember.tearoffTarget != null &&
+ callMember.extensionMethodKind == ProcedureKind.Method) {
+ operandType = inferrer.getGetterType(callMember, operandType);
+ operand = new StaticInvocation(
+ callMember.tearoffTarget as Procedure,
+ new Arguments(<Expression>[operand],
+ types: callMember.inferredExtensionTypeArguments)
+ ..fileOffset = operand.fileOffset)
+ ..fileOffset = operand.fileOffset;
+ }
+ break;
+ case ObjectAccessTargetKind.nullableInstanceMember:
+ case ObjectAccessTargetKind.objectMember:
+ case ObjectAccessTargetKind.nullableCallFunction:
+ case ObjectAccessTargetKind.nullableExtensionMember:
+ case ObjectAccessTargetKind.dynamic:
+ case ObjectAccessTargetKind.never:
+ case ObjectAccessTargetKind.invalid:
+ case ObjectAccessTargetKind.missing:
+ case ObjectAccessTargetKind.ambiguous:
+ case ObjectAccessTargetKind.callFunction:
+ break;
+ }
+ }
+ node.expression = operand..parent = node;
Expression result = node;
DartType resultType = const InvalidType();
if (operandType is FunctionType) {
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart
new file mode 100644
index 0000000..692cc20
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2021, 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 'dart:async';
+
+method<T extends Class, S extends int>(Class c, int i, T t, S s) {
+ c<int>; // ok
+ i<int>; // ok
+ t<int>; // ok
+ s<int>; // ok
+}
+
+test<T extends Class?, S extends int>(
+ Class? c1,
+ GetterCall c2,
+ int? i,
+ T t1,
+ T? t2,
+ S? s,
+ void Function<T>()? f1,
+ Never n,
+ dynamic d,
+ String a,
+ double b,
+ bool c,
+ FutureOr<Class> f2,
+ Function f3) {
+ c1<int>; // error
+ c2<int>; // error
+ i<int>; // error
+ t1<int>; // error
+ t2<int>; // error
+ s<int>; // error
+ f1<int>; // error
+ n<int>; // error
+ d<int>; // error
+ a<int>; // error
+ b<int>; // error
+ c<int>; // error
+ f2<int>; // error
+ f3<int>; // error
+}
+
+class Class {
+ call<T>() {}
+}
+
+class GetterCall {
+ void Function<T>() get call => <T>() {};
+}
+
+extension Extension on int {
+ call<T>() {}
+}
+
+extension ExtensionGetter on double {
+ void Function<T>() get call => <T>() {};
+}
+
+extension ExtensionSetter on bool {
+ set call(void Function<T>() value) {}
+}
+
+extension Ambiguous1 on String {
+ call<T>() {}
+}
+
+extension Ambiguous2 on String {
+ call<T>() {}
+}
+
+main() {
+ method(Class(), 0, Class(), 0);
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.strong.expect
new file mode 100644
index 0000000..2270689
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.strong.expect
@@ -0,0 +1,189 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// c1<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+// - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// c2<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+// Try changing the operand or remove the type arguments.
+// i<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+// Try changing the operand or remove the type arguments.
+// t1<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+// Try changing the operand or remove the type arguments.
+// t2<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+// Try changing the operand or remove the type arguments.
+// s<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+// Try changing the operand or remove the type arguments.
+// n<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+// Try changing the operand or remove the type arguments.
+// d<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+// Try changing the operand or remove the type arguments.
+// a<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+// Try changing the operand or remove the type arguments.
+// b<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+// Try changing the operand or remove the type arguments.
+// c<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// f2<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+// - 'Function' is from 'dart:core'.
+// Try changing the operand or remove the type arguments.
+// f3<int>; // error
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Class extends core::Object {
+ synthetic constructor •() → self::Class
+ : super core::Object::•()
+ ;
+ method call<T extends core::Object? = dynamic>() → dynamic {}
+}
+class GetterCall extends core::Object {
+ synthetic constructor •() → self::GetterCall
+ : super core::Object::•()
+ ;
+ get call() → <T extends core::Object? = dynamic>() → void
+ return <T extends core::Object? = dynamic>() → void {};
+}
+extension Extension on core::int {
+ method call = self::Extension|call;
+ tearoff call = self::Extension|get#call;
+}
+extension ExtensionGetter on core::double {
+ get call = self::ExtensionGetter|get#call;
+}
+extension ExtensionSetter on core::bool {
+ set call = self::ExtensionSetter|set#call;
+}
+extension Ambiguous1 on core::String {
+ method call = self::Ambiguous1|call;
+ tearoff call = self::Ambiguous1|get#call;
+}
+extension Ambiguous2 on core::String {
+ method call = self::Ambiguous2|call;
+ tearoff call = self::Ambiguous2|get#call;
+}
+static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic {
+ c.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+ self::Extension|get#call(i)<core::int>;
+ t.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+ self::Extension|get#call(s)<core::int>;
+}
+static method test<T extends self::Class?, S extends core::int>(self::Class? c1, self::GetterCall c2, core::int? i, self::test::T% t1, self::test::T? t2, self::test::S? s, <T extends core::Object? = dynamic>() →? void f1, Never n, dynamic d, core::String a, core::double b, core::bool c, FutureOr<self::Class>f2, core::Function f3) → dynamic {
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+ c1<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+ - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+ c2<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+Try changing the operand or remove the type arguments.
+ i<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+Try changing the operand or remove the type arguments.
+ t1<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+Try changing the operand or remove the type arguments.
+ t2<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+Try changing the operand or remove the type arguments.
+ s<int>; // error
+ ^";
+ f1<core::int>;
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+Try changing the operand or remove the type arguments.
+ n<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+Try changing the operand or remove the type arguments.
+ d<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+Try changing the operand or remove the type arguments.
+ a<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+Try changing the operand or remove the type arguments.
+ b<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+Try changing the operand or remove the type arguments.
+ c<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+ f2<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+ - 'Function' is from 'dart:core'.
+Try changing the operand or remove the type arguments.
+ f3<int>; // error
+ ^";
+}
+static method Extension|call<T extends core::Object? = dynamic>(lowered final core::int #this) → dynamic {}
+static method Extension|get#call(lowered final core::int #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Extension|call<T%>(#this);
+static method ExtensionGetter|get#call(lowered final core::double #this) → <T extends core::Object? = dynamic>() → void
+ return <T extends core::Object? = dynamic>() → void {};
+static method ExtensionSetter|set#call(lowered final core::bool #this, <T extends core::Object? = dynamic>() → void value) → void {}
+static method Ambiguous1|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous1|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous1|call<T%>(#this);
+static method Ambiguous2|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous2|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous2|call<T%>(#this);
+static method main() → dynamic {
+ self::method<self::Class, core::int>(new self::Class::•(), 0, new self::Class::•(), 0);
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.strong.transformed.expect
new file mode 100644
index 0000000..2270689
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.strong.transformed.expect
@@ -0,0 +1,189 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// c1<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+// - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// c2<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+// Try changing the operand or remove the type arguments.
+// i<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+// Try changing the operand or remove the type arguments.
+// t1<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+// Try changing the operand or remove the type arguments.
+// t2<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+// Try changing the operand or remove the type arguments.
+// s<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+// Try changing the operand or remove the type arguments.
+// n<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+// Try changing the operand or remove the type arguments.
+// d<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+// Try changing the operand or remove the type arguments.
+// a<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+// Try changing the operand or remove the type arguments.
+// b<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+// Try changing the operand or remove the type arguments.
+// c<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// f2<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+// - 'Function' is from 'dart:core'.
+// Try changing the operand or remove the type arguments.
+// f3<int>; // error
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Class extends core::Object {
+ synthetic constructor •() → self::Class
+ : super core::Object::•()
+ ;
+ method call<T extends core::Object? = dynamic>() → dynamic {}
+}
+class GetterCall extends core::Object {
+ synthetic constructor •() → self::GetterCall
+ : super core::Object::•()
+ ;
+ get call() → <T extends core::Object? = dynamic>() → void
+ return <T extends core::Object? = dynamic>() → void {};
+}
+extension Extension on core::int {
+ method call = self::Extension|call;
+ tearoff call = self::Extension|get#call;
+}
+extension ExtensionGetter on core::double {
+ get call = self::ExtensionGetter|get#call;
+}
+extension ExtensionSetter on core::bool {
+ set call = self::ExtensionSetter|set#call;
+}
+extension Ambiguous1 on core::String {
+ method call = self::Ambiguous1|call;
+ tearoff call = self::Ambiguous1|get#call;
+}
+extension Ambiguous2 on core::String {
+ method call = self::Ambiguous2|call;
+ tearoff call = self::Ambiguous2|get#call;
+}
+static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic {
+ c.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+ self::Extension|get#call(i)<core::int>;
+ t.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+ self::Extension|get#call(s)<core::int>;
+}
+static method test<T extends self::Class?, S extends core::int>(self::Class? c1, self::GetterCall c2, core::int? i, self::test::T% t1, self::test::T? t2, self::test::S? s, <T extends core::Object? = dynamic>() →? void f1, Never n, dynamic d, core::String a, core::double b, core::bool c, FutureOr<self::Class>f2, core::Function f3) → dynamic {
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+ c1<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+ - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+ c2<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+Try changing the operand or remove the type arguments.
+ i<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+Try changing the operand or remove the type arguments.
+ t1<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+Try changing the operand or remove the type arguments.
+ t2<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+Try changing the operand or remove the type arguments.
+ s<int>; // error
+ ^";
+ f1<core::int>;
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+Try changing the operand or remove the type arguments.
+ n<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+Try changing the operand or remove the type arguments.
+ d<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+Try changing the operand or remove the type arguments.
+ a<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+Try changing the operand or remove the type arguments.
+ b<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+Try changing the operand or remove the type arguments.
+ c<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+ f2<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+ - 'Function' is from 'dart:core'.
+Try changing the operand or remove the type arguments.
+ f3<int>; // error
+ ^";
+}
+static method Extension|call<T extends core::Object? = dynamic>(lowered final core::int #this) → dynamic {}
+static method Extension|get#call(lowered final core::int #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Extension|call<T%>(#this);
+static method ExtensionGetter|get#call(lowered final core::double #this) → <T extends core::Object? = dynamic>() → void
+ return <T extends core::Object? = dynamic>() → void {};
+static method ExtensionSetter|set#call(lowered final core::bool #this, <T extends core::Object? = dynamic>() → void value) → void {}
+static method Ambiguous1|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous1|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous1|call<T%>(#this);
+static method Ambiguous2|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous2|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous2|call<T%>(#this);
+static method main() → dynamic {
+ self::method<self::Class, core::int>(new self::Class::•(), 0, new self::Class::•(), 0);
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.textual_outline.expect
new file mode 100644
index 0000000..807f530
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.textual_outline.expect
@@ -0,0 +1,48 @@
+import 'dart:async';
+
+method<T extends Class, S extends int>(Class c, int i, T t, S s) {}
+test<T extends Class?, S extends int>(
+ Class? c1,
+ GetterCall c2,
+ int? i,
+ T t1,
+ T? t2,
+ S? s,
+ void Function<T>()? f1,
+ Never n,
+ dynamic d,
+ String a,
+ double b,
+ bool c,
+ FutureOr<Class> f2,
+ Function f3) {}
+
+class Class {
+ call<T>() {}
+}
+
+class GetterCall {
+ void Function<T>() get call => <T>() {};
+}
+
+extension Extension on int {
+ call<T>() {}
+}
+
+extension ExtensionGetter on double {
+ void Function<T>() get call => <T>() {};
+}
+
+extension ExtensionSetter on bool {
+ set call(void Function<T>() value) {}
+}
+
+extension Ambiguous1 on String {
+ call<T>() {}
+}
+
+extension Ambiguous2 on String {
+ call<T>() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..5c31ac3
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.textual_outline_modelled.expect
@@ -0,0 +1,47 @@
+import 'dart:async';
+
+class Class {
+ call<T>() {}
+}
+
+class GetterCall {
+ void Function<T>() get call => <T>() {};
+}
+
+extension Ambiguous1 on String {
+ call<T>() {}
+}
+
+extension Ambiguous2 on String {
+ call<T>() {}
+}
+
+extension Extension on int {
+ call<T>() {}
+}
+
+extension ExtensionGetter on double {
+ void Function<T>() get call => <T>() {};
+}
+
+extension ExtensionSetter on bool {
+ set call(void Function<T>() value) {}
+}
+
+main() {}
+method<T extends Class, S extends int>(Class c, int i, T t, S s) {}
+test<T extends Class?, S extends int>(
+ Class? c1,
+ GetterCall c2,
+ int? i,
+ T t1,
+ T? t2,
+ S? s,
+ void Function<T>()? f1,
+ Never n,
+ dynamic d,
+ String a,
+ double b,
+ bool c,
+ FutureOr<Class> f2,
+ Function f3) {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.expect
new file mode 100644
index 0000000..2270689
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.expect
@@ -0,0 +1,189 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// c1<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+// - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// c2<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+// Try changing the operand or remove the type arguments.
+// i<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+// Try changing the operand or remove the type arguments.
+// t1<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+// Try changing the operand or remove the type arguments.
+// t2<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+// Try changing the operand or remove the type arguments.
+// s<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+// Try changing the operand or remove the type arguments.
+// n<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+// Try changing the operand or remove the type arguments.
+// d<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+// Try changing the operand or remove the type arguments.
+// a<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+// Try changing the operand or remove the type arguments.
+// b<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+// Try changing the operand or remove the type arguments.
+// c<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// f2<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+// - 'Function' is from 'dart:core'.
+// Try changing the operand or remove the type arguments.
+// f3<int>; // error
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Class extends core::Object {
+ synthetic constructor •() → self::Class
+ : super core::Object::•()
+ ;
+ method call<T extends core::Object? = dynamic>() → dynamic {}
+}
+class GetterCall extends core::Object {
+ synthetic constructor •() → self::GetterCall
+ : super core::Object::•()
+ ;
+ get call() → <T extends core::Object? = dynamic>() → void
+ return <T extends core::Object? = dynamic>() → void {};
+}
+extension Extension on core::int {
+ method call = self::Extension|call;
+ tearoff call = self::Extension|get#call;
+}
+extension ExtensionGetter on core::double {
+ get call = self::ExtensionGetter|get#call;
+}
+extension ExtensionSetter on core::bool {
+ set call = self::ExtensionSetter|set#call;
+}
+extension Ambiguous1 on core::String {
+ method call = self::Ambiguous1|call;
+ tearoff call = self::Ambiguous1|get#call;
+}
+extension Ambiguous2 on core::String {
+ method call = self::Ambiguous2|call;
+ tearoff call = self::Ambiguous2|get#call;
+}
+static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic {
+ c.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+ self::Extension|get#call(i)<core::int>;
+ t.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+ self::Extension|get#call(s)<core::int>;
+}
+static method test<T extends self::Class?, S extends core::int>(self::Class? c1, self::GetterCall c2, core::int? i, self::test::T% t1, self::test::T? t2, self::test::S? s, <T extends core::Object? = dynamic>() →? void f1, Never n, dynamic d, core::String a, core::double b, core::bool c, FutureOr<self::Class>f2, core::Function f3) → dynamic {
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+ c1<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+ - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+ c2<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+Try changing the operand or remove the type arguments.
+ i<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+Try changing the operand or remove the type arguments.
+ t1<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+Try changing the operand or remove the type arguments.
+ t2<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+Try changing the operand or remove the type arguments.
+ s<int>; // error
+ ^";
+ f1<core::int>;
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+Try changing the operand or remove the type arguments.
+ n<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+Try changing the operand or remove the type arguments.
+ d<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+Try changing the operand or remove the type arguments.
+ a<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+Try changing the operand or remove the type arguments.
+ b<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+Try changing the operand or remove the type arguments.
+ c<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+ f2<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+ - 'Function' is from 'dart:core'.
+Try changing the operand or remove the type arguments.
+ f3<int>; // error
+ ^";
+}
+static method Extension|call<T extends core::Object? = dynamic>(lowered final core::int #this) → dynamic {}
+static method Extension|get#call(lowered final core::int #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Extension|call<T%>(#this);
+static method ExtensionGetter|get#call(lowered final core::double #this) → <T extends core::Object? = dynamic>() → void
+ return <T extends core::Object? = dynamic>() → void {};
+static method ExtensionSetter|set#call(lowered final core::bool #this, <T extends core::Object? = dynamic>() → void value) → void {}
+static method Ambiguous1|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous1|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous1|call<T%>(#this);
+static method Ambiguous2|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous2|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous2|call<T%>(#this);
+static method main() → dynamic {
+ self::method<self::Class, core::int>(new self::Class::•(), 0, new self::Class::•(), 0);
+}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.outline.expect
new file mode 100644
index 0000000..a47d813
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.outline.expect
@@ -0,0 +1,58 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Class extends core::Object {
+ synthetic constructor •() → self::Class
+ ;
+ method call<T extends core::Object? = dynamic>() → dynamic
+ ;
+}
+class GetterCall extends core::Object {
+ synthetic constructor •() → self::GetterCall
+ ;
+ get call() → <T extends core::Object? = dynamic>() → void
+ ;
+}
+extension Extension on core::int {
+ method call = self::Extension|call;
+ tearoff call = self::Extension|get#call;
+}
+extension ExtensionGetter on core::double {
+ get call = self::ExtensionGetter|get#call;
+}
+extension ExtensionSetter on core::bool {
+ set call = self::ExtensionSetter|set#call;
+}
+extension Ambiguous1 on core::String {
+ method call = self::Ambiguous1|call;
+ tearoff call = self::Ambiguous1|get#call;
+}
+extension Ambiguous2 on core::String {
+ method call = self::Ambiguous2|call;
+ tearoff call = self::Ambiguous2|get#call;
+}
+static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic
+ ;
+static method test<T extends self::Class?, S extends core::int>(self::Class? c1, self::GetterCall c2, core::int? i, self::test::T% t1, self::test::T? t2, self::test::S? s, <T extends core::Object? = dynamic>() →? void f1, Never n, dynamic d, core::String a, core::double b, core::bool c, FutureOr<self::Class>f2, core::Function f3) → dynamic
+ ;
+static method Extension|call<T extends core::Object? = dynamic>(lowered final core::int #this) → dynamic
+ ;
+static method Extension|get#call(lowered final core::int #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Extension|call<T%>(#this);
+static method ExtensionGetter|get#call(lowered final core::double #this) → <T extends core::Object? = dynamic>() → void
+ ;
+static method ExtensionSetter|set#call(lowered final core::bool #this, <T extends core::Object? = dynamic>() → void value) → void
+ ;
+static method Ambiguous1|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic
+ ;
+static method Ambiguous1|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous1|call<T%>(#this);
+static method Ambiguous2|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic
+ ;
+static method Ambiguous2|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous2|call<T%>(#this);
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.transformed.expect
new file mode 100644
index 0000000..2270689
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart.weak.transformed.expect
@@ -0,0 +1,189 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// c1<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+// - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// c2<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+// Try changing the operand or remove the type arguments.
+// i<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+// Try changing the operand or remove the type arguments.
+// t1<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+// Try changing the operand or remove the type arguments.
+// t2<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+// Try changing the operand or remove the type arguments.
+// s<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+// Try changing the operand or remove the type arguments.
+// n<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+// Try changing the operand or remove the type arguments.
+// d<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+// Try changing the operand or remove the type arguments.
+// a<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+// Try changing the operand or remove the type arguments.
+// b<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+// Try changing the operand or remove the type arguments.
+// c<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+// - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+// Try changing the operand or remove the type arguments.
+// f2<int>; // error
+// ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+// - 'Function' is from 'dart:core'.
+// Try changing the operand or remove the type arguments.
+// f3<int>; // error
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:async";
+
+class Class extends core::Object {
+ synthetic constructor •() → self::Class
+ : super core::Object::•()
+ ;
+ method call<T extends core::Object? = dynamic>() → dynamic {}
+}
+class GetterCall extends core::Object {
+ synthetic constructor •() → self::GetterCall
+ : super core::Object::•()
+ ;
+ get call() → <T extends core::Object? = dynamic>() → void
+ return <T extends core::Object? = dynamic>() → void {};
+}
+extension Extension on core::int {
+ method call = self::Extension|call;
+ tearoff call = self::Extension|get#call;
+}
+extension ExtensionGetter on core::double {
+ get call = self::ExtensionGetter|get#call;
+}
+extension ExtensionSetter on core::bool {
+ set call = self::ExtensionSetter|set#call;
+}
+extension Ambiguous1 on core::String {
+ method call = self::Ambiguous1|call;
+ tearoff call = self::Ambiguous1|get#call;
+}
+extension Ambiguous2 on core::String {
+ method call = self::Ambiguous2|call;
+ tearoff call = self::Ambiguous2|get#call;
+}
+static method method<T extends self::Class, S extends core::int>(self::Class c, core::int i, self::method::T t, self::method::S s) → dynamic {
+ c.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+ self::Extension|get#call(i)<core::int>;
+ t.{self::Class::call}{<T extends core::Object? = dynamic>() → dynamic}<core::int>;
+ self::Extension|get#call(s)<core::int>;
+}
+static method test<T extends self::Class?, S extends core::int>(self::Class? c1, self::GetterCall c2, core::int? i, self::test::T% t1, self::test::T? t2, self::test::S? s, <T extends core::Object? = dynamic>() →? void f1, Never n, dynamic d, core::String a, core::double b, core::bool c, FutureOr<self::Class>f2, core::Function f3) → dynamic {
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:29:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Class?'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+ c1<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:30:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'GetterCall'.
+ - 'GetterCall' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+ c2<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:31:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'int?'.
+Try changing the operand or remove the type arguments.
+ i<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:32:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T'.
+Try changing the operand or remove the type arguments.
+ t1<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:33:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'T?'.
+Try changing the operand or remove the type arguments.
+ t2<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:34:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'S?'.
+Try changing the operand or remove the type arguments.
+ s<int>; // error
+ ^";
+ f1<core::int>;
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:36:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Never'.
+Try changing the operand or remove the type arguments.
+ n<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:37:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'dynamic'.
+Try changing the operand or remove the type arguments.
+ d<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:38:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'String'.
+Try changing the operand or remove the type arguments.
+ a<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:39:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'double'.
+Try changing the operand or remove the type arguments.
+ b<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:40:4: Error: The static type of the explicit instantiation operand must be a generic function type but is 'bool'.
+Try changing the operand or remove the type arguments.
+ c<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:41:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'FutureOr<Class>'.
+ - 'Class' is from 'pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart'.
+Try changing the operand or remove the type arguments.
+ f2<int>; // error
+ ^";
+ invalid-expression "pkg/front_end/testcases/constructor_tearoffs/callable_instantiation.dart:42:5: Error: The static type of the explicit instantiation operand must be a generic function type but is 'Function'.
+ - 'Function' is from 'dart:core'.
+Try changing the operand or remove the type arguments.
+ f3<int>; // error
+ ^";
+}
+static method Extension|call<T extends core::Object? = dynamic>(lowered final core::int #this) → dynamic {}
+static method Extension|get#call(lowered final core::int #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Extension|call<T%>(#this);
+static method ExtensionGetter|get#call(lowered final core::double #this) → <T extends core::Object? = dynamic>() → void
+ return <T extends core::Object? = dynamic>() → void {};
+static method ExtensionSetter|set#call(lowered final core::bool #this, <T extends core::Object? = dynamic>() → void value) → void {}
+static method Ambiguous1|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous1|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous1|call<T%>(#this);
+static method Ambiguous2|call<T extends core::Object? = dynamic>(lowered final core::String #this) → dynamic {}
+static method Ambiguous2|get#call(lowered final core::String #this) → <T extends core::Object? = dynamic>() → dynamic
+ return <T extends core::Object? = dynamic>() → dynamic => self::Ambiguous2|call<T%>(#this);
+static method main() → dynamic {
+ self::method<self::Class, core::int>(new self::Class::•(), 0, new self::Class::•(), 0);
+}
diff --git a/tests/language/explicit_type_instantiation_parsing_test.dart b/tests/language/explicit_type_instantiation_parsing_test.dart
index e0584e7..a7c748c 100644
--- a/tests/language/explicit_type_instantiation_parsing_test.dart
+++ b/tests/language/explicit_type_instantiation_parsing_test.dart
@@ -307,9 +307,7 @@
// Valid only if parenthesized.
expect1((Z < X, X >) < 4);
- // Still can't instantiate something non-generic.
- /**/ v<int>;
- // ^^^^^
- // [cfe] The static type of the explicit instantiation operand must be a generic function type but is 'Object?'.
- // [analyzer] unspecified
+ // Since `v` has type `Object?`, this is an extension invocation of the
+ // implicit `call` tear off.
+ /**/ v<int, String>;
}
diff --git a/tools/VERSION b/tools/VERSION
index 4f88fa0..b6ef0a3 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 15
PATCH 0
-PRERELEASE 180
+PRERELEASE 181
PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/test_generators/async_nested_test_generator.dart b/tools/test_generators/async_nested_test_generator.dart
index 658e917..b03a22f 100644
--- a/tools/test_generators/async_nested_test_generator.dart
+++ b/tools/test_generators/async_nested_test_generator.dart
@@ -39,7 +39,7 @@
String name = "async_nested_${maxSize}_${i}_test.dart";
asyncFile.renameSync(name);
print(" -> Created $name");
- print(" (you might want to run dartfmt -w $name).");
+ print(" (you might want to run 'dart format $name').");
}
}
}