public OperationBodyComputationState(ResolvedTypes resolvedTypes, IFeatureScopeSession featureScopeSession, JvmOperation operation) { super(resolvedTypes.pushExpectedExceptions(operation), featureScopeSession, operation); for(JvmFormalParameter parameter: operation.getParameters()) { addLocalToCurrentScope(parameter); } }
@Override /* @Nullable */ protected LightweightTypeReference getExpectedType() { JvmOperation operation = (JvmOperation) getMember(); LightweightTypeReference expectedType = ((LogicalContainerAwareReentrantTypeResolver)getResolver()).getReturnTypeOfOverriddenOperation(operation, resolvedTypes, getFeatureScopeSession()); if (expectedType != null) { InferredTypeIndicator.resolveTo(operation.getReturnType(), expectedType.toJavaCompliantTypeReference()); return expectedType; } return getResolvedTypes().getExpectedTypeForAssociatedExpression(getMember(), getNonNullRootExpression()); }
@Override protected ITypeComputationResult createNoTypeResult() { JvmOperation operation = (JvmOperation) getMember(); LightweightTypeReference expectedType = ((LogicalContainerAwareReentrantTypeResolver)getResolver()).getReturnTypeOfOverriddenOperation(operation, resolvedTypes, getFeatureScopeSession()); if (expectedType != null) { InferredTypeIndicator.resolveTo(operation.getReturnType(), expectedType.toJavaCompliantTypeReference()); } return new NoTypeResult(getMember(), resolvedTypes.getReferenceOwner()); } }
@SuppressWarnings("unused") protected void _computeTypes(Map<JvmIdentifiableElement, ResolvedTypes> preparedResolvedTypes, ResolvedTypes resolvedTypes, IFeatureScopeSession featureScopeSession, JvmOperation operation) { ResolvedTypes childResolvedTypes = preparedResolvedTypes.get(operation); if (childResolvedTypes == null) { if (preparedResolvedTypes.containsKey(operation)) return; throw new IllegalStateException("No resolved type found. Operation was: " + operation.getIdentifier()); } else { preparedResolvedTypes.put(operation, null); } OperationBodyComputationState state = new OperationBodyComputationState(childResolvedTypes, operation.isStatic() ? featureScopeSession : featureScopeSession.toInstanceContext(), operation); addExtensionProviders(state, operation.getParameters()); markComputing(operation.getReturnType()); try { state.computeTypes(); } finally { unmarkComputing(operation.getReturnType()); } computeAnnotationTypes(childResolvedTypes, featureScopeSession, operation); computeLocalTypes(preparedResolvedTypes, childResolvedTypes, featureScopeSession, operation); mergeChildTypes(childResolvedTypes); }
@Override protected List<AbstractTypeExpectation> getExpectations(AbstractTypeComputationState actualState, boolean returnType) { LightweightTypeReference type = getExpectedType(); AbstractTypeExpectation result; if (type != null) { result = returnType ? new TypeExpectation(type, actualState, returnType) : new RootTypeExpectation(type, actualState); } else { result = returnType ? new NoExpectation(actualState, returnType) : new RootNoExpectation(actualState, true); } return Collections.singletonList(result); }
try { markComputing(dispatchCase.getReturnType()); dispatchCaseResult = state.computeTypes(); } finally { unmarkComputing(dispatchCase.getReturnType());
@Override /* @Nullable */ protected LightweightTypeReference getExpectedType() { LightweightTypeReference expectedType = super.getExpectedType(); if (expectedType != null) { return expectedType; } if (dispatcher != null) { JvmOperation operation = (JvmOperation) getMember(); if (!InferredTypeIndicator.isInferred(dispatcher.getReturnType())) { LightweightTypeReference result = getResolvedTypes().getActualType(dispatcher); if (result != null) InferredTypeIndicator.resolveTo(operation.getReturnType(), result.toJavaCompliantTypeReference()); return result; } } return inheritedExpectedType; }