summaryrefslogtreecommitdiff
path: root/script/core/completion/keyword.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script/core/completion/keyword.lua')
-rw-r--r--script/core/completion/keyword.lua329
1 files changed, 329 insertions, 0 deletions
diff --git a/script/core/completion/keyword.lua b/script/core/completion/keyword.lua
new file mode 100644
index 00000000..5558106a
--- /dev/null
+++ b/script/core/completion/keyword.lua
@@ -0,0 +1,329 @@
+local define = require 'proto.define'
+local files = require 'files'
+local guide = require 'parser.guide'
+
+local keyWordMap = {
+ { 'do', function(info, results)
+ if info.hasSpace then
+ results[#results+1] = {
+ label = 'do .. end',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = [[$0 end]],
+ }
+ else
+ results[#results+1] = {
+ label = 'do .. end',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+do\
+\t$0\
+end",
+ }
+ end
+ return true
+ end, function(info)
+ return guide.eachSourceContain(info.state.ast, info.start, function(source)
+ if source.type == 'while'
+ or source.type == 'in'
+ or source.type == 'loop' then
+ if source.finish - info.start <= 2 then
+ return true
+ end
+ end
+ end)
+ end },
+ { 'and' },
+ { 'break' },
+ { 'else' },
+ { 'elseif', function(info, results)
+ local offset = guide.positionToOffset(info.state, info.position)
+ if info.text:find('^%s*then', offset + 1)
+ or info.text:find('^%s*do', offset + 1) then
+ return false
+ end
+ if info.hasSpace then
+ results[#results+1] = {
+ label = 'elseif .. then',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = [[$1 then]],
+ }
+ else
+ results[#results+1] = {
+ label = 'elseif .. then',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = [[elseif $1 then]],
+ }
+ end
+ return true
+ end },
+ { 'end' },
+ { 'false' },
+ { 'for', function(info, results)
+ if info.hasSpace then
+ results[#results+1] = {
+ label = 'for .. ipairs',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+${1:index}, ${2:value} in ipairs(${3:t}) do\
+\t$0\
+end"
+ }
+ results[#results+1] = {
+ label = 'for .. pairs',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+${1:key}, ${2:value} in pairs(${3:t}) do\
+\t$0\
+end"
+ }
+ results[#results+1] = {
+ label = 'for i = ..',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+${1:i} = ${2:1}, ${3:10, 1} do\
+\t$0\
+end"
+ }
+ else
+ results[#results+1] = {
+ label = 'for .. ipairs',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+for ${1:index}, ${2:value} in ipairs(${3:t}) do\
+\t$0\
+end"
+ }
+ results[#results+1] = {
+ label = 'for .. pairs',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+for ${1:key}, ${2:value} in pairs(${3:t}) do\
+\t$0\
+end"
+ }
+ results[#results+1] = {
+ label = 'for i = ..',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+for ${1:i} = ${2:1}, ${3:10, 1} do\
+\t$0\
+end"
+ }
+ end
+ return true
+ end },
+ { 'function', function(info, results)
+ if info.hasSpace then
+ results[#results+1] = {
+ label = 'function ()',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = info.isExp and "\z
+($1)\
+\t$0\
+end" or "\z
+$1($2)\
+\t$0\
+end"
+ }
+ else
+ results[#results+1] = {
+ label = 'function ()',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = info.isExp and "\z
+function ($1)\
+\t$0\
+end" or "\z
+function $1($2)\
+\t$0\
+end"
+ }
+ end
+ return true
+ end },
+ { 'goto' },
+ { 'if', function(info, results)
+ local offset = guide.positionToOffset(info.state, info.position)
+ if info.text:find('^%s*then', offset + 1)
+ or info.text:find('^%s*do', offset + 1) then
+ return false
+ end
+ if info.hasSpace then
+ results[#results+1] = {
+ label = 'if .. then',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+$1 then\
+\t$0\
+end"
+ }
+ else
+ results[#results+1] = {
+ label = 'if .. then',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+if $1 then\
+\t$0\
+end"
+ }
+ end
+ return true
+ end },
+ { 'in', function(info, results)
+ local offset = guide.positionToOffset(info.state, info.position)
+ if info.text:find('^%s*then', offset + 1)
+ or info.text:find('^%s*do', offset + 1) then
+ return false
+ end
+ if info.hasSpace then
+ results[#results+1] = {
+ label = 'in ..',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+${1:pairs(${2:t})} do\
+\t$0\
+end"
+ }
+ else
+ results[#results+1] = {
+ label = 'in ..',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+in ${1:pairs(${2:t})} do\
+\t$0\
+end"
+ }
+ end
+ return true
+ end },
+ { 'local', function(info, results)
+ if info.hasSpace then
+ results[#results+1] = {
+ label = 'local function',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+function $1($2)\
+\t$0\
+end"
+ }
+ else
+ results[#results+1] = {
+ label = 'local function',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+local function $1($2)\
+\t$0\
+end"
+ }
+ end
+ return false
+ end },
+ { 'nil' },
+ { 'not' },
+ { 'or' },
+ { 'repeat', function(info, results)
+ if info.hasSpace then
+ results[#results+1] = {
+ label = 'repeat .. until',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = [[$0 until $1]]
+ }
+ else
+ results[#results+1] = {
+ label = 'repeat .. until',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+repeat\
+\t$0\
+until $1"
+ }
+ end
+ return true
+ end },
+ { 'return', function(info, results)
+ if not info.hasSpace then
+ results[#results+1] = {
+ label = 'do return end',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = [[do return $1end]]
+ }
+ end
+ return false
+ end },
+ { 'then', function(info, results)
+ local startOffset = guide.positionToOffset(info.state, info.start)
+ local pos, first = info.text:match('%S+%s+()(%S+)', startOffset + 1)
+ if first == 'end'
+ or first == 'else'
+ or first == 'elseif' then
+ local startRow = guide.rowColOf(info.start)
+ local finishPosition = guide.offsetToPosition(info.state, pos)
+ local finishRow = guide.rowColOf(finishPosition)
+ local startSp = info.text:match('^%s*', info.state.lines[startRow])
+ local finishSp = info.text:match('^%s*', info.state.lines[finishRow])
+ if startSp == finishSp then
+ return false
+ end
+ end
+ if not info.hasSpace then
+ results[#results+1] = {
+ label = 'then .. end',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = '\z
+then\
+\t$0\
+end'
+ }
+ end
+ return true
+ end },
+ { 'true' },
+ { 'until' },
+ { 'while', function(info, results)
+ if info.hasSpace then
+ results[#results+1] = {
+ label = 'while .. do',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+${1:true} do\
+\t$0\
+end"
+ }
+ else
+ results[#results+1] = {
+ label = 'while .. do',
+ kind = define.CompletionItemKind.Snippet,
+ insertTextFormat = 2,
+ insertText = "\z
+while ${1:true} do\
+\t$0\
+end"
+ }
+ end
+ return true
+ end },
+}
+
+return keyWordMap