fix: 在非 void 函数中强制使用 return 语句
在 FunctionChecker 中添加一个检查,以确保具有非 void 返回类型的功能 类型必须至少包含一个返回节点。否则将引发语义错误。
This commit is contained in:
parent
2a25abcf03
commit
c83a584795
@ -2,11 +2,13 @@ package org.jcnc.snow.compiler.semantic.core;
|
|||||||
|
|
||||||
import org.jcnc.snow.compiler.parser.ast.FunctionNode;
|
import org.jcnc.snow.compiler.parser.ast.FunctionNode;
|
||||||
import org.jcnc.snow.compiler.parser.ast.ModuleNode;
|
import org.jcnc.snow.compiler.parser.ast.ModuleNode;
|
||||||
|
import org.jcnc.snow.compiler.parser.ast.ReturnNode;
|
||||||
import org.jcnc.snow.compiler.semantic.analyzers.base.StatementAnalyzer;
|
import org.jcnc.snow.compiler.semantic.analyzers.base.StatementAnalyzer;
|
||||||
import org.jcnc.snow.compiler.semantic.error.SemanticError;
|
import org.jcnc.snow.compiler.semantic.error.SemanticError;
|
||||||
import org.jcnc.snow.compiler.semantic.symbol.Symbol;
|
import org.jcnc.snow.compiler.semantic.symbol.Symbol;
|
||||||
import org.jcnc.snow.compiler.semantic.symbol.SymbolKind;
|
import org.jcnc.snow.compiler.semantic.symbol.SymbolKind;
|
||||||
import org.jcnc.snow.compiler.semantic.symbol.SymbolTable;
|
import org.jcnc.snow.compiler.semantic.symbol.SymbolTable;
|
||||||
|
import org.jcnc.snow.compiler.semantic.type.BuiltinType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@code FunctionChecker} 是语义分析阶段中用于检查函数体语句合法性的调度器。
|
* {@code FunctionChecker} 是语义分析阶段中用于检查函数体语句合法性的调度器。
|
||||||
@ -79,6 +81,19 @@ public record FunctionChecker(Context ctx) {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 检查非 void 函数是否至少包含一条 return 语句
|
||||||
|
var returnType = ctx.parseType(fn.returnType());
|
||||||
|
if (returnType != BuiltinType.VOID) {
|
||||||
|
boolean hasReturn = fn.body().stream()
|
||||||
|
.anyMatch(stmtNode -> stmtNode instanceof ReturnNode);
|
||||||
|
if (!hasReturn) {
|
||||||
|
ctx.errors().add(new SemanticError(
|
||||||
|
fn,
|
||||||
|
"非 void 函数必须包含至少一条 return 语句"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user