blob: 1c7890a1277252e706cca72119a4c08ea77f040e [file] [log] [blame]
/*
* 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_FIELD
#define SKSL_FIELD
#include "include/private/SkSLModifiers.h"
#include "include/private/SkSLSymbol.h"
#include "src/sksl/ir/SkSLType.h"
#include "src/sksl/ir/SkSLVariable.h"
namespace SkSL {
/**
* A symbol which should be interpreted as a field access. Fields are added to the symboltable
* whenever a bare reference to an identifier should refer to a struct field; in GLSL, this is the
* result of declaring anonymous interface blocks.
*/
class Field final : public Symbol {
public:
inline static constexpr Kind kSymbolKind = Kind::kField;
Field(Position pos, const Variable* owner, int fieldIndex)
: INHERITED(pos, kSymbolKind, owner->type().fields()[fieldIndex].fName,
owner->type().fields()[fieldIndex].fType)
, fOwner(owner)
, fFieldIndex(fieldIndex) {}
int fieldIndex() const {
return fFieldIndex;
}
const Variable& owner() const {
return *fOwner;
}
std::string description() const override {
return this->owner().description() + "." + std::string(this->name());
}
private:
const Variable* fOwner;
int fFieldIndex;
using INHERITED = Symbol;
};
} // namespace SkSL
#endif