An `out` node shouldn't always exist. Primitive types cannot be modified in any way inside a method, while object types can.
An argument to a method call may be any kind of expression. In general, any literal expression, such as `1`, `null`, `""`, `true`, etc. will not have an `out` parameter. So we have to take care of the rest.
An `out` node should exist if there is a possibility to trace the value. And it only exists that possibility when the value comes from a **variable**
So, for the list of expressions that are not literal:
-`ArrayAccess (array[0])`: only if `array` is a variable
-`ArrayCreationExpr`: NO
-`ArrayInitializerExpr`: NO
-`BinaryExpr`: NO, it returns a value
-`CastExpr ((Cast) obj)`: only if `obj` is a variable
-`ClassExpr (obj.class)`: NO
-`ConditionalExpr (1?a:b)`: we'll have to check `a` and `b` expressions
-`FieldAccessExpr (obj.field)`: only if `obj` is a **variable**
-`InstanceOfExpr`: NO
-`MethodCallExpr (foo.bar(x))`: NO
-`NameExpr`: YES
-`ObjectCreationExpr`: NO
-`SuperExpr`: NO
-`ThisExpr`: NO
-`UnaryExpr (a++)`: we'll have to check if `a` is a variable