Ejemplo n.º 1
0
 //Добавляет интерфейс и всех его предков в список реализуемых данным классом.
 public static void AddInterface(common_type_node cnode, type_node _interface, location loc)
 {
     if (original_types_equals(_interface, cnode))
     {
         throw new TreeConverter.UndefinedNameReference(_interface.name, loc);
     }
     if (!_interface.IsInterface)
     {
         throw new TreeConverter.SimpleSemanticError(loc, "{0}_IS_NOT_INTERFACE", _interface.name);
     }
     if (_interface.ForwardDeclarationOnly)
     {
         throw new TreeConverter.SimpleSemanticError(loc, "FORWARD_DECLARATION_{0}_AS_IMPLEMENTING_INTERFACE", _interface.name);
     }
     if (!cnode.ImplementingInterfaces.Contains(_interface))
     {
         cnode.ImplementingInterfaces.Add(_interface);
         foreach (type_node tn in _interface.ImplementingInterfaces)
         {
             if (!cnode.ImplementingInterfaces.Contains(tn))
             {
                 cnode.ImplementingInterfaces.Add(tn);
             }
         }
     }
 }
Ejemplo n.º 2
0
 private static type_compare get_table_type_compare(type_node left, type_node right)
 {
     type_intersection_node[] tins = get_type_intersections(left, right);
     if (tins.Length == 0)
     {
         return(type_compare.non_comparable_type);
     }
     if (tins.Length == 1)
     {
         return(tins[0].type_compare);
     }
     if (tins.Length == 2)
     {
         type_compare tc1 = tins[0].type_compare;
         type_compare tc2 = tins[1].type_compare;
         if ((tc1 == type_compare.non_comparable_type) && (tc2 == type_compare.non_comparable_type))
         {
             return(type_compare.non_comparable_type);
         }
         if ((tc1 == type_compare.greater_type) && (tc2 == type_compare.less_type))
         {
             return(type_compare.greater_type);
         }
         if ((tc1 == type_compare.less_type) && (tc2 == type_compare.greater_type))
         {
             return(type_compare.less_type);
         }
         throw new PascalABCCompiler.TreeConverter.CompilerInternalError("Conflicting type comparsion");
     }
     return(type_compare.non_comparable_type);
 }
