Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(764)

Unified Diff: src/sksl/SkSLParser.cpp

Issue 2312233002: refactored SkSL VarDeclaration handling (Closed)
Patch Set: fixed nits Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/sksl/SkSLParser.h ('k') | src/sksl/SkSLSPIRVCodeGenerator.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/sksl/SkSLParser.cpp
diff --git a/src/sksl/SkSLParser.cpp b/src/sksl/SkSLParser.cpp
index 65187c3f4cab18ee53e3f0087119953fe0f2df25..b240e4501e98a1f4847cd8c00ca784d854ee9a31 100644
--- a/src/sksl/SkSLParser.cpp
+++ b/src/sksl/SkSLParser.cpp
@@ -274,7 +274,7 @@ std::unique_ptr<ASTDeclaration> Parser::declaration() {
}
/* modifiers type IDENTIFIER varDeclarationEnd */
-std::unique_ptr<ASTVarDeclaration> Parser::varDeclaration() {
+std::unique_ptr<ASTVarDeclarations> Parser::varDeclarations() {
ASTModifiers modifiers = this->modifiers();
std::unique_ptr<ASTType> type(this->type());
if (!type) {
@@ -301,23 +301,23 @@ std::unique_ptr<ASTType> Parser::structDeclaration() {
}
std::vector<Type::Field> fields;
while (this->peek().fKind != Token::RBRACE) {
- std::unique_ptr<ASTVarDeclaration> decl = this->varDeclaration();
+ std::unique_ptr<ASTVarDeclarations> decl = this->varDeclarations();
if (!decl) {
return nullptr;
}
- for (size_t i = 0; i < decl->fNames.size(); i++) {
+ for (const auto& var : decl->fVars) {
auto type = (const Type*) fTypes[decl->fType->fName];
- for (int j = (int) decl->fSizes[i].size() - 1; j >= 0; j--) {
- if (decl->fSizes[i][j]->fKind != ASTExpression::kInt_Kind) {
+ for (int i = (int) var.fSizes.size() - 1; i >= 0; i--) {
+ if (var.fSizes[i]->fKind != ASTExpression::kInt_Kind) {
this->error(decl->fPosition, "array size in struct field must be a constant");
}
- uint64_t columns = ((ASTIntLiteral&) *decl->fSizes[i][j]).fValue;
+ uint64_t columns = ((ASTIntLiteral&) *var.fSizes[i]).fValue;
std::string name = type->name() + "[" + to_string(columns) + "]";
type = new Type(name, Type::kArray_Kind, *type, (int) columns);
fTypes.takeOwnership((Type*) type);
}
- fields.push_back(Type::Field(decl->fModifiers, decl->fNames[i], type));
- if (decl->fValues[i]) {
+ fields.push_back(Type::Field(decl->fModifiers, var.fName, type));
+ if (var.fValue) {
this->error(decl->fPosition, "initializers are not permitted on struct fields");
}
}
@@ -331,20 +331,20 @@ std::unique_ptr<ASTType> Parser::structDeclaration() {
}
/* structDeclaration ((IDENTIFIER varDeclarationEnd) | SEMICOLON) */
-std::unique_ptr<ASTVarDeclaration> Parser::structVarDeclaration(ASTModifiers modifiers) {
+std::unique_ptr<ASTVarDeclarations> Parser::structVarDeclaration(ASTModifiers modifiers) {
std::unique_ptr<ASTType> type = this->structDeclaration();
if (!type) {
return nullptr;
}
if (peek().fKind == Token::IDENTIFIER) {
Token name = this->nextToken();
- std::unique_ptr<ASTVarDeclaration> result = this->varDeclarationEnd(modifiers,
- std::move(type),
- std::move(name.fText));
+ std::unique_ptr<ASTVarDeclarations> result = this->varDeclarationEnd(modifiers,
+ std::move(type),
+ std::move(name.fText));
if (result) {
- for (size_t i = 0; i < result->fValues.size(); i++) {
- if (result->fValues[i]) {
- this->error(result->fValues[i]->fPosition,
+ for (const auto& var : result->fVars) {
+ if (var.fValue) {
+ this->error(var.fValue->fPosition,
"struct variables cannot be initialized");
}
}
@@ -357,12 +357,10 @@ std::unique_ptr<ASTVarDeclaration> Parser::structVarDeclaration(ASTModifiers mod
/* (LBRACKET expression? RBRACKET)* (EQ expression)? (COMMA IDENTIFER
(LBRACKET expression? RBRACKET)* (EQ expression)?)* SEMICOLON */
-std::unique_ptr<ASTVarDeclaration> Parser::varDeclarationEnd(ASTModifiers mods,
- std::unique_ptr<ASTType> type,
- std::string name) {
- std::vector<std::string> names;
- std::vector<std::vector<std::unique_ptr<ASTExpression>>> sizes;
- names.push_back(name);
+std::unique_ptr<ASTVarDeclarations> Parser::varDeclarationEnd(ASTModifiers mods,
+ std::unique_ptr<ASTType> type,
+ std::string name) {
+ std::vector<ASTVarDeclaration> vars;
std::vector<std::unique_ptr<ASTExpression>> currentVarSizes;
while (this->peek().fKind == Token::LBRACKET) {
this->nextToken();
@@ -380,26 +378,23 @@ std::unique_ptr<ASTVarDeclaration> Parser::varDeclarationEnd(ASTModifiers mods,
}
}
}
- sizes.push_back(std::move(currentVarSizes));
- std::vector<std::unique_ptr<ASTExpression>> values;
+ std::unique_ptr<ASTExpression> value;
if (this->peek().fKind == Token::EQ) {
this->nextToken();
- std::unique_ptr<ASTExpression> value(this->expression());
+ value = this->expression();
if (!value) {
return nullptr;
}
- values.push_back(std::move(value));
- } else {
- values.push_back(nullptr);
}
+ vars.emplace_back(std::move(name), std::move(currentVarSizes), std::move(value));
while (this->peek().fKind == Token::COMMA) {
this->nextToken();
Token name;
if (!this->expect(Token::IDENTIFIER, "an identifier", &name)) {
return nullptr;
}
- names.push_back(name.fText);
currentVarSizes.clear();
+ value.reset();
while (this->peek().fKind == Token::LBRACKET) {
this->nextToken();
if (this->peek().fKind == Token::RBRACKET) {
@@ -416,26 +411,21 @@ std::unique_ptr<ASTVarDeclaration> Parser::varDeclarationEnd(ASTModifiers mods,
}
}
}
- sizes.push_back(std::move(currentVarSizes));
if (this->peek().fKind == Token::EQ) {
this->nextToken();
- std::unique_ptr<ASTExpression> value(this->expression());
+ value = this->expression();
if (!value) {
return nullptr;
}
- values.push_back(std::move(value));
- } else {
- values.push_back(nullptr);
}
+ vars.emplace_back(std::move(name.fText), std::move(currentVarSizes), std::move(value));
}
if (!this->expect(Token::SEMICOLON, "';'")) {
return nullptr;
}
- return std::unique_ptr<ASTVarDeclaration>(new ASTVarDeclaration(std::move(mods),
- std::move(type),
- std::move(names),
- std::move(sizes),
- std::move(values)));
+ return std::unique_ptr<ASTVarDeclarations>(new ASTVarDeclarations(std::move(mods),
+ std::move(type),
+ std::move(vars)));
}
/* modifiers type IDENTIFIER (LBRACKET INT_LITERAL RBRACKET)? */
@@ -614,7 +604,7 @@ std::unique_ptr<ASTStatement> Parser::statement() {
case Token::HIGHP: // fall through
case Token::MEDIUMP: // fall through
case Token::LOWP: {
- auto decl = this->varDeclaration();
+ auto decl = this->varDeclarations();
if (!decl) {
return nullptr;
}
@@ -622,7 +612,7 @@ std::unique_ptr<ASTStatement> Parser::statement() {
}
case Token::IDENTIFIER:
if (this->isType(start.fText)) {
- auto decl = this->varDeclaration();
+ auto decl = this->varDeclarations();
if (!decl) {
return nullptr;
}
@@ -663,9 +653,9 @@ std::unique_ptr<ASTDeclaration> Parser::interfaceBlock(ASTModifiers mods) {
return nullptr;
}
this->nextToken();
- std::vector<std::unique_ptr<ASTVarDeclaration>> decls;
+ std::vector<std::unique_ptr<ASTVarDeclarations>> decls;
while (this->peek().fKind != Token::RBRACE) {
- std::unique_ptr<ASTVarDeclaration> decl = this->varDeclaration();
+ std::unique_ptr<ASTVarDeclarations> decl = this->varDeclarations();
if (!decl) {
return nullptr;
}
@@ -788,12 +778,12 @@ std::unique_ptr<ASTForStatement> Parser::forStatement() {
break;
case Token::CONST:
initializer = std::unique_ptr<ASTStatement>(new ASTVarDeclarationStatement(
- this->varDeclaration()));
+ this->varDeclarations()));
break;
case Token::IDENTIFIER:
if (this->isType(nextToken.fText)) {
initializer = std::unique_ptr<ASTStatement>(new ASTVarDeclarationStatement(
- this->varDeclaration()));
+ this->varDeclarations()));
break;
}
// fall through
« no previous file with comments | « src/sksl/SkSLParser.h ('k') | src/sksl/SkSLSPIRVCodeGenerator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698