1//
2// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7#include "compiler/intermediate.h"
8
9class TAliveTraverser : public TIntermTraverser {
10public:
11    TAliveTraverser(TQualifier q) : TIntermTraverser(true, false, false, true), found(false), qualifier(q)
12    {
13    }
14
15	bool wasFound() { return found; }
16
17protected:
18    bool found;
19    TQualifier qualifier;
20
21    void visitSymbol(TIntermSymbol*);
22    bool visitSelection(Visit, TIntermSelection*);
23};
24
25//
26// Report whether or not a variable of the given qualifier type
27// is guaranteed written.  Not always possible to determine if
28// it is written conditionally.
29//
30// ?? It does not do this well yet, this is just a place holder
31// that simply determines if it was reference at all, anywhere.
32//
33bool QualifierWritten(TIntermNode* node, TQualifier qualifier)
34{
35    TAliveTraverser it(qualifier);
36
37    if (node)
38        node->traverse(&it);
39
40    return it.wasFound();
41}
42
43void TAliveTraverser::visitSymbol(TIntermSymbol* node)
44{
45    //
46    // If it's what we're looking for, record it.
47    //
48    if (node->getQualifier() == qualifier)
49        found = true;
50}
51
52bool TAliveTraverser::visitSelection(Visit preVisit, TIntermSelection* node)
53{
54    if (wasFound())
55        return false;
56
57    return true;
58}
59