Example #1
0
        public override string GenerateControl(ControlInput input, ControlGenerationData data, int indent)
        {
            var output = string.Empty;

            data.hasBroke = true;

            if (input == Unit.enter)
            {
                return(CodeBuilder.Indent(indent) + "break".ConstructHighlight() + ";");
            }

            return(base.GenerateControl(input, data, indent));
        }
        public override string GenerateControl(ControlInput input, ControlGenerationData data, int indent)
        {
            var output = string.Empty;

            var trueData = new ControlGenerationData()
            {
                mustBreak = data.mustBreak, mustReturn = data.mustReturn, returns = data.returns
            };
            var falseData = new ControlGenerationData()
            {
                mustBreak = data.mustBreak, mustReturn = data.mustReturn, returns = data.returns
            };

            if (input == Unit.enter)
            {
                output += CodeBuilder.Indent(indent) + "if".ConstructHighlight() + " (" + GenerateValue(Unit.condition) + ")";
                output += "\n";
                output += CodeBuilder.OpenBody(indent);
                output += "\n";
                output += (Unit.ifTrue.hasAnyConnection ? (Unit.ifTrue.connection.destination.unit as Unit).GenerateControl(Unit.ifTrue.connection.destination, trueData, indent + 1) : string.Empty);
                output += "\n";
                output += CodeBuilder.CloseBody(indent);

                if (Unit.ifFalse.hasAnyConnection)
                {
                    output += "\n";
                    output += CodeBuilder.Indent(indent) + "else".ConstructHighlight();
                    output += "\n";
                    output += CodeBuilder.OpenBody(indent);
                    output += "\n";

                    output += (Unit.ifFalse.hasAnyConnection ? (Unit.ifFalse.connection.destination.unit as Unit).GenerateControl(Unit.ifFalse.connection.destination, falseData, indent + 1) : string.Empty);
                    output += "\n";
                    output += CodeBuilder.CloseBody(indent);
                }
            }

            if (data.mustBreak)
            {
                if (!trueData.hasBroke || !falseData.hasBroke)
                {
                    data.hasBroke = false;
                }
                else
                {
                    data.hasBroke = true;
                }
            }

            return(output);
        }
Example #3
0
 public static string GenerateControl <T>(this T node, ControlInput input, ControlGenerationData data, int indent) where T : Unit
 {
     return(NodeGenerator <T> .GetSingleDecorator(node, node).GenerateControl(input, data, indent));
 }
        public override string GenerateControl(ControlInput input, ControlGenerationData data, int indent)
        {
            var output = string.Empty;

            if (input == Unit.enter)
            {
                var values    = Unit.branches;
                var outputs   = Unit.outputs.ToArray();
                var isLiteral = Unit.selector.hasValidConnection && Unit.selector.connection.source.unit as Literal != null;
                var localName = string.Empty;
                if (isLiteral)
                {
                    localName = data.AddLocalName("str");
                }
                var newLiteral = isLiteral ? CodeBuilder.Indent(indent) + "var ".ConstructHighlight() + $"{localName} = " + ((Unit)Unit.selector.connection.source.unit).GenerateValue(Unit.selector.connection.source) + ";" : string.Empty;
                var @enum      = Unit.selector.hasValidConnection ? (isLiteral ? localName : ((Unit)Unit.selector.connection.source.unit).GenerateValue(Unit.selector.connection.source)) : base.GenerateControl(input, data, indent);

                if (isLiteral)
                {
                    output += newLiteral + "\n";
                }
                output += CodeBuilder.Indent(indent) + "switch".ConstructHighlight() + $" ({@enum})";
                output += "\n";
                output += CodeBuilder.Indent(indent) + "{";
                output += "\n";

                for (int i = 0; i < values.Count; i++)
                {
                    var _connection = ((ControlOutput)outputs[i])?.connection;

                    output += CodeBuilder.Indent(indent + 1) + "case ".ConstructHighlight() + $@" ""{values[i].Key}""".StringHighlight() + ":";
                    output += "\n";

                    var _controlData = new ControlGenerationData();
                    _controlData.returns    = data.returns;
                    _controlData.hasBroke   = data.hasBroke;
                    _controlData.mustBreak  = _controlData.returns == typeof(Void);
                    _controlData.mustReturn = !_controlData.mustBreak;
                    _controlData.localNames = data.localNames;

                    if (((ControlOutput)outputs[i]).hasValidConnection)
                    {
                        output += ((Unit)_connection.destination.unit).GenerateControl(_connection.destination as ControlInput, _controlData, indent + 2);
                        output += "\n";
                    }

                    if (_controlData.mustBreak && !_controlData.hasBroke)
                    {
                        output += CodeBuilder.Indent(indent + 2) + "/* Case Must Break */".WarningHighlight() + "\n";
                    }
                    if (_controlData.mustReturn && !_controlData.hasReturned)
                    {
                        output += CodeBuilder.Indent(indent + 2) + "/* Case Must Return or Break */".WarningHighlight() + "\n";
                    }
                }

                var connection = [email protected];

                output += CodeBuilder.Indent(indent + 1) + "default ".ConstructHighlight() + ":";
                output += "\n";

                var controlData = new ControlGenerationData();
                controlData.returns    = data.returns;
                controlData.hasBroke   = data.hasBroke;
                controlData.mustBreak  = controlData.returns == typeof(Void);
                controlData.mustReturn = !controlData.mustBreak;
                controlData.localNames = data.localNames;

                if ([email protected])
                {
                    output += ((Unit)connection.destination.unit).GenerateControl(connection.destination as ControlInput, controlData, indent + 2);
                    output += "\n";
                }

                if (controlData.mustBreak && !controlData.hasBroke)
                {
                    output += CodeBuilder.Indent(indent + 2) + "/* Case Must Break */".WarningHighlight() + "\n";
                }
                if (controlData.mustReturn && !controlData.hasReturned)
                {
                    output += CodeBuilder.Indent(indent + 2) + "/* Case Must Return or Break */".WarningHighlight() + "\n";
                }

                output += CodeBuilder.Indent(indent) + "}";
                output += "\n";

                return(output);
            }

            return(base.GenerateControl(input, data, indent));
        }
 public virtual string GenerateControl(ControlInput input, ControlGenerationData data, int indent)
 {
     return(CodeBuilder.Indent(indent) + $"/* Port '{ input.key }' of '{ input.unit.GetType().Name }' Missing Generator. */");
 }
