// // Copyright 2019 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. // // ReplaceShadowingVariables.cpp: Replace all references to any variable in the AST that is // a redefinition of a variable in a nested scope. This is a useful for ESSL 1.00 shaders // where the spec section "4.2.3. Redeclaring Variables" states "However, a nested scope can // override an outer scope's declaration of a particular variable name." This is changed in // later spec versions, such as ESSL 3.20 spec which states "If [a variable] is declared as // a parameter in a function definition, it is scoped until the end of that function // definition. A function's parameter declarations and body together form a single scope." // // So this class is useful when translating from ESSL 1.00 shaders, where function body var // redefinition is allowed, to later shader versions where it's not allowed. // #include "compiler/translator/tree_util/ReplaceShadowingVariables.h" #include "compiler/translator/tree_util/ReplaceVariable.h" #include "compiler/translator/Compiler.h" #include "compiler/translator/IntermNode.h" #include "compiler/translator/Symbol.h" #include "compiler/translator/SymbolTable.h" #include "compiler/translator/tree_util/IntermNode_util.h" #include "compiler/translator/tree_util/IntermTraverse.h" #include <unordered_set> namespace sh { namespace { // Custom struct to queue up any replacements until after AST traversal struct DeferredReplacementBlock { … }; class ReplaceShadowingVariablesTraverser : public TIntermTraverser { … }; } // anonymous namespace // Replaces every occurrence of a variable with another variable. [[nodiscard]] bool ReplaceShadowingVariables(TCompiler *compiler, TIntermBlock *root, TSymbolTable *symbolTable) { … } } // namespace sh