Skip to content

Commit

Permalink
.
Browse files Browse the repository at this point in the history
  • Loading branch information
beyaz committed Dec 7, 2024
1 parent 704f110 commit adb0082
Showing 1 changed file with 31 additions and 22 deletions.
53 changes: 31 additions & 22 deletions ReactWithDotNet/ILCodeGeneration/MonoCecilToJsonModelMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public static void Import(this MetadataTable metadataTable, TypeDefinition value
{
var model = AsModel(value, metadataTable);

var index = metadataTable.Types.FindIndex(x => IsSame((TypeReferenceModel)x, model));
var index = metadataTable.Types.FindIndex(x => IsSame(x, model, metadataTable));
if (index >= 0)
{
metadataTable.Types[index] = model;
Expand All @@ -33,7 +33,7 @@ public static void Import(this MetadataTable metadataTable, MethodDefinition val
{
var model = AsModel(value, metadataTable);

var index = metadataTable.Methods.FindIndex(x => IsSame(x, model));
var index = metadataTable.Methods.FindIndex(x => IsSame(x, model,metadataTable));
if (index >= 0)
{
metadataTable.Methods[index] = model;
Expand Down Expand Up @@ -65,11 +65,11 @@ static TypeDefinitionModel AsModel(this TypeDefinition value, MetadataTable meta

CustomAttributes = value.CustomAttributes.Where(IsExportableAttribute).ToListOf(AsModel, metadataTable),
BaseType = value.BaseType.IndexAt(metadataTable),
Methods = metadataTable.Methods.ForceReplaceThenGetIndexes(value.Methods.ToListOf(AsModel, metadataTable)),
Fields = metadataTable.Fields.ForceReplaceThenGetIndexes(value.Fields.ToListOf(AsModel, metadataTable)),
Properties = metadataTable.Properties.ForceReplaceThenGetIndexes(value.Properties.ToListOf(AsModel, metadataTable)),
NestedTypes = metadataTable.Types.ForceReplaceThenGetIndexes(value.NestedTypes.ToListOf(AsModel, metadataTable)),
Events = metadataTable.Events.ForceReplaceThenGetIndexes(value.Events.ToListOf(AsModel, metadataTable)),
Methods = metadataTable.Methods.ForceReplaceThenGetIndexes(value.Methods.ToListOf(AsModel, metadataTable), metadataTable),
Fields = metadataTable.Fields.ForceReplaceThenGetIndexes(value.Fields.ToListOf(AsModel, metadataTable),metadataTable),
Properties = metadataTable.Properties.ForceReplaceThenGetIndexes(value.Properties.ToListOf(AsModel, metadataTable),metadataTable),
NestedTypes = metadataTable.Types.ForceReplaceThenGetIndexes(value.NestedTypes.ToListOf(AsModel, metadataTable),metadataTable),
Events = metadataTable.Events.ForceReplaceThenGetIndexes(value.Events.ToListOf(AsModel, metadataTable),metadataTable),
Interfaces = value.Interfaces.ToListOf(AsModel, metadataTable)
};
}
Expand Down Expand Up @@ -592,13 +592,13 @@ static TypeReferenceModel AsModel(this TypeReference value, MetadataTable metada
};
}

static IReadOnlyList<int> ForceReplaceThenGetIndexes<TDefinitionModel>(this List<MemberReferenceModel> targetList, IEnumerable<TDefinitionModel> enumerable) where TDefinitionModel : MemberReferenceModel
static IReadOnlyList<int> ForceReplaceThenGetIndexes<TDefinitionModel>(this List<MemberReferenceModel> targetList, IEnumerable<TDefinitionModel> enumerable, MetadataTable metadataTable) where TDefinitionModel : MemberReferenceModel
{
var list = new List<int>();

foreach (var definitionModel in enumerable)
{
var index = targetList.FindIndex(x => IsSame(x, definitionModel));
var index = targetList.FindIndex(x => IsSame(x, definitionModel,metadataTable));
if (index >= 0)
{
targetList[index] = definitionModel;
Expand Down Expand Up @@ -779,18 +779,34 @@ static bool IsExportableAttribute(CustomAttribute value)
return true;
}

static bool IsSame(object a, object b)


static bool IsSame(object a, object b, MetadataTable metadataTable)
{
if (a is FieldReferenceModel fieldReferenceA && b is FieldReferenceModel fieldReferenceB)

{
return fieldReferenceA.Name == fieldReferenceB.Name && fieldReferenceA.DeclaringType == fieldReferenceB.DeclaringType;
if (a is PropertyReference reference && b is PropertyReferenceModel model)
{
return reference.Name == model.Name && reference.DeclaringType.IndexAt(metadataTable) == model.DeclaringType;
}

}

if (a is PropertyReferenceModel propertyReferenceA && b is PropertyReferenceModel propertyReferenceB)
{
return propertyReferenceA.Name == propertyReferenceB.Name && propertyReferenceA.DeclaringType == propertyReferenceB.DeclaringType;
if (a is PropertyReferenceModel propertyReferenceA && b is PropertyReferenceModel propertyReferenceB)
{
return propertyReferenceA.Name == propertyReferenceB.Name && propertyReferenceA.DeclaringType == propertyReferenceB.DeclaringType;
}
}


if (a is FieldReferenceModel fieldReferenceA && b is FieldReferenceModel fieldReferenceB)
{
return fieldReferenceA.Name == fieldReferenceB.Name && fieldReferenceA.DeclaringType == fieldReferenceB.DeclaringType;
}



if (a is EventReferenceModel eventReferenceA && b is EventReferenceModel eventReferenceB)
{
return eventReferenceA.Name == eventReferenceB.Name && eventReferenceA.DeclaringType == eventReferenceB.DeclaringType;
Expand Down Expand Up @@ -831,14 +847,7 @@ static bool IsSame(object a, object b)

throw new NotImplementedException();
}

static bool IsSame(PropertyReference value, MemberReferenceModel model, MetadataTable metadataTable)
{
return model is PropertyReferenceModel referenceModel &&
value.Name == referenceModel.Name &&
value.DeclaringType.IndexAt(metadataTable) == referenceModel.DeclaringType;
}


static bool IsSame(FieldReference value, MemberReferenceModel model, MetadataTable metadataTable)
{
return model is FieldReferenceModel referenceModel &&
Expand Down

0 comments on commit adb0082

Please sign in to comment.