1ca0551cfSopenharmony_ci/*
2ca0551cfSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3ca0551cfSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4ca0551cfSopenharmony_ci * you may not use this file except in compliance with the License.
5ca0551cfSopenharmony_ci * You may obtain a copy of the License at
6ca0551cfSopenharmony_ci *
7ca0551cfSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8ca0551cfSopenharmony_ci *
9ca0551cfSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10ca0551cfSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11ca0551cfSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ca0551cfSopenharmony_ci * See the License for the specific language governing permissions and
13ca0551cfSopenharmony_ci * limitations under the License.
14ca0551cfSopenharmony_ci */
15ca0551cfSopenharmony_ci
16ca0551cfSopenharmony_ci#include "codegen/code_generator.h"
17ca0551cfSopenharmony_ci#include "parser/parser.h"
18ca0551cfSopenharmony_ci#include "preprocessor/preprocessor.h"
19ca0551cfSopenharmony_ci#include "util/file.h"
20ca0551cfSopenharmony_ci#include "util/logger.h"
21ca0551cfSopenharmony_ci#include "util/options.h"
22ca0551cfSopenharmony_ci#include "hash/hash.h"
23ca0551cfSopenharmony_ci#include "metadata/metadata_builder.h"
24ca0551cfSopenharmony_ci#include "metadata/metadata_dumper.h"
25ca0551cfSopenharmony_ci#include "metadata/metadata_reader.h"
26ca0551cfSopenharmony_ci#include "metadata/metadata_serializer.h"
27ca0551cfSopenharmony_ci
28ca0551cfSopenharmony_ciusing namespace OHOS::Idl;
29ca0551cfSopenharmony_ci
30ca0551cfSopenharmony_cistatic int FileParse(Parser &parser)
31ca0551cfSopenharmony_ci{
32ca0551cfSopenharmony_ci    std::vector<FileDetail> fileDetails;
33ca0551cfSopenharmony_ci    if (!Preprocessor::Preprocess(fileDetails)) {
34ca0551cfSopenharmony_ci        Logger::E(TAG, "failed to preprocess");
35ca0551cfSopenharmony_ci        return -1;
36ca0551cfSopenharmony_ci    }
37ca0551cfSopenharmony_ci
38ca0551cfSopenharmony_ci    if (!parser.Parse(fileDetails)) {
39ca0551cfSopenharmony_ci        Logger::E(TAG, "failed to parse file");
40ca0551cfSopenharmony_ci        return -1;
41ca0551cfSopenharmony_ci    }
42ca0551cfSopenharmony_ci
43ca0551cfSopenharmony_ci    return 0;
44ca0551cfSopenharmony_ci}
45ca0551cfSopenharmony_ci
46ca0551cfSopenharmony_cistatic void DumpAst(const StrAstMap &allAst)
47ca0551cfSopenharmony_ci{
48ca0551cfSopenharmony_ci    const Options &options = Options::GetInstance();
49ca0551cfSopenharmony_ci    if (!options.DoDumpAST()) {
50ca0551cfSopenharmony_ci        return;
51ca0551cfSopenharmony_ci    }
52ca0551cfSopenharmony_ci    for (const auto &astPair : allAst) {
53ca0551cfSopenharmony_ci        AutoPtr<AST> ast = astPair.second;
54ca0551cfSopenharmony_ci        if ((options.GetInterfaceType() == InterfaceType::SA) &&
55ca0551cfSopenharmony_ci            (ast->GetASTFileType() != ASTFileType::AST_IFACE)) {
56ca0551cfSopenharmony_ci            continue;
57ca0551cfSopenharmony_ci        }
58ca0551cfSopenharmony_ci        if (astPair.second != nullptr) {
59ca0551cfSopenharmony_ci            printf("%s\n", astPair.second->Dump("").c_str());
60ca0551cfSopenharmony_ci        }
61ca0551cfSopenharmony_ci    }
62ca0551cfSopenharmony_ci}
63ca0551cfSopenharmony_ci
64ca0551cfSopenharmony_cistatic int DumpMetaData(const StrAstMap &allAst)
65ca0551cfSopenharmony_ci{
66ca0551cfSopenharmony_ci    Options &options = Options::GetInstance();
67ca0551cfSopenharmony_ci    if ((options.GetInterfaceType() != InterfaceType::SA)) {
68ca0551cfSopenharmony_ci        return 0;
69ca0551cfSopenharmony_ci    }
70ca0551cfSopenharmony_ci
71ca0551cfSopenharmony_ci    AutoPtr<AST> ast;
72ca0551cfSopenharmony_ci    for (const auto &astPair : allAst) {
73ca0551cfSopenharmony_ci        ast = astPair.second;
74ca0551cfSopenharmony_ci        if (ast->GetASTFileType() == ASTFileType::AST_IFACE) {
75ca0551cfSopenharmony_ci            break;
76ca0551cfSopenharmony_ci        }
77ca0551cfSopenharmony_ci    }
78ca0551cfSopenharmony_ci    MetadataBuilder builder(ast);
79ca0551cfSopenharmony_ci    std::shared_ptr<MetaComponent> metadata = builder.Build();
80ca0551cfSopenharmony_ci    if (metadata == nullptr) {
81ca0551cfSopenharmony_ci        Logger::E(TAG, "Generate metadata failed.");
82ca0551cfSopenharmony_ci        return -1;
83ca0551cfSopenharmony_ci    }
84ca0551cfSopenharmony_ci
85ca0551cfSopenharmony_ci    if (options.DoDumpMetadata()) {
86ca0551cfSopenharmony_ci        MetadataDumper dumper(metadata.get());
87ca0551cfSopenharmony_ci        printf("%s", dumper.Dump("").c_str());
88ca0551cfSopenharmony_ci    }
89ca0551cfSopenharmony_ci
90ca0551cfSopenharmony_ci    if (options.DoSaveMetadata()) {
91ca0551cfSopenharmony_ci        File metadataFile(options.GetMetadataFile(), File::WRITE);
92ca0551cfSopenharmony_ci        if (!metadataFile.IsValid()) {
93ca0551cfSopenharmony_ci            Logger::E(TAG, "Create metadata file failed.");
94ca0551cfSopenharmony_ci            return -1;
95ca0551cfSopenharmony_ci        }
96ca0551cfSopenharmony_ci
97ca0551cfSopenharmony_ci        MetadataSerializer serializer(metadata.get());
98ca0551cfSopenharmony_ci        serializer.Serialize();
99ca0551cfSopenharmony_ci        uintptr_t data = serializer.GetData();
100ca0551cfSopenharmony_ci        int size = serializer.GetDataSize();
101ca0551cfSopenharmony_ci
102ca0551cfSopenharmony_ci        metadataFile.WriteData(reinterpret_cast<void*>(data), size);
103ca0551cfSopenharmony_ci        metadataFile.Flush();
104ca0551cfSopenharmony_ci        metadataFile.Close();
105ca0551cfSopenharmony_ci    }
106ca0551cfSopenharmony_ci    return 0;
107ca0551cfSopenharmony_ci}
108ca0551cfSopenharmony_ci
109ca0551cfSopenharmony_cistatic int ReadMetaData(StrAstMap &astList)
110ca0551cfSopenharmony_ci{
111ca0551cfSopenharmony_ci    const Options &options = Options::GetInstance();
112ca0551cfSopenharmony_ci    if ((options.GetInterfaceType() != InterfaceType::SA) || options.DoCompile()) {
113ca0551cfSopenharmony_ci        return 0;
114ca0551cfSopenharmony_ci    }
115ca0551cfSopenharmony_ci    std::string metadataFile = options.GetMetadataFile();
116ca0551cfSopenharmony_ci    std::shared_ptr<MetaComponent> metadata = MetadataReader::ReadMetadataFromFile(metadataFile);
117ca0551cfSopenharmony_ci    if (metadata == nullptr) {
118ca0551cfSopenharmony_ci        Logger::E(TAG, "Get metadata from \"%s\" failed.", metadataFile.c_str());
119ca0551cfSopenharmony_ci        return -1;
120ca0551cfSopenharmony_ci    }
121ca0551cfSopenharmony_ci
122ca0551cfSopenharmony_ci    MetadataReader reader(metadata.get());
123ca0551cfSopenharmony_ci    astList = reader.ReadMetadataToAst();
124ca0551cfSopenharmony_ci    return 0;
125ca0551cfSopenharmony_ci}
126ca0551cfSopenharmony_ci
127ca0551cfSopenharmony_ciint main(int argc, char **argv)
128ca0551cfSopenharmony_ci{
129ca0551cfSopenharmony_ci    Options &options = Options::GetInstance();
130ca0551cfSopenharmony_ci    if (!options.Parse(argc, argv)) {
131ca0551cfSopenharmony_ci        return -1;
132ca0551cfSopenharmony_ci    }
133ca0551cfSopenharmony_ci
134ca0551cfSopenharmony_ci    if (options.DoShowUsage()) {
135ca0551cfSopenharmony_ci        options.ShowUsage();
136ca0551cfSopenharmony_ci        return 0;
137ca0551cfSopenharmony_ci    }
138ca0551cfSopenharmony_ci    if (options.DoShowVersion()) {
139ca0551cfSopenharmony_ci        options.ShowVersion();
140ca0551cfSopenharmony_ci        return 0;
141ca0551cfSopenharmony_ci    }
142ca0551cfSopenharmony_ci    if (options.HasWarning()) {
143ca0551cfSopenharmony_ci        options.ShowWarning();
144ca0551cfSopenharmony_ci    }
145ca0551cfSopenharmony_ci
146ca0551cfSopenharmony_ci    if (options.DoGetHashKey()) {
147ca0551cfSopenharmony_ci        return Hash::GenHashKey() ? 0 : -1;
148ca0551cfSopenharmony_ci    }
149ca0551cfSopenharmony_ci
150ca0551cfSopenharmony_ci    StrAstMap astList;
151ca0551cfSopenharmony_ci    Parser parser;
152ca0551cfSopenharmony_ci    if (options.DoCompile()) {
153ca0551cfSopenharmony_ci        if (FileParse(parser) != 0) {
154ca0551cfSopenharmony_ci            return -1;
155ca0551cfSopenharmony_ci        }
156ca0551cfSopenharmony_ci
157ca0551cfSopenharmony_ci        astList = parser.GetAllAst();
158ca0551cfSopenharmony_ci        DumpAst(astList);
159ca0551cfSopenharmony_ci
160ca0551cfSopenharmony_ci        if (DumpMetaData(astList) != 0) {
161ca0551cfSopenharmony_ci            return -1;
162ca0551cfSopenharmony_ci        }
163ca0551cfSopenharmony_ci    }
164ca0551cfSopenharmony_ci
165ca0551cfSopenharmony_ci    if (!options.DoGenerateCode()) {
166ca0551cfSopenharmony_ci        return 0;
167ca0551cfSopenharmony_ci    }
168ca0551cfSopenharmony_ci
169ca0551cfSopenharmony_ci    if (ReadMetaData(astList) != 0) {
170ca0551cfSopenharmony_ci        return -1;
171ca0551cfSopenharmony_ci    }
172ca0551cfSopenharmony_ci
173ca0551cfSopenharmony_ci    if (!CodegenBuilder::GetInstance().Generate(astList)) {
174ca0551cfSopenharmony_ci        Logger::E(TAG, "failed to generate code");
175ca0551cfSopenharmony_ci        return -1;
176ca0551cfSopenharmony_ci    }
177ca0551cfSopenharmony_ci    return 0;
178ca0551cfSopenharmony_ci}