aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/sksl/ast/SkSLASTVarDeclaration.h
blob: 613867e136397a44f93b4a42c729b9334de3d767 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
 * 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_ASTVARDECLARATION
#define SKSL_ASTVARDECLARATION

#include "SkSLASTDeclaration.h"
#include "SkSLASTModifiers.h"
#include "SkSLASTStatement.h"
#include "SkSLASTType.h"
#include "../SkSLUtil.h"

namespace SkSL {

/**
 * A variable declaration, which may consist of multiple individual variables. For instance
 * 'int x, y = 1, z[4][2]' is a single ASTVarDeclaration. This declaration would have a type of 
 * 'int', names ['x', 'y', 'z'], sizes of [[], [], [4, 2]], and values of [null, 1, null].
 */
struct ASTVarDeclaration : public ASTDeclaration {
    ASTVarDeclaration(ASTModifiers modifiers, 
                      std::unique_ptr<ASTType> type, 
                      std::vector<std::string> names, 
                      std::vector<std::vector<std::unique_ptr<ASTExpression>>> sizes,
                      std::vector<std::unique_ptr<ASTExpression>> values)
    : INHERITED(type->fPosition, kVar_Kind)
    , fModifiers(modifiers)
    , fType(std::move(type))
    , fNames(std::move(names))
    , fSizes(std::move(sizes))
    , fValues(std::move(values)) {
        ASSERT(fNames.size() == fValues.size());
    }

    std::string description() const override {
        std::string result = fModifiers.description() + fType->description() + " ";
        std::string separator = "";
        for (size_t i = 0; i < fNames.size(); i++) {
            result += separator;
            separator = ", ";
            result += fNames[i];
            for (size_t j = 0; j < fSizes[i].size(); j++) {
                if (fSizes[i][j]) {
                    result += "[" + fSizes[i][j]->description() + "]";
                } else {
                    result += "[]";
                }
            }
            if (fValues[i]) {
                result += " = " + fValues[i]->description();
            }
        }
        return result;        
    }

    const ASTModifiers fModifiers;
    const std::unique_ptr<ASTType> fType;
    const std::vector<std::string> fNames;
    const std::vector<std::vector<std::unique_ptr<ASTExpression>>> fSizes;
    const std::vector<std::unique_ptr<ASTExpression>> fValues;

    typedef ASTDeclaration INHERITED;
};

} // namespace

#endif