private static Operation chooseFunctionForInvocation(
      LinkedList<Operation> functions, FileScope scope) {
    Operation candidate = null;
    int candidatePriority = 0;
    int curPriority;
    for (Operation f : functions) {
      curPriority = 0;

      // Scoped private functions override global ones
      if (f.getScope() == scope) {
        curPriority = 2;
        if (f.isOverride()) {
          curPriority = 4;
        }
      } else if (f.getVisibility() != Visibility.PRIVATE) {
        curPriority = 1;
        if (f.isOverride()) {
          curPriority = 3;
        }
      }
      if (curPriority > candidatePriority) {
        candidate = f;
        candidatePriority = curPriority;
      }
    }
    return candidate;
  }
  void addMethod(Operation f) {

    // Enrichment methods may not declared override
    if (f.isOverride())
      throw Problem.ofType(ProblemId.NATIVE_ENRICHMENT_METHOD_DECLARED_OVERRIDE)
          .at(f.getDefinition())
          .raiseUnrecoverable();

    String uid = f.getUid();
    LinkedHashMap<Signature, LinkedList<Operation>> meths = methods.get(uid);
    if (meths == null) {
      meths = new LinkedHashMap<Signature, LinkedList<Operation>>();
      methods.put(uid, meths);
    }
    addMethod(f, meths);
  }