Skip to content

Commit 9cc4dbf

Browse files
Add a hacky .net 3.5 compatible version.
1 parent 6bc61b0 commit 9cc4dbf

File tree

12 files changed

+189
-128
lines changed

12 files changed

+189
-128
lines changed

Assets/CustomInspectorCreator/Editor/CustomInspectorCreator.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using UnityEngine;
66
using GTS.InspectorGeneration.Data;
77
using GTS.InspectorGeneration.Utilities;
8+
using System.Collections.Generic;
89

910
namespace GTS.InspectorGeneration
1011
{
@@ -27,7 +28,11 @@ private static void Generate(bool isText)
2728

2829
MessageLogger.LogStartMessage(fileData.ClassName, isText);
2930

30-
Type type = new Compiler().GetTypeForCompiledClassAtPath(fileData.FullPath);
31+
//Type type = new Compiler().GetTypeForCompiledClassAtPath(fileData.FullPath);
32+
Generator generator = new Generator();
33+
string nameSpace = generator.GetNameSpace(fileData.FullPath);
34+
35+
Type type = new Compiler().GetTypeFromString(nameSpace + "." + fileData.ClassName);
3136

3237
if (type == null)
3338
{
@@ -39,7 +44,7 @@ private static void Generate(bool isText)
3944
return;
4045
}
4146

42-
string[] generatedCode = new Generator().Generate(type, fileData.FullPath, fileData.ClassName);
47+
string[] generatedCode = generator.Generate(type, fileData.FullPath, fileData.ClassName);
4348

4449
string code = new Builder().Build(generatedCode);
4550

Assets/CustomInspectorCreator/Editor/Utilities/Compiler.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,23 @@
22
using System.Linq;
33
using Microsoft.CSharp;
44
using System.CodeDom.Compiler;
5+
using System.Reflection.Emit;
56

67
namespace GTS.InspectorGeneration.Utilities
78
{
89
public class Compiler
910
{
11+
/// <summary>
12+
/// Attempt to get the Type from the passed in string typeName.
13+
/// </summary>
14+
public Type GetTypeFromString(string typeName)
15+
{
16+
MessageLogger.LogType(typeName);
17+
Type t = Type.GetType(typeName + ", Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null");
18+
MessageLogger.LogType(t.ToString());
19+
return t;
20+
}
21+
1022
/// <summary>
1123
/// Attempt to compile a csharp script (.cs) at the given path.
1224
/// <para>Succesfull compilation will result in the return of the class's Type, else return null.</para>
@@ -43,7 +55,9 @@ private CompilerParameters CreateCompileParameters()
4355

4456
// Add all referenced assemblies
4557
parameters.ReferencedAssemblies.AddRange(
46-
AppDomain.CurrentDomain.GetAssemblies().Where(item => !item.IsDynamic).Select(item => item.Location).ToArray());
58+
AppDomain.CurrentDomain.GetAssemblies()
59+
.Where(item => !(item.ManifestModule is ModuleBuilder))
60+
.Select(item => item.Location).ToArray());
4761

4862
return parameters;
4963
}

Assets/CustomInspectorCreator/Editor/Utilities/Generator.cs

Lines changed: 77 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.IO;
33
using System.Linq;
44
using System.Text;
@@ -10,13 +10,13 @@ namespace GTS.InspectorGeneration.Utilities
1010
{
1111
public class Generator
1212
{
13-
private string tabLevel;
13+
private string tabLevel = "";
1414
private bool didHaveProps;
1515
private string classTypeField;
1616
private string onEnableBody;
1717

1818
public string[] Generate(Type type, string fullPath, string className)
19-
{
19+
{
2020
string varName = GetVarName(className);
2121

2222
string usings = GenerateUsings(fullPath);
@@ -70,15 +70,37 @@ private string GenerateUsings(string path)
7070
// Could add unintended using statements, example here in the StreamReader.
7171
if (line.Contains("using") && line.Contains(";")) //Test a 'using' fix.
7272
{
73-
sb.Append($"{line}\n");
73+
sb.Append(string.Format("{0}\n", line));
7474
}
7575
}
7676
}
7777
return sb.ToString();
7878
}
7979

80+
public string GetNameSpace(string path)
81+
{
82+
//Debug.Log("generating usings");
83+
84+
string nameSpace = String.Empty;
85+
using (var reader = new StreamReader(path))
86+
{
87+
string line;
88+
89+
while ((line = reader.ReadLine()) != null)
90+
{
91+
// Could add unintended using statements, example here in the StreamReader.
92+
if (line.Contains("namespace")) //Test a 'using' fix.
93+
{
94+
nameSpace = line.Replace("namespace", "").Replace("{", "").Trim();
95+
}
96+
}
97+
}
98+
return nameSpace;
99+
}
100+
80101
private string GenerateNamespaceBegin(Type type)
81102
{
103+
//Debug.Log("generating NameSpace");
82104
string myNamespace = type.Namespace;
83105
if (string.IsNullOrEmpty(myNamespace))
84106
{
@@ -87,61 +109,70 @@ private string GenerateNamespaceBegin(Type type)
87109
else
88110
{
89111
Indent();
90-
return $"\nnamespace {myNamespace}\n{{";
112+
return ("\nnamespace " + myNamespace + "\n{");
91113
}
92114
}
93115

94116
private string GenerateInspectorAttribute(string className)
95117
{
96-
return $"\n{tabLevel}[CustomEditor(typeof({className}))]\n";
118+
//Debug.Log("generating Inspector Attribute");
119+
120+
return string.Format("\n{0}[CustomEditor(typeof({1}))]\n", tabLevel, className);
97121
}
98122

99123
private string GenerateClassDeclarationBegin(string className)
100124
{
101-
return $"{tabLevel}public class {className}Editor : Editor\n{tabLevel}{{\n";
125+
//Debug.Log("generating Class Declaration Begin");
126+
127+
return (tabLevel + "public class " + className + "Editor : Editor\n" + tabLevel + "{\n");
102128
}
103129

104130
// Members
105131
private string GenerateClassTypeMember(string className, string varName)
106132
{
107-
Indent();
108-
return $"{tabLevel}private {className} {varName};\n";
133+
//Debug.Log("generating Class Type Member");
134+
return (string.Format("{0}private {1} {2}; \n", tabLevel, className, varName));
109135
}
110136

111137
// OnEnable
112138
private string GenerateOnEnableBegin()
113139
{
114-
string onEnableStart = $"\n{tabLevel}private void OnEnable()\n";
115-
string openBrace = $"{tabLevel}{{\n";
140+
//Debug.Log("generating OnEnable Begin");
141+
string onEnableStart = (string.Format("\n{0}private void OnEnable()\n", tabLevel));
142+
string openBrace = (tabLevel + "{\n");
116143

117-
return $"{onEnableStart}{openBrace}";
144+
return (string.Format("{0}{1}", onEnableStart, openBrace));
118145
}
119146

120147
private string GenerateOnEnableBody(string varName, string className)
121148
{
149+
//Debug.Log("generating OnEnable Body");
122150
Indent();
123-
string body = $"{tabLevel}{varName} = ({className})target;\n";
151+
string body = string.Format("{0}{1} = ({2})target; \n", tabLevel, varName, className);
124152
Dedent();
125-
return $"{body}";
153+
return string.Format("{0}", body);
126154
}
127155

128156
private string GenerateOnEnableEnd()
129157
{
130-
string closeBrace = $"{tabLevel}}}\n\n";
131-
return $"{closeBrace}";
158+
//Debug.Log("generating OnEnable End");
159+
string closeBrace = tabLevel + "}\n\n";
160+
return string.Format("{0}", closeBrace);
132161
}
133162

134163
//OnInspectorGUI
135164
private string GenerateOnInspectorGUIBegin()
136165
{
137-
return $"{tabLevel}public override void OnInspectorGUI()\n{tabLevel}{{\n";
166+
//Debug.Log("generating OnInspectorGUI Begin");
167+
return (tabLevel + "public override void OnInspectorGUI()\n" + tabLevel + "{\n");
138168
}
139169

140170
private string GenerateOnInspectorGUIBodyFields(Type type, string varName)
141171
{
172+
//Debug.Log("generating OnInspectorGUI Body Fields");
142173
Indent();
143174

144-
StringBuilder sb = new StringBuilder($"{tabLevel}// Fields\n");
175+
StringBuilder sb = new StringBuilder(string.Format("{0}// Fields\n", tabLevel));
145176

146177
BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly;
147178

@@ -156,7 +187,9 @@ private string GenerateOnInspectorGUIBodyFields(Type type, string varName)
156187

157188
private string GenerateOnInspectorGUIBodyProperties(Type type, string varName)
158189
{
159-
StringBuilder sb = new StringBuilder($"\n{tabLevel}// Properties\n");
190+
//Debug.Log("generating OnInspectorGUI Body Properties");
191+
192+
StringBuilder sb = new StringBuilder(string.Format("\n{0}// Properties\n", tabLevel));
160193

161194
BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly;
162195

@@ -171,7 +204,9 @@ private string GenerateOnInspectorGUIBodyProperties(Type type, string varName)
171204

172205
private string GenerateOnInspectorGUIBodyMethodButtons(Type type, string varName)
173206
{
174-
StringBuilder sb = new StringBuilder($"\n{tabLevel}// Buttons");
207+
//Debug.Log("generating OnInspectorGUI Body Buttons");
208+
209+
StringBuilder sb = new StringBuilder(string.Format("\n{0}// Buttons", tabLevel));
175210

176211
BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.NonPublic;
177212

@@ -185,13 +220,13 @@ private string GenerateOnInspectorGUIBodyMethodButtons(Type type, string varName
185220
{
186221
MessageLogger.LogAttributeType(a);
187222

188-
string buttonStart = $"\n{tabLevel}if(GUILayout.Button(\"{GetLabelName(m.Name)}\"))\n{tabLevel}{{\n";
223+
string buttonStart = ("\n" + tabLevel + "if(GUILayout.Button(\"" + GetLabelName(m.Name) + ")\"))\n" + tabLevel + "{\n");
189224
Indent();
190-
string buttonBody = $"{tabLevel}{varName}.{m.Name}();\n";
225+
string buttonBody = string.Format("{0}{1}.{2}(); \n", tabLevel, varName, m.Name);
191226
Dedent();
192-
string buttonEnd = $"{tabLevel}}}\n";
227+
string buttonEnd = tabLevel + "}\n";
193228

194-
sb.Append($"{buttonStart}{buttonBody}{buttonEnd}");
229+
sb.Append(string.Format("{0}{1}{2}", buttonStart, buttonBody, buttonEnd));
195230

196231
}
197232
}
@@ -204,20 +239,20 @@ private string GenerateOnInspectorGUIEnd()
204239
string result = string.Empty;
205240
if (didHaveProps)
206241
{
207-
result = $"\n{tabLevel}serializedObject.ApplyModifiedProperties();\n";
242+
result = string.Format("\n{0}serializedObject.ApplyModifiedProperties(); \n", tabLevel);
208243
}
209244

210245
Dedent();
211246

212-
result = $"{result}{tabLevel}}}\n";
247+
result = result + tabLevel + "}\n";
213248
return result;
214249
}
215-
250+
216251
// Finialize
217252
private string GenerateClassDeclarationEnd()
218253
{
219254
Dedent();
220-
return $"{tabLevel}}}\n";
255+
return tabLevel + "}\n";
221256
}
222257

223258
private string GenerateNamespaceEnd(Type type)
@@ -299,10 +334,10 @@ private string GoBackAndAddSerializedProperty(string name)
299334
didHaveProps = true;
300335

301336
string ammendMemberDeclarations = AmmendMemberDeclarations(name);
302-
classTypeField = $"{classTypeField}{ammendMemberDeclarations}";
337+
classTypeField = string.Format("{0}{1}", classTypeField, ammendMemberDeclarations);
303338

304339
string ammendOnEnable = AmmendOnEnable(name);
305-
onEnableBody = $"{onEnableBody}{ammendOnEnable}";
340+
onEnableBody = string.Format("{0}{1}", onEnableBody, ammendOnEnable);
306341

307342
return GenerateEditorGUILayoutForSerializedProperty(name);
308343
}
@@ -311,7 +346,7 @@ private string GoBackAndAddSerializedProperty(string name)
311346
// A special case
312347
private string GenerateEditorGUILayoutEnumPopup(string varName, string name, string type)
313348
{
314-
string result = $"{tabLevel}{varName}.{name} = ({type.Split('.').Last()})EditorGUILayout.EnumPopup(\"{name}\", {varName}.{name});\n{tabLevel}// Also could use EnumFlagsField.\n";
349+
string result = string.Format("{0}{1}.{2} = ({3})EditorGUILayout.EnumPopup(\"{2}\", {1}.{2}); \n{0}// Also could use EnumFlagsField.\n", tabLevel, varName, name, type.Split('.').Last());
315350
return result;
316351
}
317352
// Default
@@ -321,34 +356,34 @@ private string GenerateEditorGUILayoutForGivenType(string varName, string name,
321356
string comment = LookUpComments(type);
322357
if (!string.IsNullOrEmpty(comment))
323358
{
324-
toAdd = $"{tabLevel}{comment}";
359+
toAdd = string.Format("{0}{1}", tabLevel, comment);
325360
}
326-
string r = $"{tabLevel}{varName}.{name} = EditorGUILayout.{result}(\"{name}\", {varName}.{name});\n{toAdd}";
361+
string r = string.Format("{0}{1}.{2} = EditorGUILayout.{3}(\"{2}\", {1}.{2}); \n{4}", tabLevel, varName, name, result, toAdd);
327362
return r;
328363
}
329364
// A special case
330365
private string GenerateEditorGUILayoutForSerializedProperty(string name)
331366
{
332-
return $"{tabLevel}EditorGUILayout.PropertyField({GetVarName(name)}, new GUIContent(\"{GetLabelName(name)}\"), true);\n";
367+
return string.Format("{0}EditorGUILayout.PropertyField({1}, new GUIContent(\"{2}\"), true); \n", tabLevel, GetVarName(name), GetLabelName(name));
333368
}
334369

335370
private string GenerateErrorMessage(string name, string type)
336371
{
337-
return $"{tabLevel}// Omitting {name} from code generation. No applicable entry for {type}!\n";
372+
return string.Format("{0}// Omitting {1} from code generation. No applicable entry for {2}!\n", tabLevel, name, type);
338373
}
339374
#endregion
340375

341376
#region Ammendments
342377
private string AmmendOnEnable(string name)
343378
{
344379
// m_IntProp = serializedObject.FindProperty("m_MyInt")
345-
return $"{tabLevel}{GetVarName(name)} = serializedObject.FindProperty(\"{name}\");\n";
380+
return string.Format("{0}{1} = serializedObject.FindProperty(\"{2}\"); \n", tabLevel, GetVarName(name), name);
346381
}
347382

348383
private string AmmendMemberDeclarations(string name)
349384
{
350385
Dedent();
351-
string result = $"{tabLevel}SerializedProperty {GetVarName(name)};\n";
386+
string result = string.Format("{0}SerializedProperty {1}; \n", tabLevel, GetVarName(name));
352387
Indent();
353388

354389
return result;
@@ -358,20 +393,20 @@ private string AmmendMemberDeclarations(string name)
358393
#region Helpers
359394
private void Indent()
360395
{
361-
tabLevel = $"{tabLevel }\t";
396+
tabLevel += " ";
362397
}
363398

364399
private void Dedent()
365400
{
366-
if(tabLevel.Length > 0)
401+
if (tabLevel.Length > 0)
367402
{
368403
tabLevel = tabLevel.Remove(tabLevel.Length - 1);
369404
}
370405
}
371406

372407
private string GetVarName(string className)
373408
{
374-
return $"_{Char.ToLowerInvariant(className[0])}{className.Substring(1)}";
409+
return string.Format("_{0}{1}", Char.ToLowerInvariant(className[0]), className.Substring(1));
375410
}
376411

377412
private string GetLabelName(string name)
@@ -382,11 +417,11 @@ private string GetLabelName(string name)
382417
{
383418
foreach (var s in split)
384419
{
385-
result = $"{result} {s}";
420+
result = string.Format("{0} {1}", result, s);
386421
}
387422

388423
result = result.Trim();
389-
result = $"{Char.ToUpperInvariant(result[0])}{result.Substring(1)}";
424+
result = string.Format("{0}{1}", Char.ToUpperInvariant(result[0]), result.Substring(1));
390425
return result;
391426
}
392427

Assets/CustomInspectorCreator/Editor/Utilities/Generator.cs.meta

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)