src/vs/platform/files/node/watcher/nodejs/nodejsWatcherLib.ts/NodeJSFileWatcherLibrary/onFileChange
class NodeJSFileWatcherLibrary:	private async onFileChange(event: IDiskFileChange, skipIncludeExcludeChecks = false): Promise<void> {
		if (this.cts.token.isCancellationRequested) {
			return;
		}

		// Logging
		if (this.verboseLogging) {
			this.trace(`${event.type === FileChangeType.ADDED ? '[ADDED]' : event.type === FileChangeType.DELETED ? '[DELETED]' : '[CHANGED]'} ${event.path}`);
		}

		// Add to buffer unless excluded or not included (not if explicitly disabled)
		if (!skipIncludeExcludeChecks && this.excludes.some(exclude => exclude(event.path))) {
			if (this.verboseLogging) {
				this.trace(` >> ignored (excluded) ${event.path}`);
			}
		} else if (!skipIncludeExcludeChecks && this.includes && this.includes.length > 0 && !this.includes.some(include => include(event.path))) {
			if (this.verboseLogging) {
				this.trace(` >> ignored (not included) ${event.path}`);
			}
		} else {
			this.fileChangesBuffer.push(event);
		}

		// Handle emit through delayer to accommodate for bulk changes and thus reduce spam
		try {
			await this.fileChangesDelayer.trigger(async () => {
				const fileChanges = this.fileChangesBuffer;
				this.fileChangesBuffer = [];

				// Coalesce events: merge events of same kind
				const coalescedFileChanges = coalesceEvents(fileChanges);

				if (coalescedFileChanges.length > 0) {

					// Logging
					if (this.verboseLogging) {
						for (const event of coalescedFileChanges) {
							this.trace(`>> normalized ${event.type === FileChangeType.ADDED ? '[ADDED]' : event.type === FileChangeType.DELETED ? '[DELETED]' : '[CHANGED]'} ${event.path}`);
						}
					}

					// Broadcast to clients via throttler
					const worked = this.throttledFileChangesWorker.work(coalescedFileChanges);

					// Logging
					if (!worked) {
						this.warn(`started ignoring events due to too many file change events at once (incoming: ${coalescedFileChanges.length}, most recent change: ${coalescedFileChanges[0].path}). Use 'files.watcherExclude' setting to exclude folders with lots of changing files (e.g. compilation output).`);
					} else {
						if (this.throttledFileChangesWorker.pending > 0) {
							this.trace(`started throttling events due to large amount of file change events at once (pending: ${this.throttledFileChangesWorker.pending}, most recent change: ${coalescedFileChanges[0].path}). Use 'files.watcherExclude' setting to exclude folders with lots of changing files (e.g. compilation output).`);
						}
					}
				}
			});
		} catch (error) {
			// ignore (we are likely disposed and cancelled)
		}
	}