OLD | NEW |
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`. |
(...skipping 1299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1310 KernelMember member, Member overriddenMember) { | 1310 KernelMember member, Member overriddenMember) { |
1311 if (member._accessorNode != null) { | 1311 if (member._accessorNode != null) { |
1312 member._accessorNode.crossOverrides.add(overriddenMember); | 1312 member._accessorNode.crossOverrides.add(overriddenMember); |
1313 } | 1313 } |
1314 } | 1314 } |
1315 | 1315 |
1316 static void recordOverride(KernelMember member, Member overriddenMember) { | 1316 static void recordOverride(KernelMember member, Member overriddenMember) { |
1317 if (member._accessorNode != null) { | 1317 if (member._accessorNode != null) { |
1318 member._accessorNode.overrides.add(overriddenMember); | 1318 member._accessorNode.overrides.add(overriddenMember); |
1319 } | 1319 } |
| 1320 if (member is KernelProcedure && member._methodNode != null) { |
| 1321 member._methodNode.overrides.add(overriddenMember); |
| 1322 } |
1320 } | 1323 } |
1321 } | 1324 } |
1322 | 1325 |
1323 /// Shadow object for [MethodInvocation]. | 1326 /// Shadow object for [MethodInvocation]. |
1324 class KernelMethodInvocation extends MethodInvocation | 1327 class KernelMethodInvocation extends MethodInvocation |
1325 implements KernelExpression { | 1328 implements KernelExpression { |
1326 /// Indicates whether this method invocation is a call to a `call` method | 1329 /// Indicates whether this method invocation is a call to a `call` method |
1327 /// resulting from the invocation of a function expression. | 1330 /// resulting from the invocation of a function expression. |
1328 final bool _isImplicitCall; | 1331 final bool _isImplicitCall; |
1329 | 1332 |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1468 inferrer.listener.nullLiteralExit(this, inferredType); | 1471 inferrer.listener.nullLiteralExit(this, inferredType); |
1469 return inferredType; | 1472 return inferredType; |
1470 } | 1473 } |
1471 } | 1474 } |
1472 | 1475 |
1473 /// Concrete shadow object representing a procedure in kernel form. | 1476 /// Concrete shadow object representing a procedure in kernel form. |
1474 class KernelProcedure extends Procedure implements KernelMember { | 1477 class KernelProcedure extends Procedure implements KernelMember { |
1475 @override | 1478 @override |
1476 AccessorNode _accessorNode; | 1479 AccessorNode _accessorNode; |
1477 | 1480 |
| 1481 MethodNode _methodNode; |
| 1482 |
1478 @override | 1483 @override |
1479 KernelTypeInferrer _typeInferrer; | 1484 KernelTypeInferrer _typeInferrer; |
1480 | 1485 |
| 1486 final bool _hasImplicitReturnType; |
| 1487 |
1481 KernelProcedure(Name name, ProcedureKind kind, FunctionNode function, | 1488 KernelProcedure(Name name, ProcedureKind kind, FunctionNode function, |
| 1489 this._hasImplicitReturnType, |
1482 {String fileUri}) | 1490 {String fileUri}) |
1483 : super(name, kind, function, fileUri: fileUri); | 1491 : super(name, kind, function, fileUri: fileUri); |
1484 | 1492 |
1485 @override | 1493 @override |
1486 void setInferredType( | 1494 void setInferredType( |
1487 TypeInferenceEngineImpl engine, String uri, DartType inferredType) { | 1495 TypeInferenceEngineImpl engine, String uri, DartType inferredType) { |
1488 if (isSetter) { | 1496 if (isSetter) { |
1489 if (function.positionalParameters.length > 0) { | 1497 if (function.positionalParameters.length > 0) { |
1490 var parameter = function.positionalParameters[0]; | 1498 var parameter = function.positionalParameters[0]; |
1491 engine.instrumentation?.record(Uri.parse(uri), parameter.fileOffset, | 1499 engine.instrumentation?.record(Uri.parse(uri), parameter.fileOffset, |
1492 'topType', new InstrumentationValueForType(inferredType)); | 1500 'topType', new InstrumentationValueForType(inferredType)); |
1493 parameter.type = inferredType; | 1501 parameter.type = inferredType; |
1494 } | 1502 } |
1495 } else if (isGetter) { | 1503 } else if (isGetter) { |
1496 engine.instrumentation?.record(Uri.parse(uri), fileOffset, 'topType', | 1504 engine.instrumentation?.record(Uri.parse(uri), fileOffset, 'topType', |
1497 new InstrumentationValueForType(inferredType)); | 1505 new InstrumentationValueForType(inferredType)); |
1498 function.returnType = inferredType; | 1506 function.returnType = inferredType; |
1499 } else { | 1507 } else { |
1500 internalError( | 1508 internalError( |
1501 'setInferredType called on a procedure that is not an accessor'); | 1509 'setInferredType called on a procedure that is not an accessor'); |
1502 } | 1510 } |
1503 } | 1511 } |
| 1512 |
| 1513 static MethodNode getMethodNode(Procedure procedure) { |
| 1514 if (procedure is KernelProcedure) return procedure._methodNode; |
| 1515 return null; |
| 1516 } |
| 1517 |
| 1518 static bool hasImplicitReturnType(KernelProcedure procedure) { |
| 1519 return procedure._hasImplicitReturnType; |
| 1520 } |
1504 } | 1521 } |
1505 | 1522 |
1506 /// Concrete shadow object representing an assignment to a property. | 1523 /// Concrete shadow object representing an assignment to a property. |
1507 class KernelPropertyAssign extends KernelComplexAssignmentWithReceiver { | 1524 class KernelPropertyAssign extends KernelComplexAssignmentWithReceiver { |
1508 /// If this assignment uses null-aware access (`?.`), the conditional | 1525 /// If this assignment uses null-aware access (`?.`), the conditional |
1509 /// expression that guards the access; otherwise `null`. | 1526 /// expression that guards the access; otherwise `null`. |
1510 Expression nullAwareGuard; | 1527 Expression nullAwareGuard; |
1511 | 1528 |
1512 KernelPropertyAssign(Expression receiver, Expression rhs, | 1529 KernelPropertyAssign(Expression receiver, Expression rhs, |
1513 {bool isSuper: false}) | 1530 {bool isSuper: false}) |
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1932 } | 1949 } |
1933 | 1950 |
1934 @override | 1951 @override |
1935 KernelTypeInferrer createLocalTypeInferrer( | 1952 KernelTypeInferrer createLocalTypeInferrer( |
1936 Uri uri, TypeInferenceListener listener, InterfaceType thisType) { | 1953 Uri uri, TypeInferenceListener listener, InterfaceType thisType) { |
1937 return new KernelTypeInferrer._( | 1954 return new KernelTypeInferrer._( |
1938 this, uri.toString(), listener, false, thisType, null); | 1955 this, uri.toString(), listener, false, thisType, null); |
1939 } | 1956 } |
1940 | 1957 |
1941 @override | 1958 @override |
| 1959 MethodNode createMethodNode(KernelProcedure procedure) { |
| 1960 MethodNode methodNode = new MethodNode(procedure); |
| 1961 procedure._methodNode = methodNode; |
| 1962 return methodNode; |
| 1963 } |
| 1964 |
| 1965 @override |
1942 KernelTypeInferrer createTopLevelTypeInferrer(TypeInferenceListener listener, | 1966 KernelTypeInferrer createTopLevelTypeInferrer(TypeInferenceListener listener, |
1943 InterfaceType thisType, KernelMember member) { | 1967 InterfaceType thisType, KernelMember member) { |
1944 return member._typeInferrer = new KernelTypeInferrer._( | 1968 return member._typeInferrer = new KernelTypeInferrer._( |
1945 this, member.fileUri, listener, true, thisType, member._accessorNode); | 1969 this, member.fileUri, listener, true, thisType, member._accessorNode); |
1946 } | 1970 } |
1947 | 1971 |
1948 @override | 1972 @override |
1949 KernelTypeInferrer getMemberTypeInferrer(KernelMember member) { | 1973 KernelTypeInferrer getMemberTypeInferrer(KernelMember member) { |
1950 return member._typeInferrer; | 1974 return member._typeInferrer; |
1951 } | 1975 } |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2280 } | 2304 } |
2281 | 2305 |
2282 transformChildren(v) { | 2306 transformChildren(v) { |
2283 return internalError("Internal error: Unsupported operation."); | 2307 return internalError("Internal error: Unsupported operation."); |
2284 } | 2308 } |
2285 | 2309 |
2286 visitChildren(v) { | 2310 visitChildren(v) { |
2287 return internalError("Internal error: Unsupported operation."); | 2311 return internalError("Internal error: Unsupported operation."); |
2288 } | 2312 } |
2289 } | 2313 } |
OLD | NEW |