From 7e15be5bef74a562943253a764ef9ffd1b540847 Mon Sep 17 00:00:00 2001 From: fcurdi Date: Mon, 24 Aug 2020 20:26:43 -0300 Subject: [PATCH] retrieve generic parameter instantiated type --- Backend/Analyses/TypeInferenceAnalysis.cs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Backend/Analyses/TypeInferenceAnalysis.cs b/Backend/Analyses/TypeInferenceAnalysis.cs index b25cde66..d8a79ff9 100644 --- a/Backend/Analyses/TypeInferenceAnalysis.cs +++ b/Backend/Analyses/TypeInferenceAnalysis.cs @@ -10,6 +10,7 @@ using Backend.Model; using Model.ThreeAddressCode.Values; using Backend.Utils; +using Model; namespace Backend.Analyses { @@ -56,6 +57,27 @@ public override void Visit(MethodCallInstruction instruction) if (instruction.HasResult) { instruction.Result.Type = instruction.Method.ReturnType; + + // if returnType is a genericParameter that is instantiated, then use its instantiated type + if (instruction.Method.ReturnType is IGenericParameterReference genericParameterReference) + { + IList genericArguments; + switch (genericParameterReference.Kind) + { + case GenericParameterKind.Type: + genericArguments = ((IBasicType) genericParameterReference.GenericContainer).GenericArguments; + break; + case GenericParameterKind.Method: + genericArguments = ((IMethodReference) genericParameterReference.GenericContainer).GenericArguments; + break; + default: + throw genericParameterReference.Kind.ToUnknownValueException(); + } + if (genericArguments.Count > 0) + { + instruction.Result.Type = genericArguments[genericParameterReference.Index]; + } + } } // Skip implicit "this" parameter.