24c1772ea4
It turned out that everywhere we were using or testing DSL code either directly or indirectly imported big chunks of the SkSL library. These imports turned out to be necessary; code written using just DSL.h would fail with various template instantiation errors. Change-Id: Iae72d15b0d6ef14614ac1a4ff08c36bc1876cd4d Reviewed-on: https://skia-review.googlesource.com/c/skia/+/381638 Commit-Queue: Ethan Nicholas <ethannicholas@google.com> Reviewed-by: John Stiles <johnstiles@google.com>
92 lines
1.9 KiB
C++
92 lines
1.9 KiB
C++
/*
|
|
* 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 "include/private/SkSLIRNode.h"
|
|
#include "include/private/SkSLProgramElement.h"
|
|
|
|
namespace SkSL {
|
|
|
|
/**
|
|
* Represents a symboltable entry.
|
|
*/
|
|
class Symbol : public IRNode {
|
|
public:
|
|
enum class Kind {
|
|
kExternal = (int) ProgramElement::Kind::kLast + 1,
|
|
kField,
|
|
kFunctionDeclaration,
|
|
kSymbolAlias,
|
|
kType,
|
|
kUnresolvedFunction,
|
|
kVariable,
|
|
|
|
kFirst = kExternal,
|
|
kLast = kVariable
|
|
};
|
|
|
|
Symbol(int offset, Kind kind, StringFragment name, const Type* type = nullptr)
|
|
: INHERITED(offset, (int) kind)
|
|
, fName(name)
|
|
, fType(type) {
|
|
SkASSERT(kind >= Kind::kFirst && kind <= Kind::kLast);
|
|
}
|
|
|
|
~Symbol() override {}
|
|
|
|
const Type& type() const {
|
|
SkASSERT(fType);
|
|
return *fType;
|
|
}
|
|
|
|
Kind kind() const {
|
|
return (Kind) fKind;
|
|
}
|
|
|
|
StringFragment name() const {
|
|
return fName;
|
|
}
|
|
|
|
/**
|
|
* Use is<T> to check the type of a symbol.
|
|
* e.g. replace `sym.kind() == Symbol::Kind::kVariable` with `sym.is<Variable>()`.
|
|
*/
|
|
template <typename T>
|
|
bool is() const {
|
|
return this->kind() == T::kSymbolKind;
|
|
}
|
|
|
|
/**
|
|
* Use as<T> to downcast symbols. e.g. replace `(Variable&) sym` with `sym.as<Variable>()`.
|
|
*/
|
|
template <typename T>
|
|
const T& as() const {
|
|
SkASSERT(this->is<T>());
|
|
return static_cast<const T&>(*this);
|
|
}
|
|
|
|
template <typename T>
|
|
T& as() {
|
|
SkASSERT(this->is<T>());
|
|
return static_cast<T&>(*this);
|
|
}
|
|
|
|
private:
|
|
StringFragment fName;
|
|
const Type* fType;
|
|
|
|
using INHERITED = IRNode;
|
|
|
|
friend class Type;
|
|
};
|
|
|
|
} // namespace SkSL
|
|
|
|
#endif
|