static void EnsureExtensionFolder(string extensionsPath = CodeGenerationShared.DefaultExtensionPath) { CodeGenerationShared.EnsureAssetsFolderExists(extensionsPath); var asmRefPath = extensionsPath + "/MarsExtensionTypes.asmref"; if (!File.Exists(asmRefPath)) { File.WriteAllText(asmRefPath, k_MarsAsmRefContent); AssetDatabase.ImportAsset(asmRefPath); } }
/// <summary> /// Run every code generator we can find with every type we want to generate /// </summary> /// <returns>True if all generators succeeded, false if any error occured</returns> internal static void TryRunGeneration() { k_UserTypeSources.Clear(); var previousConditionTypes = GetPreviouslyGeneratedTypes(); var conditionTypes = GatherConditionTypes(); var relationTypes = GatherRelationTypes(); var previousRelationTypes = GetPreviouslyGeneratedRelationTypes(); CodeGenerationShared.EnsureOutputFolder(); EnsureExtensionFolder(); k_TypesToRemove.Clear(); SearchForTypeAssets((type, paths) => { if (paths.Length == 1) { PromptForTypeFileMove(type.Name, paths[0]); k_TypesToRemove.Add(type); } else if (paths.Length > 1) { PromptForTypeFileMove(type.Name); k_TypesToRemove.Add(type); } }); conditionTypes = RemoveWhere(conditionTypes, data => k_TypesToRemove.Contains(data.Type)); relationTypes = RemoveWhere(relationTypes, data => k_TypesToRemove.Contains(data.Type)); var anyConditionTypeChanges = AnyTypeChanges(conditionTypes, previousConditionTypes); var anyRelationTypeChanges = AnyTypeChanges(relationTypes, previousRelationTypes); if (!anyConditionTypeChanges && !anyRelationTypeChanges && CodeGenVersionIsUpToDate()) { HasGenerated = true; return; } RunGenerators(conditionTypes, relationTypes, GatherGenerators()); CodeGenVersionUpdate(); AssetDatabase.Refresh(); }
void WriteSetTraitBlock(CodeGenerationTypeData[] typeData) { const string toReplace = "{SetTrait_METHODS}"; WriteBlock(toReplace, typeData, (data) => { var backingField = GetBackingFieldName(data); var pool = CodeGenerationShared.GetDictionaryPool(data); WriteLine($"public void SetTrait(string traitName, {data.Type.FullName} value)"); WriteLine("{"); WriteLine($" if(!{backingField}.TryGetValue(this, out var typeValues))"); WriteLine(" {"); WriteLine($" typeValues = {pool}.Get();"); WriteLine($" {backingField}[this] = typeValues;"); WriteLine(" }"); WriteLine(); WriteLine(" typeValues[traitName] = value;"); WriteLine("}"); return(DumpBufferContents()); }); }
static bool RunGenerators(CodeGenerationTypeData[] conditionTypes, CodeGenerationTypeData[] relationTypes, IEnumerable <IGeneratesCode> generators) { DebugUtils.Log("Running MARS code generators..."); CodeGenerationShared.EnsureOutputFolder(); // some generators may need the type from both conditions and relations. // though both sets are already sorted, documentation for .Union does not specify if it will always be in the same order. var typesUnion = conditionTypes.Union(relationTypes).OrderBy(t => t.Type.FullName).ToArray(); var success = true; foreach (var generator in generators) { var typeSet = conditionTypes; switch (generator.TypeSet) { case GeneratedTypeSet.Relations: typeSet = relationTypes; break; case GeneratedTypeSet.All: typeSet = typesUnion; break; } if (!generator.TryGenerateCode(typeSet)) { DebugUtils.LogWarning($"Error (likely with file access) occured with generator {generator.GetType().Name}"); success = false; } } WriteMarsAssemblyRef(); return(success); }