/* * 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. */ #include "AST.h" #include "Annotation.h" #include "Coordinator.h" #include "Interface.h" #include "Method.h" #include "Scope.h" #include #include #include #include namespace android { void AST::emitVtsTypeDeclarations(Formatter& out) const { if (AST::isInterface()) { const Interface* iface = mRootScope.getInterface(); return iface->emitVtsAttributeDeclaration(out); } for (const auto& type : mRootScope.getSubTypes()) { // Skip for TypeDef as it is just an alias of a defined type. if (type->isTypeDef()) { continue; } out << "attribute: {\n"; out.indent(); type->emitVtsTypeDeclarations(out); out.unindent(); out << "}\n\n"; } } void AST::generateVts(Formatter& out) const { std::string baseName = AST::getBaseName(); const Interface *iface = AST::getInterface(); out << "component_class: HAL_HIDL\n"; out << "component_name: \"" << (iface ? iface->definedName() : "types") << "\"\n\n"; out << "component_type_version_major: " << mPackage.getPackageMajorVersion() << "\n"; out << "component_type_version_minor: " << mPackage.getPackageMinorVersion() << "\n"; out << "package: \"" << mPackage.package() << "\"\n\n"; // Generate import statement for all imported interface/types. std::set allImportedNames; getAllImportedNames(&allImportedNames); for (const auto &name : allImportedNames) { // ignore IBase. if (name != gIBaseFqName) { out << "import: \"" << name.string() << "\"\n"; } } out << "\n"; if (isInterface()) { const Interface* iface = mRootScope.getInterface(); out << "interface: {\n"; out.indent(); // Generate all the attribute declarations first. emitVtsTypeDeclarations(out); // Generate all the method declarations. for (const Interface* superInterface : iface->superTypeChain()) { superInterface->emitVtsMethodDeclaration(out, true /*isInhereted*/); } iface->emitVtsMethodDeclaration(out, false /*isInhereted*/); out.unindent(); out << "}\n"; } else { emitVtsTypeDeclarations(out); } } } // namespace android