internal async Task<ISet<TypeDescriptor>> GetPotentialTypesAsync(PropGraphNodeDescriptor n, PropagationGraph propGraph, ICodeProvider codeProvider)
 {
     var result = new HashSet<TypeDescriptor>();
     foreach (var typeDescriptor in propGraph.GetTypes(n))
     {
         // TO-DO fix by adding a where T: AnalysisType
         if (typeDescriptor.IsConcreteType)
         {
             result.Add(typeDescriptor);
         }
         else
         {
             Contract.Assert(this.InstatiatedTypes != null);
             foreach(var candidateType in this.InstatiatedTypes)
             {
                 var isSubtype = await codeProvider.IsSubtypeAsync(candidateType, typeDescriptor);
                 if(isSubtype)
                 {
                     result.Add(candidateType);
                 }
             }
         }
     }
     return result;
 }