@Nullable private Boolean isOverriding(MethodJavaSymbol overridee, JavaType.ClassJavaType classType) { // same number and type of formal parameters if (getParametersTypes().size() != overridee.getParametersTypes().size()) { return false; } for (int i = 0; i < getParametersTypes().size(); i++) { JavaType paramOverrider = getParametersTypes().get(i); if (paramOverrider.isTagged(JavaType.UNKNOWN)) { // FIXME : complete symbol table should not have unknown types and generics should be // handled properly for this. return null; } // Generics type should have same erasure see JLS8 8.4.2 JavaType overrideeType = overridee.getParametersTypes().get(i); if (classType instanceof JavaType.ParametrizedTypeJavaType) { overrideeType = ((JavaType.ParametrizedTypeJavaType) classType) .typeSubstitution.substitutedType(overrideeType); if (overrideeType == null) { overrideeType = overridee.getParametersTypes().get(i); } } if (!paramOverrider.erasure().equals(overrideeType.erasure())) { return false; } } // we assume code is compiling so no need to check return type at this point. return true; }
/** Check accessibility of parent method. */ private boolean canOverride(MethodJavaSymbol overridee) { if (overridee.isPackageVisibility()) { return overridee.outermostClass().owner().equals(outermostClass().owner()); } return !overridee.isPrivate(); }