code: protected JvmIdentifiableElement getRefinableCandidate(XExpression object, ITypeComputationState state) {
  		if (object instanceof XSwitchExpression) {
  			XSwitchExpression switchExpression = (XSwitchExpression) object;
  			JvmFormalParameter declaredParam = switchExpression.getDeclaredParam();
  			if (declaredParam != null) {
  				return declaredParam;
  			}
  			return getRefinableCandidate(switchExpression.getSwitch(), state);
  		}
  		if (object instanceof XFeatureCall) {
  			List<? extends IFeatureLinkingCandidate> candidates = state.getLinkingCandidates((XFeatureCall)object);
  			if (candidates.size() == 1) {
  				JvmIdentifiableElement linkedFeature = candidates.get(0).getFeature();
  				if (isRefinableFeature(linkedFeature)) {
  					return linkedFeature;
  				}
  			}
  		} else if (object instanceof XMemberFeatureCall) {
  			List<? extends IFeatureLinkingCandidate> candidates = state.getLinkingCandidates((XMemberFeatureCall)object);
  			if (candidates.size() == 1) {
  				JvmIdentifiableElement linkedFeature = candidates.get(0).getFeature();
  				if (isRefinableFeature(linkedFeature)) {
  					XExpression receiver = ((XMemberFeatureCall) object).getMemberCallTarget();
  					if (receiver instanceof XAbstractFeatureCall) {
  						List<? extends IFeatureLinkingCandidate> receiverCandidates = state.getLinkingCandidates((XAbstractFeatureCall)receiver);
  						if (receiverCandidates.size() == 1) {
  							IFeatureLinkingCandidate receiverCandidate = receiverCandidates.get(0);
  							if (receiverCandidate.getFeature() instanceof JvmType && !receiverCandidate.isTypeLiteral()) {
  								return linkedFeature;
  							}
  						}
  					}
  				}
  			}
  		}
  		return null;
  	}
docs: /* @Nullable