Ejemplo n.º 3
0
        private void ForeachCheckAndConvert(foreach_stmt _foreach_stmt, out expression_node foreachCollection,
                                            out var_definition_node foreachVariable)
        {
            var lambdaSearcher = new LambdaSearcher(_foreach_stmt.in_what);

            if (lambdaSearcher.CheckIfContainsLambdas())
            {
                AddError(new LambdasNotAllowedInForeachInWhatSatetement(get_location(lambdaSearcher.FoundLambda)));
            }

            foreachCollection = convert_strong(_foreach_stmt.in_what);

            expression_node tmp = convert_if_typed_expression_to_function_call(foreachCollection);

            if (tmp.type != null)
            {
                foreachCollection = tmp;
            }

            bool      sys_coll_ienum; // true означает, что мы нашли тип object у интерфейса System.Collections.IEnumerable
            type_node elem_type = null;

            if (!FindIEnumerableElementType(foreachCollection.type, ref elem_type, out sys_coll_ienum))
            {
                AddError(foreachCollection.location, "CAN_NOT_EXECUTE_FOREACH_BY_EXPR_OF_TYPE_{0}", foreachCollection.type.name);
            }

            CheckToEmbeddedStatementCannotBeADeclaration(_foreach_stmt.stmt);

            foreachVariable = FindForeachVariable(_foreach_stmt, elem_type, sys_coll_ienum);
        }
 public delegate_internal_interface(type_node return_value_type, function_node invoke_method,
                                    function_node constructor)
 {
     _return_value_type = return_value_type;
     _invoke_method     = invoke_method;
     _constructor       = constructor;
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Автовыведение типов в yield'ax.
        /// </summary>
        private void ProcessAssigntToAutoType(addressed_expression to, ref expression_node from)
        {
            var sequence = to.type as compiled_generic_instance_type_node;

            // SSM 26.06.16 - правка в связи с автовыведением типов в yieldах
            if (to.type is auto_type)
            {
                try_convert_typed_expression_to_function_call(ref from);
                if (to is class_field_reference)
                {
                    var cfr = to as class_field_reference;
                    cfr.field.type = from.type;
                    cfr.type       = from.type; // Это неверно работает когда yieldится процедура #1439
                    // SSM 1.11.18 попытка правки возвращения процедуры в yield
                    //if (from.type.semantic_node_type == semantic_node_type.delegated_method)

                    cfr.field.inital_value = context.GetInitalValueForVariable(cfr.field, cfr.field.inital_value);
                }
                else if (to is local_block_variable_reference)
                {
                    var lvr = to as local_block_variable_reference;
                    lvr.var.type         = from.type;
                    lvr.type             = from.type;
                    lvr.var.inital_value = context.GetInitalValueForVariable(lvr.var, lvr.var.inital_value);
                }
                else
                {
                    AddError(to.location, "Не могу вывести тип при наличии yield: " + to.type.full_name);
                }
                //to.type = from.type; // и без всякого real_type!
            }
            else if (sequence?.instance_params[0] is ienumerable_auto_type)
            {
                type_node elem_type = null;
                try_convert_typed_expression_to_function_call(ref from);
                bool bb; // здесь bb не нужно. Оно нужно в foreach
                var  b = FindIEnumerableElementType(from.type, ref elem_type, out bb);
                if (!b)
                {
                    AddError(from.location, "CAN_NOT_EXECUTE_FOREACH_BY_EXPR_OF_TYPE_{0}", from.type.full_name);
                }

                var IEnumType = new template_type_reference(new named_type_reference("System.Collections.Generic.IEnumerable"),
                                                            new template_param_list(new semantic_type_node(elem_type)));
                if (to is class_field_reference)
                {
                    var cfr = to as class_field_reference;

                    cfr.field.type = convert_strong(IEnumType);
                    cfr.type       = cfr.field.type;
                }
                else if (to is local_block_variable_reference)
                {
                    var lvr = to as local_block_variable_reference;

                    lvr.var.type = convert_strong(IEnumType); // замена типа у описания переменной
                    lvr.type     = lvr.var.type;              // замена типа у переменной
                }
            }
        }
Ejemplo n.º 6
0
        public static bool is_with_nil_allowed(type_node tn)
        {
            //(ssyy) переписал нормально, через switch

            switch (tn.type_special_kind)
            {
            case SemanticTree.type_special_kind.array_wrapper:
            case SemanticTree.type_special_kind.binary_file:
            case SemanticTree.type_special_kind.diap_type:
            case SemanticTree.type_special_kind.enum_kind:
            case SemanticTree.type_special_kind.set_type:
            case SemanticTree.type_special_kind.short_string:
            case SemanticTree.type_special_kind.text_file:
            case SemanticTree.type_special_kind.typed_file:
                return(false);

            default:
                if (tn == SystemLibrary.SystemLibInitializer.AbstractBinaryFileNode)
                {
                    return(false);
                }
                if (tn.is_generic_parameter)
                {
                    return(tn.is_class || tn.base_type != SystemLibrary.SystemLibrary.object_type && tn.base_type.is_class);
                }
                else if (tn is ref_type_node)
                {
                    return(true);
                }
                else
                {
                    return(!tn.is_value || tn is null_type_node);
                }
            }
        }
Ejemplo n.º 7
0
 public wrapped_common_type_node(PCUReader pr, type_node base_type, string name, SemanticTree.type_access_level type_access_level,
                                 common_namespace_node comprehensive_namespace, SymbolTable.ClassScope cs, location loc, int offset) :
     base(base_type, name, type_access_level, comprehensive_namespace, cs, loc)
 {
     this.pr     = pr;
     this.offset = offset;
 }
 public exception_filter(type_node filter_type, local_block_variable_reference exception_var,
                         statement_node exception_handler, location loc) : base(loc)
 {
     _filter_type       = filter_type;
     _exception_var     = exception_var;
     _exception_handler = exception_handler;
 }
 public void UpdateReturnType()
 {
     if (!_ret_type_generated)
     {
         type_node tn = _functions[0].return_value_type;
         int       i  = 1;
         while (i < _functions.Count)
         {
             if (_functions[i].return_value_type == tn)
             {
                 ++i;
             }
             else
             {
                 break;
             }
         }
         if (i == _functions.Count)
         {
             return_value_type = tn;
         }
         else
         {
             _ret_type_generated = true;
             return_value_type   = new indefinite_type_node();
         }
     }
 }
Ejemplo n.º 10
0
 public SymbolInfo(type_node value)
 {
     //reference = new SymbolInfo(value);
     _sym_info     = value;
     _access_level = access_level.al_public;
     _symbol_kind  = symbol_kind.sk_none;
 }
Ejemplo n.º 11
0
        /// <summary>
        /// Проверяет, подходит ли фаункция для вызова с указанными параметрами
        /// </summary>
        /// <param name="candidate"></param>
        /// <param name="givenParameterTypes">Типы параметров, указанные пользователем</param>
        /// <returns></returns>
        private bool IsSuitableFunction(
            function_node candidate,
            type_node[] givenParameterTypes,
            expression_node patternInstance,
            location deconstructionLocation,
            out type_node[] parameterTypes)
        {
            parameterTypes = new type_node[givenParameterTypes.Length];
            var selfParameter = candidate.is_extension_method ? candidate.parameters.First(IsSelfParameter) : null;

            Debug.Assert(!candidate.is_extension_method || selfParameter != null, "Couldn't find self parameter in extension method");
            var candidateParameterTypes =
                candidate.is_extension_method ?
                candidate.parameters.Where(x => !IsSelfParameter(x)).ToArray() :
                candidate.parameters.ToArray();

            if (candidateParameterTypes.Length != givenParameterTypes.Length)
            {
                return(false);
            }

            // Разрешаем только deconstruct текущего класса, родительские в расчет не берем
            if (candidate is common_method_node commonMethod && !AreTheSameType(patternInstance.type, commonMethod.cont_type))
            {
                return(false);
            }

            var genericDeduceNeeded = candidate.is_extension_method && candidate.is_generic_function;

            type_node[] deducedGenerics = new type_node[candidate.generic_parameters_count];
            if (genericDeduceNeeded)
            {
                // Выводим дженерики по self
                var nils           = new List <int>();
                var deduceSucceded = generic_convertions.DeduceInstanceTypes(selfParameter.type, patternInstance.type, deducedGenerics, nils);
                if (!deduceSucceded || deducedGenerics.Contains(null))
                {
                    return(false);
                }
            }

            for (int i = 0; i < givenParameterTypes.Length; i++)
            {
                var givenParameter     = givenParameterTypes[i];
                var candidateParameter = candidateParameterTypes[i].type;
                if (genericDeduceNeeded && (candidateParameter.is_generic_parameter || candidateParameter.is_generic_type_instance))
                {
                    candidateParameter = InstantiateParameter(candidateParameter, deducedGenerics);
                }

                if (givenParameter != null && !AreTheSameType(candidateParameter, givenParameter))
                {
                    return(false);
                }

                parameterTypes[i] = candidateParameter;
            }

            return(true);
        }
Ejemplo n.º 12
0
 public static type_definition ConvertSemanticTypeToSyntaxType(type_node semType)
 {
     // SSM 29/12/18 пробую скомбинировать
     //if (semType is compiled_type_node && !(semType as compiled_type_node).is_generic_type_definition && !(semType as compiled_type_node).is_generic_type_instance)
     //return new semantic_type_node(semType); // SSM 29/12/18 поменял на современное. Не получилось!
     //else
     return(OpenMP.ConvertToSyntaxType(semType)); // Это же надо! Пользоваться для этого хреновиной из OpenMP!!!
 }
        private static List <ident> GetTemplateParametersTypeDependsOn(type_node type)
        {
            if (type.generic_function_container != null)
            {
                return(new List <ident>
                {
                    new ident(type.name)
                });
            }

            var typeRef = type as ref_type_node;

            if (typeRef != null)
            {
                return(GetTemplateParametersTypeDependsOn(typeRef.pointed_type));
            }

            var typeIi = type.get_internal_interface(internal_interface_kind.unsized_array_interface) as array_internal_interface;

            if (typeIi != null)
            {
                return(GetTemplateParametersTypeDependsOn(typeIi.element_type));
            }

            if (type.type_special_kind == type_special_kind.set_type)
            {
                return(GetTemplateParametersTypeDependsOn(type.element_type));
            }

            if (type.IsDelegate)
            {
                var dii = type.get_internal_interface(internal_interface_kind.delegate_interface) as delegate_internal_interface;
                var res = new List <ident>();
                if (dii != null)
                {
                    var paramCount = dii.parameters.Count;
                    for (var i = 0; i < paramCount; i++)
                    {
                        res.AddRange(GetTemplateParametersTypeDependsOn(dii.parameters[i].type));
                    }
                }
                return(res);
            }

            if (type.is_generic_type_instance)
            {
                var pcount = type.instance_params.Count;
                var res    = new List <ident>();

                for (var i = 0; i < pcount; i++)
                {
                    res.AddRange(GetTemplateParametersTypeDependsOn(type.instance_params[i]));
                }
                return(res);
            }

            return(new List <ident>());
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Проверяет, подходит ли фаункция для вызова с указанными параметрами
        /// </summary>
        /// <param name="candidate"></param>
        /// <param name="givenParameterTypes">Типы параметров, указанные пользователем</param>
        /// <returns></returns>
        private bool IsSuitableFunction(
            function_node candidate,
            type_node[] givenParameterTypes,
            expression_node patternInstance,
            location deconstructionLocation,
            out type_node[] parameterTypes)
        {
            parameterTypes = new type_node[givenParameterTypes.Length];
            var selfParameter = candidate.is_extension_method ? candidate.parameters.First(IsSelfParameter) : null;

            Debug.Assert(!candidate.is_extension_method || selfParameter != null, "Couldn't find self parameter in extension method");
            var candidateParameterTypes =
                candidate.is_extension_method ?
                candidate.parameters.Where(x => !IsSelfParameter(x)).ToArray() :
                candidate.parameters.ToArray();

            if (candidateParameterTypes.Length != givenParameterTypes.Length)
            {
                return(false);
            }

            var genericDeduceNeeded = candidate.is_extension_method && candidate.is_generic_function;

            type_node[] deducedGenerics = new type_node[candidate.generic_parameters_count];
            if (genericDeduceNeeded)
            {
                // Выводим дженерики по self
                var nils           = new List <int>();
                var deduceSucceded = generic_convertions.DeduceInstanceTypes(selfParameter.type, patternInstance.type, deducedGenerics, nils);
                if (!deduceSucceded || deducedGenerics.Contains(null))
                {
                    // Проверка на то, что в Deconstruct все дженерики выводятся по self делается в другом месте
                    // TODO Patterns: сделать проверку из коммента выше
                    // TODO Patterns: запретить дженерик методы в классах. Можно использовать только дженерик-типы самого класса в качестве параметров
                    //AddError(deconstructionLocation, "COULDNT_DEDUCE_DECONSTRUCT_GENERIC_TYPE");
                    return(false);
                }
            }

            for (int i = 0; i < givenParameterTypes.Length; i++)
            {
                var givenParameter     = givenParameterTypes[i];
                var candidateParameter = candidateParameterTypes[i].type;
                if (genericDeduceNeeded && (candidateParameter.is_generic_parameter || candidateParameter.is_generic_type_instance))
                {
                    candidateParameter = InstantiateParameter(candidateParameter, deducedGenerics);
                }

                if (givenParameter != null && !AreTheSameType(candidateParameter, givenParameter))
                {
                    return(false);
                }

                parameterTypes[i] = candidateParameter;
            }

            return(true);
        }
 public bounded_array_interface(ordinal_type_interface oti, type_node element_type,
                                common_property_node index_property, type_node index_type, class_field int_array)
 {
     _oti            = oti;
     _element_type   = element_type;
     _index_property = index_property;
     _index_type     = index_type;
     _int_array      = int_array;
 }
Ejemplo n.º 16
0
 public class_field(string name, type_node type, common_type_node cont_class,
                    polymorphic_state polymorphic_state, field_access_level field_access_level,
                    location loc) :
     base(name, type)
 {
     _cont_class         = cont_class;
     _polymorphic_state  = polymorphic_state;
     _field_access_level = field_access_level;
     _loc = loc;
 }
        /// <summary>
        /// Поиск символа в пространстве имен.
        /// </summary>
        /// <param name="name">Имя для поиска.</param>
        /// <returns>Первый элемент списка найденных имен. null если ни чего не найдено.</returns>
        public override SymbolInfoList find(string name)
        {
            bool           is_ns = NetHelper.IsNetNamespace(_name + "." + name);
            SymbolInfoList sil   = null;

            if (is_ns)
            {
                compiled_namespace_node cnn = compiled_namespace_node.get_compiled_namespace(_name + "." + name, _tcst);
                sil = new SymbolInfoList(new SymbolInfo(cnn));
            }
            else
            {
                //Kolay changed next string.   throwOnError=false  ignoreCase=true,   .
                //Type t = Type.GetType(_name+"."+name,false,true);
                if (common_namespace != null)
                {
                    sil = common_namespace.scope.FindOnlyInScope(name);
                    if (sil != null)
                    {
                        return(sil);
                    }
                }
                Type t = NetHelper.FindType(_name + "." + name);
                if (t != null)
                {
                    sil = new SymbolInfoList(new SymbolInfo(compiled_type_node.get_type_node(t, _tcst)));
                }
                else
                {
                    t = NetHelper.FindType(_name + "." + _name);
                    if (t != null && NetHelper.IsEntryType(t))
                    {
                        sil = NetHelper.FindName(t, name);
                        if (sil == null)
                        {
                            type_node tn = NetHelper.FindCompiledPascalType(_name + "." + name);
                            if (tn != null)
                            {
                                sil = new SymbolInfoList(new SymbolInfo(tn));
                            }
                            else
                            {
                                template_class tc = NetHelper.FindCompiledTemplateType(_name + "." + name);
                                if (tc != null)
                                {
                                    sil = new SymbolInfoList(new SymbolInfo(tc));
                                }
                            }
                        }
                    }
                }
            }
            return(sil);
        }
Ejemplo n.º 18
0
 public common_parameter(string name, type_node tp, parameter_type pt,
                         common_function_node cont_function, concrete_parameter_type conc_par_type, expression_node default_value,
                         location loc) :
     base(name, tp)
 {
     _par_type                = pt;
     _cont_function           = cont_function;
     _concrete_parameter_type = conc_par_type;
     _default_value           = default_value;
     _loc = loc;
 }
Ejemplo n.º 19
0
 public common_namespace_event(string name, type_node del_type, common_namespace_node cont_namespace, common_namespace_function_node add_function, common_namespace_function_node remove_function, common_namespace_function_node raise_function,
                               location loc)
 {
     this._name            = name;
     this.del_type         = del_type;
     this._add_function    = add_function;
     this._remove_function = remove_function;
     this._raise_function  = raise_function;
     this._cont_namespace  = cont_namespace;
     this._loc             = loc;
 }
Ejemplo n.º 20
0
        private type_node[] InferAndCheckPatternVariableTypes(List <var_def_statement> variableDefinitions, expression_node patternInstance, desugared_deconstruction deconstruction)
        {
            var parameterTypes = variableDefinitions.Select(x => x.vars_type == null ? null : convert_strong(x.vars_type)).ToArray();
            List <function_node> candidates            = new List <function_node>();
            List <type_node[]>   deducedParametersList = new List <type_node[]>();
            var allDeconstructs = patternInstance.type.find_in_type(compiler_string_consts.deconstruct_method_name, context.CurrentScope);

            foreach (var canditateSymbol in allDeconstructs)
            {
                var deducedParameters = new type_node[parameterTypes.Length];
                var possibleCandidate = canditateSymbol.sym_info as function_node;
                if (!IsSuitableFunction(possibleCandidate, parameterTypes, patternInstance, get_location(deconstruction), out deducedParameters))
                {
                    continue;
                }

                deducedParametersList.Add(deducedParameters);
                candidates.Add(possibleCandidate);
            }

            if (candidates.Count == 0)
            {
                AddError(get_location(deconstruction), "NO_SUITABLE_DECONSTRUCT_FOUND");
                return(null);
            }
            else
            if (candidates.Count > 1)
            {
                RemoveDefaultDeconstruct(candidates);
                if (candidates.Count > 1 && !CheckIfParameterListElementsAreTheSame(deducedParametersList))
                {
                    AddError(get_location(deconstruction), "DECONSTRUCTOR_METHOD_AMBIGUITY");
                    return(null);
                }
            }

            // Единственный подхдящий кандидат найден, либо их несколько, с одинаковыми выходными параметрами
            var chosenFunction = candidates.First();

            if (chosenFunction.is_extension_method)
            {
                if (chosenFunction.is_generic_function)
                {
                    chosenFunction = generic_convertions.get_function_instance(chosenFunction, deducedParametersList.First().ToList());
                }

                return(chosenFunction.parameters.Where(x => !IsSelfParameter(x)).Select(x => x.type).ToArray());
            }
            else
            {
                return(chosenFunction.parameters.Select(x => x.type).ToArray());//deducedParametersList[0];
            }
        }
Ejemplo n.º 21
0
 public common_property_node(string name, common_type_node comprehensive_type, type_node property_type,
                             function_node get_function, function_node set_function, location loc,
                             SemanticTree.field_access_level field_access_level, SemanticTree.polymorphic_state polymorphic_state)
 {
     _name = name;
     _comprehensive_type = comprehensive_type;
     _property_type      = property_type;
     _get_function       = get_function;
     _set_function       = set_function;
     _loc = loc;
     _field_access_level = field_access_level;
     _polymorphic_state  = polymorphic_state;
 }
Ejemplo n.º 22
0
 public common_event(string name, type_node del_type, common_type_node cont_type, common_method_node add_method, common_method_node remove_method, common_method_node raise_method,
                     field_access_level fal, polymorphic_state ps, location loc)
 {
     this._name               = name;
     this.del_type            = del_type;
     this._add_method         = add_method;
     this._remove_method      = remove_method;
     this._raise_method       = raise_method;
     this._field_access_level = fal;
     this._polymorphic_state  = ps;
     this._cont_type          = cont_type;
     this._loc = loc;
 }
Ejemplo n.º 23
0
        private void make_unary_operator(string operator_name, compiled_type_node to,
                                         SemanticTree.basic_function_type bft, type_node ret_value_type)
        {
            parameterArrayList  pars = new parameterArrayList();
            basic_function_node bfn  = new basic_function_node(bft, pars, ret_value_type);

            bfn.is_overload = true;
            basic_parameter par = new basic_parameter(compiler_string_consts.unary_param_name, to,
                                                      SemanticTree.parameter_type.value, bfn);

            pars.Add(par);
            to.add_additional_name(operator_name, new SymbolInfo(bfn));
        }
Ejemplo n.º 24
0
 private void CheckType(type_node type, expression_node initial_value, location loc)
 {
     /*if (type.IsPointer && type.element_type.is_value_type && type.element_type is common_type_node)
      * {
      *  AddHint("DO_NOT_USE_POINTERS_TO_RECORDS", loc);
      * }*/
     if (type.type_special_kind == SemanticTree.type_special_kind.short_string && !(current_type != null && current_type.is_value))
     {
         AddHint("DO_NOT_USE_SHORT_STRINGS", loc);
     }
     else if (type.type_special_kind == SemanticTree.type_special_kind.array_kind || type.type_special_kind == SemanticTree.type_special_kind.array_wrapper)
     {
         CheckType(type.element_type, initial_value, loc);
     }
 }
Ejemplo n.º 25
0
        private var_definition_node FindForeachVariable(foreach_stmt _foreach_stmt, type_node elem_type, bool sys_coll_ienum)
        {
            var_definition_node foreachVariable = null;

            if (_foreach_stmt.type_name == null) // значит, переменная определена в другом месте
            {
                location        loc1 = get_location(_foreach_stmt.identifier);
                definition_node dn   = context.check_name_node_type(_foreach_stmt.identifier.name, loc1,
                                                                    general_node_type.variable_node);
                foreachVariable = (var_definition_node)dn;
                if (!check_name_in_current_scope(_foreach_stmt.identifier.name))
                {
                    AddError(loc1, "FOREACH_LOOP_CONTROL_MUST_BE_SIMPLE_LOCAL_VARIABLE");
                }
            }
            else
            {
                foreachVariable = context.add_var_definition(_foreach_stmt.identifier.name,
                                                             get_location(_foreach_stmt.identifier));

                type_node tn;
                if (_foreach_stmt.type_name is no_type_foreach) // значит, это for var x in a
                {
                    tn = elem_type;
                }
                else // значит, это for var x: T in a
                {
                    tn = convert_strong(_foreach_stmt.type_name);
                    check_for_type_allowed(tn, get_location(_foreach_stmt.type_name));
                    check_using_static_class(tn, get_location(_foreach_stmt.type_name));
                }
                if (tn.is_value_type && !tn.is_standard_type)
                {
                    context.close_var_definition_list(tn, new default_operator_node(tn, foreachVariable.location));
                }
                else
                {
                    context.close_var_definition_list(tn, null);
                }
            }

            if (/*!(foreachVariable.type is compiled_generic_instance_type_node) &&*/ !sys_coll_ienum) // SSM 16.09.18 - закомментировал это ограничение для фиксации бага #1184
            {
                convertion_data_and_alghoritms.check_convert_type_with_inheritance(elem_type, foreachVariable.type,
                                                                                   get_location(_foreach_stmt.identifier));
            }
            return(foreachVariable);
        }
Ejemplo n.º 26
0
        private void make_object_operator(common_type_node ctn, SemanticTree.basic_function_type bas_ft,
                                          string name, type_node ret_type, SemanticTree.parameter_type first_parameter_type)
        {
            parameterArrayList  pars = new parameterArrayList();
            basic_function_node bfn  = new basic_function_node(bas_ft, pars, ret_type);

            bfn.is_overload = true;
            basic_parameter to = new basic_parameter(compiler_string_consts.left_param_name, ctn,
                                                     first_parameter_type, bfn);
            basic_parameter from = new basic_parameter(compiler_string_consts.right_param_name, ctn,
                                                       SemanticTree.parameter_type.value, bfn);

            pars.Add(to);
            pars.Add(from);
            ctn.Scope.AddSymbol(name, new SymbolInfo(bfn));
        }
Ejemplo n.º 27
0
        private static type_intersection_node[] get_type_intersections(type_node left, type_node right)
        {
            type_intersection_node tin1 = left.get_type_intersection(right);
            type_intersection_node tin2 = right.get_type_intersection(left);

            if (tin1 == null)
            {
                if (tin2 == null)
                {
                    return(new type_intersection_node[0]);
                }
                else
                {
                    type_intersection_node[] tinarr  = new type_intersection_node[1];
                    type_intersection_node   new_tin = new type_intersection_node();

                    new_tin.another_to_this = tin2.another_to_this;
                    new_tin.this_to_another = tin2.this_to_another;
                    if (tin2.type_compare == type_compare.greater_type)
                    {
                        new_tin.type_compare = type_compare.less_type;
                    }
                    else
                    {
                        new_tin.type_compare = type_compare.greater_type;
                    }
                    tinarr[0] = new_tin;
                    return(tinarr);
                }
            }
            else
            {
                if (tin2 == null)
                {
                    type_intersection_node[] tinarr2 = new type_intersection_node[1];
                    tinarr2[0] = tin1;
                    return(tinarr2);
                }
                else
                {
                    type_intersection_node[] tinarr3 = new type_intersection_node[2];
                    tinarr3[0] = tin1;
                    tinarr3[1] = tin2;
                    return(tinarr3);
                }
            }
        }
Ejemplo n.º 28
0
        public static type_compare compare_types(type_node left, type_node right)
        {
            type_compare ret = get_table_type_compare(left, right);

            if (ret != type_compare.non_comparable_type)
            {
                return(ret);
            }
            if (is_derived(left, right))
            {
                return(type_compare.greater_type);
            }
            if (is_derived(right, left))
            {
                return(type_compare.less_type);
            }
            return(type_compare.non_comparable_type);
        }
Ejemplo n.º 29
0
        private string get_pointer_name(ref_type_node ctn)
        {
            type_node tn = ctn.pointed_type;
            int       i  = 1;

            while (tn is ref_type_node)
            {
                i++;
                tn = (tn as ref_type_node).pointed_type;
            }
            string s = get_name(tn);

            for (int j = 0; j < i; j++)
            {
                s += "*";
            }
            return(s);
        }
Ejemplo n.º 30
0
        private string get_dyn_array_name(common_type_node ctn)
        {
            type_node tn = ctn.element_type;
            int       i  = 1;

            while (tn.type_special_kind == SemanticTree.type_special_kind.array_kind)
            {
                i++;
                tn = tn.element_type;
            }
            string s = get_name(tn);

            for (int j = 0; j < i; j++)
            {
                s += "[]";
            }
            return(s);
        }
Ejemplo n.º 31
0
		private void make_unary_operator(string operator_name,compiled_type_node to,
			SemanticTree.basic_function_type bft,type_node ret_value_type)
		{
			parameterArrayList pars=new parameterArrayList();
			basic_function_node bfn=new basic_function_node(bft,pars,ret_value_type);
			bfn.is_overload=true;
			basic_parameter par=new basic_parameter(compiler_string_consts.unary_param_name,to,
				SemanticTree.parameter_type.value,bfn);
			pars.Add(par);
			to.add_additional_name(operator_name,new SymbolInfo(bfn));
		}
Ejemplo n.º 32
0
		private basic_function_node make_common_binary_operation(string operator_name,compiled_type_node def_type,compiled_type_node left,
			compiled_type_node right,SemanticTree.basic_function_type bft,type_node ret_value_type)
		{
			parameterArrayList pars=new parameterArrayList();
			basic_function_node bfn=new basic_function_node(bft,pars,ret_value_type);
			bfn.is_overload=true;
			basic_parameter par_left=new basic_parameter(compiler_string_consts.left_param_name,left,
				SemanticTree.parameter_type.value,bfn);
			basic_parameter par_right=new basic_parameter(compiler_string_consts.right_param_name,right,
				SemanticTree.parameter_type.value,bfn);
			pars.Add(par_left);
			pars.Add(par_right);
			def_type.add_additional_name(operator_name,new SymbolInfo(bfn));
			return bfn;
		}
Ejemplo n.º 33
0
		private basic_function_node make_binary_operator(string operator_name,compiled_type_node to,
			SemanticTree.basic_function_type bft,type_node ret_value_type)
		{
			/*parameterArrayList pars=new parameterArrayList();
			basic_function_node bfn=new basic_function_node(bft,pars,ret_value_type);
			basic_parameter par_left=new basic_parameter(compiler_string_consts.left_param_name,to,
				SemanticTree.parameter_type.value,bfn);
			basic_parameter par_right=new basic_parameter(compiler_string_consts.right_param_name,to,
				SemanticTree.parameter_type.value,bfn);
			pars.Add(par_left);
			pars.Add(par_right);
			to.add_additional_name(operator_name,new SymbolInfo(bfn));*/
			return make_common_binary_operation(operator_name,to,to,to,bft,ret_value_type);
		}
Ejemplo n.º 34
0
		private basic_function_node create_oti_method(SemanticTree.basic_function_type bft,type_node type)
		{
			parameterArrayList pal=new parameterArrayList();
			basic_function_node bfn=new basic_function_node(bft,pal,type);
			common_parameter cp=new common_parameter(compiler_string_consts.unary_param_name,type,
				SemanticTree.parameter_type.var,null);
			pal.Add(cp);
			bfn.is_overload=true;
			return bfn;
		}
Ejemplo n.º 35
0
		private void make_object_operator(common_type_node ctn,SemanticTree.basic_function_type bas_ft,
			string name,type_node ret_type,SemanticTree.parameter_type first_parameter_type)
		{
			parameterArrayList pars=new parameterArrayList();
			basic_function_node bfn=new basic_function_node(bas_ft,pars,ret_type);
			bfn.is_overload=true;
			basic_parameter to=new basic_parameter(compiler_string_consts.left_param_name,ctn,
				first_parameter_type,bfn);
			basic_parameter from=new basic_parameter(compiler_string_consts.right_param_name,ctn,
				SemanticTree.parameter_type.value,bfn);
			pars.Add(to);
			pars.Add(from);
			ctn.Scope.AddSymbol(name,new SymbolInfo(bfn));
		}
Ejemplo n.º 36
0
		private void make_object_operator(common_type_node ctn,SemanticTree.basic_function_type bas_ft,string name,
			type_node ret_type)
		{
			make_object_operator(ctn,bas_ft,name,ret_type,SemanticTree.parameter_type.value);
		}