• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ES2PANDA_COMPILER_CORE_AST_VERIFIER_CHECKCONTEXT_H
17 #define ES2PANDA_COMPILER_CORE_AST_VERIFIER_CHECKCONTEXT_H
18 
19 #include "ir/astNode.h"
20 #include "utils/json_builder.h"
21 
22 namespace ark::es2panda::compiler::ast_verifier {
23 
24 enum class CheckDecision { CORRECT, INCORRECT };
25 enum class CheckAction { CONTINUE, SKIP_SUBTREE };
26 using CheckResult = std::tuple<CheckDecision, CheckAction>;
27 
28 enum class CheckSeverity { ERROR, WARNING, UNKNOWN };
CheckSeverityString(CheckSeverity value)29 inline std::string CheckSeverityString(CheckSeverity value)
30 {
31     switch (value) {
32         case CheckSeverity::ERROR:
33             return "error";
34         case CheckSeverity::WARNING:
35             return "warning";
36         default:
37             UNREACHABLE();
38     }
39 }
40 
41 class CheckMessage {
42 public:
CheckMessage(util::StringView name,util::StringView cause,util::StringView message,size_t line)43     explicit CheckMessage(util::StringView name, util::StringView cause, util::StringView message, size_t line)
44         : invariantName_ {name}, cause_ {cause}, message_ {message}, line_ {line}
45     {
46     }
47 
Invariant()48     std::string Invariant() const
49     {
50         return invariantName_;
51     }
52 
Cause()53     std::string Cause() const
54     {
55         return cause_;
56     }
57 
DumpJSON(CheckSeverity severity,const std::string & sourceName,const std::string & phaseName)58     std::function<void(JsonObjectBuilder &)> DumpJSON(CheckSeverity severity, const std::string &sourceName,
59                                                       const std::string &phaseName) const
60     {
61         return [sourceName, phaseName, severity, this](JsonObjectBuilder &body) {
62             body.AddProperty("severity", CheckSeverityString(severity));
63             body.AddProperty("invariant", invariantName_);
64             body.AddProperty("cause", cause_);
65             body.AddProperty("ast", message_);
66             body.AddProperty("line", line_ + 1);
67             body.AddProperty("source", sourceName);
68             body.AddProperty("phase", phaseName);
69         };
70     }
71 
72 private:
73     std::string invariantName_;
74     std::string cause_;
75     std::string message_;
76     size_t line_;
77 };
78 
79 using Messages = std::vector<CheckMessage>;
80 
81 class CheckContext {
82 public:
CheckContext()83     explicit CheckContext() : checkName_ {"Invalid"} {}
84 
85     void AddCheckMessage(const std::string &cause, const ir::AstNode &node, const lexer::SourcePosition &from);
86     void SetCheckName(util::StringView checkName);
87     Messages GetMessages();
88 
89 private:
90     Messages messages_;
91     util::StringView checkName_;
92 };
93 
94 }  // namespace ark::es2panda::compiler::ast_verifier
95 
96 #endif  // ES2PANDA_COMPILER_CORE_AST_VERIFIER_CHECKCONTEXT_H
97