PgSQLSignatureHelpProvider.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { RefObject } from 'react'
  2. import BackwardIterator from './BackwardIterator'
  3. import type { DatabaseFunction } from '@/data/database-functions/database-functions-query'
  4. // [Joshen] Needs to be fixed
  5. export default function getPgsqlSignatureHelpProvider(_monaco: any, pgInfoRef: RefObject<any>) {
  6. return {
  7. signatureHelpTriggerCharacters: ['(', ','],
  8. provideSignatureHelp: function (model: any, position: any) {
  9. // position.column should minus 2 as it returns 2 for first char
  10. // position.lineNumber should minus 1
  11. const iterator = new BackwardIterator(model, position.column - 2, position.lineNumber - 1)
  12. let paramCount = iterator.readArguments()
  13. if (paramCount < 0) return null
  14. let ident = iterator.readIdent()
  15. if (!ident || ident.match(/^\".*?\"$/)) return null
  16. let fn = (pgInfoRef.current.functions as DatabaseFunction[]).find(
  17. (f) => f.name.toLocaleLowerCase() === ident.toLocaleLowerCase()
  18. )
  19. if (!fn) return null
  20. if (!fn.args || fn.args.length < paramCount) return null
  21. const activeSignature = 0
  22. const activeParameter = Math.min(paramCount, fn.args.length - 1)
  23. const signatures = []
  24. signatures.push({
  25. label: `${fn.name}(${fn.argument_types})`,
  26. parameters: fn.args.map((v) => {
  27. return { label: v.name }
  28. }),
  29. })
  30. return { value: { signatures, activeSignature, activeParameter }, dispose: () => {} }
  31. },
  32. }
  33. }