private void CreateCapturedFormalParamsNamesMap(ISet <string> formalParamsNames, IDictionary <string, string> captueedFormalParamsNamesMap) { foreach (var formalParamName in formalParamsNames) { captueedFormalParamsNamesMap.Add(formalParamName, CapturedNamesHelper.MakeCapturedFormalParameterName(formalParamName)); } }
// Лучше запретить yield в вложенных функциях и в функциях со вложенными! // Запретить-запретить-запретить public override void visit(procedure_definition pd) { // var u = UpperNode(3); // В случае отсутствия формальных параметров if ((object)pd.proc_header.parameters == null) { base.visit(pd.proc_body); return; } formalParametersStack.Add(new Dictionary <string, string>()); int currentLevel = formalParametersStack.Count - 1; foreach (var plist in pd.proc_header.parameters.params_list) { foreach (var id in plist.idents.idents) { var paramName = id.name; var hoistedParamName = CapturedNamesHelper.MakeCapturedFormalParameterName(id.name); formalParametersStack[currentLevel].Add(paramName, hoistedParamName); // Захват CollectedFormalParameters.Add(hoistedParamName, plist.vars_type); } } base.visit(pd.proc_body); formalParametersStack.RemoveAt(currentLevel); }
private void CreateCapturedLocalsNamesMap(ISet <string> localsNames, IDictionary <string, string> capturedLocalsNamesMap) { foreach (var localName in localsNames) { capturedLocalsNamesMap.Add(localName, CapturedNamesHelper.MakeCapturedLocalName(localName)); } }
public syntax_tree_node Convert(syntax_tree_node root) { // Прошивание ссылками на Parent nodes. Должно идти первым // FillParentNodeVisitor расположен в SyntaxTree/tree как базовый визитор, отвечающий за построение дерева //FillParentNodeVisitor.New.ProcessNode(root); // почему-то перепрошивает не всё. А следующий вызов - всё root.FillParentsInAllChilds(); // new range - до всего! До выноса выражения с лямбдой из foreach NewRangeDesugarVisitor.New.ProcessNode(root); // Unnamed Records перенёс сюда UnnamedRecordsCheckVisitor.New.ProcessNode(root); // Выносим выражения с лямбдами из заголовка foreach StandOutExprWithLambdaInForeachSequenceVisitor.New.ProcessNode(root); VarNamesInMethodsWithSameNameAsClassGenericParamsReplacer.New.ProcessNode(root); // SSM bug fix #1147 FindOnExceptVarsAndApplyRenameVisitor.New.ProcessNode(root); #if DEBUG //new SimplePrettyPrinterVisitor("E:/projs/out.txt").ProcessNode(root); #endif // loop LoopDesugarVisitor.New.ProcessNode(root); // tuple_node TupleVisitor.New.ProcessNode(root); // index IndexVisitor.New.ProcessNode(root); // assign_tuple и assign_var_tuple AssignTuplesDesugarVisitor.New.ProcessNode(root); // slice_expr и slice_expr_question SliceDesugarVisitor.New.ProcessNode(root); // question_point_desugar_visitor QuestionPointDesugarVisitor.New.ProcessNode(root); // double_question_desugar_visitor DoubleQuestionDesugarVisitor.New.ProcessNode(root); // Patterns // SingleDeconstructChecker.New.ProcessNode(root); // SSM 21.10.18 - пока разрешил множественные деконструкторы. Если будут проблемы - запретить ExtendedIsDesugaringVisitor.New.ProcessNode(root); // Десахаризация расширенного is, который используется в сложных логических выражениях PatternsDesugaringVisitor.New.ProcessNode(root); // Обязательно в этом порядке. // simple_property PropertyDesugarVisitor.New.ProcessNode(root); // Всё, связанное с yield CapturedNamesHelper.Reset(); MarkMethodHasYieldAndCheckSomeErrorsVisitor.New.ProcessNode(root); ProcessYieldCapturedVarsVisitor.New.ProcessNode(root); #if DEBUG //new SimplePrettyPrinterVisitor("D:\\Tree.txt").ProcessNode(root); //FillParentNodeVisitor.New.ProcessNode(root); /*var cv = CollectLightSymInfoVisitor.New; * cv.ProcessNode(root); * cv.Output(@"Light1.txt");*/ /*try * { * root.visit(new SimplePrettyPrinterVisitor(@"d:\\zzz1.txt")); * } * catch(Exception e) * { * * System.IO.File.AppendAllText(@"d:\\zzz1.txt",e.Message); * }*/ #endif return(root); }
public syntax_tree_node Convert(syntax_tree_node root) { // Прошивание ссылками на Parent nodes. Должно идти первым // FillParentNodeVisitor расположен в SyntaxTree/tree как базовый визитор, отвечающий за построение дерева //FillParentNodeVisitor.New.ProcessNode(root); // почему-то перепрошивает не всё. А следующий вызов - всё root.FillParentsInAllChilds(); // Выносим выражения с лямбдами из заголовка foreach StandOutExprWithLambdaInForeachSequenceVisitor.New.ProcessNode(root); // type classes - пока закомментировал SSM 20/10/18. Грязный кусок кода. FillParentsInAllChilds вызывается повторно /*{ * var typeclasses = SyntaxVisitors.TypeclassVisitors.FindTypeclassesVisitor.New; * typeclasses.ProcessNode(root); * var instancesAndRestrictedFunctions = SyntaxVisitors.TypeclassVisitors.FindInstancesAndRestrictedFunctionsVisitor.New(typeclasses.typeclasses); * instancesAndRestrictedFunctions.ProcessNode(root); * SyntaxVisitors.TypeclassVisitors.ReplaceTypeclassVisitor.New(instancesAndRestrictedFunctions).ProcessNode(root); * }*/ //root.FillParentsInAllChilds(); #if DEBUG //new SimplePrettyPrinterVisitor("E:/projs/out.txt").ProcessNode(root); #endif // loop LoopDesugarVisitor.New.ProcessNode(root); // tuple_node TupleVisitor.New.ProcessNode(root); // assign_tuple и assign_var_tuple AssignTuplesDesugarVisitor.New.ProcessNode(root); // slice_expr и slice_expr_question SliceDesugarVisitor.New.ProcessNode(root); // question_point_desugar_visitor QuestionPointDesugarVisitor.New.ProcessNode(root); // double_question_desugar_visitor DoubleQuestionDesugarVisitor.New.ProcessNode(root); // Patterns // SingleDeconstructChecker.New.ProcessNode(root); // SSM 21.10.18 - пока разрешил множественные деконструкторы. Если будут проблемы - запретить PatternsDesugaringVisitor.New.ProcessNode(root); // simple_property PropertyDesugarVisitor.New.ProcessNode(root); // Всё, связанное с yield CapturedNamesHelper.Reset(); MarkMethodHasYieldAndCheckSomeErrorsVisitor.New.ProcessNode(root); ProcessYieldCapturedVarsVisitor.New.ProcessNode(root); #if DEBUG //new SimplePrettyPrinterVisitor("D:\\Tree.txt").ProcessNode(root); //FillParentNodeVisitor.New.ProcessNode(root); /*var cv = CollectLightSymInfoVisitor.New; * cv.ProcessNode(root); * cv.Output(@"Light1.txt");*/ /*try * { * root.visit(new SimplePrettyPrinterVisitor(@"d:\\zzz4.txt")); * } * catch(Exception e) * { * * System.IO.File.AppendAllText(@"d:\\zzz4.txt",e.Message); * }*/ #endif return(root); }