// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef TOOLS_BLINK_GC_PLUGIN_BLINK_GC_PLUGIN_CONSUMER_H_
#define TOOLS_BLINK_GC_PLUGIN_BLINK_GC_PLUGIN_CONSUMER_H_
#include <string>
#include "BlinkGCPluginOptions.h"
#include "Config.h"
#include "DiagnosticsReporter.h"
#include "clang/AST/AST.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/Basic/Diagnostic.h"
#include "clang/Frontend/CompilerInstance.h"
class JsonWriter;
class RecordInfo;
// Main class containing checks for various invariants of the Blink
// garbage collection infrastructure.
class BlinkGCPluginConsumer : public clang::ASTConsumer {
public:
BlinkGCPluginConsumer(clang::CompilerInstance& instance,
const BlinkGCPluginOptions& options);
void HandleTranslationUnit(clang::ASTContext& context) override;
private:
void ParseFunctionTemplates(clang::TranslationUnitDecl* decl);
// Main entry for checking a record declaration.
void CheckRecord(RecordInfo* info);
// Check a class-like object (eg, class, specialization, instantiation).
void CheckClass(RecordInfo* info);
clang::CXXRecordDecl* GetDependentTemplatedDecl(const clang::Type& type);
void CheckPolymorphicClass(RecordInfo* info, clang::CXXMethodDecl* trace);
clang::CXXRecordDecl* GetLeftMostBase(clang::CXXRecordDecl* left_most);
bool DeclaresVirtualMethods(clang::CXXRecordDecl* decl);
void CheckLeftMostDerived(RecordInfo* info);
void CheckDispatch(RecordInfo* info);
void CheckFinalization(RecordInfo* info);
void CheckUnneededFinalization(RecordInfo* info);
bool HasNonEmptyFinalizer(RecordInfo* info);
// This is the main entry for tracing method definitions.
void CheckTracingMethod(clang::CXXMethodDecl* method);
// Determine what type of tracing method this is (dispatch or trace).
void CheckTraceOrDispatchMethod(RecordInfo* parent,
clang::CXXMethodDecl* method);
// Check an actual trace method.
void CheckTraceMethod(RecordInfo* parent,
clang::CXXMethodDecl* trace,
Config::TraceMethodType trace_type);
void DumpClass(RecordInfo* info);
// Adds either a warning or error, based on the current handling of -Werror.
clang::DiagnosticsEngine::Level getErrorLevel();
std::string GetLocString(clang::SourceLocation loc);
bool IsIgnored(RecordInfo* info);
bool IsIgnoredClass(RecordInfo* info);
bool InIgnoredDirectory(RecordInfo* info);
bool InCheckedNamespace(RecordInfo* info);
bool GetFilename(clang::SourceLocation loc, std::string* filename);
clang::CompilerInstance& instance_;
DiagnosticsReporter reporter_;
BlinkGCPluginOptions options_;
RecordCache cache_;
JsonWriter* json_;
};
#endif // TOOLS_BLINK_GC_PLUGIN_BLINK_GC_PLUGIN_CONSUMER_H_