mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	This fixes the following bugs:
`${1:else_text}` -> format with if_text: "else_text"
`${1:-else_text}` -> format with if_text: "else_text"
`${1:}` in `format` (eg. empty else_text) -> error.
`${1:}` (eg. empty placeholder) -> error.
Thanks hrsh7th :)
		
	
		
			
				
	
	
		
			237 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local helpers = require('test.functional.helpers')(after_each)
 | 
						|
local snippet = require('vim.lsp._snippet')
 | 
						|
 | 
						|
local eq = helpers.eq
 | 
						|
local exec_lua = helpers.exec_lua
 | 
						|
 | 
						|
describe('vim.lsp._snippet', function()
 | 
						|
  before_each(helpers.clear)
 | 
						|
  after_each(helpers.clear)
 | 
						|
 | 
						|
  local parse = function(...)
 | 
						|
    return exec_lua('return require("vim.lsp._snippet").parse(...)', ...)
 | 
						|
  end
 | 
						|
 | 
						|
  it('should parse only text', function()
 | 
						|
    eq({
 | 
						|
      type = snippet.NodeType.SNIPPET,
 | 
						|
      children = {
 | 
						|
        {
 | 
						|
          type = snippet.NodeType.TEXT,
 | 
						|
          raw = 'TE\\$\\}XT',
 | 
						|
          esc = 'TE$}XT',
 | 
						|
        },
 | 
						|
      },
 | 
						|
    }, parse('TE\\$\\}XT'))
 | 
						|
  end)
 | 
						|
 | 
						|
  it('should parse tabstop', function()
 | 
						|
    eq({
 | 
						|
      type = snippet.NodeType.SNIPPET,
 | 
						|
      children = {
 | 
						|
        {
 | 
						|
          type = snippet.NodeType.TABSTOP,
 | 
						|
          tabstop = 1,
 | 
						|
        },
 | 
						|
        {
 | 
						|
          type = snippet.NodeType.TABSTOP,
 | 
						|
          tabstop = 2,
 | 
						|
        },
 | 
						|
      },
 | 
						|
    }, parse('$1${2}'))
 | 
						|
  end)
 | 
						|
 | 
						|
  it('should parse placeholders', function()
 | 
						|
    eq({
 | 
						|
      type = snippet.NodeType.SNIPPET,
 | 
						|
      children = {
 | 
						|
        {
 | 
						|
          type = snippet.NodeType.PLACEHOLDER,
 | 
						|
          tabstop = 1,
 | 
						|
          children = {
 | 
						|
            {
 | 
						|
              type = snippet.NodeType.PLACEHOLDER,
 | 
						|
              tabstop = 2,
 | 
						|
              children = {
 | 
						|
                {
 | 
						|
                  type = snippet.NodeType.TEXT,
 | 
						|
                  raw = 'TE\\$\\}XT',
 | 
						|
                  esc = 'TE$}XT',
 | 
						|
                },
 | 
						|
                {
 | 
						|
                  type = snippet.NodeType.TABSTOP,
 | 
						|
                  tabstop = 3,
 | 
						|
                },
 | 
						|
                {
 | 
						|
                  type = snippet.NodeType.TABSTOP,
 | 
						|
                  tabstop = 1,
 | 
						|
                  transform = {
 | 
						|
                    type = snippet.NodeType.TRANSFORM,
 | 
						|
                    pattern = 'regex',
 | 
						|
                    option = 'i',
 | 
						|
                    format = {
 | 
						|
                      {
 | 
						|
                        type = snippet.NodeType.FORMAT,
 | 
						|
                        capture_index = 1,
 | 
						|
                        modifier = 'upcase',
 | 
						|
                      },
 | 
						|
                    },
 | 
						|
                  },
 | 
						|
                },
 | 
						|
                {
 | 
						|
                  type = snippet.NodeType.TEXT,
 | 
						|
                  raw = 'TE\\$\\}XT',
 | 
						|
                  esc = 'TE$}XT',
 | 
						|
                },
 | 
						|
              },
 | 
						|
            },
 | 
						|
          },
 | 
						|
        },
 | 
						|
      },
 | 
						|
    }, parse('${1:${2:TE\\$\\}XT$3${1/regex/${1:/upcase}/i}TE\\$\\}XT}}'))
 | 
						|
  end)
 | 
						|
 | 
						|
  it('should parse variables', function()
 | 
						|
    eq({
 | 
						|
      type = snippet.NodeType.SNIPPET,
 | 
						|
      children = {
 | 
						|
        {
 | 
						|
          type = snippet.NodeType.VARIABLE,
 | 
						|
          name = 'VAR',
 | 
						|
        },
 | 
						|
        {
 | 
						|
          type = snippet.NodeType.VARIABLE,
 | 
						|
          name = 'VAR',
 | 
						|
        },
 | 
						|
        {
 | 
						|
          type = snippet.NodeType.VARIABLE,
 | 
						|
          name = 'VAR',
 | 
						|
          children = {
 | 
						|
            {
 | 
						|
              type = snippet.NodeType.TABSTOP,
 | 
						|
              tabstop = 1,
 | 
						|
            },
 | 
						|
          },
 | 
						|
        },
 | 
						|
        {
 | 
						|
          type = snippet.NodeType.VARIABLE,
 | 
						|
          name = 'VAR',
 | 
						|
          transform = {
 | 
						|
            type = snippet.NodeType.TRANSFORM,
 | 
						|
            pattern = 'regex',
 | 
						|
            format = {
 | 
						|
              {
 | 
						|
                type = snippet.NodeType.FORMAT,
 | 
						|
                capture_index = 1,
 | 
						|
                modifier = 'upcase',
 | 
						|
              },
 | 
						|
            },
 | 
						|
          },
 | 
						|
        },
 | 
						|
      },
 | 
						|
    }, parse('$VAR${VAR}${VAR:$1}${VAR/regex/${1:/upcase}/}'))
 | 
						|
  end)
 | 
						|
 | 
						|
  it('should parse choice', function()
 | 
						|
    eq({
 | 
						|
      type = snippet.NodeType.SNIPPET,
 | 
						|
      children = {
 | 
						|
        {
 | 
						|
          type = snippet.NodeType.CHOICE,
 | 
						|
          tabstop = 1,
 | 
						|
          items = {
 | 
						|
            ',',
 | 
						|
            '|',
 | 
						|
          },
 | 
						|
        },
 | 
						|
      },
 | 
						|
    }, parse('${1|\\,,\\||}'))
 | 
						|
  end)
 | 
						|
 | 
						|
  it('should parse format', function()
 | 
						|
    eq({
 | 
						|
      type = snippet.NodeType.SNIPPET,
 | 
						|
      children = {
 | 
						|
        {
 | 
						|
          type = snippet.NodeType.VARIABLE,
 | 
						|
          name = 'VAR',
 | 
						|
          transform = {
 | 
						|
            type = snippet.NodeType.TRANSFORM,
 | 
						|
            pattern = 'regex',
 | 
						|
            format = {
 | 
						|
              {
 | 
						|
                type = snippet.NodeType.FORMAT,
 | 
						|
                capture_index = 1,
 | 
						|
                modifier = 'upcase',
 | 
						|
              },
 | 
						|
              {
 | 
						|
                type = snippet.NodeType.FORMAT,
 | 
						|
                capture_index = 1,
 | 
						|
                if_text = 'if_text',
 | 
						|
                else_text = '',
 | 
						|
              },
 | 
						|
              {
 | 
						|
                type = snippet.NodeType.FORMAT,
 | 
						|
                capture_index = 1,
 | 
						|
                if_text = '',
 | 
						|
                else_text = 'else_text',
 | 
						|
              },
 | 
						|
              {
 | 
						|
                type = snippet.NodeType.FORMAT,
 | 
						|
                capture_index = 1,
 | 
						|
                else_text = 'else_text',
 | 
						|
                if_text = 'if_text',
 | 
						|
              },
 | 
						|
              {
 | 
						|
                type = snippet.NodeType.FORMAT,
 | 
						|
                capture_index = 1,
 | 
						|
                if_text = '',
 | 
						|
                else_text = 'else_text',
 | 
						|
              },
 | 
						|
            },
 | 
						|
          },
 | 
						|
        },
 | 
						|
      },
 | 
						|
    }, parse('${VAR/regex/${1:/upcase}${1:+if_text}${1:-else_text}${1:?if_text:else_text}${1:else_text}/}'))
 | 
						|
  end)
 | 
						|
 | 
						|
  it('should parse empty strings', function()
 | 
						|
    eq({
 | 
						|
      children = {
 | 
						|
        {
 | 
						|
          children = { {
 | 
						|
            esc = '',
 | 
						|
            raw = '',
 | 
						|
            type = 7,
 | 
						|
          } },
 | 
						|
          tabstop = 1,
 | 
						|
          type = 2,
 | 
						|
        },
 | 
						|
        {
 | 
						|
          esc = ' ',
 | 
						|
          raw = ' ',
 | 
						|
          type = 7,
 | 
						|
        },
 | 
						|
        {
 | 
						|
          name = 'VAR',
 | 
						|
          transform = {
 | 
						|
            format = {
 | 
						|
              {
 | 
						|
                capture_index = 1,
 | 
						|
                else_text = '',
 | 
						|
                if_text = '',
 | 
						|
                type = 6,
 | 
						|
              },
 | 
						|
            },
 | 
						|
            option = 'g',
 | 
						|
            pattern = 'erg',
 | 
						|
            type = 5,
 | 
						|
          },
 | 
						|
          type = 3,
 | 
						|
        },
 | 
						|
      },
 | 
						|
      type = 0,
 | 
						|
    }, parse('${1:} ${VAR/erg/${1:?:}/g}'))
 | 
						|
  end)
 | 
						|
end)
 |