public ITypeComputationResult computeTypes() { XExpression rootExpression = getRootExpression(); if (rootExpression == null) return createNoTypeResult(); return computeTypes(rootExpression); }
@Override public TypeAssigner assignTypes() { TypeCheckpointComputationState state = new TypeCheckpointComputationState(getResolvedTypes(), getFeatureScopeSession(), this) { @Override protected ExpressionTypeComputationState createExpressionComputationState(XExpression expression, StackedResolvedTypes typeResolution) { return new RootExpressionTypeComputationState(typeResolution, getFeatureScopeSession(), this, expression, getExpectedType()); } }; return createTypeAssigner(state); }
@Override protected final List<AbstractTypeExpectation> getReturnExpectations(AbstractTypeComputationState actualState, boolean asActualExpectation) { return getExpectations(actualState, !asActualExpectation); }
@Override protected LightweightTypeReference acceptType(XExpression alreadyHandled, ResolvedTypes types, AbstractTypeExpectation expectation, LightweightTypeReference type, boolean returnType, int flags) { if (alreadyHandled != getRootExpression()) return types.acceptType(getNonNullRootExpression(), expectation, type, returnType, flags); return type; }
@Override protected ExpressionTypeComputationState createExpressionComputationState(XExpression expression, StackedResolvedTypes typeResolution) { return new RootExpressionTypeComputationState(typeResolution, getFeatureScopeSession(), this, expression, getExpectedType()); }
protected XExpression getNonNullRootExpression() { XExpression result = getRootExpression(); if (result == null) throw new IllegalStateException("root expression was null"); return result; }
@Override protected LightweightTypeReference acceptType(ResolvedTypes types, AbstractTypeExpectation expectation, LightweightTypeReference type, boolean returnType, int flags) { return types.acceptType(getNonNullRootExpression(), expectation, type, returnType, flags); }
@Override protected ExpressionTypeComputationState createExpressionComputationState(XExpression expression, StackedResolvedTypes typeResolution) { return new RootExpressionTypeComputationState(typeResolution, getFeatureScopeSession(), this, expression, getExpectedType()); } };
protected abstract List<AbstractTypeExpectation> getExpectations(AbstractTypeComputationState actualState, boolean returnType);