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);
        }
Example #2
0
        public syntax_tree_node Convert(syntax_tree_node root)
        {
            // Прошивание ссылками на Parent nodes. Должно идти первым
            // FillParentNodeVisitor расположен в SyntaxTree/tree как базовый визитор, отвечающий за построение дерева
            FillParentNodeVisitor.New.ProcessNode(root);

            // Выносим выражения с лямбдами из заголовка foreach
            StandOutExprWithLambdaInForeachSequenceVisitor.New.ProcessNode(root);

            // type classes

            {
                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
            PatternsDesugaringVisitor.New.ProcessNode(root);



            // Всё, связанное с yield
            MarkMethodHasYieldAndCheckSomeErrorsVisitor.New.ProcessNode(root);
            ProcessYieldCapturedVarsVisitor.New.ProcessNode(root);

#if DEBUG
            //new SimplePrettyPrinterVisitor("G:\\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
             * {
             *
             * }*/
#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);
        }