| /******************************************************************************* |
| * Copyright (c) 2005, 2007 IBM Corporation and others. |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| |
| *******************************************************************************/ |
| package org.eclipse.dltk.python.internal.core.evaluation; |
| |
| import org.eclipse.dltk.ast.expressions.ExpressionConstants; |
| import org.eclipse.dltk.evaluation.types.ErrorDefinedType; |
| import org.eclipse.dltk.evaluation.types.SimpleType; |
| import org.eclipse.dltk.evaluation.types.UnknownType; |
| import org.eclipse.dltk.ti.types.IEvaluatedType; |
| |
| /** |
| * Used to handle binary expression type calculations. |
| */ |
| public class PythonBinaryExpressionOperations |
| { |
| |
| public static IEvaluatedType makeType( int left, int kind, int right ) { |
| |
| // left are number. |
| if( left == SimpleType.TYPE_NUMBER ) { // same types are |
| switch( kind ) { |
| case ExpressionConstants.E_PLUS: |
| case ExpressionConstants.E_MINUS: |
| case ExpressionConstants.E_MOD: |
| case ExpressionConstants.E_MULT: |
| if( right == SimpleType.TYPE_LIST ) { // FIXME: Only for |
| // integers.. |
| return new SimpleType( SimpleType.TYPE_LIST ); |
| } |
| if( right == SimpleType.TYPE_TUPLE ) { // FIXME: Only for |
| // integers.. |
| return new SimpleType( SimpleType.TYPE_TUPLE ); |
| } |
| case ExpressionConstants.E_DIV: |
| case ExpressionConstants.E_DOUBLE_ARROW: |
| case ExpressionConstants.E_POWER: |
| case ExpressionConstants.E_RSHIFT: |
| case ExpressionConstants.E_LSHIFT: |
| case ExpressionConstants.E_XOR: |
| if( right == SimpleType.TYPE_NUMBER ) { |
| return new SimpleType( SimpleType.TYPE_NUMBER ); |
| } |
| break; |
| // to boolean expressions. |
| case ExpressionConstants.E_GE: |
| case ExpressionConstants.E_LE: |
| case ExpressionConstants.E_GT: |
| case ExpressionConstants.E_LT: |
| case ExpressionConstants.E_EQUAL: |
| case ExpressionConstants.E_NOT_EQUAL: |
| case ExpressionConstants.E_NOT_EQUAL2: |
| if( right == SimpleType.TYPE_NUMBER ) { |
| return new SimpleType( SimpleType.TYPE_BOOLEAN ); |
| } |
| break; |
| // in expressions. |
| case ExpressionConstants.E_IN: |
| case ExpressionConstants.E_NOTIN: |
| if( right == SimpleType.TYPE_DICT ) { |
| return new SimpleType( SimpleType.TYPE_BOOLEAN ); |
| } |
| if( right == SimpleType.TYPE_LIST ) { |
| return new SimpleType( SimpleType.TYPE_BOOLEAN ); |
| } |
| if( right == SimpleType.TYPE_TUPLE ) { |
| return new SimpleType( SimpleType.TYPE_BOOLEAN ); |
| } |
| } |
| return ErrorDefinedType.INSTANCE; // Error other operations aren't |
| // supported. |
| } |
| // left are string |
| if( left == SimpleType.TYPE_STRING ) { // same types are |
| if( kind == ExpressionConstants.E_PLUS ) { |
| if( right == SimpleType.TYPE_STRING ) { |
| return new SimpleType( SimpleType.TYPE_STRING ); |
| } |
| } |
| if( kind == ExpressionConstants.E_MOD ) { // string % op. |
| if( right == SimpleType.TYPE_TUPLE ) { |
| return new SimpleType( SimpleType.TYPE_STRING ); |
| } |
| if( right == SimpleType.TYPE_DICT ) { |
| return new SimpleType( SimpleType.TYPE_STRING ); |
| } |
| // TODO: Add correct other types handling. |
| // Because it may be one argument such as instance or type, or |
| // also may be number or other string. |
| // But only if one % are pressent in string. So may be check it |
| // here? Or not here? |
| return new SimpleType( SimpleType.TYPE_STRING ); |
| } |
| if( kind == ExpressionConstants.E_MULT ) { |
| if( right == SimpleType.TYPE_NUMBER ) { |
| return new SimpleType( SimpleType.TYPE_STRING ); |
| } |
| } |
| return ErrorDefinedType.INSTANCE; // Other operations aren't |
| // supported. |
| } |
| // left are Tuple |
| if( left == SimpleType.TYPE_TUPLE ) { // same types are |
| switch( kind ) { |
| case ExpressionConstants.E_PLUS: |
| if( right == SimpleType.TYPE_TUPLE ) { |
| return new SimpleType( SimpleType.TYPE_TUPLE ); |
| } |
| break; |
| case ExpressionConstants.E_MULT: |
| if( right == SimpleType.TYPE_NUMBER ) { |
| return new SimpleType( SimpleType.TYPE_TUPLE ); |
| } |
| } |
| return ErrorDefinedType.INSTANCE; // Other operations aren't |
| // supported. |
| } |
| // left are List |
| if( left == SimpleType.TYPE_LIST ) { // same types are |
| switch( kind ) { |
| case ExpressionConstants.E_PLUS: |
| if( right == SimpleType.TYPE_LIST ) { |
| return new SimpleType( SimpleType.TYPE_LIST ); |
| } |
| break; |
| case ExpressionConstants.E_MULT: |
| if( right == SimpleType.TYPE_NUMBER ) { |
| return new SimpleType( SimpleType.TYPE_LIST ); |
| } |
| } |
| return ErrorDefinedType.INSTANCE; // Other operations aren't |
| // supported. |
| } |
| // if left are Dict. |
| if( left == SimpleType.TYPE_DICT ) { |
| |
| } |
| |
| return UnknownType.INSTANCE; // Not implemented or really unknown |
| } |
| |
| } |