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

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart

Issue 2828253003: Add top level type inference logic for integer literals. (Closed)
Patch Set: Clean up, bug fix, and remove unintentional expectations changes Created 3 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, 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 /// This file declares a "shadow hierarchy" of concrete classes which extend 5 /// This file declares a "shadow hierarchy" of concrete classes which extend
6 /// the kernel class hierarchy, adding methods and fields needed by the 6 /// the kernel class hierarchy, adding methods and fields needed by the
7 /// BodyBuilder. 7 /// BodyBuilder.
8 /// 8 ///
9 /// Instances of these classes may be created using the factory methods in 9 /// Instances of these classes may be created using the factory methods in
10 /// `ast_factory.dart`. 10 /// `ast_factory.dart`.
11 /// 11 ///
12 /// Note that these classes represent the Dart language prior to desugaring. 12 /// Note that these classes represent the Dart language prior to desugaring.
13 /// When a single Dart construct desugars to a tree containing multiple kernel 13 /// When a single Dart construct desugars to a tree containing multiple kernel
14 /// AST nodes, the shadow class extends the kernel object at the top of the 14 /// AST nodes, the shadow class extends the kernel object at the top of the
15 /// desugared tree. 15 /// desugared tree.
16 /// 16 ///
17 /// This means that in some cases multiple shadow classes may extend the same 17 /// This means that in some cases multiple shadow classes may extend the same
18 /// kernel class, because multiple constructs in Dart may desugar to a tree 18 /// kernel class, because multiple constructs in Dart may desugar to a tree
19 /// with the same kind of root node. 19 /// with the same kind of root node.
20 import 'package:front_end/src/base/instrumentation.dart'; 20 import 'package:front_end/src/base/instrumentation.dart';
21 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart'; 21 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
22 import 'package:kernel/ast.dart'; 22 import 'package:kernel/ast.dart';
23 import 'package:kernel/class_hierarchy.dart';
24 import 'package:kernel/core_types.dart';
25 23
26 /// Concrete shadow object representing a statement block in kernel form. 24 /// Concrete shadow object representing a statement block in kernel form.
27 class KernelBlock extends Block implements KernelStatement { 25 class KernelBlock extends Block implements KernelStatement {
28 KernelBlock(List<Statement> statements) : super(statements); 26 KernelBlock(List<Statement> statements) : super(statements);
29 27
30 @override 28 @override
31 void _inferStatement(KernelTypeInferrer inferrer) { 29 void _inferStatement(KernelTypeInferrer inferrer) {
32 for (var statement in statements) { 30 for (var statement in statements) {
33 inferrer.inferStatement(statement); 31 inferrer.inferStatement(statement);
34 } 32 }
35 } 33 }
36 } 34 }
37 35
38 /// Common base class for shadow objects representing expressions in kernel 36 /// Common base class for shadow objects representing expressions in kernel
39 /// form. 37 /// form.
40 abstract class KernelExpression implements Expression { 38 abstract class KernelExpression implements Expression {
41 /// Calls back to [inferrer] to perform type inference for whatever concrete 39 /// Calls back to [inferrer] to perform type inference for whatever concrete
42 /// type of [KernelExpression] this is. 40 /// type of [KernelExpression] this is.
43 DartType _inferExpression( 41 DartType _inferExpression(
44 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded); 42 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded);
45 } 43 }
46 44
45 /// Concrete shadow object representing a field in kernel form.
46 class KernelField extends Field {
47 bool _implicitlyTyped = true;
48
49 FieldNode<KernelField> _fieldNode;
50
51 bool _isInferred = false;
52
53 KernelField(Name name, {String fileUri}) : super(name, fileUri: fileUri) {}
54
55 @override
56 void set type(DartType value) {
57 _implicitlyTyped = false;
58 super.type = value;
59 }
60
61 String get _fileUri {
62 // TODO(paulberry): This is a hack. We should use this.fileUri, because we
63 // want the URI of the compilation unit. But that gives a relative URI,
64 // and I don't know what it's relative to or how to convert it to an
65 // absolute URI.
66 return enclosingLibrary.importUri.toString();
67 }
68
69 void _setInferredType(DartType inferredType) {
70 _isInferred = true;
71 super.type = inferredType;
72 }
73 }
74
47 /// Concrete shadow object representing a function expression in kernel form. 75 /// Concrete shadow object representing a function expression in kernel form.
48 class KernelFunctionExpression extends FunctionExpression 76 class KernelFunctionExpression extends FunctionExpression
49 implements KernelExpression { 77 implements KernelExpression {
50 KernelFunctionExpression(FunctionNode function) : super(function); 78 KernelFunctionExpression(FunctionNode function) : super(function);
51 79
52 @override 80 @override
53 DartType _inferExpression( 81 DartType _inferExpression(
54 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 82 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
55 // TODO(paulberry): implement. 83 // TODO(paulberry): implement.
56 return typeNeeded ? const DynamicType() : null; 84 return typeNeeded ? const DynamicType() : null;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 } 131 }
104 132
105 /// Common base class for shadow objects representing statements in kernel 133 /// Common base class for shadow objects representing statements in kernel
106 /// form. 134 /// form.
107 abstract class KernelStatement extends Statement { 135 abstract class KernelStatement extends Statement {
108 /// Calls back to [inferrer] to perform type inference for whatever concrete 136 /// Calls back to [inferrer] to perform type inference for whatever concrete
109 /// type of [KernelStatement] this is. 137 /// type of [KernelStatement] this is.
110 void _inferStatement(KernelTypeInferrer inferrer); 138 void _inferStatement(KernelTypeInferrer inferrer);
111 } 139 }
112 140
141 /// Concrete shadow object representing a read of a static variable in kernel
142 /// form.
143 class KernelStaticGet extends StaticGet implements KernelExpression {
144 KernelStaticGet(Member target) : super(target);
145
146 @override
147 DartType _inferExpression(
148 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
149 return inferrer.inferStaticGet(typeContext, typeNeeded, target.getterType);
150 }
151 }
152
113 /// Concrete implementation of [TypeInferrer] specialized to work with kernel 153 /// Concrete implementation of [TypeInferrer] specialized to work with kernel
114 /// objects. 154 /// objects.
115 class KernelTypeInferrer extends TypeInferrer<Statement, Expression, 155 class KernelTypeInferrer extends TypeInferrer<Statement, Expression,
116 KernelVariableDeclaration, Field> { 156 KernelVariableDeclaration, KernelField> {
117 KernelTypeInferrer(CoreTypes coreTypes, ClassHierarchy classHierarchy, 157 KernelTypeInferrer(Instrumentation instrumentation, bool strongMode)
118 Instrumentation instrumentation, bool strongMode) 158 : super(instrumentation, strongMode);
119 : super(coreTypes, classHierarchy, instrumentation, strongMode); 159
160 @override
161 void clearFieldInitializer(KernelField field) {
162 field.initializer = null;
163 }
164
165 @override
166 FieldNode<KernelField> createFieldNode(KernelField field) {
167 FieldNode<KernelField> fieldNode = new FieldNode<KernelField>(this, field);
168 field._fieldNode = fieldNode;
169 return fieldNode;
170 }
171
172 @override
173 DartType getFieldDeclaredType(KernelField field) {
174 return field._implicitlyTyped ? null : field.type;
175 }
176
177 @override
178 List<FieldNode<KernelField>> getFieldDependencies(KernelField field) {
179 return field._fieldNode?.dependencies;
180 }
181
182 @override
183 Expression getFieldInitializer(KernelField field) {
184 return field.initializer;
185 }
186
187 @override
188 FieldNode<KernelField> getFieldNodeForReadTarget(Member readTarget) {
189 if (readTarget is KernelField) {
190 return readTarget._fieldNode;
191 } else {
192 return null;
193 }
194 }
195
196 @override
197 int getFieldOffset(KernelField field) {
198 return field.fileOffset;
199 }
200
201 @override
202 String getFieldUri(KernelField field) {
203 return field._fileUri;
204 }
120 205
121 @override 206 @override
122 DartType inferExpression( 207 DartType inferExpression(
123 Expression expression, DartType typeContext, bool typeNeeded) { 208 Expression expression, DartType typeContext, bool typeNeeded) {
124 if (expression is KernelExpression) { 209 if (expression is KernelExpression) {
125 // Use polymorphic dispatch on [KernelExpression] to perform whatever kind 210 // Use polymorphic dispatch on [KernelExpression] to perform whatever kind
126 // of type inference is correct for this kind of statement. 211 // of type inference is correct for this kind of statement.
127 // TODO(paulberry): experiment to see if dynamic dispatch would be better, 212 // TODO(paulberry): experiment to see if dynamic dispatch would be better,
128 // so that the type hierarchy will be simpler (which may speed up "is" 213 // so that the type hierarchy will be simpler (which may speed up "is"
129 // checks). 214 // checks).
(...skipping 16 matching lines...) Expand all
146 // so that the type hierarchy will be simpler (which may speed up "is" 231 // so that the type hierarchy will be simpler (which may speed up "is"
147 // checks). 232 // checks).
148 return statement._inferStatement(this); 233 return statement._inferStatement(this);
149 } else { 234 } else {
150 // Encountered a statement type for which type inference is not yet 235 // Encountered a statement type for which type inference is not yet
151 // implemented, so just skip it for now. 236 // implemented, so just skip it for now.
152 // TODO(paulberry): once the BodyBuilder uses shadow classes for 237 // TODO(paulberry): once the BodyBuilder uses shadow classes for
153 // everything, this case should no longer be needed. 238 // everything, this case should no longer be needed.
154 } 239 }
155 } 240 }
241
242 @override
243 bool isFieldInferred(KernelField field) {
244 return field._isInferred;
245 }
246
247 @override
248 void setFieldInferredType(KernelField field, DartType inferredType) {
249 field._setInferredType(inferredType);
250 }
156 } 251 }
157 252
158 /// Concrete shadow object representing a variable declaration in kernel form. 253 /// Concrete shadow object representing a variable declaration in kernel form.
159 class KernelVariableDeclaration extends VariableDeclaration 254 class KernelVariableDeclaration extends VariableDeclaration
160 implements KernelStatement { 255 implements KernelStatement {
161 final bool _implicitlyTyped; 256 final bool _implicitlyTyped;
162 257
163 KernelVariableDeclaration(String name, 258 KernelVariableDeclaration(String name,
164 {Expression initializer, 259 {Expression initializer,
165 DartType type, 260 DartType type,
(...skipping 20 matching lines...) Expand all
186 KernelVariableGet(VariableDeclaration variable, [DartType promotedType]) 281 KernelVariableGet(VariableDeclaration variable, [DartType promotedType])
187 : super(variable, promotedType); 282 : super(variable, promotedType);
188 283
189 @override 284 @override
190 DartType _inferExpression( 285 DartType _inferExpression(
191 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { 286 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
192 // TODO(paulberry): implement. 287 // TODO(paulberry): implement.
193 return typeNeeded ? const DynamicType() : null; 288 return typeNeeded ? const DynamicType() : null;
194 } 289 }
195 } 290 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698