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