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

Unified Diff: pkg/analyzer/lib/src/task/strong/checker.dart

Issue 1921823007: Make types concrete when checking overrides. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 8 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/analyzer/lib/src/task/strong/checker.dart
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 08d414b3d77c1973c180b4d5e7fe223cf63acffa..cf6b2f1ae8635123209e5307312d15fac116bdb6 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -104,13 +104,14 @@ class CodeChecker extends RecursiveAstVisitor {
final bool _hints;
bool _failure = false;
- CodeChecker(this.typeProvider, StrongTypeSystemImpl rules,
+ CodeChecker(TypeProvider typeProvider, StrongTypeSystemImpl rules,
AnalysisErrorListener reporter,
{bool hints: false})
- : rules = rules,
+ : typeProvider = typeProvider,
+ rules = rules,
reporter = reporter,
_hints = hints,
- _overrideChecker = new _OverrideChecker(rules, reporter);
+ _overrideChecker = new _OverrideChecker(typeProvider, rules, reporter);
bool get failure => _failure || _overrideChecker._failure;
@@ -956,9 +957,10 @@ class CodeChecker extends RecursiveAstVisitor {
class _OverrideChecker {
bool _failure = false;
final StrongTypeSystemImpl rules;
+ final TypeProvider _typeProvider;
final AnalysisErrorListener _reporter;
- _OverrideChecker(this.rules, this._reporter);
+ _OverrideChecker(this._typeProvider, this.rules, this._reporter);
void check(ClassDeclaration node) {
if (node.element.type.isObject) return;
@@ -1225,7 +1227,20 @@ class _OverrideChecker {
errorLocation, element, type, subType, baseType));
}
}
- if (!rules.isSubtypeOf(subType, baseType)) {
+ FunctionType concreteSubType = subType;
+ FunctionType concreteBaseType = baseType;
+ if (element is MethodElement) {
+ if (concreteSubType.typeFormals.isNotEmpty) {
+ if (concreteBaseType.typeFormals.isEmpty) {
+ concreteSubType = rules.instantiateToBounds(concreteSubType);
+ }
+ }
+ concreteSubType =
+ rules.typeToConcreteType(_typeProvider, concreteSubType);
+ concreteBaseType =
+ rules.typeToConcreteType(_typeProvider, concreteBaseType);
+ }
+ if (!rules.isSubtypeOf(concreteSubType, concreteBaseType)) {
// See whether non-subtype cases fit one of our common patterns:
//
// Common pattern 1: Inferable return type (on getters and methods)
« no previous file with comments | « pkg/analyzer/lib/src/generated/error_verifier.dart ('k') | pkg/analyzer/test/src/task/strong/checker_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698