Skip to content

Commit b4a185b

Browse files
committed
new progress
1 parent f1e1f6b commit b4a185b

File tree

3 files changed

+51
-23
lines changed

3 files changed

+51
-23
lines changed

CodingSeb.Localization.FodyAddin.Fody/CodingSeb.Localization.FodyAddin.Fody.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,7 @@
66
<ItemGroup>
77
<PackageReference Include="FodyHelpers" Version="6.3.0" />
88
</ItemGroup>
9+
<ItemGroup>
10+
<ProjectReference Include="..\CodingSeb.Localization\CodingSeb.Localization.csproj" />
11+
</ItemGroup>
912
</Project>

CodingSeb.Localization.FodyAddin.Fody/ModuleWeaver.cs

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,29 @@ private void AddCurrentLanguageChangedSensitivity(TypeDefinition typeDefinition)
3939

4040
FieldDefinition propertyListFieldDefinition = AddLocalizedPropertyNamesStaticList(typeDefinition, propertyToLocalize.Select(p => p.Name));
4141

42+
MethodDefinition triggerPropertyChangedMethod = typeDefinition.FindPropertyChangedTriggerMethod();
43+
44+
if (triggerPropertyChangedMethod == null)
45+
{
46+
triggerPropertyChangedMethod = new MethodDefinition("__NotifyPropertyChanged__", MethodAttributes.Private, TypeSystem.VoidReference);
47+
triggerPropertyChangedMethod.Parameters.Add(new ParameterDefinition("propertyName", ParameterAttributes.None, ModuleDefinition.ImportReference(typeof(string))));
48+
typeDefinition.Methods.Add(triggerPropertyChangedMethod);
49+
50+
// TODO
51+
}
52+
4253
var method = new MethodDefinition("__CurrentLanguageChanged__", MethodAttributes.Private, TypeSystem.VoidReference);
54+
method.Parameters.Add(new ParameterDefinition("sender", ParameterAttributes.None, TypeSystem.ObjectReference));
55+
method.Parameters.Add(new ParameterDefinition("e", ParameterAttributes.None, ModuleDefinition.ImportReference(typeof(CurrentLanguageChangedEventArgs))));
4356
ILProcessor processor = method.Body.GetILProcessor();
44-
processor.Append(Instruction.Create(OpCodes.Ldstr, "Hello World"));
45-
processor.Append(Instruction.Create(OpCodes.Ret));
57+
processor.Emit(OpCodes.Nop);
58+
processor.Emit(OpCodes.Ldsfld, propertyListFieldDefinition);
59+
processor.Emit(OpCodes.Ldarg_0);
60+
processor.Emit(OpCodes.Ldftn, triggerPropertyChangedMethod);
61+
processor.Emit(OpCodes.Newobj, ModuleDefinition.ImportReference(typeof(Action<string>).GetConstructors().First()));
62+
processor.Emit(OpCodes.Callvirt, ModuleDefinition.ImportReference(typeof(List<string>).GetMethod("ForEach", new Type[] { typeof(Action<string>) })));
63+
processor.Emit(OpCodes.Nop);
64+
processor.Emit(OpCodes.Ret);
4665
typeDefinition.Methods.Add(method);
4766
}
4867

