public COOPFunctionConverter(ClassHierarchy hierarchy, COOPClass parentClass)
 {
     classHierarchy   = hierarchy;
     this.parentClass = parentClass;
     originalNameAndInputTypesToMangledName = new Dictionary <NameInputTypePair, string>(NameInputTypePair.nameInputsComparer);
     originalNameAndInputTypesToisStatic    = new Dictionary <NameInputTypePair, bool>();
     functionToReturnType = new Dictionary <string, COOPClass>();
     availableClasses     = hierarchy.getLineage(parentClass);
     availableClasses.AddRange(parentClass.imports);
     generateDictionaries();
 }
        private List <COOPFunction> getAvailableFunctions(COOPClass coopClass, ClassHierarchy hierarchy)
        {
            List <COOPFunction> output = new List <COOPFunction>(coopClass.Functions.Values);

            List <COOPClass> lineageClasses = new List <COOPClass>(hierarchy.getLineage(coopClass));

            lineageClasses.Remove(coopClass);

            foreach (COOPClass lineageClass in lineageClasses)
            {
                output.AddRange(from f in lineageClass.Functions.Values where (int)f.AccessLevel >= 1 select f);
            }
            foreach (COOPClass coopClassImport in coopClass.imports)
            {
                output.AddRange(from f in coopClassImport.Functions.Values where f.AccessLevel == AccessLevel.Public select f);
            }

            return(output);
        }