Add stub definitions to the type determiner.
This adds enough infrastructure to type determiner to start building
out the statement and expression determination.
Bug: tint:5
Change-Id: I5e095cf652b5e3358e6fbabd66dd703348950857
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/18826
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index 8abece1..4e8a046 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -23,8 +23,62 @@
TypeDeterminer::~TypeDeterminer() = default;
-bool TypeDeterminer::Determine(ast::Module*) {
+bool TypeDeterminer::Determine(ast::Module* mod) {
+ for (const auto& var : mod->global_variables()) {
+ variable_stack_.set_global(var->name(), var.get());
+ }
+
+ for (const auto& func : mod->functions()) {
+ name_to_function_[func->name()] = func.get();
+ }
+
+ if (!DetermineFunctions(mod->functions())) {
+ return false;
+ }
return true;
}
+bool TypeDeterminer::DetermineFunctions(const ast::FunctionList& funcs) {
+ for (const auto& func : funcs) {
+ if (!DetermineFunction(func.get())) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool TypeDeterminer::DetermineFunction(ast::Function* func) {
+ variable_stack_.push_scope();
+ if (!DetermineResultType(func->body())) {
+ return false;
+ }
+ variable_stack_.pop_scope();
+
+ return true;
+}
+
+bool TypeDeterminer::DetermineResultType(const ast::StatementList& stmts) {
+ for (const auto& stmt : stmts) {
+ if (!DetermineResultType(stmt.get())) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool TypeDeterminer::DetermineResultType(ast::Statement*) {
+ error_ = "unknown statement type for type determination";
+ return false;
+}
+
+bool TypeDeterminer::DetermineResultType(ast::Expression* expr) {
+ // This is blindly called above, so in some cases the expression won't exist.
+ if (!expr) {
+ return true;
+ }
+
+ error_ = "unknown expression for type determination";
+ return false;
+}
+
} // namespace tint
diff --git a/src/type_determiner.h b/src/type_determiner.h
index b43f923..2bfba85 100644
--- a/src/type_determiner.h
+++ b/src/type_determiner.h
@@ -38,14 +38,34 @@
explicit TypeDeterminer(Context* ctx);
~TypeDeterminer();
- /// Runs the type determiner
- /// @param module the module to update with typing information
- /// @returns true if the type determiner was successful
- bool Determine(ast::Module* module);
-
/// @returns error messages from the type determiner
const std::string& error() { return error_; }
+ /// Runs the type determiner
+ /// @param mod the module to update with typing information
+ /// @returns true if the type determiner was successful
+ bool Determine(ast::Module* mod);
+ /// Determines type information for functions
+ /// @param funcs the functions to check
+ /// @returns true if the determination was successful
+ bool DetermineFunctions(const ast::FunctionList& funcs);
+ /// Determines type information for a function
+ /// @param func the function to check
+ /// @returns true if the determination was successful
+ bool DetermineFunction(ast::Function* func);
+ /// Determines type information for a set of statements
+ /// @param stmts the statements to check
+ /// @returns true if the determination was successful
+ bool DetermineResultType(const ast::StatementList& stmts);
+ /// Determines type information for a statement
+ /// @param stmt the statement to check
+ /// @returns true if the determination was successful
+ bool DetermineResultType(ast::Statement* stmt);
+ /// Determines type information for an expression
+ /// @param expr the expression to check
+ /// @returns true if the determination was successful
+ bool DetermineResultType(ast::Expression* expr);
+
private:
Context& ctx_;
std::string error_;