Example #1
0
        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}");
            }
        }
Example #2
0
 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));
 }