public void Test() { const string source = @"using Liversage.Primitives; namespace Generated; [Primitive] public readonly partial struct A { readonly int value; } [Primitive] public readonly partial struct B { readonly int value; }"; var inputCompilation = CreateCompilation(source); var generator = new PrimitiveGenerator(); var driver = CSharpGeneratorDriver.Create(generator).RunGeneratorsAndUpdateCompilation(inputCompilation, out _, out _); var runResult = driver.GetRunResult(); Assert.True(runResult.Diagnostics.IsEmpty); Assert.Single(runResult.Results); var generatorResult = runResult.Results[0]; Assert.Equal(generator, generatorResult.Generator); Assert.True(generatorResult.Diagnostics.IsEmpty); Assert.Null(generatorResult.Exception); Assert.Equal(2, generatorResult.GeneratedSources.Length); var generatedSourceA = generatorResult.GeneratedSources[0]; var generatedSourceB = generatorResult.GeneratedSources[1]; Assert.Equal("A.g.cs", generatedSourceA.HintName); Assert.Equal("B.g.cs", generatedSourceB.HintName); }
public void Test(string source, string expectedDiagnosticId) { var inputCompilation = CreateCompilation(source); var generator = new PrimitiveGenerator(); var driver = CSharpGeneratorDriver.Create(generator).RunGeneratorsAndUpdateCompilation(inputCompilation, out _, out _); var runResult = driver.GetRunResult(); Assert.Single(runResult.Diagnostics); var diagnostic = runResult.Diagnostics[0]; Assert.Equal(expectedDiagnosticId, diagnostic.Id); }
public void GenerateIntegerSingle() { var mockSuit = new Mock <Suit>(); var primitiveGenerator = new PrimitiveGenerator(mockSuit.Object); mockSuit.Setup(i => i.GeneratePrimitive <int>("test", It.IsAny <ISessionManager>())) .Returns(10); var result = primitiveGenerator.Integer("test"); Assert.Equal(10, result); mockSuit.Verify(i => i.GeneratePrimitive <int>("test", It.IsAny <ISessionManager>())); }
public void GenerateStringSingle() { var mockSuit = new Mock <Suit>(); var primitiveGenerator = new PrimitiveGenerator(mockSuit.Object); mockSuit.Setup(i => i.GeneratePrimitive <string>("test", It.IsAny <ISessionManager>())) .Returns("Hello"); var result = primitiveGenerator.String("test"); Assert.Equal("Hello", result); mockSuit.Verify(i => i.GeneratePrimitive <string>("test", It.IsAny <ISessionManager>())); }
public void GenerateIntegerList(int times) { var mockSuit = new Mock <Suit>(); var primitiveGenerator = new PrimitiveGenerator(mockSuit.Object); mockSuit.Setup(i => i.GeneratePrimitive <int>("test", It.IsAny <ISessionManager>())) .Returns(10); var result = primitiveGenerator.Integer("test", count: times); Assert.All(result, i => Assert.Equal(10, i)); mockSuit.Verify(i => i.GeneratePrimitive <int>("test", It.IsAny <ISessionManager>()), Times.Exactly(times)); }
public void GenerateMeshes() { DistrictMeshes.Clear(); NeighborhoodMeshes.Clear(); if (CityConfiguration.DistrictLayer != null && CityConfiguration.DistrictLayer.PolygonIdToDistrictMap != null) { foreach (var polygon in CityConfiguration.DistrictLayer.PolygonIdToDistrictMap.Keys) { Mesh m = PrimitiveGenerator.GeneratePolygon(polygon); DistrictMeshes.Add(m); } } if (CityConfiguration.WardLayer != null && CityConfiguration.WardLayer.PolygonIdToNeighborhoodMap != null) { foreach (var polygon in CityConfiguration.WardLayer.PolygonIdToNeighborhoodMap.Keys) { Mesh m = PrimitiveGenerator.GeneratePolygon(polygon); NeighborhoodMeshes.Add(m); } } }
void PrimitiveSettings() { using (ShapesUI.Group) { GUILayout.Label("Primitives", EditorStyles.boldLabel); using (new ShapesUI.AssetEditScope(ShapesAssets.Instance)) { if (showDetailLevels = EditorGUILayout.Foldout(showDetailLevels, new GUIContent("Detail Levels", "Configure the mesh density of each detail level preset, for every type of Shape that can make use of it"))) { using (new EditorGUI.IndentLevelScope(1)) { DrawDetailLevelProperties(sphereDetail, "Sphere", TOOLTIP_DETAIL_SPHERE, min: 1, p => PrimitiveGenerator.TriangleCountIcosphere(p.intValue)); DrawDetailLevelProperties(torusDivsMinorMajor, "Torus", TOOLTIP_DETAIL_TORUS, min: 3, p => PrimitiveGenerator.TriangleCountTorus(p.vector2IntValue)); DrawDetailLevelProperties(coneDivs, "Cone", TOOLTIP_DETAIL_CONE, min: 3, p => PrimitiveGenerator.TriangleCountCone(p.intValue)); DrawDetailLevelProperties(cylinderDivs, "Cylinder", TOOLTIP_DETAIL_CYLINDER, min: 3, p => PrimitiveGenerator.TriangleCountCylinder(p.intValue)); DrawDetailLevelProperties(capsuleDivs, "Capsule", TOOLTIP_DETAIL_CAPSULE, min: 1, p => PrimitiveGenerator.TriangleCountCapsule(p.intValue)); } } if (showBounds = EditorGUILayout.Foldout(showBounds, new GUIContent("Bounds Sizes", ShapesConfig.TOOLTIP_BOUNDS))) { using (new EditorGUI.IndentLevelScope(1)) { EditorGUILayout.PropertyField(boundsSizeSphere, new GUIContent("Sphere")); EditorGUILayout.PropertyField(boundsSizeTorus, new GUIContent("Torus")); EditorGUILayout.PropertyField(boundsSizeCone, new GUIContent("Cone")); EditorGUILayout.PropertyField(boundsSizeCylinder, new GUIContent("Cylinder")); EditorGUILayout.PropertyField(boundsSizeCapsule, new GUIContent("Capsule")); EditorGUILayout.PropertyField(boundsSizeQuad, new GUIContent("Quad")); EditorGUILayout.PropertyField(boundsSizeTriangle, new GUIContent("Triangle")); EditorGUILayout.PropertyField(boundsSizeCuboid, new GUIContent("Cuboid")); } } GUILayout.Space(3); if (ShapesUI.CenteredButton(new GUIContent("Apply & regenerate primitives", "Regenerate all primitive mesh assets using the configuration above"))) { PrimitiveGenerator.Generate3DPrimitiveAssets(); } GUILayout.Space(3); } } }
public void Test(string source, string expectedGeneratedFileName, string expectedGeneratedSource) { var inputCompilation = CreateCompilation(source); var generator = new PrimitiveGenerator(); var driver = CSharpGeneratorDriver.Create(generator).RunGeneratorsAndUpdateCompilation(inputCompilation, out _, out _); var runResult = driver.GetRunResult(); Assert.True(runResult.Diagnostics.IsEmpty); Assert.Single(runResult.Results); var generatorResult = runResult.Results[0]; Assert.Equal(generator, generatorResult.Generator); Assert.True(generatorResult.Diagnostics.IsEmpty); Assert.Null(generatorResult.Exception); Assert.Single(generatorResult.GeneratedSources); var generatedSource = generatorResult.GeneratedSources[0]; Assert.Equal(expectedGeneratedFileName, generatedSource.HintName); var generatedSourceText = generatedSource.SourceText.ToString(); Assert.Equal(expectedGeneratedSource, generatedSourceText); }
public string ProcessDefinition(string name) { var path = $"./Definitions/{name}.json"; var lastModified = File.GetLastWriteTime(path); var def = File.ReadAllText(path); var tmpl = _sheetTemplate; var sheet = GameData.Excel.GetSheetRaw(name); if (sheet == null) { Console.WriteLine($" - sheet {name} no longer exists!"); return(null); } tmpl = tmpl.Replace("%%SHEET_NAME%%", name); var hash = sheet.HeaderFile.GetColumnsHash(); tmpl = tmpl.Replace("%%COL_HASH%%", $"0x{hash:x8}"); var cols = sheet.Columns; var schema = JsonConvert.DeserializeObject <SheetDefinition>(def); var generators = new List <BaseShitGenerator>(); for (uint i = 0; i < cols.Length; i++) { var column = cols[i]; var schemaDef = schema.Definitions.FirstOrDefault(d => d.Index == i); var type = column.Type; var clrType = ExcelTypeToManaged(type); if (schemaDef == null) { var generator = new PrimitiveGenerator(clrType, $"Unknown{i}", i); generators.Add(generator); continue; } schemaDef.Name = Clean(schemaDef.Name); var schemaType = schemaDef.Type; // single field if (schemaType == null) { if (schemaDef.ConverterType == "link" && DefinitionExists(schemaDef.ConverterTarget)) { var target = schemaDef.ConverterTarget; generators.Add(new LazyRowGenerator(target, schemaDef.Name, i, cols)); } // todo: this is f*****g ass, maybe we can fake a variant though? lol // else if( schemaDef.ConverterType == "complexlink" ) // { // fieldGenerators.Add( new PrimitiveGenerator( clrType, schemaDef.Name, i ) ); // } else { // no link/unsupported generators.Add(new PrimitiveGenerator(clrType, schemaDef.Name, i)); } } // repeats else if (schemaType == "repeat") { // unfuck shit stupid groups with one member which are actually just arrays if (schemaDef.Definition?.Type == "group" && schemaDef.Definition.Members.Count == 1) { schemaDef.Definition.Type = "shitgroup"; schemaDef.Name = Clean(schemaDef.Definition.Members.First().Name); } // todo: groups need their own handling here but it's kind of shit, probably should do this differently if (schemaDef.Definition?.Type == "group") { var memberCount = schemaDef.Definition.Members.Count; string className; string fieldName; if (schemaDef.Definition.GroupName != null) { className = $"{schemaDef.Definition.GroupName}Obj"; fieldName = schemaDef.Definition.GroupName; } else { className = $"{name}UnkData{i}Obj"; fieldName = $"UnkData{i}"; } // todo: add pluralisation to field name? lol generators.Add( new GroupStructGenerator( className, fieldName, i, schemaDef.Definition.Members, schemaDef.Count, cols ) ); i += (schemaDef.Count * (uint)memberCount) - 1; } else { if (schemaDef.ConverterType == "link" && DefinitionExists(schemaDef.ConverterTarget)) { var target = schemaDef.ConverterTarget; generators.Add(new LazyRowRepeatGenerator(target, schemaDef.Name, i, schemaDef.Count, cols)); } // todo: this is f****d and i question my sanity if i ever want to actually support this f*****g garbage // else if( schemaDef.ConverterType == "complexlink" ) // { // // } else { if (string.IsNullOrEmpty(schemaDef.Name)) { schemaDef.Name = $"Unknown{i}"; } generators.Add(new PrimitiveRepeatGenerator(clrType, schemaDef.Name, i, schemaDef.Count)); } i += schemaDef.Count - 1; } } } var fieldsSb = new StringBuilder(); var readsSb = new StringBuilder(); var structsSb = new StringBuilder(); // run the generators foreach (var generator in generators) { generator.WriteFields(fieldsSb); // fieldsSb.AppendLine(); generator.WriteReaders(readsSb); // readsSb.AppendLine(); generator.WriteStructs(structsSb); } // fix indent the big brain way Func <StringBuilder, int, string> fixIndent = (sb, level) => { var indent = ""; for (int i = 0; i < level * 4; i++) { indent += " "; } return(indent + sb.ToString().Replace("\n", $"\n{indent}")); }; tmpl = tmpl.Replace("%%STRUCT_DEFS%%", fixIndent(structsSb, 2)); tmpl = tmpl.Replace("%%DATA_MEMBERS%%", fixIndent(fieldsSb, 2)); tmpl = tmpl.Replace("%%DATA_READERS%%", fixIndent(readsSb, 3).TrimEnd()); return(tmpl); }