/* * Copyright 2024 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "src/sksl/ir/SkSLSymbol.h" #include "src/sksl/ir/SkSLExpression.h" #include "src/sksl/ir/SkSLFieldAccess.h" #include "src/sksl/ir/SkSLFieldSymbol.h" #include "src/sksl/ir/SkSLFunctionDeclaration.h" #include "src/sksl/ir/SkSLFunctionReference.h" #include "src/sksl/ir/SkSLType.h" #include "src/sksl/ir/SkSLTypeReference.h" #include "src/sksl/ir/SkSLVariable.h" #include "src/sksl/ir/SkSLVariableReference.h" #include namespace SkSL { std::unique_ptr Symbol::instantiate(const Context& context, Position pos) const { switch (this->kind()) { case Symbol::Kind::kFunctionDeclaration: return std::make_unique( context, pos, &this->as()); case Symbol::Kind::kVariable: { const Variable* var = &this->as(); // default to kRead_RefKind; this will be corrected later if the variable is written to return VariableReference::Make(pos, var, VariableReference::RefKind::kRead); } case Symbol::Kind::kField: { const FieldSymbol* field = &this->as(); auto base = VariableReference::Make( pos, &field->owner(), VariableReference::RefKind::kRead); return FieldAccess::Make(context, pos, std::move(base), field->fieldIndex(), FieldAccess::OwnerKind::kAnonymousInterfaceBlock); } case Symbol::Kind::kType: return TypeReference::Convert(context, pos, &this->as()); default: SkDEBUGFAILF("unsupported symbol type %d\n", fKind); return nullptr; } } } // namespace SkSL