@@ -2089,6 +2089,116 @@ def foo(x: list):
2089
2089
Assertions .assertThat (xType .unwrappedType ()).isSameAs (LIST_TYPE );
2090
2090
}
2091
2091
2092
+ @ Test
2093
+ void assignmentOrTest () {
2094
+ var yType = (UnionType ) lastExpression ("""
2095
+ def foo(x: int):
2096
+ y = x or "str"
2097
+ y
2098
+ """ ).typeV2 ();
2099
+
2100
+ Assertions .assertThat (yType .candidates ())
2101
+ .allMatch (ObjectType .class ::isInstance )
2102
+ .extracting (PythonType ::unwrappedType )
2103
+ .containsOnly (INT_TYPE , STR_TYPE );
2104
+ Assertions .assertThat (yType .typeSource ()).isSameAs (TypeSource .TYPE_HINT );
2105
+ }
2106
+
2107
+ @ Test
2108
+ void assignmentPlusTest () {
2109
+ var fileInput = inferTypes ("""
2110
+ class A: ...
2111
+ def foo(x: int, y: str):
2112
+ a = x + 1
2113
+ b = x + y
2114
+ c = A + x
2115
+ d = x + A
2116
+ e = 2 + 3
2117
+ a
2118
+ b
2119
+ c
2120
+ d
2121
+ e
2122
+ """ );
2123
+
2124
+ var statements = TreeUtils .firstChild (fileInput , FunctionDef .class ::isInstance )
2125
+ .map (FunctionDef .class ::cast )
2126
+ .map (FunctionDef ::body )
2127
+ .map (StatementList ::statements )
2128
+ .orElseGet (List ::of );
2129
+
2130
+ var aType = ((ExpressionStatement ) statements .get (statements .size () - 5 )).expressions ().get (0 ).typeV2 ();
2131
+ var bType = ((ExpressionStatement ) statements .get (statements .size () - 4 )).expressions ().get (0 ).typeV2 ();
2132
+ var cType = ((ExpressionStatement ) statements .get (statements .size () - 3 )).expressions ().get (0 ).typeV2 ();
2133
+ var dType = ((ExpressionStatement ) statements .get (statements .size () - 2 )).expressions ().get (0 ).typeV2 ();
2134
+ var eType = ((ExpressionStatement ) statements .get (statements .size () - 1 )).expressions ().get (0 ).typeV2 ();
2135
+
2136
+ Assertions .assertThat (aType .unwrappedType ()).isSameAs (INT_TYPE );
2137
+ Assertions .assertThat (aType .typeSource ()).isSameAs (TypeSource .TYPE_HINT );
2138
+
2139
+ Assertions .assertThat (bType ).isSameAs (PythonType .UNKNOWN );
2140
+ Assertions .assertThat (cType ).isSameAs (PythonType .UNKNOWN );
2141
+ Assertions .assertThat (dType ).isSameAs (PythonType .UNKNOWN );
2142
+
2143
+ Assertions .assertThat (eType .unwrappedType ()).isSameAs (INT_TYPE );
2144
+ Assertions .assertThat (eType .typeSource ()).isSameAs (TypeSource .EXACT );
2145
+ }
2146
+
2147
+ @ Test
2148
+ void assignmentPlusTest2 () {
2149
+ var fileInput = inferTypes ("""
2150
+ class A: ...
2151
+ def foo(x):
2152
+ if x:
2153
+ t = int
2154
+ else:
2155
+ t = str
2156
+ a = t()
2157
+ b = 1 + a
2158
+ c = a + 1
2159
+ a
2160
+ b
2161
+ c
2162
+ """ );
2163
+
2164
+ var statements = TreeUtils .firstChild (fileInput , FunctionDef .class ::isInstance )
2165
+ .map (FunctionDef .class ::cast )
2166
+ .map (FunctionDef ::body )
2167
+ .map (StatementList ::statements )
2168
+ .orElseGet (List ::of );
2169
+
2170
+ var aType = ((ExpressionStatement ) statements .get (statements .size () - 3 )).expressions ().get (0 ).typeV2 ();
2171
+ var bType = ((ExpressionStatement ) statements .get (statements .size () - 2 )).expressions ().get (0 ).typeV2 ();
2172
+ var cType = ((ExpressionStatement ) statements .get (statements .size () - 1 )).expressions ().get (0 ).typeV2 ();
2173
+
2174
+ Assertions .assertThat (aType ).isInstanceOf (ObjectType .class );
2175
+ Assertions .assertThat (aType .unwrappedType ()).isInstanceOf (UnionType .class );
2176
+ var candidates = ((UnionType ) aType .unwrappedType ()).candidates ();
2177
+ Assertions .assertThat (candidates ).containsOnly (INT_TYPE , STR_TYPE );
2178
+
2179
+ Assertions .assertThat (bType ).isSameAs (PythonType .UNKNOWN );
2180
+ Assertions .assertThat (cType ).isSameAs (PythonType .UNKNOWN );
2181
+ }
2182
+
2183
+ @ Test
2184
+ void assignmentMinusTest () {
2185
+ var fileInput = inferTypes ("""
2186
+ def foo():
2187
+ f = 2 - 3
2188
+ f
2189
+ """ );
2190
+
2191
+ var statements = TreeUtils .firstChild (fileInput , FunctionDef .class ::isInstance )
2192
+ .map (FunctionDef .class ::cast )
2193
+ .map (FunctionDef ::body )
2194
+ .map (StatementList ::statements )
2195
+ .orElseGet (List ::of );
2196
+
2197
+ var fType = ((ExpressionStatement ) statements .get (statements .size () - 1 )).expressions ().get (0 ).typeV2 ();
2198
+ Assertions .assertThat (fType ).isSameAs (PythonType .UNKNOWN );
2199
+ }
2200
+
2201
+
2092
2202
private static FileInput inferTypes (String lines ) {
2093
2203
return inferTypes (lines , PROJECT_LEVEL_TYPE_TABLE );
2094
2204
}
0 commit comments