blob: 7a95061bded93944315346a9ff23e82f08fb7eeb [file] [log] [blame]
//===--- NotificationCenter.h - ---------------------------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_SOURCEKIT_CORE_NOTIFICATIONCENTER_H
#define LLVM_SOURCEKIT_CORE_NOTIFICATIONCENTER_H
#include "SourceKit/Core/LLVM.h"
#include "SourceKit/Support/Tracing.h"
#include "SourceKit/Support/UIdent.h"
#include "llvm/Support/Mutex.h"
#include <functional>
#include <vector>
namespace SourceKit {
struct DiagnosticEntryInfo;
typedef std::function<void(StringRef DocumentName)>
DocumentUpdateNotificationReceiver;
typedef std::function<void(uint64_t CompileID, trace::OperationKind,
const trace::SwiftInvocation &)>
CompileWillStartNotificationReceiver;
typedef std::function<void(uint64_t CompileID, trace::OperationKind,
ArrayRef<DiagnosticEntryInfo>)>
CompileDidFinishNotificationReceiver;
class NotificationCenter {
bool DispatchToMain;
std::vector<DocumentUpdateNotificationReceiver> DocUpdReceivers;
std::vector<std::function<void(void)>> TestReceivers;
std::vector<std::function<void(void)>> SemaEnabledReceivers;
std::vector<CompileWillStartNotificationReceiver> CompileWillStartReceivers;
std::vector<CompileDidFinishNotificationReceiver> CompileDidFinishReceivers;
mutable llvm::sys::Mutex Mtx;
public:
explicit NotificationCenter(bool dispatchToMain);
~NotificationCenter();
void addDocumentUpdateNotificationReceiver(
DocumentUpdateNotificationReceiver Receiver);
void addTestNotificationReceiver(std::function<void(void)> Receiver);
void addSemaEnabledNotificationReceiver(std::function<void(void)> Receiver);
void addCompileWillStartNotificationReceiver(
CompileWillStartNotificationReceiver Receiver);
void addCompileDidFinishNotificationReceiver(
CompileDidFinishNotificationReceiver Receiver);
void postDocumentUpdateNotification(StringRef DocumentName) const;
void postTestNotification() const;
void postSemaEnabledNotification() const;
void
postCompileWillStartNotification(uint64_t CompileID,
trace::OperationKind OpKind,
const trace::SwiftInvocation &Inv) const;
void postCompileDidFinishNotification(
uint64_t CompileID, trace::OperationKind OpKind,
ArrayRef<DiagnosticEntryInfo> Diagnostics) const;
};
} // namespace SourceKit
#endif