Пример #1
0
 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);
        }
Пример #3
0
 private void CreateCapturedLocalsNamesMap(ISet <string> localsNames, IDictionary <string, string> capturedLocalsNamesMap)
 {
     foreach (var localName in localsNames)
     {
         capturedLocalsNamesMap.Add(localName, CapturedNamesHelper.MakeCapturedLocalName(localName));
     }
 }
Пример #4
0
        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);
        }