summaryrefslogtreecommitdiffstats
path: root/gfx/skia/skia/src/sksl/ir/SkSLField.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/skia/skia/src/sksl/ir/SkSLField.h')
-rw-r--r--gfx/skia/skia/src/sksl/ir/SkSLField.h56
1 files changed, 56 insertions, 0 deletions
diff --git a/gfx/skia/skia/src/sksl/ir/SkSLField.h b/gfx/skia/skia/src/sksl/ir/SkSLField.h
new file mode 100644
index 0000000000..a7fa6575cf
--- /dev/null
+++ b/gfx/skia/skia/src/sksl/ir/SkSLField.h
@@ -0,0 +1,56 @@
+/*
+ * 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 kIRNodeKind = Kind::kField;
+
+ Field(Position pos, const Variable* owner, int fieldIndex)
+ : INHERITED(pos, kIRNodeKind, 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().name().empty()
+ ? std::string(this->name())
+ : (this->owner().description() + "." + std::string(this->name()));
+ }
+
+private:
+ const Variable* fOwner;
+ int fFieldIndex;
+
+ using INHERITED = Symbol;
+};
+
+} // namespace SkSL
+
+#endif