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); }