src/vs/workbench/contrib/debug/browser/callStackView.ts/SessionsRenderer/doRenderElement
class SessionsRenderer:	private doRenderElement(session: IDebugSession, matches: IMatch[], data: ISessionTemplateData): void {
		data.session.title = localize({ key: 'session', comment: ['Session is a noun'] }, "Session");
		data.label.set(session.getLabel(), matches);
		const stoppedDetails = session.getStoppedDetails();
		const thread = session.getAllThreads().find(t => t.stopped);
		const primary: IAction[] = [];
		const secondary: IAction[] = [];
		const result = { primary, secondary };
		this.callStackItemType.set('session');
		this.callStackItemStopped.set(session.state === State.Stopped);
		this.sessionHasOneThread.set(session.getAllThreads().length === 1);
		this.callStackSessionIsAttach.set(isSessionAttach(session));
		data.elementDisposable.push(createAndFillInActionBarActions(this.menu, { arg: getContextForContributedActions(session), shouldForwardArgs: true }, result, 'inline'));

		data.actionBar.clear();
		data.actionBar.push(primary, { icon: true, label: false });
		// We need to set our internal context on the action bar, since our commands depend on that one
		// While the external context our extensions rely on
		data.actionBar.context = getContext(session);
		data.stateLabel.style.display = '';

		if (stoppedDetails) {
			data.stateLabel.textContent = stoppedDescription(stoppedDetails);
			data.session.title = stoppedText(stoppedDetails);
			data.stateLabel.classList.toggle('exception', stoppedDetails.reason === 'exception');
		} else if (thread && thread.stoppedDetails) {
			data.stateLabel.textContent = stoppedDescription(thread.stoppedDetails);
			data.session.title = stoppedText(thread.stoppedDetails);
			data.stateLabel.classList.toggle('exception', thread.stoppedDetails.reason === 'exception');
		} else {
			data.stateLabel.textContent = localize({ key: 'running', comment: ['indicates state'] }, "Running");
			data.stateLabel.classList.remove('exception');
		}
	}