Shader/ShaderLang: Add type inference for variable declaration

This commit is contained in:
Jérôme Leclercq
2021-04-14 17:56:33 +02:00
parent 0f15387c6c
commit b234134abc
6 changed files with 37 additions and 7 deletions

View File

@@ -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);

View File

@@ -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();
}