InvokableReferenceTypeUsage implements TypeUsage, Invokable { @Override public boolean sameType(TypeUsage other) { if (!other.isInvokable()) { return false; } if (!(other instanceof InvokableReferenceTypeUsage)) { return false; } InvokableReferenceTypeUsage otherInvokable = (InvokableReferenceTypeUsage)other; if (this.internalInvokableDefinition.getFormalParameters().size() != otherInvokable.internalInvokableDefinition.getFormalParameters().size()) { return false; } for (int i=0; i<this.internalInvokableDefinition.getFormalParameters().size(); i++) { if (!this.internalInvokableDefinition.getFormalParameters().get(i).getType().sameType( otherInvokable.internalInvokableDefinition.getFormalParameters().get(i).getType())) { return false; } } return this.internalInvokableDefinition.getReturnType().sameType( otherInvokable.internalInvokableDefinition.getReturnType()); } InvokableReferenceTypeUsage(InternalInvokableDefinition internalInvokableDefinition); @Override TypeUsage replaceTypeVariables(Map<String, T> typeParams); @Override boolean sameType(TypeUsage other); @Override boolean isInvokable(); @Override Invokable asInvokable(); @Override JvmType jvmType(); @Override boolean hasInstanceField(String fieldName, Symbol instance); @Override Symbol getInstanceField(String fieldName, Symbol instance); @Override Optional<Invokable> getMethod(String method, boolean staticContext); @Override boolean canBeAssignedTo(TypeUsage type); @Override boolean isOverloaded(); @Override Optional<InternalInvokableDefinition> internalInvokableDefinitionFor(List<ActualParam> actualParams); @Override String describe(); @Override boolean equals(Object o); @Override int hashCode(); @Override String toString();  }
@Test public void testSameType() { assertEquals(true, invokableA.sameType(invokableA)); assertEquals(false, invokableA.sameType(invokableB)); assertEquals(false, invokableA.sameType(invokableC)); assertEquals(false, invokableA.sameType(invokableD)); assertEquals(true, invokableA.sameType(invokableSameAsA)); assertEquals(false, invokableA.sameType(invokableSameAsD)); assertEquals(false, invokableB.sameType(invokableA)); assertEquals(true, invokableB.sameType(invokableB)); assertEquals(false, invokableB.sameType(invokableC)); assertEquals(false, invokableB.sameType(invokableD)); assertEquals(false, invokableB.sameType(invokableSameAsA)); assertEquals(false, invokableB.sameType(invokableSameAsD)); assertEquals(false, invokableC.sameType(invokableA)); assertEquals(false, invokableC.sameType(invokableB)); assertEquals(true, invokableC.sameType(invokableC)); assertEquals(false, invokableC.sameType(invokableD)); assertEquals(false, invokableC.sameType(invokableSameAsA)); assertEquals(false, invokableC.sameType(invokableSameAsD)); assertEquals(false, invokableD.sameType(invokableA)); assertEquals(false, invokableD.sameType(invokableB)); assertEquals(false, invokableD.sameType(invokableC)); assertEquals(true, invokableD.sameType(invokableD)); assertEquals(false, invokableD.sameType(invokableSameAsA)); assertEquals(true, invokableD.sameType(invokableSameAsD)); }