Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        /// <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();
        }
Beispiel #3
0
        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());
            });
        }
Beispiel #4
0
        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);
        }