Path: blob/main/contrib/llvm-project/clang/lib/ARCMigrate/Internals.h
35236 views
//===-- Internals.h - Implementation Details---------------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef LLVM_CLANG_LIB_ARCMIGRATE_INTERNALS_H9#define LLVM_CLANG_LIB_ARCMIGRATE_INTERNALS_H1011#include "clang/Basic/LangOptions.h"12#include "clang/Basic/Diagnostic.h"13#include "clang/Frontend/MigratorOptions.h"14#include "llvm/ADT/ArrayRef.h"15#include <list>16#include <optional>1718namespace clang {19class ASTContext;20class Sema;21class Stmt;2223namespace arcmt {2425class CapturedDiagList {26typedef std::list<StoredDiagnostic> ListTy;27ListTy List;2829public:30void push_back(const StoredDiagnostic &diag) { List.push_back(diag); }3132bool clearDiagnostic(ArrayRef<unsigned> IDs, SourceRange range);33bool hasDiagnostic(ArrayRef<unsigned> IDs, SourceRange range) const;3435void reportDiagnostics(DiagnosticsEngine &diags) const;3637bool hasErrors() const;3839typedef ListTy::const_iterator iterator;40iterator begin() const { return List.begin(); }41iterator end() const { return List.end(); }42};4344void writeARCDiagsToPlist(const std::string &outPath,45ArrayRef<StoredDiagnostic> diags,46SourceManager &SM, const LangOptions &LangOpts);4748class TransformActions {49DiagnosticsEngine &Diags;50CapturedDiagList &CapturedDiags;51void *Impl; // TransformActionsImpl.5253public:54TransformActions(DiagnosticsEngine &diag, CapturedDiagList &capturedDiags,55ASTContext &ctx, Preprocessor &PP);56~TransformActions();5758void startTransaction();59bool commitTransaction();60void abortTransaction();6162void insert(SourceLocation loc, StringRef text);63void insertAfterToken(SourceLocation loc, StringRef text);64void remove(SourceRange range);65void removeStmt(Stmt *S);66void replace(SourceRange range, StringRef text);67void replace(SourceRange range, SourceRange replacementRange);68void replaceStmt(Stmt *S, StringRef text);69void replaceText(SourceLocation loc, StringRef text,70StringRef replacementText);71void increaseIndentation(SourceRange range,72SourceLocation parentIndent);7374bool clearDiagnostic(ArrayRef<unsigned> IDs, SourceRange range);75bool clearAllDiagnostics(SourceRange range) {76return clearDiagnostic(std::nullopt, range);77}78bool clearDiagnostic(unsigned ID1, unsigned ID2, SourceRange range) {79unsigned IDs[] = { ID1, ID2 };80return clearDiagnostic(IDs, range);81}82bool clearDiagnostic(unsigned ID1, unsigned ID2, unsigned ID3,83SourceRange range) {84unsigned IDs[] = { ID1, ID2, ID3 };85return clearDiagnostic(IDs, range);86}8788bool hasDiagnostic(unsigned ID, SourceRange range) {89return CapturedDiags.hasDiagnostic(ID, range);90}9192bool hasDiagnostic(unsigned ID1, unsigned ID2, SourceRange range) {93unsigned IDs[] = { ID1, ID2 };94return CapturedDiags.hasDiagnostic(IDs, range);95}9697DiagnosticBuilder report(SourceLocation loc, unsigned diagId,98SourceRange range = SourceRange());99void reportError(StringRef error, SourceLocation loc,100SourceRange range = SourceRange());101void reportWarning(StringRef warning, SourceLocation loc,102SourceRange range = SourceRange());103void reportNote(StringRef note, SourceLocation loc,104SourceRange range = SourceRange());105106bool hasReportedErrors() const {107return Diags.hasUnrecoverableErrorOccurred();108}109110class RewriteReceiver {111public:112virtual ~RewriteReceiver();113114virtual void insert(SourceLocation loc, StringRef text) = 0;115virtual void remove(CharSourceRange range) = 0;116virtual void increaseIndentation(CharSourceRange range,117SourceLocation parentIndent) = 0;118};119120void applyRewrites(RewriteReceiver &receiver);121};122123class Transaction {124TransformActions &TA;125bool Aborted;126127public:128Transaction(TransformActions &TA) : TA(TA), Aborted(false) {129TA.startTransaction();130}131132~Transaction() {133if (!isAborted())134TA.commitTransaction();135}136137void abort() {138TA.abortTransaction();139Aborted = true;140}141142bool isAborted() const { return Aborted; }143};144145class MigrationPass {146public:147ASTContext &Ctx;148LangOptions::GCMode OrigGCMode;149MigratorOptions MigOptions;150Sema &SemaRef;151TransformActions &TA;152const CapturedDiagList &CapturedDiags;153std::vector<SourceLocation> &ARCMTMacroLocs;154std::optional<bool> EnableCFBridgeFns;155156MigrationPass(ASTContext &Ctx, LangOptions::GCMode OrigGCMode, Sema &sema,157TransformActions &TA, const CapturedDiagList &capturedDiags,158std::vector<SourceLocation> &ARCMTMacroLocs)159: Ctx(Ctx), OrigGCMode(OrigGCMode), SemaRef(sema), TA(TA),160CapturedDiags(capturedDiags), ARCMTMacroLocs(ARCMTMacroLocs) {}161162const CapturedDiagList &getDiags() const { return CapturedDiags; }163164bool isGCMigration() const { return OrigGCMode != LangOptions::NonGC; }165bool noFinalizeRemoval() const { return MigOptions.NoFinalizeRemoval; }166void setNoFinalizeRemoval(bool val) {MigOptions.NoFinalizeRemoval = val; }167168bool CFBridgingFunctionsDefined();169};170171static inline StringRef getARCMTMacroName() {172return "__IMPL_ARCMT_REMOVED_EXPR__";173}174175} // end namespace arcmt176177} // end namespace clang178179#endif180181182