}
private void refineMethod(Tree.SpecifierStatement that) {
Method refinedMethod = (Method) that.getRefined();
Method method = (Method) that.getDeclaration();
ClassOrInterface ci = (ClassOrInterface) method.getContainer();
Declaration root = refinedMethod.getRefinedDeclaration();
method.setRefinedDeclaration(root);
if (getInterveningRefinements(method.getName(),
getSignature(method), root,
ci, (TypeDeclaration) root.getContainer())
.isEmpty()) {
that.getBaseMemberExpression()
.addError("shortcut refinement does not exactly refine any overloaded inherited member");
}
else {
ProducedReference refinedProducedReference =
getRefinedMember(refinedMethod, ci);
method.setType(refinedProducedReference.getType());
List<Tree.ParameterList> parameterLists;
Tree.Term me = that.getBaseMemberExpression();
if (me instanceof Tree.ParameterizedExpression) {
parameterLists =
((Tree.ParameterizedExpression) me).getParameterLists();
}
else {
parameterLists = emptyList();
}
for (int i=0; i<refinedMethod.getParameterLists().size(); i++) {
ParameterList refinedParameters =
refinedMethod.getParameterLists().get(i);
ParameterList parameters =
method.getParameterLists().get(i);
Tree.ParameterList parameterList =
parameterLists.size()<=i ?
null : parameterLists.get(i);
for (int j=0; j<refinedParameters.getParameters().size(); j++) {
Parameter refinedParameter =
refinedParameters.getParameters().get(j);
ProducedType refinedParameterType =
refinedProducedReference
.getTypedParameter(refinedParameter)
.getFullType();
if (parameterList==null ||
parameterList.getParameters().size()<=j) {
Parameter p = parameters.getParameters().get(j);
p.getModel().setType(refinedParameterType);
}
else {
Tree.Parameter parameter =
parameterList.getParameters().get(j);
Parameter p = parameter.getParameterModel();
ProducedType parameterType =
p.getModel().getTypedReference().getFullType();
Node typeNode = parameter;
if (parameter instanceof Tree.ParameterDeclaration) {
Tree.Type type =
((Tree.ParameterDeclaration) parameter)
.getTypedDeclaration().getType();
if (type!=null) {
typeNode = type;
}
}
checkIsExactlyForInterop(that.getUnit(),
refinedParameters.isNamedParametersSupported(),
parameterType, refinedParameterType, typeNode,
"type of parameter '" + p.getName() +
"' of '" + method.getName() +
"' declared by '" + ci.getName() +
"' is different to type of corresponding parameter '" +
refinedParameter.getName() + "' of refined method '" +
refinedMethod.getName() + "' of '" +
((Declaration) refinedMethod.getContainer()).getName() +
"'");