Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Unified Diff: pkg/dev_compiler/lib/src/compiler/code_generator.dart

Issue 2995813002: fix #30423, covariant parameter tearoff type should be Object (Closed)
Patch Set: Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/dev_compiler/lib/src/compiler/code_generator.dart
diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
index 51f3d76ec19a4b9a9dbd679595ec60f44cc7077e..9deaaa4fa053320d93a13df21a5d4f3fb4bdeee7 100644
--- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
@@ -14,9 +14,8 @@ import 'package:analyzer/dart/ast/token.dart' show Token, TokenType;
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/ast/token.dart' show StringToken;
-import 'package:analyzer/src/dart/element/element.dart'
- show FieldElementImpl, LocalVariableElementImpl;
-import 'package:analyzer/src/dart/element/type.dart' show DynamicTypeImpl;
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/dart/sdk/sdk.dart';
import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
import 'package:analyzer/src/generated/resolver.dart'
@@ -2021,11 +2020,9 @@ class CodeGenerator extends Object
lookup = classElem.type.lookUpInheritedSetter;
tMember = node.isStatic ? tStaticSetters : tInstanceSetters;
} else {
- // Method
- // Swap in "Object" for parameter types that are covariant overrides.
- var objectType = context.typeProvider.objectType;
- elementToType =
- (MethodElement element) => element.getReifiedType(objectType);
+ // Swap in "Object" for parameter types that are covariant, either via
+ // the `covariant` keyword or because of covariant generics.
+ elementToType = _getMemberRuntimeType;
getOverride = classElem.lookUpInheritedConcreteMethod;
lookup = classElem.type.lookUpInheritedMethod;
tMember = node.isStatic ? tStaticMethods : tInstanceMethods;
@@ -2191,6 +2188,24 @@ class CodeGenerator extends Object
}''', [params, params, body]);
}
+ FunctionType _getMemberRuntimeType(ExecutableElement element) {
+ // Check whether we have any covariant parameters.
+ // Usually we don't, so we can use the same type.
+ if (!element.parameters.any(_isCovariant)) return element.type;
+
+ var parameters = element.parameters
+ .map((p) => new ParameterElementImpl.synthetic(p.name,
+ _isCovariant(p) ? objectClass.type : p.type, p.parameterKind))
+ .toList();
+
+ var function = new FunctionElementImpl("", -1)
+ ..isSynthetic = true
+ ..returnType = element.returnType
+ ..shareTypeParameters(element.typeParameters)
+ ..parameters = parameters;
+ return function.type = new FunctionTypeImpl(function);
+ }
+
JS.Expression _constructorName(ConstructorElement ctor) {
var name = ctor.name;
if (name == '') {
@@ -2386,8 +2401,6 @@ class CodeGenerator extends Object
var parameters = _parametersOf(node);
if (parameters == null) return null;
- var covariantParams = _classProperties?.covariantParameters;
-
var body = <JS.Statement>[];
for (var param in parameters.parameters) {
var jsParam = _emitSimpleIdentifier(param.identifier);
@@ -2415,8 +2428,7 @@ class CodeGenerator extends Object
}
var paramElement = resolutionMap.elementDeclaredByFormalParameter(param);
- if (paramElement.isCovariant ||
- covariantParams != null && covariantParams.contains(paramElement)) {
+ if (_isCovariant(paramElement)) {
var castType = _emitType(paramElement.type);
body.add(js.statement('#._check(#);', [castType, jsParam]));
}
@@ -2424,6 +2436,12 @@ class CodeGenerator extends Object
return body.isEmpty ? null : _statement(body);
}
+ bool _isCovariant(ParameterElement p) {
+ if (p.isCovariant) return true;
+ var covariantParams = _classProperties?.covariantParameters;
+ return covariantParams != null && covariantParams.contains(p);
+ }
+
JS.Expression _defaultParamValue(FormalParameter param) {
if (param is DefaultFormalParameter && param.defaultValue != null) {
return _visit(param.defaultValue);

Powered by Google App Engine
This is Rietveld 408576698