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