|
5 | 5 | //
|
6 | 6 |
|
7 | 7 | using Mono.Cecil;
|
| 8 | +using Mono.Cecil.Cil; |
8 | 9 | using Mono.Collections.Generic;
|
9 | 10 | using nanoFramework.Tools.MetadataProcessor.Core.Extensions;
|
10 | 11 | using System;
|
@@ -514,6 +515,15 @@ private HashSet<MetadataToken> BuildDependencyList(MetadataToken token)
|
514 | 515 | }
|
515 | 516 | }
|
516 | 517 |
|
| 518 | + // generic parameters |
| 519 | + foreach (var g in td.GenericParameters) |
| 520 | + { |
| 521 | + if (!nanoTablesContext.ClassNamesToExclude.Contains(g.DeclaringType.FullName)) |
| 522 | + { |
| 523 | + set.Add(g.MetadataToken); |
| 524 | + } |
| 525 | + } |
| 526 | + |
517 | 527 | // methods
|
518 | 528 | foreach (var m in td.Methods)
|
519 | 529 | {
|
@@ -620,6 +630,15 @@ private HashSet<MetadataToken> BuildDependencyList(MetadataToken token)
|
620 | 630 | set.Add(md.ReturnType.MetadataToken);
|
621 | 631 | }
|
622 | 632 |
|
| 633 | + // generic parameters |
| 634 | + if(md.HasGenericParameters) |
| 635 | + { |
| 636 | + foreach (var gp in md.GenericParameters) |
| 637 | + { |
| 638 | + set.Add(gp.MetadataToken); |
| 639 | + } |
| 640 | + } |
| 641 | + |
623 | 642 | // parameters
|
624 | 643 | foreach (var p in md.Parameters)
|
625 | 644 | {
|
@@ -707,7 +726,9 @@ private HashSet<MetadataToken> BuildDependencyList(MetadataToken token)
|
707 | 726 | i.Operand is FieldReference ||
|
708 | 727 | i.Operand is TypeDefinition ||
|
709 | 728 | i.Operand is TypeSpecification ||
|
710 |
| - i.Operand is TypeReference) |
| 729 | + i.Operand is TypeReference || |
| 730 | + i.Operand is GenericInstanceType || |
| 731 | + i.Operand is GenericParameter) |
711 | 732 | {
|
712 | 733 | set.Add(((IMetadataTokenProvider)i.Operand).MetadataToken);
|
713 | 734 | }
|
@@ -763,6 +784,16 @@ i.Operand is TypeSpecification ||
|
763 | 784 | }
|
764 | 785 |
|
765 | 786 | break;
|
| 787 | + |
| 788 | + case TokenType.GenericParam: |
| 789 | + case TokenType.AssemblyRef: |
| 790 | + case TokenType.String: |
| 791 | + // we are good with these, nothing to do here |
| 792 | + break; |
| 793 | + |
| 794 | + default: |
| 795 | + Debug.Fail($"Unable to process token {token}."); |
| 796 | + break; |
766 | 797 | }
|
767 | 798 |
|
768 | 799 | return set;
|
@@ -823,6 +854,26 @@ private string TokenToString(MetadataToken token)
|
823 | 854 | output.Append(fd.Name);
|
824 | 855 | break;
|
825 | 856 |
|
| 857 | + case TokenType.GenericParam: |
| 858 | + var gp = _tablesContext.GenericParamsTable.Items.FirstOrDefault(g => g.MetadataToken == token); |
| 859 | + |
| 860 | + output.Append($"[GenericParam 0x{token.ToUInt32().ToString("X8")}]"); |
| 861 | + |
| 862 | + if (gp.DeclaringType != null) |
| 863 | + { |
| 864 | + output.Append(TokenToString(gp.DeclaringType.MetadataToken)); |
| 865 | + output.Append("::"); |
| 866 | + } |
| 867 | + else if(gp.DeclaringMethod != null) |
| 868 | + { |
| 869 | + output.Append(TokenToString(gp.DeclaringMethod.MetadataToken)); |
| 870 | + output.Append("::"); |
| 871 | + } |
| 872 | + |
| 873 | + output.Append(gp.Name); |
| 874 | + |
| 875 | + break; |
| 876 | + |
826 | 877 | case TokenType.Method:
|
827 | 878 | var md = _tablesContext.MethodDefinitionTable.Items.FirstOrDefault(i => i.MetadataToken == token);
|
828 | 879 |
|
@@ -879,6 +930,17 @@ private string TokenToString(MetadataToken token)
|
879 | 930 | typeRef = fr.DeclaringType;
|
880 | 931 | typeName = fr.Name;
|
881 | 932 | }
|
| 933 | + else |
| 934 | + { |
| 935 | + // try now with generic parameters |
| 936 | + var gr = _tablesContext.GenericParamsTable.Items.FirstOrDefault(g => g.MetadataToken == token); |
| 937 | + |
| 938 | + if (gr != null) |
| 939 | + { |
| 940 | + typeRef = gr.DeclaringType; |
| 941 | + typeName = gr.Name; |
| 942 | + } |
| 943 | + } |
882 | 944 | }
|
883 | 945 |
|
884 | 946 | Debug.Assert(typeRef != null);
|
@@ -916,6 +978,10 @@ private string TokenToString(MetadataToken token)
|
916 | 978 | output.Append($"'{sr}'");
|
917 | 979 | }
|
918 | 980 | break;
|
| 981 | + |
| 982 | + default: |
| 983 | + Debug.Fail($"Unable to process token {token}."); |
| 984 | + break; |
919 | 985 | }
|
920 | 986 |
|
921 | 987 | // output token ID if empty
|
|
0 commit comments