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/universe.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 } | |
Johnni Winther
2015/07/13 19:21:43
'boolish' -> 'Boolish'
Siggi Cherem (dart-lang)
2015/09/29 01:39:33
Done.
| |
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 final int 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 |