public FieldTranslationInfo GetOrMakeTranslationInfo(FieldInfo fieldInfo) { if (fieldInfo == null) { throw new ArgumentNullException(nameof(fieldInfo)); } FieldTranslationInfo fti; if (FieldTranslations.TryGetValue(fieldInfo, out fti)) { return(fti); } if (fieldInfo.Name == "Py_EOL") { Debug.Write(""); } fti = FieldTranslations[fieldInfo] = FieldTranslationInfo.FromFieldInfo(fieldInfo, this); if (OnTranslationInfoCreated != null) { OnTranslationInfoCreated(this, new TranslationInfoCreatedEventArgs { FieldTranslation = fti }); } return(fti); }
private static void Check(FieldInfo fieldInfo, FieldTranslationInfo fti) { if (fti == null) { throw new ArgumentNullException(nameof(fti)); } if (fti.Destination != FieldTranslationDestionations.NormalField && fti.Destination != FieldTranslationDestionations.ClassConst) { throw new Exception(string.Format("Unable to find right way to convert field {0}", fieldInfo.ExcName())); } }
public static FieldTranslationInfo FromFieldInfo(FieldInfo fieldInfo, TranslationInfo info) { if (fieldInfo == null) { return(null); } var fieldInfoDeclaringType = fieldInfo.DeclaringType; if (fieldInfoDeclaringType == null) { throw new Exception("fieldInfo.DeclaringType is null"); // Resharper } var fti = new FieldTranslationInfo(); if (fieldInfo.IsLiteral) { fti.Destination = FieldTranslationDestionations.ClassConst; } { fti.ScriptName = fieldInfo.Name; if (!fieldInfo.IsPublic) { fti.ScriptName = "_" + fieldInfo.Name; } if (fieldInfo.IsPrivate) { fti.ScriptName = "__" + fieldInfo.Name; } var scriptNameAttribute = fieldInfo.GetCustomAttribute <PyNameAttribute>(); if (scriptNameAttribute != null) { fti.ScriptName = scriptNameAttribute.Name; fti.IsScriptNamePyEncoded = scriptNameAttribute.Kind == PyNameAttribute.Kinds.IntIndex; } } { var asDefinedConstAttribute = fieldInfo.GetCustomAttribute <AsDefinedConstAttribute>(); if (asDefinedConstAttribute != null) { fti.Destination = FieldTranslationDestionations.DefinedConst; if (!string.IsNullOrEmpty(asDefinedConstAttribute.DefinedConstName)) { fti.ScriptName = asDefinedConstAttribute.DefinedConstName; } } } { var globalVariableAttribute = fieldInfo.GetCustomAttribute <GlobalVariableAttribute>(); if (globalVariableAttribute != null) { Check(fieldInfo, fti); fti.Destination = FieldTranslationDestionations.GlobalVariable; if (!string.IsNullOrEmpty(globalVariableAttribute.GlobalVariableName)) { fti.ScriptName = globalVariableAttribute.GlobalVariableName; } } } { var asValueAttribute = fieldInfo.GetCustomAttribute <AsValueAttribute>(); if (asValueAttribute != null) { Check(fieldInfo, fti); fti.Destination = FieldTranslationDestionations.JustValue; fti.UsGlueForValue = asValueAttribute.Glue; } } var canBeNull = false; switch (fti.Destination) { case FieldTranslationDestionations.JustValue: case FieldTranslationDestionations.GlobalVariable: canBeNull = true; fti.IncludeModule = null; // force null break; case FieldTranslationDestionations.DefinedConst: case FieldTranslationDestionations.ClassConst: case FieldTranslationDestionations.NormalField: var cti = info.GetOrMakeTranslationInfo(fieldInfoDeclaringType); fti.IncludeModule = cti.ModuleName; if (cti.BuildIn) { fti.IncludeModule = null; canBeNull = true; } var isFieldOutsideClass = fti.Destination == FieldTranslationDestionations.GlobalVariable || fti.Destination == FieldTranslationDestionations.DefinedConst; { // can be in other module for GlobalVariable and DefinedConst var moduleAttribute = fieldInfo.GetCustomAttribute <PyModuleAttribute>(); if (moduleAttribute != null) { if (!isFieldOutsideClass) { throw new Exception(string.Format( "Module attribute can only be defined for GlobalVariable or DefinedConst. Check {0}.", fieldInfo.ExcName())); } fti.IncludeModule = PyCodeModuleName.FromAttribute(moduleAttribute); } } if (cti.IsPage) { fti.IsDefinedInNonincludableModule = true; } if (!isFieldOutsideClass) { if (cti.IsArray || cti.Type.IsEnum || cti.BuildIn) { canBeNull = true; fti.IncludeModule = null; // force null } else if (cti.DontIncludeModuleForClassMembers) { throw new Exception( string.Format("field {0} belongs to nonincludable class (array, enum or skipped)", fieldInfo.ExcName())); } } break; } if (!fti.IncludeModule.IsEmpty()) { return(fti); } if (canBeNull) { fti.IncludeModule = null; // can be not null but empty fti.IsDefinedInNonincludableModule = false; } else { throw new Exception(string.Format("Include module is empty for field {0}.", fieldInfo.ExcName())); } return(fti); }