void GenEnum(TpmType e, List <TpmNamedConstant> elements, bool needsNone = false) { WriteComment(e); if (e is TpmBitfield) { Write("[Flags]"); } Write("[DataContract]"); Write($"[SpecTypeName(\"{e.SpecName}\")]"); Write($"public enum {e.Name} : {e.GetFinalUnderlyingType().Name}"); TabIn("{"); if (needsNone) { Write("None = 0,"); } foreach (TpmNamedConstant nc in elements) { string commaAfterOld = Separator(nc, elements); string comma = nc.Name != nc.OldStyleName ? "," : commaAfterOld; WriteComment(nc); Write("[EnumMember]"); string value = nc.Value, valueComment = ""; if (nc.SpecValue.Expr != null) { // Bitfields keep their member names unchanged, so they do not need the SpecTypeName attr. Write($"[SpecTypeName(\"{nc.SpecName}\")]"); uint val = unchecked ((uint)nc.NumericValue); valueComment = Expression.IsNumber(nc.SpecValue.Expr) ? "" : " // 0x" + val.ToString("X"); if (val >= unchecked ((uint)(0x90 << 24))) { value = $"unchecked (({e.GetFinalUnderlyingType().Name})({nc.Value}))"; } } Write($"{nc.Name} = {value}{comma}{valueComment}"); if (nc.Name != nc.OldStyleName) { Write($"[Obsolete(\"Use {e.Name}.{nc.Name} instead\")]"); Write($"{nc.OldStyleName} = {nc.Value}{commaAfterOld}"); } } ; TabOut("}"); } // GenEnum()
} // GenerateHeader() void GenEnum(TpmType e, List <TpmNamedConstant> elements) { WriteComment(e); Write($"struct {e.Name} : public TpmEnum<{e.GetFinalUnderlyingType().Name}>"); TabIn("{"); Write($"TPM_ENUM_PROLOGUE({e.Name})"); var enumVals = new Dictionary <string, string>(); foreach (var elt in elements) { WriteComment(AsSummary(elt.Comment)); string delimiter = Separator(elt, elements); Write($"{elt.Name} = {elt.Value}{delimiter}"); // Do not include artificially added named constants into the name conversion maps if (elt.SpecName != null) { enumVals[elt.Name] = e is TpmEnum?ToHex(elt.NumericValue) : elt.Value; } // Backward compat if (elt.Name == "PW") { WriteComment(AsSummary("Deprecated: use PW instead")); Write($"RS_PW [[deprecated(\"Use TPM_RH::PW instead\")]] = {elt.Value},"); } } Write($"TPM_ENUM_EPILOGUE({e.Name})"); TabOut("};"); EnumMap[e.Name] = enumVals; } // GenEnum()
public TpmType GetFinalUnderlyingType() => UnderlyingType == null ? this : UnderlyingType.GetFinalUnderlyingType();