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); } }
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); }
public virtual void visit(desugared_deconstruction _desugared_deconstruction) { DefaultVisit(_desugared_deconstruction); }
public override void visit(desugared_deconstruction dd) { DefaultVisit(dd); }