extensions/php-language-features/src/features/signatureHelpProvider.ts/PHPSignatureHelpProvider/provideSignatureHelp
class PHPSignatureHelpProvider:	public provideSignatureHelp(document: TextDocument, position: Position, _token: CancellationToken): Promise<SignatureHelp> | null {
		const enable = workspace.getConfiguration('php').get<boolean>('suggest.basic', true);
		if (!enable) {
			return null;
		}

		const iterator = new BackwardIterator(document, position.character - 1, position.line);

		const paramCount = this.readArguments(iterator);
		if (paramCount < 0) {
			return null;
		}

		const ident = this.readIdent(iterator);
		if (!ident) {
			return null;
		}

		const entry = phpGlobalFunctions.globalfunctions[ident] || phpGlobals.keywords[ident];
		if (!entry || !entry.signature) {
			return null;
		}
		const paramsString = entry.signature.substring(0, entry.signature.lastIndexOf(')') + 1);
		const signatureInfo = new SignatureInformation(ident + paramsString, entry.description);

		const re = /\w*\s+\&?\$[\w_\.]+|void/g;
		let match: RegExpExecArray | null = null;
		while ((match = re.exec(paramsString)) !== null) {
			signatureInfo.parameters.push({ label: match[0], documentation: '' });
		}
		const ret = new SignatureHelp();
		ret.signatures.push(signatureInfo);
		ret.activeSignature = 0;
		ret.activeParameter = Math.min(paramCount, signatureInfo.parameters.length - 1);
		return Promise.resolve(ret);
	}