blob: 6a46833d01a3f78518bb7993fac8461601ba5de3 [file] [log] [blame]
/*
* Copyright 2021 Google LLC.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/sksl/DSLSymbols.h"
#include "include/private/SkSLSymbol.h"
#include "include/sksl/SkSLPosition.h"
#include "src/sksl/SkSLCompiler.h"
#include "src/sksl/SkSLThreadContext.h"
#include "src/sksl/dsl/priv/DSLWriter.h"
#include "src/sksl/ir/SkSLSymbolTable.h"
#include "src/sksl/ir/SkSLType.h"
#include "src/sksl/ir/SkSLVariable.h"
#include <string>
#include <type_traits>
#include <utility>
namespace SkSL {
namespace dsl {
class DSLVarBase;
static bool is_type_in_symbol_table(std::string_view name, SkSL::SymbolTable* symbols) {
const SkSL::Symbol* s = (*symbols)[name];
return s && s->is<Type>();
}
void PushSymbolTable() {
SymbolTable::Push(&ThreadContext::SymbolTable());
}
void PopSymbolTable() {
SymbolTable::Pop(&ThreadContext::SymbolTable());
}
std::shared_ptr<SymbolTable> CurrentSymbolTable() {
return ThreadContext::SymbolTable();
}
DSLExpression Symbol(std::string_view name, Position pos) {
return DSLExpression(ThreadContext::Compiler().convertIdentifier(pos, name), pos);
}
bool IsType(std::string_view name) {
return is_type_in_symbol_table(name, CurrentSymbolTable().get());
}
bool IsBuiltinType(std::string_view name) {
return is_type_in_symbol_table(name, CurrentSymbolTable()->builtinParent());
}
void AddToSymbolTable(DSLVarBase& var, Position pos) {
const SkSL::Variable* skslVar = DSLWriter::Var(var);
if (skslVar) {
CurrentSymbolTable()->addWithoutOwnership(skslVar);
}
ThreadContext::ReportErrors(pos);
}
const std::string* Retain(std::string string) {
return CurrentSymbolTable()->takeOwnershipOfString(std::move(string));
}
} // namespace dsl
} // namespace SkSL