OLD | NEW |
(Empty) | |
| 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 |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 /// API to get results from a static analysis of the source program. |
| 6 library compiler.src.stats.analysis_result; |
| 7 |
| 8 import '../tree/tree.dart' show Node; |
| 9 import '../universe/selector.dart' show Selector; |
| 10 |
| 11 /// A three-value logic bool (yes, no, maybe). We say that `yes` and `maybe` are |
| 12 /// "truthy", while `no` and `maybe` are "falsy". |
| 13 // TODO(sigmund): is it worth using an enum? or switch to true/false/null? |
| 14 enum Boolish { yes, no, maybe } |
| 15 |
| 16 /// Specifies results of some kind of static analysis on a source program. |
| 17 abstract class AnalysisResult { |
| 18 /// Information computed about a specific [receiver]. |
| 19 ReceiverInfo infoForReceiver(Node receiver); |
| 20 |
| 21 /// Information computed about a specific [selector] applied to a specific |
| 22 /// [receiver]. |
| 23 SelectorInfo infoForSelector(Node receiver, Selector selector); |
| 24 } |
| 25 |
| 26 /// Analysis information about a receiver of a send. |
| 27 abstract class ReceiverInfo { |
| 28 /// Receiver node for which this information is computed. |
| 29 Node get receiver; |
| 30 |
| 31 /// Return whether [receiver] resolves to a value that implements no such |
| 32 /// method. The answer is `yes` if all values that [receiver] could evaluate |
| 33 /// to at runtime contain it, or `no` if none of them does. Maybe if it |
| 34 /// depends on some context or we can't determine this information precisely. |
| 35 Boolish get hasNoSuchMethod; |
| 36 |
| 37 /// When [hasNoSuchMethod] is yes, the precise number of possible noSuchMethod |
| 38 /// handlers for this receiver. |
| 39 int get possibleNsmTargets; |
| 40 |
| 41 /// Return whether [receiver] may ever be null. |
| 42 Boolish get isNull; |
| 43 } |
| 44 |
| 45 /// Information about a specific selector applied to a specific receiver. |
| 46 abstract class SelectorInfo { |
| 47 /// Receiver node of the [selector]. |
| 48 Node get receiver; |
| 49 |
| 50 /// Specific selector on [receiver] for which this information is computed. |
| 51 Selector get selector; |
| 52 |
| 53 /// Whether a member matching [selector] exists in [receiver]. |
| 54 Boolish get exists; |
| 55 |
| 56 /// Whether [receiver] needs an interceptor to implement [selector]. |
| 57 Boolish get usesInterceptor; |
| 58 |
| 59 /// Possible total number of methods that could be the target of the selector. |
| 60 /// This needs to be combined with [isAccurate] to correctly understand the |
| 61 /// value. Some invariants: |
| 62 /// |
| 63 /// * If [exists] is `no`, the value here should be 0, regardless of |
| 64 /// accuracy. |
| 65 /// * If [exists] is `yes`, the value is always considered 1 or more. |
| 66 /// If [isAccurate] is false, we treat it as there may be many possible |
| 67 /// targets. |
| 68 /// * If [exists] is `maybe`, the value is considered 0 or more. |
| 69 int get possibleTargets; |
| 70 |
| 71 /// Whether the information about [possibleTargets] is accurate. |
| 72 bool get isAccurate; |
| 73 } |
OLD | NEW |