// // Copyright 2020 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // #ifndef COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_NODETYPE_H_ #define COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_NODETYPE_H_ #include "compiler/translator/tree_util/IntermTraverse.h" namespace sh { enum class NodeType { Unknown, Symbol, ConstantUnion, FunctionPrototype, PreprocessorDirective, Unary, Binary, Ternary, Swizzle, IfElse, Switch, Case, FunctionDefinition, Aggregate, Block, GlobalQualifierDeclaration, Declaration, Loop, Branch, }; // This is a function like object instead of a function that stack allocates this because // TIntermTraverser is a heavy object to construct. class GetNodeType : private TIntermTraverser { NodeType nodeType; public: GetNodeType() : TIntermTraverser(true, false, false) {} NodeType operator()(TIntermNode &node) { node.visit(Visit::PreVisit, this); return nodeType; } private: void visitSymbol(TIntermSymbol *) override { nodeType = NodeType::Symbol; } void visitConstantUnion(TIntermConstantUnion *) override { nodeType = NodeType::ConstantUnion; } void visitFunctionPrototype(TIntermFunctionPrototype *) override { nodeType = NodeType::FunctionPrototype; } void visitPreprocessorDirective(TIntermPreprocessorDirective *) override { nodeType = NodeType::PreprocessorDirective; } bool visitSwizzle(Visit, TIntermSwizzle *) override { nodeType = NodeType::Swizzle; return false; } bool visitBinary(Visit, TIntermBinary *) override { nodeType = NodeType::Binary; return false; } bool visitUnary(Visit, TIntermUnary *) override { nodeType = NodeType::Unary; return false; } bool visitTernary(Visit, TIntermTernary *) override { nodeType = NodeType::Ternary; return false; } bool visitIfElse(Visit, TIntermIfElse *) override { nodeType = NodeType::IfElse; return false; } bool visitSwitch(Visit, TIntermSwitch *) override { nodeType = NodeType::Switch; return false; } bool visitCase(Visit, TIntermCase *) override { nodeType = NodeType::Case; return false; } bool visitFunctionDefinition(Visit, TIntermFunctionDefinition *) override { nodeType = NodeType::FunctionDefinition; return false; } bool visitAggregate(Visit, TIntermAggregate *) override { nodeType = NodeType::Aggregate; return false; } bool visitBlock(Visit, TIntermBlock *) override { nodeType = NodeType::Block; return false; } bool visitGlobalQualifierDeclaration(Visit, TIntermGlobalQualifierDeclaration *) override { nodeType = NodeType::GlobalQualifierDeclaration; return false; } bool visitDeclaration(Visit, TIntermDeclaration *) override { nodeType = NodeType::Declaration; return false; } bool visitLoop(Visit, TIntermLoop *) override { nodeType = NodeType::Loop; return false; } bool visitBranch(Visit, TIntermBranch *) override { nodeType = NodeType::Branch; return false; } }; } // namespace sh #endif // COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_NODETYPE_H_