generateVts.cpp revision 5158db484e5ab302368f191d75d5b1334c270e52
15158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang#include "AST.h"
25158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
35158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang#include "Annotation.h"
45158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang#include "Coordinator.h"
55158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang#include "Formatter.h"
65158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang#include "Interface.h"
75158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang#include "Method.h"
85158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang#include "Scope.h"
95158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
105158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang#include <android-base/logging.h>
115158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang#include <string>
125158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang#include <vector>
135158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
145158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangnamespace android {
155158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
165158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang// Remove the double quotas in a string.
175158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatic std::string removeQuotes(const std::string in) {
185158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    std::string out{in};
195158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return out.substr(1, out.size() - 2);
205158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
215158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
225158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t AST::emitVtsTypeDeclarations(
235158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        Formatter &out,
245158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        Vector<Type*> types) const {
255158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    for (const auto& type : types) {
265158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out << "attribute: {\n";
275158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out.indent();
285158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        status_t status = type->emitVtsTypeDeclarations(out);
295158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        if (status != OK) {
305158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            return status;
315158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        }
325158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out.unindent();
335158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out << "}\n\n";
345158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
355158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
365158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
375158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
385158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t AST::generateVts(const std::string &outputPath) const {
395158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    std::string path = outputPath;
405158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    path.append(mCoordinator->convertPackageRootToPath(mPackage));
415158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    path.append(mCoordinator->getPackagePath(mPackage, true /* relative */));
425158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
435158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    std::string ifaceName;
445158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    std::string baseName;
455158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
465158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    bool isInterface = true;
475158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    if (!AST::isInterface(&ifaceName)) {
485158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        baseName = "types";
495158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        isInterface = false;
505158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    } else {
515158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        baseName = ifaceName.substr(1);  // cut off the leading 'I'.
525158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
535158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
545158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    path.append(baseName);
555158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    path.append(".vts");
565158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
575158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    CHECK(Coordinator::MakeParentHierarchy(path));
585158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    FILE *file = fopen(path.c_str(), "w");
595158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
605158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    if (file == NULL) {
615158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        return -errno;
625158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
635158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
645158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    Formatter out(file);
655158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
665158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "component_class: HAL_HIDL\n";
675158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
685158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    // Get the component_type for interface from annotation.
695158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    if (isInterface) {
705158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        const Interface *iface = mRootScope->getInterface();
715158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        Annotation *annotation = iface->annotations().valueFor("hal_type");
725158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        if (annotation != NULL) {
735158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            std::vector<std::string> * values = annotation->params().valueFor(
745158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                    "type");
755158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            if (values != NULL) {
765158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                out << "component_type: "
775158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                    << removeQuotes(values->at(0))
785158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                    << "\n";
795158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            }
805158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        }
815158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
825158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
835158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "component_type_version: " << mPackage.version().substr(1) << "\n";
845158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "component_name: \""
855158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        << (isInterface ? ifaceName : "types")
865158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        << "\"\n\n";
875158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
885158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "package: \"" << mPackage.package() << "\"\n\n";
895158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
905158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    for (const auto &item : mImportedNames) {
915158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out << "import: \"" << item.string() << "\"\n";
925158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
935158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
945158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "\n";
955158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
965158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    if (isInterface) {
975158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        const Interface *iface = mRootScope->getInterface();
985158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out << "interface: {\n";
995158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out.indent();
1005158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1015158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        status_t status = emitVtsTypeDeclarations(out, iface->getSubTypes());
1025158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        if (status != OK) {
1035158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            return status;
1045158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        }
1055158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1065158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        for (const auto &method : iface->methods()) {
1075158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            out << "api: {\n";
1085158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            out.indent();
1095158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            out << "name: \"" << method->name() << "\"\n";
1105158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            for (const auto &result : method->results()) {
1115158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                out << "return_type_hidl: {\n";
1125158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                out.indent();
1135158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                status_t status = result->type().emitVtsArgumentType(out);
1145158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                if (status != OK) {
1155158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                    return status;
1165158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                }
1175158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                out.unindent();
1185158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                out << "}\n";
1195158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            }
1205158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            for (const auto &arg : method->args()) {
1215158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                out << "arg: {\n";
1225158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                out.indent();
1235158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                status_t status = arg->type().emitVtsArgumentType(out);
1245158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                if (status != OK) {
1255158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                    return status;
1265158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                }
1275158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                out.unindent();
1285158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                out << "}\n";
1295158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            }
1305158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            out.unindent();
1315158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            out << "}\n\n";
1325158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        }
1335158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1345158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out.unindent();
1355158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out << "}\n";
1365158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    } else {
1375158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        status_t status = emitVtsTypeDeclarations(out,
1385158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                                                  mRootScope->getSubTypes());
1395158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        if (status != OK) {
1405158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            return status;
1415158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        }
1425158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
1435158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
1445158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
1455158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1465158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}  // namespace android
1475158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1485158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1495158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1505158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
151