/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef AST_H_
#define AST_H_

#include "Scope.h"
#include "Expression.h"

#include <hidl-util/Formatter.h>
#include <android-base/macros.h>
#include <android-base/logging.h>
#include <string>
#include <vector>
#include <utils/Errors.h>

namespace android {

struct Include;
struct Define;
struct CompositeDeclaration;
struct Declaration;

struct AST {
    AST(const std::string &path,
        const std::string &outputDir,
        const std::string &package,
        bool isOpenGl);
    ~AST();

    void *scanner();
    void setScanner(void *scanner);

    bool isOpenGl() const;

    const std::string &getFilename() const;

    void setDeclarations(std::vector<Declaration *> *declarations);
    void setIncludes(std::vector<Include *> *includes);

    Expression *getExpression() const;
    void setExpression(Expression *expression);

    status_t generateCode() const;

    void processContents();

    const Scope<Define *> &getDefinesScope() const;
    Scope<Define *> &getDefinesScope();

private:
    void * mScanner = NULL;
    std::string mPath;
    std::string mOutputDir;
    std::string mPackage;

    bool mIsOpenGl;

    Expression* mExpression = NULL;

    std::vector<Declaration *> *mDeclarations = NULL;
    std::vector<CompositeDeclaration *> *mInterfaces = NULL;
    std::vector<Include *> *mIncludes = NULL;

    Scope<Define *> mDefinesScope;

    const std::string getFileDir() const;

    status_t generateFile(CompositeDeclaration* declaration) const;
    status_t generateTypesFile() const;

    void generateIncludes(Formatter &out) const;
    void generatePackageLine(Formatter &out) const;

    void isolateInterfaces();
    void isolateGlobalInterface();
    void isolateIncludes();
    void isolateConstants(Expression::Type ofType);

    DISALLOW_COPY_AND_ASSIGN(AST);
};

}  // namespace android

#endif  // AST_H_
