Ejemplo n.º 1
0
        private void BuildVariableUsages(
            AST.Node node,
            AST.FunctionDeclaration parent,
            IDictionary <AST.VariableDeclaration, HashSet <AST.FunctionDeclaration> > result)
        {
            var newParent = parent;

            switch (node)
            {
            case AST.FunctionDeclaration declaration:
            {
                newParent = declaration;
                break;
            }

            case AST.VariableDeclaration declaration:
            {
                if (!result.ContainsKey(declaration))
                {
                    result.Add(declaration, new HashSet <AST.FunctionDeclaration>());
                }

                result[declaration].Add(parent);
                break;
            }

            case AST.Variable variable:
            {
                if (!result.ContainsKey(variable.Declaration))
                {
                    result.Add(variable.Declaration, new HashSet <AST.FunctionDeclaration>());
                }

                result[variable.Declaration].Add(parent);
                break;
            }
            }

            foreach (var child in node.Children())
            {
                this.BuildVariableUsages(child, newParent, result);
            }
        }
Ejemplo n.º 2
0
        private void TraverseTree(
            AST.Node node,
            IReadOnlyDictionary <AST.VariableDeclaration, HashSet <AST.FunctionDeclaration> > variableUsages,
            Function parentFunction = null)
        {
            switch (node)
            {
            case AST.FunctionDeclaration functionDeclaration:
            {
                var function = FunctionBuilder.CreateFunction(functionDeclaration, parentFunction);
                functionDeclaration.Function = function;
                foreach (var argument in functionDeclaration.Parameters)
                {
                    argument.IntermediateVariable = this.ReserveLocation(function, variableUsages, argument);
                }

                if (functionDeclaration.Body != null)
                {
                    this.TraverseTree(functionDeclaration.Body, variableUsages, function);
                }

                return;
            }

            case AST.VariableDeclaration variableDeclaration:
            {
                variableDeclaration.IntermediateVariable = this.ReserveLocation(parentFunction, variableUsages, variableDeclaration);
                break;
            }
            }

            foreach (var child in node.Children())
            {
                this.TraverseTree(child, variableUsages, parentFunction);
            }
        }