Rename the project from scl_lsp to tia_lsp to future-proof for additional
TIA Portal languages (STL/AWL, LAD, FBD). The 'scl' language name is kept
as-is for the SCL filetype and tree-sitter parser; future languages get
their own names (stl, lad, fbd).
Project-wide changes:
- lua/scl_lsp/ → lua/tia_lsp/ (plugin entry point)
- lua/scl/ → lua/tia/ (language modules, shared across TIA langs)
- require('scl.*') → require('tia.*')
- require('scl_lsp') → require('tia_lsp')
- LSP client name: 'scl_lsp' → 'tia_lsp'
- Diagnostic source: 'scl_lsp' → 'tia_lsp' (src/diagnostics.lua)
- package.json name: 'scl-language-server' → 'tia-lsp'
lua/tia_lsp/init.lua:
- Add vim.fn.exepath('tia-lsp') detection so the plugin prefers the
mason-installed executable and falls back to { 'lua', server_path }
for manual installs.
- Add opts.ts_parser_url to configure the tree-sitter parser source.
- Remove hardcoded ~/dev/scl_lsp paths in favor of ~/dev/tia-lsp and
the new ts_parser_url option.
Cleanup:
- Delete lua/tia/init.lua (dead code, unreferenced duplicate of tia_lsp).
- Delete scl_lsp.sh (replaced by the mason-installed bin/tia-lsp wrapper).
- Update README.md and AGENTS.md to reflect the two-repo split
(tia-lsp server + tia-lsp.nvim plugin) and document Mason installation.
Unchanged (intentional):
- grammar.js, src/grammar.json, src/parser.c: tree-sitter language name
remains 'scl' (it's the language, not the project).
- Filetype patterns ('scl', 'udt', 'db') in autocmds.
- :SCL* command names (per-filetype prefix; future :STL* etc.).
Tests pass with the same pre-existing failures as before the rename
(formatter VAR_INPUT test, udt_parser line 199 const-variable bug,
plc_json reference-project-missing). No new failures introduced.
153 lines
8.3 KiB
Lua
153 lines
8.3 KiB
Lua
-- TIA Portal built-in instructions for SCL Neovim plugin
|
|
-- Defines functions, function blocks, and their parameters for completion
|
|
|
|
local M = {}
|
|
|
|
-- Built-in functions (return values, no state)
|
|
M.FUNCTIONS = {
|
|
ADD = true,
|
|
SUB = true,
|
|
MUL = true,
|
|
DIV = true,
|
|
MIN = true,
|
|
MAX = true,
|
|
LIMIT = true,
|
|
MOVE = true,
|
|
CONVERT = true,
|
|
ROUND = true,
|
|
TRUNC = true,
|
|
CEIL = true,
|
|
FLOOR = true,
|
|
SQR = true,
|
|
SQRT = true,
|
|
SIN = true,
|
|
COS = true,
|
|
TAN = true,
|
|
ASIN = true,
|
|
ACOS = true,
|
|
ATAN = true,
|
|
LEN = true,
|
|
CONCAT = true,
|
|
LEFT = true,
|
|
RIGHT = true,
|
|
MID = true,
|
|
AND = true,
|
|
OR = true,
|
|
XOR = true,
|
|
SHL = true,
|
|
SHR = true,
|
|
ROL = true,
|
|
ROR = true,
|
|
BCD_I = true,
|
|
I_BCD = true,
|
|
}
|
|
|
|
-- Built-in function blocks (have state, need instance)
|
|
M.FUNCTION_BLOCKS = {
|
|
TON = true,
|
|
TOF = true,
|
|
TP = true,
|
|
TONR = true,
|
|
CTU = true,
|
|
CTD = true,
|
|
CTUD = true,
|
|
IEC_TIMER = true,
|
|
IEC_TON = true,
|
|
IEC_TOF = true,
|
|
IEC_TP = true,
|
|
IEC_COUNTER = true,
|
|
IEC_CTU = true,
|
|
IEC_CTD = true,
|
|
IEC_CTUD = true,
|
|
R_TRIG = true,
|
|
F_TRIG = true,
|
|
SR = true,
|
|
RS = true,
|
|
SCHEDULE = true,
|
|
BPM = true,
|
|
LOG = true,
|
|
DATALOG = true,
|
|
}
|
|
|
|
-- Parameter definitions for built-in instructions
|
|
-- Format: { inputs = { { name, type }, ... }, outputs = { { name, type }, ... } }
|
|
M.PARAMETERS = {
|
|
TON = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } },
|
|
TOF = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } },
|
|
TP = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } },
|
|
TONR = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" }, { name = "R", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } },
|
|
CTU = { inputs = { { name = "CU", type = "BOOL" }, { name = "R", type = "BOOL" }, { name = "PV", type = "INT" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "CV", type = "INT" } } },
|
|
CTD = { inputs = { { name = "CD", type = "BOOL" }, { name = "LD", type = "BOOL" }, { name = "PV", type = "INT" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "CV", type = "INT" } } },
|
|
CTUD = { inputs = { { name = "CU", type = "BOOL" }, { name = "CD", type = "BOOL" }, { name = "R", type = "BOOL" }, { name = "LD", type = "BOOL" }, { name = "PV", type = "INT" } }, outputs = { { name = "QU", type = "BOOL" }, { name = "QD", type = "BOOL" }, { name = "CV", type = "INT" } } },
|
|
R_TRIG = { inputs = { { name = "CLK", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" } } },
|
|
F_TRIG = { inputs = { { name = "CLK", type = "BOOL" } }, outputs = { { name = "Q", type = "BOOL" } } },
|
|
SR = { inputs = { { name = "S", type = "BOOL" }, { name = "R1", type = "BOOL" } }, outputs = { { name = "Q1", type = "BOOL" } } },
|
|
RS = { inputs = { { name = "S1", type = "BOOL" }, { name = "R", type = "BOOL" } }, outputs = { { name = "Q1", type = "BOOL" } } },
|
|
IEC_TIMER = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } },
|
|
IEC_TON = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } },
|
|
IEC_TOF = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } },
|
|
IEC_TP = { inputs = { { name = "IN", type = "BOOL" }, { name = "PT", type = "TIME" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "ET", type = "TIME" } } },
|
|
IEC_COUNTER = { inputs = { { name = "CU", type = "BOOL" }, { name = "CD", type = "BOOL" }, { name = "R", type = "BOOL" }, { name = "LD", type = "BOOL" }, { name = "PV", type = "INT" } }, outputs = { { name = "QU", type = "BOOL" }, { name = "QD", type = "BOOL" }, { name = "CV", type = "INT" } } },
|
|
IEC_CTU = { inputs = { { name = "CU", type = "BOOL" }, { name = "R", type = "BOOL" }, { name = "PV", type = "INT" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "CV", type = "INT" } } },
|
|
IEC_CTD = { inputs = { { name = "CD", type = "BOOL" }, { name = "LD", type = "BOOL" }, { name = "PV", type = "INT" } }, outputs = { { name = "Q", type = "BOOL" }, { name = "CV", type = "INT" } } },
|
|
IEC_CTUD = { inputs = { { name = "CU", type = "BOOL" }, { name = "CD", type = "BOOL" }, { name = "R", type = "BOOL" }, { name = "LD", type = "BOOL" }, { name = "PV", type = "INT" } }, outputs = { { name = "QU", type = "BOOL" }, { name = "QD", type = "BOOL" }, { name = "CV", type = "INT" } } },
|
|
ADD = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } },
|
|
SUB = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } },
|
|
MUL = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } },
|
|
DIV = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } },
|
|
MIN = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } },
|
|
MAX = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } },
|
|
LIMIT = { inputs = { { name = "MN" }, { name = "IN" }, { name = "MX" } }, outputs = { { name = "OUT" } } },
|
|
MOVE = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
CONVERT = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
ROUND = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
TRUNC = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
CEIL = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
FLOOR = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
SQR = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
SQRT = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
SIN = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
COS = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
TAN = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
ASIN = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
ACOS = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
ATAN = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
LEN = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
CONCAT = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } },
|
|
LEFT = { inputs = { { name = "IN" }, { name = "L" } }, outputs = { { name = "OUT" } } },
|
|
RIGHT = { inputs = { { name = "IN" }, { name = "L" } }, outputs = { { name = "OUT" } } },
|
|
MID = { inputs = { { name = "IN" }, { name = "L" }, { name = "P" } }, outputs = { { name = "OUT" } } },
|
|
AND = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } },
|
|
OR = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } },
|
|
XOR = { inputs = { { name = "IN1" }, { name = "IN2" } }, outputs = { { name = "OUT" } } },
|
|
SHL = { inputs = { { name = "IN" }, { name = "N" } }, outputs = { { name = "OUT" } } },
|
|
SHR = { inputs = { { name = "IN" }, { name = "N" } }, outputs = { { name = "OUT" } } },
|
|
ROL = { inputs = { { name = "IN" }, { name = "N" } }, outputs = { { name = "OUT" } } },
|
|
ROR = { inputs = { { name = "IN" }, { name = "N" } }, outputs = { { name = "OUT" } } },
|
|
BCD_I = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
I_BCD = { inputs = { { name = "IN" } }, outputs = { { name = "OUT" } } },
|
|
}
|
|
|
|
--- Get parameter info for a built-in instruction
|
|
--- @param name string The instruction name
|
|
--- @return table|nil Parameter definition with inputs and outputs arrays
|
|
function M.get_parameters(name)
|
|
return M.PARAMETERS[name:upper()]
|
|
end
|
|
|
|
--- Check if name is a known function block
|
|
--- @param name string The name to check
|
|
--- @return boolean True if known function block
|
|
function M.is_known_function_block(name)
|
|
return M.FUNCTION_BLOCKS[name:upper()] or false
|
|
end
|
|
|
|
--- Check if name is a known function
|
|
--- @param name string The name to check
|
|
--- @return boolean True if known function
|
|
function M.is_known_function(name)
|
|
return M.FUNCTIONS[name:upper()] or false
|
|
end
|
|
|
|
return M
|