d6f2338ab1
Bug: skia:11095 Change-Id: Icd69df40675e5ecde5004e04a7dcd78eedf8343c Reviewed-on: https://skia-review.googlesource.com/c/skia/+/344765 Commit-Queue: Brian Osman <brianosman@google.com> Reviewed-by: John Stiles <johnstiles@google.com> Reviewed-by: Ethan Nicholas <ethannicholas@google.com> Reviewed-by: Mike Klein <mtklein@google.com>
72 lines
2.8 KiB
C++
72 lines
2.8 KiB
C++
/*
|
|
* Copyright 2019 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/SkSLSectionAndParameterHelper.h"
|
|
#include "src/sksl/ir/SkSLBinaryExpression.h"
|
|
#include "src/sksl/ir/SkSLConstructor.h"
|
|
#include "src/sksl/ir/SkSLDoStatement.h"
|
|
#include "src/sksl/ir/SkSLExpressionStatement.h"
|
|
#include "src/sksl/ir/SkSLFieldAccess.h"
|
|
#include "src/sksl/ir/SkSLForStatement.h"
|
|
#include "src/sksl/ir/SkSLFunctionCall.h"
|
|
#include "src/sksl/ir/SkSLIfStatement.h"
|
|
#include "src/sksl/ir/SkSLIndexExpression.h"
|
|
#include "src/sksl/ir/SkSLPostfixExpression.h"
|
|
#include "src/sksl/ir/SkSLPrefixExpression.h"
|
|
#include "src/sksl/ir/SkSLReturnStatement.h"
|
|
#include "src/sksl/ir/SkSLSwitchStatement.h"
|
|
#include "src/sksl/ir/SkSLSwizzle.h"
|
|
#include "src/sksl/ir/SkSLTernaryExpression.h"
|
|
|
|
namespace SkSL {
|
|
|
|
SectionAndParameterHelper::SectionAndParameterHelper(const Program* program, ErrorReporter& errors)
|
|
: fProgram(*program) {
|
|
for (const ProgramElement* p : fProgram.elements()) {
|
|
switch (p->kind()) {
|
|
case ProgramElement::Kind::kGlobalVar: {
|
|
const VarDeclaration& decl =
|
|
p->as<GlobalVarDeclaration>().declaration()->as<VarDeclaration>();
|
|
if (IsParameter(decl.var())) {
|
|
fParameters.push_back(&decl.var());
|
|
}
|
|
break;
|
|
}
|
|
case ProgramElement::Kind::kSection: {
|
|
const Section& s = p->as<Section>();
|
|
const String& name = s.name();
|
|
const String& arg = s.argument();
|
|
if (IsSupportedSection(name.c_str())) {
|
|
if (SectionRequiresArgument(name.c_str()) && !arg.size()) {
|
|
errors.error(s.fOffset,
|
|
("section '@" + name +
|
|
"' requires one parameter").c_str());
|
|
}
|
|
if (!SectionAcceptsArgument(name.c_str()) && arg.size()) {
|
|
errors.error(s.fOffset,
|
|
("section '@" + name + "' has no parameters").c_str());
|
|
}
|
|
} else {
|
|
errors.error(s.fOffset,
|
|
("unsupported section '@" + name + "'").c_str());
|
|
}
|
|
if (!SectionPermitsDuplicates(name.c_str()) &&
|
|
fSections.find(name) != fSections.end()) {
|
|
errors.error(s.fOffset,
|
|
("duplicate section '@" + name + "'").c_str());
|
|
}
|
|
fSections[name].push_back(&s);
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
} // namespace SkSL
|