getSignatureHelp method

Future<LspSignatureHelps> getSignatureHelp(
  1. String filePath,
  2. int line,
  3. int character,
  4. int triggerKind, {
  5. String? triggerCharacter,
  6. bool isRetrigger = false,
})

Requests signature help information for the given position in a document.

This method sends a 'textDocument/signatureHelp' request to the language server with the specified file path, line, character position, and trigger context. It processes the response to extract signature details, including the label, documentation, parameters, and active indices.

  • filePath: The path to the file for which signature help is requested.
  • line: The zero-based line number in the document.
  • character: The zero-based character position in the line.
  • triggerKind: The kind of trigger that initiated the signature help request (e.g., invoked, trigger character, or content change).
  • triggerCharacter: An optional character that triggered the request, if applicable.

Returns a Future<LspSignatureHelps> containing the signature help information, including the active signature and parameter indices, label, documentation, and parameters. If no signatures are available, default empty values are used.

Implementation

Future<LspSignatureHelps> getSignatureHelp(
  String filePath,
  int line,
  int character,
  int triggerKind, {
  String? triggerCharacter,
  bool isRetrigger = false,
}) async {
  final commonParams = _commonParams(filePath, line, character);
  commonParams.addAll({
    'context': {
      'triggerKind': triggerKind,
      if (triggerCharacter != null) 'triggerCharacter': triggerCharacter,
      'isRetrigger': isRetrigger,
    },
  });
  final response = await _sendRequest(
    method: 'textDocument/signatureHelp',
    params: commonParams,
  );

  final result = response['result'];

  if (result == null) {
    return LspSignatureHelps(
      activeParameter: -1,
      activeSignature: -1,
      documentation: "",
      label: "",
      parameters: [],
    );
  }

  final signatures = result['signatures'];
  late final String label, doc;
  late final List<Map<String, dynamic>> parameters;
  if (signatures is List) {
    if (signatures.isNotEmpty) {
      label = (signatures[0]['label']) ?? "";
      final rawParameters = signatures[0]['parameters'];
      if (rawParameters is List) {
        parameters = rawParameters.map((param) {
          if (param is Map<String, dynamic>) {
            return param;
          } else if (param is String) {
            return {'label': param};
          } else {
            return {'label': param['label'] ?? param.toString()};
          }
        }).toList();
      } else {
        parameters = [];
      }

      final docField = signatures[0]['documentation'];
      if (docField is String) {
        doc = docField;
      } else if (docField is Map) {
        doc = docField['value'] ?? "";
      } else {
        doc = "";
      }
    } else {
      label = "";
      doc = "";
      parameters = [];
    }
  } else {
    label = "";
    doc = "";
    parameters = [];
  }
  return LspSignatureHelps(
    activeParameter: (result['activeParameter'] ?? -1) as int,
    activeSignature: (result['activeSignature'] ?? -1) as int,
    documentation: doc,
    label: label,
    parameters: parameters,
  );
}