Example #6
0
        public override string GenerateControl(ControlInput input, ControlGenerationData data, int indent)
        {
            var output = string.Empty;

            if (input == Unit.enter)
            {
                var values    = Unit.enumType.GetEnumValues();
                var outputs   = Unit.outputs.ToArray();
                var isLiteral = [email protected] && [email protected] as Literal != null;
                var localName = string.Empty;
                if (isLiteral)
                {
                    localName = data.AddLocalName("@enum");
                }
                var newLiteral = isLiteral ? CodeBuilder.Indent(indent) + "var ".ConstructHighlight() + localName + " = " + ((Unit)[email protected]).GenerateValue([email protected]) : string.Empty;
                var @enum      = [email protected] ? (isLiteral ? localName : ((Unit)[email protected]).GenerateValue([email protected])) : base.GenerateControl(input, data, indent);

                if (isLiteral)
                {
                    output += newLiteral + "\n";
                }
                output += CodeBuilder.Indent(indent) + "switch".ConstructHighlight() + " (" + @enum + ")";
                output += "\n";
                output += CodeBuilder.Indent(indent) + "{";
                output += "\n";

                for (int i = 0; i < values.Length; i++)
                {
                    var connection = ((ControlOutput)outputs[i])?.connection;

                    output += CodeBuilder.Indent(indent + 1) + "case ".ConstructHighlight() + Unit.enumType.Name.EnumHighlight() + "." + values.GetValue(i).ToString() + ":";
                    output += "\n";

                    var controlData = new ControlGenerationData();
                    controlData.returns    = data.returns;
                    controlData.mustBreak  = controlData.returns == typeof(Void);
                    controlData.mustReturn = !controlData.mustBreak;
                    controlData.localNames = data.localNames;

                    if (((ControlOutput)outputs[i]).hasValidConnection)
                    {
                        output += ((Unit)connection.destination.unit).GenerateControl(connection.destination as ControlInput, controlData, indent + 2);
                        output += "\n";
                    }

                    if (controlData.mustBreak && !controlData.hasBroke)
                    {
                        output += CodeBuilder.Indent(indent + 2) + "/* Case Must Break */".WarningHighlight() + "\n";
                    }
                    if (controlData.mustReturn && !controlData.hasReturned)
                    {
                        output += CodeBuilder.Indent(indent + 2) + "/* Case Must Return or Break */".WarningHighlight() + "\n";
                    }
                }

                output += CodeBuilder.Indent(indent) + "}";
                output += "\n";

                return(output);
            }

            return(base.GenerateControl(input, data, indent));
        }