Example #1
0
        public override void visit(desugared_deconstruction deconstruction)
        {
            var invokationTarget = convert_strong(deconstruction.deconstruction_target as expression);
            var types            = InferAndCheckPatternVariableTypes(deconstruction.variables.definitions, invokationTarget, deconstruction);

            if (types == null)
            {
                return;
            }

            foreach (var definition in deconstruction.WithTypes(types.Select(x => new semantic_type_node(x)).ToArray()))
            {
                definition.visit(this);
            }
        }
Example #2
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];
            }
        }
 /*public override void visit(PascalABCCompiler.SyntaxTree.exception_block fn)
  * {
  *  syntaxTreeVisitor.visit(fn);
  * }*/
 // Patterns
 public override void visit(desugared_deconstruction _desugared_deconstruction)
 {
     // позволяем вывести типы объявленных переменных
     syntaxTreeVisitor.visit(_desugared_deconstruction);
 }
Example #4
0
 public virtual void visit(desugared_deconstruction _desugared_deconstruction)
 {
     DefaultVisit(_desugared_deconstruction);
 }
 public override void visit(desugared_deconstruction dd)
 {
     DefaultVisit(dd);
 }