private static bool CheckField( Core.Session session, int structIndex, int fieldIndex, Core.Type innerType, Stack<int> seenStructs) { var fieldStruct = innerType as Core.TypeStruct; if (fieldStruct == null) return false; var st = session.GetStruct(structIndex); Core.Name fieldName; st.fieldNames.FindByValue(fieldIndex, out fieldName); session.PushContext( "in struct '" + session.GetStructName(structIndex).GetString() + "', " + "field '" + fieldName.GetString() + "'", st.GetFieldNameSpan(fieldIndex)); var err = false; if (seenStructs.Contains(fieldStruct.structIndex)) { err = true; session.AddMessage( Diagnostics.MessageKind.Error, Diagnostics.MessageCode.StructRecursion, "struct recursion", session.GetStruct(fieldStruct.structIndex).GetNameSpan(), st.GetFieldNameSpan(fieldIndex)); } if (!err) CheckStruct(session, fieldStruct.structIndex, seenStructs); session.PopContext(); return err; }
private static bool CheckStruct(Core.Session session, int structIndex, Stack<int> seenStructs) { var st = session.GetStruct(structIndex); var err = false; seenStructs.Push(structIndex); for (var i = 0; i < st.fieldTypes.Count; i++) { err |= CheckField(session, structIndex, i, st.fieldTypes[i], seenStructs); var fieldTuple = st.fieldTypes[i] as Core.TypeTuple; if (fieldTuple != null) { for (var j = 0; j < fieldTuple.elementTypes.Length; j++) err |= CheckField(session, structIndex, i, fieldTuple.elementTypes[j], seenStructs); } } seenStructs.Pop(); return err; }
public static Core.Name GetFieldName( Core.Session session, Core.Type baseType, int fieldIndex) { var baseStruct = baseType as Core.TypeStruct; if (baseStruct != null) { Core.Name name; session.GetStruct(baseStruct.structIndex).fieldNames.FindByValue(fieldIndex, out name); return name; } var baseTuple = baseType as Core.TypeTuple; if (baseTuple != null) return Core.Name.FromPath(fieldIndex.ToString()); return null; }
public static Core.Type GetFieldType( Core.Session session, Core.Type baseType, int fieldIndex) { var baseStruct = baseType as Core.TypeStruct; if (baseStruct != null) return session.GetStruct(baseStruct.structIndex).fieldTypes[fieldIndex]; var baseTuple = baseType as Core.TypeTuple; if (baseTuple != null) return baseTuple.elementTypes[fieldIndex]; return new Core.TypeError(); }
public static int GetFieldNum( Core.Session session, Core.Type baseType) { var baseStruct = baseType as Core.TypeStruct; if (baseStruct != null) return session.GetStruct(baseStruct.structIndex).fieldTypes.Count; var baseTuple = baseType as Core.TypeTuple; if (baseTuple != null) return baseTuple.elementTypes.Length; return 0; }
public override bool IsZeroSized(Core.Session session) { var st = session.GetStruct(this.structIndex); return !st.primitive && st.fieldTypes.Count == 0; }