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;
  }
  private void addMethod(Operation f, LinkedHashMap<Signature, LinkedList<Operation>> meths) {
    LinkedList<Operation> list = meths.get(f.getSignature());

    // No duplicate method? Everything fine!
    if (list == null) {
      list = new LinkedList<Operation>();
      meths.put(f.getSignature(), list);
      list.add(f);
      return;
    }

    // Function is just a forward declaration and there is already such a function? Skip!
    if (f.isForwardDeclaration()) return;

    // Test for duplicate functions
    ListIterator<Operation> iter = list.listIterator();
    while (iter.hasNext()) {
      Operation f2 = iter.next();

      // Forward declaration? Remove!
      if (f2.isForwardDeclaration()) {
        iter.remove();
        continue;
      }

      // Duplicate?
      if (f2.getScope().equals(f.getScope())
          || (f.getVisibility() != Visibility.PRIVATE
              && f2.getVisibility() != Visibility.PRIVATE)) {
        // TODO: This code was copy pasted from function set. Check if it makes sense for
        // enrichments
        throw Problem.ofType(ProblemId.DUPLICATE_METHOD)
            .at(f.getDefinition(), f2.getDefinition())
            .raiseUnrecoverable();
      }
    }
    list.add(f);
  }