@@ -56,37 +75,37 @@ public FieldDefinition AddLocalizedPropertyNamesStaticList(TypeDefinition typeDe
5675

5776
typeDefinition.Fields.Add(field);
5877

59-
MethodDefinition staticConstructor = GetOrCreateStaticConstructor(typeDefinition);
78+
MethodDefinition staticConstructor = typeDefinition.GetStaticConstructor();
79+
80+
if (staticConstructor == null)
81+
{
82+
staticConstructor = new MethodDefinition(".cctor", staticConstructorAttributes, TypeSystem.VoidReference);
83+
typeDefinition.Methods.Add(staticConstructor);
84+
}
6085

61-
var il = staticConstructor.Body.GetILProcessor();
86+
var instructions = staticConstructor.Body.Instructions;
6287

63-
if (il.Body.Instructions.LastOrDefault(i => i.OpCode == OpCodes.Ret) is Instruction instruction)
88+
if (instructions.LastOrDefault(i => i.OpCode == OpCodes.Ret) is Instruction instruction)
6489
{
65-
il.Remove(instruction);
90+
instructions.Remove(instruction);
6691
}
6792

68-
il.Emit(OpCodes.Newobj, constructorOnStringList);
93+
instructions.Add(Instruction.Create(OpCodes.Newobj, constructorOnStringList));
6994

70-
//propertiesNames.ToList().ForEach(propertyName =>
71-
//{
72-
// instructions.Add(Instruction.Create(OpCodes.Dup));
73-
// instructions.Add(Instruction.Create(OpCodes.Ldstr, propertyName));
74-
// instructions.Add(Instruction.Create(OpCodes.Callvirt, addMethodOnStringList));
75-
//});
95+
propertiesNames.ToList().ForEach(propertyName =>
96+
{
97+
instructions.Add(Instruction.Create(OpCodes.Dup));
98+
instructions.Add(Instruction.Create(OpCodes.Ldstr, propertyName));
99+
instructions.Add(Instruction.Create(OpCodes.Callvirt, addMethodOnStringList));
100+
});
76101

77-
il.Emit(OpCodes.Stsfld, field);
102+
instructions.Add(Instruction.Create(OpCodes.Stsfld, field));
78103

79-
il.Emit(OpCodes.Ret);
104+
instructions.Add(Instruction.Create(OpCodes.Ret));
80105

81106
return field;
82107
}
83108

84-
public MethodDefinition GetOrCreateStaticConstructor(TypeDefinition typeDefinition)
85-
{
86-
return typeDefinition.GetStaticConstructor() ??
87-
new MethodDefinition(".cctor", staticConstructorAttributes, TypeSystem.VoidReference);
88-
}
89-
90109
public override IEnumerable<string> GetAssembliesForScanning()
91110
{
92111
yield return "netstandard";

CodingSeb.Localization.FodyAddin.Tests/WeaverTests.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,17 @@ public void ValidateThatPropertyWithLocalizeAttributeIsUpdateWhenLanguageChanged
2525
var type = testResult.Assembly.GetType("CodingSeb.Localization.AssemblyToProcess.LocalizedWithFodyClass");
2626

2727
FieldInfo propertyNamesField = type.GetField("__localizedPropertyNames__", BindingFlags.NonPublic | BindingFlags.Static);
28+
MethodInfo languageChangedMethod = type.GetMethod("__CurrentLanguageChanged__", BindingFlags.NonPublic | BindingFlags.Instance);
2829

2930
Assert.NotNull(propertyNamesField);
31+
Assert.NotNull(languageChangedMethod);
3032

3133
var instance = (dynamic)Activator.CreateInstance(type);
3234

3335
List<string> listOfPropertyNames = propertyNamesField.GetValue(instance) as List<string>;
3436

3537
Assert.NotNull(listOfPropertyNames);
36-
Assert.Contains("TestPropertya", listOfPropertyNames);
38+
Assert.Contains("TestProperty", listOfPropertyNames);
3739

3840
INotifyPropertyChanged notifyPropertyChanged = instance as INotifyPropertyChanged;
3941

@@ -46,9 +48,13 @@ void NotifyPropertyChanged_PropertyChanged(object sender, PropertyChangedEventAr
4648

4749
notifyPropertyChanged.PropertyChanged += NotifyPropertyChanged_PropertyChanged;
4850

51+
languageChangedMethod.Invoke(instance, new object[] { Loc.Instance, new CurrentLanguageChangedEventArgs("en", "fr") });
52+
Assert.Equal("TestProperty", propertyName);
53+
54+
propertyName = string.Empty;
55+
4956
notifyPropertyChanged.PropertyChanged -= NotifyPropertyChanged_PropertyChanged;
5057

51-
//Assert.Equal("TestProperty" ,propertyName);
5258
}
5359
}
5460
}

0 commit comments

Comments
 (0)