public void TranslateExplicitCastNode(ExplicitCastNode node) { // Translate all the pure nodes this node depends on in // the correct order TranslateDependentPureNodes(node); // Try to cast the incoming object and go to next states. // If no pin is connected fail by default. if (node.ObjectToCast.IncomingPin != null) { string pinToCastName = GetPinIncomingValue(node.ObjectToCast); builder.AppendLine($"if ({pinToCastName} is {node.CastType.FullCodeNameUnbound})"); builder.AppendLine("{"); builder.AppendLine($"{GetOrCreatePinName(node.CastPin)} = ({node.CastType.FullCodeNameUnbound}){pinToCastName};"); WriteGotoOutputPin(node.CastSuccessPin); builder.AppendLine("}"); builder.AppendLine("else"); } if (node.CastFailedPin.OutgoingPin != null) { WriteGotoOutputPin(node.CastFailedPin); } else { builder.AppendLine("return;"); } }
public void TranslateExplicitCastNode(ExplicitCastNode node) { if (!node.IsPure) { // Translate all the pure nodes this node depends on in // the correct order TranslateDependentPureNodes(node); } // Try to cast the incoming object and go to next states. if (node.ObjectToCast.IncomingPin != null) { string pinToCastName = GetPinIncomingValue(node.ObjectToCast); string outputName = GetOrCreatePinName(node.CastPin); // If failure pin is not connected write explicit cast that throws. // Otherwise check if cast object is null and execute failure // path if it is. if (node.IsPure || node.CastFailedPin.OutgoingPin == null) { builder.AppendLine($"{outputName} = ({node.CastType.FullCodeNameUnbound}){pinToCastName};"); if (!node.IsPure) { WriteGotoOutputPinIfNecessary(node.CastSuccessPin, node.InputExecPins[0]); } } else { builder.AppendLine($"{outputName} = {pinToCastName} as {node.CastType.FullCodeNameUnbound};"); if (!node.IsPure) { builder.AppendLine($"if ({outputName} is null)"); builder.AppendLine("{"); WriteGotoOutputPinIfNecessary(node.CastFailedPin, node.InputExecPins[0]); builder.AppendLine("}"); builder.AppendLine("else"); builder.AppendLine("{"); WriteGotoOutputPinIfNecessary(node.CastSuccessPin, node.InputExecPins[0]); builder.AppendLine("}"); } } } }