Shader/ShaderLang: Add type inference for variable declaration
This commit is contained in:
@@ -594,6 +594,21 @@ namespace Nz::ShaderAst
|
||||
AstScopedVisitor::Visit(node);
|
||||
}
|
||||
|
||||
void AstValidator::Visit(DeclareVariableStatement& node)
|
||||
{
|
||||
if (IsNoType(node.varType))
|
||||
{
|
||||
if (!node.initialExpression)
|
||||
throw AstError{ "variable must either have a type or an initial value" };
|
||||
|
||||
node.initialExpression->Visit(*this);
|
||||
|
||||
node.varType = GetExpressionType(*node.initialExpression);
|
||||
}
|
||||
|
||||
AstScopedVisitor::Visit(node);
|
||||
}
|
||||
|
||||
void AstValidator::Visit(ExpressionStatement& node)
|
||||
{
|
||||
MandatoryExpr(node.expression);
|
||||
|
||||
@@ -637,15 +637,19 @@ namespace Nz::ShaderLang
|
||||
Expect(Advance(), TokenType::Let);
|
||||
|
||||
std::string variableName = ParseIdentifierAsName();
|
||||
RegisterVariable(variableName);
|
||||
|
||||
ShaderAst::ExpressionType variableType = ShaderAst::NoType{};
|
||||
if (Peek().type == TokenType::Colon)
|
||||
{
|
||||
Expect(Advance(), TokenType::Colon);
|
||||
|
||||
Expect(Advance(), TokenType::Colon);
|
||||
|
||||
|
||||
variableType = ParseType();
|
||||
}
|
||||
|
||||
ShaderAst::ExpressionPtr expression;
|
||||
ShaderAst::ExpressionPtr expression;
|
||||
if (IsNoType(variableType) || Peek().type == TokenType::Assign)
|
||||
{
|
||||
{
|
||||
Expect(Advance(), TokenType::Assign);
|
||||
expression = ParseExpression();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user