protected override void DefineCompiledCode() { var methods = decorated.methods.custom; var fields = decorated.variables.variables; for (int i = 0; i < fields.Count; i++) { var variable = decorated.variables.variables[i]; var field = FieldGenerator.Field(AccessModifier.Public, FieldModifier.None, variable.declaration.type, variable.name); field.Default(variable.declaration.defaultValue); @class.AddField(field); } for (int i = 0; i < methods.Count; i++) { var nest = decorated.methods.custom[i]; if (CanAddMethod(nest)) { var controlData = new ControlGenerationData(); controlData.returns = nest.entry.declaration.type; var body = nest.entry.invoke.hasAnyConnection ? (nest.entry.invoke.connection.destination?.unit as Unit).GenerateControl(nest.entry.invoke.connection.destination, controlData, 0) : string.Empty; var method = Method(nest.name, nest.entry.declaration.scope, nest.entry.declaration.modifier, nest.entry.declaration.type, body: body); AddParameters(method, nest); @class.AddMethod(method); } } var keys = decorated.methods.overrides.Keys().ToArray(); for (int i = 0; i < keys.Length; i++) { var nest = decorated.methods.overrides.current[keys[i]]; if (CanAddMethod(nest)) { var controlData = new ControlGenerationData(); controlData.returns = nest.entry.declaration.type; var body = nest.entry.invoke.hasAnyConnection? (nest.entry.invoke.connection.destination?.unit as Unit).GenerateControl(nest.entry.invoke.connection.destination, controlData, 0) : string.Empty; var method = nest.entry.declaration.type.Is().Void() ? Method( nest.name.Replace(" ", string.Empty), nest.entry.declaration.scope, MustOverride(nest) ? MethodModifier.Override : nest.entry.declaration.modifier, nest.entry.declaration.type, body: body ) : Method( nest.name.Replace(" ", string.Empty), nest.entry.declaration.scope, MustOverride(nest) ? MethodModifier.Override : nest.entry.declaration.modifier, nest.entry.declaration.type, body: body ); AddParameters(method, nest); @class.AddMethod(method); } } ; }
public override string GenerateControl(ControlInput input, ControlGenerationData data, int indent) { var destination = Unit.invoke.connection?.destination; if (!Unit.invoke.hasAnyConnection) { return("\n"); } return(NodeGenerator.GetSingleDecorator(destination.unit as Unit, destination.unit as Unit).GenerateControl(destination, data, indent)); }
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); }
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(Lasm.UAlive.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)); }
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("@int"); } 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}".NumericHighlight() + ":"; output += "\n"; var _controlData = new ControlGenerationData(); _controlData.returns = data.returns; _controlData.mustBreak = _controlData.returns == typeof(Lasm.UAlive.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.mustBreak = controlData.returns == typeof(Lasm.UAlive.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)); }