@Override public TypeResult<StatementTypeCheckResult> typeCheck( ReturnNode returnStatement, Option<Type> returnType) { TypeResultBuilder<StatementTypeCheckResult> typeResult = typeResultBuilder(StatementTypeCheckResult.alwaysReturns()); ExpressionNode expression = returnStatement.getExpression(); TypeResult<Type> expressionTypeResult = typeInferer.inferType(expression); typeResult.addErrors(expressionTypeResult); if (!returnType.hasValue()) { typeResult.addError(error(returnStatement, new CannotReturnHereError())); } else if (expressionTypeResult.hasValue() && !subTyping.isSubType(expressionTypeResult.getOrThrow(), returnType.get())) { typeResult.addError( error( expression, new WrongReturnTypeError(returnType.get(), expressionTypeResult.getOrThrow()))); } return typeResult.build(); }
@Test public void functionSignatureDoesNotReturn() { TypeResult<StatementTypeCheckResult> result = typeCheck(funcSignature); assertThat(result, isSuccessWithValue(StatementTypeCheckResult.noReturn())); }