1 | // Copyright 2021 The Go Authors. All rights reserved. |
---|---|
2 | // Use of this source code is governed by a BSD-style |
3 | // license that can be found in the LICENSE file. |
4 | |
5 | // Code generated by copytermlist.go DO NOT EDIT. |
6 | |
7 | package typeparams |
8 | |
9 | import "go/types" |
10 | |
11 | // A term describes elementary type sets: |
12 | // |
13 | // β : (*term)(nil) == β // set of no types (empty set) |
14 | // π€: &term{} == π€ // set of all types (π€niverse) |
15 | // T: &term{false, T} == {T} // set of type T |
16 | // ~t: &term{true, t} == {t' | under(t') == t} // set of types with underlying type t |
17 | // |
18 | type term struct { |
19 | tilde bool // valid if typ != nil |
20 | typ types.Type |
21 | } |
22 | |
23 | func (x *term) String() string { |
24 | switch { |
25 | case x == nil: |
26 | return "β " |
27 | case x.typ == nil: |
28 | return "π€" |
29 | case x.tilde: |
30 | return "~" + x.typ.String() |
31 | default: |
32 | return x.typ.String() |
33 | } |
34 | } |
35 | |
36 | // equal reports whether x and y represent the same type set. |
37 | func (x *term) equal(y *term) bool { |
38 | // easy cases |
39 | switch { |
40 | case x == nil || y == nil: |
41 | return x == y |
42 | case x.typ == nil || y.typ == nil: |
43 | return x.typ == y.typ |
44 | } |
45 | // β β x, y β π€ |
46 | |
47 | return x.tilde == y.tilde && types.Identical(x.typ, y.typ) |
48 | } |
49 | |
50 | // union returns the union x βͺ y: zero, one, or two non-nil terms. |
51 | func (x *term) union(y *term) (_, _ *term) { |
52 | // easy cases |
53 | switch { |
54 | case x == nil && y == nil: |
55 | return nil, nil // β βͺ β == β |
56 | case x == nil: |
57 | return y, nil // β βͺ y == y |
58 | case y == nil: |
59 | return x, nil // x βͺ β == x |
60 | case x.typ == nil: |
61 | return x, nil // π€ βͺ y == π€ |
62 | case y.typ == nil: |
63 | return y, nil // x βͺ π€ == π€ |
64 | } |
65 | // β β x, y β π€ |
66 | |
67 | if x.disjoint(y) { |
68 | return x, y // x βͺ y == (x, y) if x β© y == β |
69 | } |
70 | // x.typ == y.typ |
71 | |
72 | // ~t βͺ ~t == ~t |
73 | // ~t βͺ T == ~t |
74 | // T βͺ ~t == ~t |
75 | // T βͺ T == T |
76 | if x.tilde || !y.tilde { |
77 | return x, nil |
78 | } |
79 | return y, nil |
80 | } |
81 | |
82 | // intersect returns the intersection x β© y. |
83 | func (x *term) intersect(y *term) *term { |
84 | // easy cases |
85 | switch { |
86 | case x == nil || y == nil: |
87 | return nil // β β© y == β and β© β == β |
88 | case x.typ == nil: |
89 | return y // π€ β© y == y |
90 | case y.typ == nil: |
91 | return x // x β© π€ == x |
92 | } |
93 | // β β x, y β π€ |
94 | |
95 | if x.disjoint(y) { |
96 | return nil // x β© y == β if x β© y == β |
97 | } |
98 | // x.typ == y.typ |
99 | |
100 | // ~t β© ~t == ~t |
101 | // ~t β© T == T |
102 | // T β© ~t == T |
103 | // T β© T == T |
104 | if !x.tilde || y.tilde { |
105 | return x |
106 | } |
107 | return y |
108 | } |
109 | |
110 | // includes reports whether t β x. |
111 | func (x *term) includes(t types.Type) bool { |
112 | // easy cases |
113 | switch { |
114 | case x == nil: |
115 | return false // t β β == false |
116 | case x.typ == nil: |
117 | return true // t β π€ == true |
118 | } |
119 | // β β x β π€ |
120 | |
121 | u := t |
122 | if x.tilde { |
123 | u = under(u) |
124 | } |
125 | return types.Identical(x.typ, u) |
126 | } |
127 | |
128 | // subsetOf reports whether x β y. |
129 | func (x *term) subsetOf(y *term) bool { |
130 | // easy cases |
131 | switch { |
132 | case x == nil: |
133 | return true // β β y == true |
134 | case y == nil: |
135 | return false // x β β == false since x != β |
136 | case y.typ == nil: |
137 | return true // x β π€ == true |
138 | case x.typ == nil: |
139 | return false // π€ β y == false since y != π€ |
140 | } |
141 | // β β x, y β π€ |
142 | |
143 | if x.disjoint(y) { |
144 | return false // x β y == false if x β© y == β |
145 | } |
146 | // x.typ == y.typ |
147 | |
148 | // ~t β ~t == true |
149 | // ~t β T == false |
150 | // T β ~t == true |
151 | // T β T == true |
152 | return !x.tilde || y.tilde |
153 | } |
154 | |
155 | // disjoint reports whether x β© y == β . |
156 | // x.typ and y.typ must not be nil. |
157 | func (x *term) disjoint(y *term) bool { |
158 | if debug && (x.typ == nil || y.typ == nil) { |
159 | panic("invalid argument(s)") |
160 | } |
161 | ux := x.typ |
162 | if y.tilde { |
163 | ux = under(ux) |
164 | } |
165 | uy := y.typ |
166 | if x.tilde { |
167 | uy = under(uy) |
168 | } |
169 | return !types.Identical(ux, uy) |
170 | } |
171 |
Members