From 623c8a2542cf071b59aebe4811d7d61c762db774 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 27 Aug 2023 20:27:49 +0100 Subject: Check while loop body does not yield value --- .../java/org/shedlang/compiler/typechecker/TypeChecker.java | 10 ++++++++++ .../typechecker/errors/LoopBodyCannotYieldValueError.java | 10 ++++++++++ 2 files changed, 20 insertions(+) create mode 100644 src/main/java/org/shedlang/compiler/typechecker/errors/LoopBodyCannotYieldValueError.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 651a4f79..5302ee6c 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -900,6 +900,16 @@ public class TypeChecker { var typedBody = typedBodyResult.value(); context = typedBodyResult.context(); + switch (typedBody.behaviour()) { + case TypedFunctionStatementBehaviour.BlockReturn blockReturn -> { + throw new LoopBodyCannotYieldValueError(untyped.body().source()); + } + case TypedFunctionStatementBehaviour.Continue continue_ -> { + } + case TypedFunctionStatementBehaviour.Terminate terminate -> { + } + } + return context.toResult(new TypedWhileNode( typedCondition, typedBody, diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/LoopBodyCannotYieldValueError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/LoopBodyCannotYieldValueError.java new file mode 100644 index 00000000..2c80338e --- /dev/null +++ b/src/main/java/org/shedlang/compiler/typechecker/errors/LoopBodyCannotYieldValueError.java @@ -0,0 +1,10 @@ +package org.shedlang.compiler.typechecker.errors; + +import org.shedlang.compiler.errors.SourceError; +import org.shedlang.compiler.sources.Source; + +public class LoopBodyCannotYieldValueError extends SourceError { + public LoopBodyCannotYieldValueError(Source source) { + super("Loop body cannot yield value", source); + } +} -- cgit v1.2.3