/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SKSL_SYMBOL #define SKSL_SYMBOL #include "src/sksl/ir/SkSLIRNode.h" namespace SkSL { /** * Represents a symboltable entry. */ struct Symbol : public IRNode { enum Kind { kFunctionDeclaration_Kind, kUnresolvedFunction_Kind, kType_Kind, kVariable_Kind, kField_Kind, kExternal_Kind }; Symbol(int offset, Kind kind, StringFragment name) : INHERITED(offset) , fKind(kind) , fName(name) {} ~Symbol() override {} /** * Use is to check the type of a symbol. * e.g. replace `sym.fKind == Symbol::kVariable_Kind` with `sym.is()`. */ template bool is() const { return this->fKind == T::kSymbolKind; } /** * Use as to downcast symbols. e.g. replace `(Variable&) sym` with `sym.as()`. */ template const T& as() const { SkASSERT(this->is()); return static_cast(*this); } template T& as() { SkASSERT(this->is()); return static_cast(*this); } Kind fKind; StringFragment fName; using INHERITED = IRNode; }; } // namespace SkSL #endif