generateVts.cpp revision 368491306c932ef23939c3214cd014278e1aa6ca
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
22864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t AST::emitVtsTypeDeclarations(Formatter &out) const {
23864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    std::set<AST *> allImportedASTs;
24864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    return emitVtsTypeDeclarationsHelper(out, &allImportedASTs);
25864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang}
26864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
27864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t AST::emitVtsTypeDeclarationsHelper(
285158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        Formatter &out,
29864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        std::set<AST *> *allImportSet) const {
30864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    // First, generate vts type declaration for all imported AST.
31864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    for (const auto &ast : mImportedASTs) {
32864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        // Already processed, skip.
33864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        if (allImportSet->find(ast) != allImportSet->end()) {
34864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            continue;
35864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        }
36864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        allImportSet->insert(ast);
37864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        std::string ifaceName;
38864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        // We only care about types.hal.
39864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        if (!ast->isInterface(&ifaceName)) {
40864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            status_t status = ast->emitVtsTypeDeclarationsHelper(
41864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang                    out, allImportSet);
42864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            if (status != OK) {
43864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang                return status;
44864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            }
45864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        }
46864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    }
47864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    // Next, generate vts type declaration for the current AST.
48864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    for (const auto &type : mRootScope->getSubTypes()) {
49368491306c932ef23939c3214cd014278e1aa6caZhuoyao Zhang        // Skip for TypeDef as it is just an alias of a defined type.
50368491306c932ef23939c3214cd014278e1aa6caZhuoyao Zhang        if (type->isTypeDef()) {
51368491306c932ef23939c3214cd014278e1aa6caZhuoyao Zhang            continue;
52368491306c932ef23939c3214cd014278e1aa6caZhuoyao Zhang        }
535158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out << "attribute: {\n";
545158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out.indent();
555158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        status_t status = type->emitVtsTypeDeclarations(out);
565158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        if (status != OK) {
575158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            return status;
585158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        }
595158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out.unindent();
605158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out << "}\n\n";
615158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
625158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
635158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
645158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
655158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t AST::generateVts(const std::string &outputPath) const {
665158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    std::string path = outputPath;
675158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    path.append(mCoordinator->convertPackageRootToPath(mPackage));
685158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    path.append(mCoordinator->getPackagePath(mPackage, true /* relative */));
695158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
705158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    std::string ifaceName;
715158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    std::string baseName;
725158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
735158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    bool isInterface = true;
745158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    if (!AST::isInterface(&ifaceName)) {
755158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        baseName = "types";
765158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        isInterface = false;
775158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    } else {
785158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        baseName = ifaceName.substr(1);  // cut off the leading 'I'.
795158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
805158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
815158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    path.append(baseName);
825158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    path.append(".vts");
835158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
845158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    CHECK(Coordinator::MakeParentHierarchy(path));
855158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    FILE *file = fopen(path.c_str(), "w");
865158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
875158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    if (file == NULL) {
885158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        return -errno;
895158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
905158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
915158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    Formatter out(file);
925158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
935158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "component_class: HAL_HIDL\n";
945158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
955158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    // Get the component_type for interface from annotation.
965158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    if (isInterface) {
975158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        const Interface *iface = mRootScope->getInterface();
985158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        Annotation *annotation = iface->annotations().valueFor("hal_type");
995158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        if (annotation != NULL) {
1005158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            std::vector<std::string> * values = annotation->params().valueFor(
1015158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                    "type");
1025158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            if (values != NULL) {
1035158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                out << "component_type: "
1045158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                    << removeQuotes(values->at(0))
1055158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang                    << "\n";
1065158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            }
1075158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        }
1085158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
1095158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1105158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "component_type_version: " << mPackage.version().substr(1) << "\n";
1115158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "component_name: \""
1125158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        << (isInterface ? ifaceName : "types")
1135158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        << "\"\n\n";
1145158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1155158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "package: \"" << mPackage.package() << "\"\n\n";
1165158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1175158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    for (const auto &item : mImportedNames) {
1185158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out << "import: \"" << item.string() << "\"\n";
1195158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
1205158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1215158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "\n";
1225158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1235158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    if (isInterface) {
1245158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        const Interface *iface = mRootScope->getInterface();
1255158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out << "interface: {\n";
1265158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out.indent();
1275158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
128864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        std::vector<const Interface *> chain;
129864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        while (iface != NULL) {
130864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            chain.push_back(iface);
131864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            iface = iface->superType();
1325158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        }
1335158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
134864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        // Generate all the attribute declarations first.
135864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        for (auto it = chain.rbegin(); it != chain.rend(); ++it) {
136864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            const Interface *superInterface = *it;
137864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            status_t status = superInterface->emitVtsAttributeDeclaration(out);
138864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            if (status != OK) {
139864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang                return status;
1405158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            }
141864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        }
142864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
143864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        // Generate all the method declarations.
144864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        for (auto it = chain.rbegin(); it != chain.rend(); ++it) {
145864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            const Interface *superInterface = *it;
146864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            status_t status = superInterface->emitVtsMethodDeclaration(out);
147864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            if (status != OK) {
148864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang                return status;
1495158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            }
1505158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        }
1515158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1525158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out.unindent();
1535158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        out << "}\n";
1545158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    } else {
155864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        status_t status = emitVtsTypeDeclarations(out);
1565158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        if (status != OK) {
1575158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang            return status;
1585158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        }
1595158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    }
1605158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
1615158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
1625158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1635158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}  // namespace android
1645158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1655158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1665158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
1675158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
168