private IAnalysisSet NumericOp(Node node, AnalysisUnit unit, Parsing.PythonOperator operation, IAnalysisSet rhs) { string methodName = InstanceInfo.BinaryOpToString(operation); if (methodName != null) { var method = GetMember(node, unit, methodName); if (method.Count > 0) { var res = method.Call( node, unit, new[] { this, rhs }, ExpressionEvaluator.EmptyNames ); if (res.IsObjectOrUnknown()) { // the type defines the operator, assume it returns // some combination of the input types. return(SelfSet.Union(rhs)); } return(res); } } return(base.BinaryOperation(node, unit, operation, rhs)); }
public override IAnalysisSet UnaryOperation(Node node, AnalysisUnit unit, Parsing.PythonOperator operation) { if (_original == null) { return(AnalysisSet.Empty); } return(_original.UnaryOperation(node, unit, operation)); }
public override IAnalysisSet BinaryOperation(Node node, AnalysisUnit unit, Parsing.PythonOperator operation, IAnalysisSet rhs) { if (_original == null) { return(base.BinaryOperation(node, unit, operation, rhs)); } return(_original.BinaryOperation(node, unit, operation, rhs)); }
public override IAnalysisSet BinaryOperation(Node node, AnalysisUnit unit, Parsing.PythonOperator operation, IAnalysisSet rhs) { var res = AnalysisSet.Empty; switch (operation) { case PythonOperator.Add: foreach (var type in rhs) { if (type.IsOfType(ClassInfo)) { res = res.Union(ClassInfo.Instance); } else { res = res.Union(type.ReverseBinaryOperation(node, unit, operation, SelfSet)); } } break; case PythonOperator.Mod: if (_supportsMod) { res = SelfSet; } break; case PythonOperator.Multiply: foreach (var type in rhs) { if (type.IsOfType(ProjectState.ClassInfos[BuiltinTypeId.Int]) || type.IsOfType(ProjectState.ClassInfos[BuiltinTypeId.Long])) { res = res.Union(ClassInfo.Instance); } else { var partialRes = ConstantInfo.NumericOp(node, this, unit, operation, rhs); if (partialRes != null) { res = res.Union(partialRes); } } } break; } if (res.Count == 0) { return(CallReverseBinaryOp(node, unit, operation, rhs)); } return(res); }