private static NIType BuildTypeFromSelfType(Nodes.SelfTypeNode selfTypeNode, string typeName) { int fieldIndex = 0; switch (selfTypeNode.Mode) { case SelfTypeMode.Struct: NIClassBuilder classBuilder = NITypes.Factory.DefineValueClass(typeName); foreach (Terminal inputTerminal in selfTypeNode.InputTerminals) { NIType fieldType = inputTerminal.GetTrueVariable().Type; classBuilder.DefineField(fieldType, $"_{fieldIndex}", NIFieldAccessPolicies.ReadWrite); ++fieldIndex; } return(classBuilder.CreateType()); case SelfTypeMode.Variant: NIUnionBuilder unionBuilder = NITypes.Factory.DefineUnion(typeName); foreach (Terminal inputTerminal in selfTypeNode.InputTerminals) { NIType fieldType = inputTerminal.GetTrueVariable().Type; unionBuilder.DefineField(fieldType, $"_{fieldIndex}"); ++fieldIndex; } unionBuilder.AddTypeKeywordProviderAttribute(DataTypes.RebarTypeKeyword); return(unionBuilder.CreateType()); default: throw new NotImplementedException($"SelfTypeMode: {selfTypeNode.Mode}"); } }
public static NIType GetSelfType(this DfirRoot typeDiagramDfirRoot) { Nodes.SelfTypeNode selfTypeNode = typeDiagramDfirRoot.BlockDiagram.Nodes.OfType <Nodes.SelfTypeNode>().First(); if (selfTypeNode == null) { return(NIType.Unset); } return(BuildTypeFromSelfType(selfTypeNode, typeDiagramDfirRoot.CompileSpecification.Name.SourceName.Last)); }