OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #ifndef TOOLS_BLINK_GC_PLUGIN_DIAGNOSTICS_REPORTER_H_ |
| 6 #define TOOLS_BLINK_GC_PLUGIN_DIAGNOSTICS_REPORTER_H_ |
| 7 |
| 8 #include "CheckFieldsVisitor.h" |
| 9 #include "CheckFinalizerVisitor.h" |
| 10 #include "CheckGCRootsVisitor.h" |
| 11 #include "Config.h" |
| 12 #include "clang/AST/AST.h" |
| 13 #include "clang/AST/ASTConsumer.h" |
| 14 #include "clang/Basic/Diagnostic.h" |
| 15 #include "clang/Frontend/CompilerInstance.h" |
| 16 |
| 17 class RecordInfo; |
| 18 |
| 19 // All error/warning reporting methods under one roof. |
| 20 // |
| 21 class DiagnosticsReporter { |
| 22 public: |
| 23 explicit DiagnosticsReporter(clang::CompilerInstance&); |
| 24 |
| 25 bool hasErrorOccurred() const; |
| 26 clang::DiagnosticsEngine::Level getErrorLevel() const; |
| 27 |
| 28 void ClassMustLeftMostlyDeriveGC(RecordInfo* info); |
| 29 void ClassRequiresTraceMethod(RecordInfo* info); |
| 30 void BaseRequiresTracing(RecordInfo* derived, |
| 31 clang::CXXMethodDecl* trace, |
| 32 clang::CXXRecordDecl* base); |
| 33 void FieldsRequireTracing(RecordInfo* info, |
| 34 clang::CXXMethodDecl* trace); |
| 35 void ClassContainsInvalidFields( |
| 36 RecordInfo* info, |
| 37 const CheckFieldsVisitor::Errors& errors); |
| 38 void ClassContainsGCRoots(RecordInfo* info, |
| 39 const CheckGCRootsVisitor::Errors& errors); |
| 40 void FinalizerAccessesFinalizedFields( |
| 41 clang::CXXMethodDecl* dtor, |
| 42 const CheckFinalizerVisitor::Errors& errors); |
| 43 void ClassRequiresFinalization(RecordInfo* info); |
| 44 void ClassDoesNotRequireFinalization(RecordInfo* info); |
| 45 void ClassMustDeclareGCMixinTraceMethod(RecordInfo* info); |
| 46 void OverriddenNonVirtualTrace(RecordInfo* info, |
| 47 clang::CXXMethodDecl* trace, |
| 48 clang::CXXMethodDecl* overridden); |
| 49 void MissingTraceDispatchMethod(RecordInfo* info); |
| 50 void MissingFinalizeDispatchMethod(RecordInfo* info); |
| 51 void VirtualAndManualDispatch(RecordInfo* info, |
| 52 clang::CXXMethodDecl* dispatch); |
| 53 void MissingTraceDispatch(const clang::FunctionDecl* dispatch, |
| 54 RecordInfo* receiver); |
| 55 void MissingFinalizeDispatch(const clang::FunctionDecl* dispatch, |
| 56 RecordInfo* receiver); |
| 57 void DerivesNonStackAllocated(RecordInfo* info, BasePoint* base); |
| 58 void ClassOverridesNew(RecordInfo* info, clang::CXXMethodDecl* newop); |
| 59 void ClassDeclaresPureVirtualTrace(RecordInfo* info, |
| 60 clang::CXXMethodDecl* trace); |
| 61 void LeftMostBaseMustBePolymorphic(RecordInfo* derived, |
| 62 clang::CXXRecordDecl* base); |
| 63 void BaseClassMustDeclareVirtualTrace(RecordInfo* derived, |
| 64 clang::CXXRecordDecl* base); |
| 65 |
| 66 void NoteManualDispatchMethod(clang::CXXMethodDecl* dispatch); |
| 67 void NoteBaseRequiresTracing(BasePoint* base); |
| 68 void NoteFieldRequiresTracing(RecordInfo* holder, clang::FieldDecl* field); |
| 69 void NotePartObjectContainsGCRoot(FieldPoint* point); |
| 70 void NoteFieldContainsGCRoot(FieldPoint* point); |
| 71 void NoteUserDeclaredDestructor(clang::CXXMethodDecl* dtor); |
| 72 void NoteUserDeclaredFinalizer(clang::CXXMethodDecl* dtor); |
| 73 void NoteBaseRequiresFinalization(BasePoint* base); |
| 74 void NoteFieldRequiresFinalization(FieldPoint* field); |
| 75 void NoteField(FieldPoint* point, unsigned note); |
| 76 void NoteField(clang::FieldDecl* field, unsigned note); |
| 77 void NoteOverriddenNonVirtualTrace(clang::CXXMethodDecl* overridden); |
| 78 |
| 79 private: |
| 80 clang::DiagnosticBuilder ReportDiagnostic( |
| 81 clang::SourceLocation location, |
| 82 unsigned diag_id); |
| 83 |
| 84 void ReportMissingDispatchMethod(RecordInfo* info, unsigned error); |
| 85 void ReportMissingDispatch(const clang::FunctionDecl* dispatch, |
| 86 RecordInfo* receiver, |
| 87 unsigned error); |
| 88 |
| 89 clang::CompilerInstance& instance_; |
| 90 clang::DiagnosticsEngine& diagnostic_; |
| 91 |
| 92 unsigned diag_class_must_left_mostly_derive_gc_; |
| 93 unsigned diag_class_requires_trace_method_; |
| 94 unsigned diag_base_requires_tracing_; |
| 95 unsigned diag_fields_require_tracing_; |
| 96 unsigned diag_class_contains_invalid_fields_; |
| 97 unsigned diag_class_contains_gc_root_; |
| 98 unsigned diag_class_requires_finalization_; |
| 99 unsigned diag_class_does_not_require_finalization_; |
| 100 unsigned diag_finalizer_accesses_finalized_field_; |
| 101 unsigned diag_finalizer_eagerly_finalized_field_; |
| 102 unsigned diag_overridden_non_virtual_trace_; |
| 103 unsigned diag_missing_trace_dispatch_method_; |
| 104 unsigned diag_missing_finalize_dispatch_method_; |
| 105 unsigned diag_virtual_and_manual_dispatch_; |
| 106 unsigned diag_missing_trace_dispatch_; |
| 107 unsigned diag_missing_finalize_dispatch_; |
| 108 unsigned diag_derives_non_stack_allocated_; |
| 109 unsigned diag_class_overrides_new_; |
| 110 unsigned diag_class_declares_pure_virtual_trace_; |
| 111 unsigned diag_left_most_base_must_be_polymorphic_; |
| 112 unsigned diag_base_class_must_declare_virtual_trace_; |
| 113 |
| 114 unsigned diag_base_requires_tracing_note_; |
| 115 unsigned diag_field_requires_tracing_note_; |
| 116 unsigned diag_raw_ptr_to_gc_managed_class_note_; |
| 117 unsigned diag_ref_ptr_to_gc_managed_class_note_; |
| 118 unsigned diag_reference_ptr_to_gc_managed_class_note_; |
| 119 unsigned diag_own_ptr_to_gc_managed_class_note_; |
| 120 unsigned diag_member_to_gc_unmanaged_class_note_; |
| 121 unsigned diag_stack_allocated_field_note_; |
| 122 unsigned diag_member_in_unmanaged_class_note_; |
| 123 unsigned diag_part_object_to_gc_derived_class_note_; |
| 124 unsigned diag_part_object_contains_gc_root_note_; |
| 125 unsigned diag_field_contains_gc_root_note_; |
| 126 unsigned diag_finalized_field_note_; |
| 127 unsigned diag_eagerly_finalized_field_note_; |
| 128 unsigned diag_user_declared_destructor_note_; |
| 129 unsigned diag_user_declared_finalizer_note_; |
| 130 unsigned diag_base_requires_finalization_note_; |
| 131 unsigned diag_field_requires_finalization_note_; |
| 132 unsigned diag_overridden_non_virtual_trace_note_; |
| 133 unsigned diag_manual_dispatch_method_note_; |
| 134 |
| 135 }; |
| 136 |
| 137 #endif // TOOLS_BLINK_GC_PLUGIN_DIAGNOSTICS_REPORTER_H_ |
OLD | NEW |