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

Side by Side Diff: lib/src/checker/rules.dart

Issue 1390903004: more housecleaning: remove DartRules and reportMissingType (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 5 years, 2 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 unified diff | Download patch
« no previous file with comments | « lib/src/checker/checker.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library dev_compiler.src.checker.rules; 5 library dev_compiler.src.checker.rules;
6 6
7 import 'package:analyzer/src/generated/ast.dart'; 7 import 'package:analyzer/src/generated/ast.dart';
8 import 'package:analyzer/src/generated/element.dart'; 8 import 'package:analyzer/src/generated/element.dart';
9 import 'package:analyzer/src/generated/resolver.dart'; 9 import 'package:analyzer/src/generated/resolver.dart';
10 10
11 import '../../strong_mode.dart' show StrongModeOptions; 11 import '../../strong_mode.dart' show StrongModeOptions;
12 import '../info.dart'; 12 import '../info.dart';
13 import '../utils.dart' as utils; 13 import '../utils.dart' as utils;
14 14
15 abstract class TypeRules { 15 abstract class TypeRules {
16 final TypeProvider provider; 16 final TypeProvider provider;
17 17
18 /// Map of fields / properties / methods on Object. 18 /// Map of fields / properties / methods on Object.
19 final Map<String, DartType> objectMembers; 19 final Map<String, DartType> objectMembers;
20 20
21 TypeRules(TypeProvider provider) 21 TypeRules(TypeProvider provider)
22 : provider = provider, 22 : provider = provider,
23 objectMembers = utils.getObjectMemberMap(provider); 23 objectMembers = utils.getObjectMemberMap(provider);
24 24
25 MissingTypeReporter reportMissingType;
26
27 bool isSubTypeOf(DartType t1, DartType t2); 25 bool isSubTypeOf(DartType t1, DartType t2);
28 bool isAssignable(DartType t1, DartType t2); 26 bool isAssignable(DartType t1, DartType t2);
29 27
30 bool isGroundType(DartType t) => true; 28 bool isGroundType(DartType t) => true;
31 // TODO(vsm): The default implementation is not ignoring the return type, 29 // TODO(vsm): The default implementation is not ignoring the return type,
32 // only the restricted override is. 30 // only the restricted override is.
33 bool isFunctionSubTypeOf(FunctionType f1, FunctionType f2, 31 bool isFunctionSubTypeOf(FunctionType f1, FunctionType f2,
34 {bool fuzzyArrows: true, bool ignoreReturn: false}) => 32 {bool fuzzyArrows: true, bool ignoreReturn: false}) =>
35 isSubTypeOf(f1, f2); 33 isSubTypeOf(f1, f2);
36 34
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 return type; 131 return type;
134 } else if (type is InterfaceType && type.element == expectedType.element) { 132 } else if (type is InterfaceType && type.element == expectedType.element) {
135 return type.typeArguments[0]; 133 return type.typeArguments[0];
136 } else { 134 } else {
137 // Malformed type - fallback on analyzer error. 135 // Malformed type - fallback on analyzer error.
138 return null; 136 return null;
139 } 137 }
140 } 138 }
141 } 139 }
142 140
143 // TODO(jmesserly): this is unused.
144 class DartRules extends TypeRules {
145 DartRules(TypeProvider provider) : super(provider);
146
147 MissingTypeReporter reportMissingType = null;
148
149 bool isSubTypeOf(DartType t1, DartType t2) {
150 return t1.isSubtypeOf(t2);
151 }
152
153 bool isAssignable(DartType t1, DartType t2) {
154 return t1.isAssignableTo(t2);
155 }
156
157 StaticInfo checkAssignment(Expression expr, DartType toType) {
158 final fromType = getStaticType(expr);
159 if (!isAssignable(fromType, toType)) {
160 return new StaticTypeError(this, expr, toType);
161 }
162 return null;
163 }
164
165 DartType elementType(Element e) {
166 return (e as dynamic).type;
167 }
168
169 /// By default, all invocations are dynamic in Dart.
170 bool isDynamic(DartType t) => true;
171 bool isDynamicTarget(Expression expr) => true;
172 bool isDynamicCall(Expression call) => true;
173 }
174
175 typedef void MissingTypeReporter(Expression expr);
176
177 class RestrictedRules extends TypeRules { 141 class RestrictedRules extends TypeRules {
178 MissingTypeReporter reportMissingType = null;
179 final StrongModeOptions options; 142 final StrongModeOptions options;
180 final List<DartType> _nonnullableTypes; 143 final List<DartType> _nonnullableTypes;
181 DownwardsInference inferrer; 144 DownwardsInference inferrer;
182 145
183 DartType _typeFromName(String name) { 146 DartType _typeFromName(String name) {
184 switch (name) { 147 switch (name) {
185 case 'int': 148 case 'int':
186 return provider.intType; 149 return provider.intType;
187 case 'double': 150 case 'double':
188 return provider.doubleType; 151 return provider.doubleType;
(...skipping 10 matching lines...) Expand all
199 162
200 RestrictedRules(TypeProvider provider, {this.options}) 163 RestrictedRules(TypeProvider provider, {this.options})
201 : _nonnullableTypes = <DartType>[], 164 : _nonnullableTypes = <DartType>[],
202 super(provider) { 165 super(provider) {
203 var types = options.nonnullableTypes; 166 var types = options.nonnullableTypes;
204 _nonnullableTypes.addAll(types.map(_typeFromName)); 167 _nonnullableTypes.addAll(types.map(_typeFromName));
205 inferrer = new DownwardsInference(this); 168 inferrer = new DownwardsInference(this);
206 } 169 }
207 170
208 DartType getStaticType(Expression expr) { 171 DartType getStaticType(Expression expr) {
209 var type = expr.staticType; 172 return expr.staticType ?? provider.dynamicType;
210 if (type != null) return type;
211 if (reportMissingType != null) reportMissingType(expr);
212 return provider.dynamicType;
213 } 173 }
214 174
215 bool _isBottom(DartType t, {bool dynamicIsBottom: false}) { 175 bool _isBottom(DartType t, {bool dynamicIsBottom: false}) {
216 if (t.isDynamic && dynamicIsBottom) return true; 176 if (t.isDynamic && dynamicIsBottom) return true;
217 // TODO(vsm): We need direct support for non-nullability in DartType. 177 // TODO(vsm): We need direct support for non-nullability in DartType.
218 // This should check on "true/nonnullable" Bottom 178 // This should check on "true/nonnullable" Bottom
219 if (t.isBottom && _nonnullableTypes.isEmpty) return true; 179 if (t.isBottom && _nonnullableTypes.isEmpty) return true;
220 return false; 180 return false;
221 } 181 }
222 182
(...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after
847 var entries = e.entries; 807 var entries = e.entries;
848 bool inferEntry(MapLiteralEntry entry) { 808 bool inferEntry(MapLiteralEntry entry) {
849 return _inferExpression(entry.key, kType, errors) && 809 return _inferExpression(entry.key, kType, errors) &&
850 _inferExpression(entry.value, vType, errors); 810 _inferExpression(entry.value, vType, errors);
851 } 811 }
852 var b = entries.every(inferEntry); 812 var b = entries.every(inferEntry);
853 if (b) annotateMapLiteral(e, targs); 813 if (b) annotateMapLiteral(e, targs);
854 return b; 814 return b;
855 } 815 }
856 } 816 }
OLDNEW
« no previous file with comments | « lib/src/checker/checker.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698