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
        private static NIType AddGenericLifetimeTypeParameter(NIClassBuilder classBuilder, string name)
        {
            var genericTypeParameters = classBuilder.MakeGenericParameters(name);
            var parameterBuilder      = genericTypeParameters.ElementAt(0);

            SetLifetimeTypeAttribute((NIAttributedBaseBuilder)parameterBuilder);
            return(parameterBuilder.CreateType());
        }