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