1292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines/*
2292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines * Copyright 2011, The Android Open Source Project
3292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines *
4292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
5292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines * you may not use this file except in compliance with the License.
6292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines * You may obtain a copy of the License at
7292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines *
8292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines *     http://www.apache.org/licenses/LICENSE-2.0
9292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines *
10292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines * Unless required by applicable law or agreed to in writing, software
11292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
12292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines * See the License for the specific language governing permissions and
14292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines * limitations under the License.
15292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines */
16292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines
17292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_AST_REPLACE_H_  // NOLINT
18292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_AST_REPLACE_H_
19292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines
20292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines#include "clang/AST/StmtVisitor.h"
21292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines
22292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines#include "slang_assert.h"
23292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines#include "clang/AST/ASTContext.h"
24292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines
25292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hinesnamespace clang {
26292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  class Diagnostic;
27292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  class Expr;
28292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  class Stmt;
29292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines}
30292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines
31292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hinesnamespace slang {
32292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines
33292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hinesclass RSASTReplace : public clang::StmtVisitor<RSASTReplace> {
34292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines private:
35283a6cf32b808c703b219862ac491df3c9fc8b4bYang Ni  const clang::ASTContext &C;
36292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  clang::Stmt *mOuterStmt;
37292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  clang::Stmt *mOldStmt;
38292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  clang::Stmt *mNewStmt;
39292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  clang::Expr *mOldExpr;
40292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  clang::Expr *mNewExpr;
41292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines
42292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  inline bool matchesExpr(const clang::Expr *E) const {
43292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines    bool retVal = mOldExpr && (mOldExpr == E);
44292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines    if (retVal) {
45292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines      slangAssert(mNewExpr &&
46292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines          "Cannot replace an expression if we don't have a new expression");
47292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines    }
48292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines    return retVal;
49292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  }
50292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines
51292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  inline bool matchesStmt(const clang::Stmt *S) const {
52292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines    slangAssert(mOldStmt);
53292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines    return mOldStmt == S;
54292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  }
55292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines
56292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  void ReplaceInCompoundStmt(clang::CompoundStmt *CS);
57292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines
58292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines public:
59283a6cf32b808c703b219862ac491df3c9fc8b4bYang Ni  explicit RSASTReplace(const clang::ASTContext &Con)
60292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines      : C(Con),
615abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        mOuterStmt(nullptr),
625abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        mOldStmt(nullptr),
635abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        mNewStmt(nullptr),
645abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        mOldExpr(nullptr),
655abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes        mNewExpr(nullptr) {
66292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  }
67292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines
68292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  void VisitStmt(clang::Stmt *S);
69292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  void VisitCompoundStmt(clang::CompoundStmt *CS);
70292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  void VisitCaseStmt(clang::CaseStmt *CS);
71283a6cf32b808c703b219862ac491df3c9fc8b4bYang Ni  void VisitDeclStmt(clang::DeclStmt* DS);
72292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  void VisitDefaultStmt(clang::DefaultStmt *DS);
73292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  void VisitDoStmt(clang::DoStmt *DS);
74292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  void VisitForStmt(clang::ForStmt *FS);
75292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  void VisitIfStmt(clang::IfStmt *IS);
76292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  void VisitSwitchCase(clang::SwitchCase *SC);
77292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  void VisitSwitchStmt(clang::SwitchStmt *SS);
78292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  void VisitWhileStmt(clang::WhileStmt *WS);
79292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines
80292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  // Replace all instances of OldStmt in OuterStmt with NewStmt.
81292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines  void ReplaceStmt(
82292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines      clang::Stmt *OuterStmt,
83292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines      clang::Stmt *OldStmt,
84292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines      clang::Stmt *NewStmt);
85292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines};
86292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines
87292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines}  // namespace slang
88292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines
89292e00a0259ac28cac1055cb6077cf6fc7c6743cStephen Hines#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_AST_REPLACE_H_  NOLINT
90