Improved parser error recovery so that it's more useful in DCD
This commit is contained in:
parent
abc861a2fe
commit
1a70b23988
|
@ -1,3 +0,0 @@
|
||||||
This is the reference implementation of an editor integration for Dscanner.
|
|
||||||
|
|
||||||
Textadept can be downloaded at http://foicica.com/textadept/
|
|
|
@ -1,60 +0,0 @@
|
||||||
/* XPM */
|
|
||||||
static char * class_xpm[] = {
|
|
||||||
"16 16 41 1",
|
|
||||||
" c None",
|
|
||||||
". c #010100",
|
|
||||||
"+ c #020100",
|
|
||||||
"@ c #BA1DBA",
|
|
||||||
"# c #C120C1",
|
|
||||||
"$ c #BA1CBA",
|
|
||||||
"% c #C824C8",
|
|
||||||
"& c #D229D2",
|
|
||||||
"* c #C724C7",
|
|
||||||
"= c #B91CB9",
|
|
||||||
"- c #010000",
|
|
||||||
"; c #AE16AE",
|
|
||||||
"> c #BF1FBF",
|
|
||||||
", c #D129D1",
|
|
||||||
"' c #E231E2",
|
|
||||||
") c #E131E1",
|
|
||||||
"! c #D028D0",
|
|
||||||
"~ c #AD16AD",
|
|
||||||
"{ c #DF2FDF",
|
|
||||||
"] c #DE2FDE",
|
|
||||||
"^ c #CF28CF",
|
|
||||||
"/ c #BE1EBE",
|
|
||||||
"( c #AC15AC",
|
|
||||||
"_ c #A813A8",
|
|
||||||
": c #B71BB7",
|
|
||||||
"< c #C622C5",
|
|
||||||
"[ c #CE27CF",
|
|
||||||
"} c #CE27CE",
|
|
||||||
"| c #C522C5",
|
|
||||||
"1 c #A713A7",
|
|
||||||
"2 c #000000",
|
|
||||||
"3 c #9E0E9E",
|
|
||||||
"4 c #BD1EBD",
|
|
||||||
"5 c #BC1EBC",
|
|
||||||
"6 c #B61AB6",
|
|
||||||
"7 c #AC15AB",
|
|
||||||
"8 c #A612A6",
|
|
||||||
"9 c #AB15AB",
|
|
||||||
"0 c #9E0E9D",
|
|
||||||
"a c #960A96",
|
|
||||||
"b c #990C99",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" .++. ",
|
|
||||||
" .@##$. ",
|
|
||||||
" .$%&&*=. ",
|
|
||||||
" -;>,')!>~- ",
|
|
||||||
" -~>!{]^/(- ",
|
|
||||||
" -_:<[}|:1- ",
|
|
||||||
" 23(:456732 ",
|
|
||||||
" 23899802 ",
|
|
||||||
" 2abba2 ",
|
|
||||||
" 2222 ",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" "};
|
|
|
@ -1,73 +0,0 @@
|
||||||
/* XPM */
|
|
||||||
static char * function_xpm[] = {
|
|
||||||
"16 16 54 1",
|
|
||||||
" c None",
|
|
||||||
". c #287E03",
|
|
||||||
"+ c #42C009",
|
|
||||||
"@ c #2B8303",
|
|
||||||
"# c #2E8B04",
|
|
||||||
"$ c #4BCA0B",
|
|
||||||
"% c #308E04",
|
|
||||||
"& c #2C8503",
|
|
||||||
"* c #47C50A",
|
|
||||||
"= c #2E8A04",
|
|
||||||
"- c #2F8B04",
|
|
||||||
"; c #48C70A",
|
|
||||||
"> c #2C8703",
|
|
||||||
", c #2F8C04",
|
|
||||||
"' c #4BCB0B",
|
|
||||||
") c #2B8403",
|
|
||||||
"! c #43C10A",
|
|
||||||
"~ c #297F03",
|
|
||||||
"{ c #2E8A03",
|
|
||||||
"] c #2B8503",
|
|
||||||
"^ c #3EBA09",
|
|
||||||
"/ c #267803",
|
|
||||||
"( c #2A8303",
|
|
||||||
"_ c #42BF09",
|
|
||||||
": c #257603",
|
|
||||||
"< c #39B408",
|
|
||||||
"[ c #227103",
|
|
||||||
"} c #3FBB09",
|
|
||||||
"| c #267903",
|
|
||||||
"1 c #227203",
|
|
||||||
"2 c #37B108",
|
|
||||||
"3 c #216D03",
|
|
||||||
"4 c #277C03",
|
|
||||||
"5 c #3DB909",
|
|
||||||
"6 c #257703",
|
|
||||||
"7 c #227003",
|
|
||||||
"8 c #35AF07",
|
|
||||||
"9 c #206B03",
|
|
||||||
"0 c #267A03",
|
|
||||||
"a c #3CB708",
|
|
||||||
"b c #247503",
|
|
||||||
"c c #216E03",
|
|
||||||
"d c #34AD07",
|
|
||||||
"e c #1F6902",
|
|
||||||
"f c #257803",
|
|
||||||
"g c #3AB508",
|
|
||||||
"h c #237303",
|
|
||||||
"i c #206C03",
|
|
||||||
"j c #32AB07",
|
|
||||||
"k c #1E6702",
|
|
||||||
"l c #39B308",
|
|
||||||
"m c #1F6A02",
|
|
||||||
"n c #31A907",
|
|
||||||
"o c #1C6502",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" .+@ #$% ",
|
|
||||||
" &*= -;> ",
|
|
||||||
" ,', )!~ ",
|
|
||||||
" {*] .^/ ",
|
|
||||||
" (_. :<[ ",
|
|
||||||
" .}| 123 ",
|
|
||||||
" 456 789 ",
|
|
||||||
" 0ab cde ",
|
|
||||||
" fgh ijk ",
|
|
||||||
" bl[ mno ",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" "};
|
|
|
@ -1,629 +0,0 @@
|
||||||
-- Copyright Brian Schott (Sir Alaran) 2012.
|
|
||||||
-- Distributed under the Boost Software License, Version 1.0.
|
|
||||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
|
|
||||||
local M = {}
|
|
||||||
|
|
||||||
_M.common.cstyle = require "common.cstyle"
|
|
||||||
|
|
||||||
if type(_G.snippets) == 'table' then
|
|
||||||
_G.snippets.dmd = {}
|
|
||||||
end
|
|
||||||
|
|
||||||
if type(_G.keys) == 'table' then
|
|
||||||
_G.keys.dmd = {}
|
|
||||||
end
|
|
||||||
|
|
||||||
-- functions icon
|
|
||||||
M.FUNCTIONS = [[
|
|
||||||
/* XPM */
|
|
||||||
static char * function_xpm[] = {
|
|
||||||
"16 16 54 1",
|
|
||||||
" c None",
|
|
||||||
". c #287E03",
|
|
||||||
"+ c #42C009",
|
|
||||||
"@ c #2B8303",
|
|
||||||
"# c #2E8B04",
|
|
||||||
"$ c #4BCA0B",
|
|
||||||
"% c #308E04",
|
|
||||||
"& c #2C8503",
|
|
||||||
"* c #47C50A",
|
|
||||||
"= c #2E8A04",
|
|
||||||
"- c #2F8B04",
|
|
||||||
"; c #48C70A",
|
|
||||||
"> c #2C8703",
|
|
||||||
", c #2F8C04",
|
|
||||||
"' c #4BCB0B",
|
|
||||||
") c #2B8403",
|
|
||||||
"! c #43C10A",
|
|
||||||
"~ c #297F03",
|
|
||||||
"{ c #2E8A03",
|
|
||||||
"] c #2B8503",
|
|
||||||
"^ c #3EBA09",
|
|
||||||
"/ c #267803",
|
|
||||||
"( c #2A8303",
|
|
||||||
"_ c #42BF09",
|
|
||||||
": c #257603",
|
|
||||||
"< c #39B408",
|
|
||||||
"[ c #227103",
|
|
||||||
"} c #3FBB09",
|
|
||||||
"| c #267903",
|
|
||||||
"1 c #227203",
|
|
||||||
"2 c #37B108",
|
|
||||||
"3 c #216D03",
|
|
||||||
"4 c #277C03",
|
|
||||||
"5 c #3DB909",
|
|
||||||
"6 c #257703",
|
|
||||||
"7 c #227003",
|
|
||||||
"8 c #35AF07",
|
|
||||||
"9 c #206B03",
|
|
||||||
"0 c #267A03",
|
|
||||||
"a c #3CB708",
|
|
||||||
"b c #247503",
|
|
||||||
"c c #216E03",
|
|
||||||
"d c #34AD07",
|
|
||||||
"e c #1F6902",
|
|
||||||
"f c #257803",
|
|
||||||
"g c #3AB508",
|
|
||||||
"h c #237303",
|
|
||||||
"i c #206C03",
|
|
||||||
"j c #32AB07",
|
|
||||||
"k c #1E6702",
|
|
||||||
"l c #39B308",
|
|
||||||
"m c #1F6A02",
|
|
||||||
"n c #31A907",
|
|
||||||
"o c #1C6502",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" .+@ #$% ",
|
|
||||||
" &*= -;> ",
|
|
||||||
" ,', )!~ ",
|
|
||||||
" {*] .^/ ",
|
|
||||||
" (_. :<[ ",
|
|
||||||
" .}| 123 ",
|
|
||||||
" 456 789 ",
|
|
||||||
" 0ab cde ",
|
|
||||||
" fgh ijk ",
|
|
||||||
" bl[ mno ",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" "};
|
|
||||||
]]
|
|
||||||
|
|
||||||
-- fields icon
|
|
||||||
M.FIELDS = [[
|
|
||||||
/* XPM */
|
|
||||||
static char * class_xpm[] = {
|
|
||||||
"16 16 41 1",
|
|
||||||
" c None",
|
|
||||||
". c #010100",
|
|
||||||
"+ c #020100",
|
|
||||||
"@ c #BA1DBA",
|
|
||||||
"# c #C120C1",
|
|
||||||
"$ c #BA1CBA",
|
|
||||||
"% c #C824C8",
|
|
||||||
"& c #D229D2",
|
|
||||||
"* c #C724C7",
|
|
||||||
"= c #B91CB9",
|
|
||||||
"- c #010000",
|
|
||||||
"; c #AE16AE",
|
|
||||||
"> c #BF1FBF",
|
|
||||||
", c #D129D1",
|
|
||||||
"' c #E231E2",
|
|
||||||
") c #E131E1",
|
|
||||||
"! c #D028D0",
|
|
||||||
"~ c #AD16AD",
|
|
||||||
"{ c #DF2FDF",
|
|
||||||
"] c #DE2FDE",
|
|
||||||
"^ c #CF28CF",
|
|
||||||
"/ c #BE1EBE",
|
|
||||||
"( c #AC15AC",
|
|
||||||
"_ c #A813A8",
|
|
||||||
": c #B71BB7",
|
|
||||||
"< c #C622C5",
|
|
||||||
"[ c #CE27CF",
|
|
||||||
"} c #CE27CE",
|
|
||||||
"| c #C522C5",
|
|
||||||
"1 c #A713A7",
|
|
||||||
"2 c #000000",
|
|
||||||
"3 c #9E0E9E",
|
|
||||||
"4 c #BD1EBD",
|
|
||||||
"5 c #BC1EBC",
|
|
||||||
"6 c #B61AB6",
|
|
||||||
"7 c #AC15AB",
|
|
||||||
"8 c #A612A6",
|
|
||||||
"9 c #AB15AB",
|
|
||||||
"0 c #9E0E9D",
|
|
||||||
"a c #960A96",
|
|
||||||
"b c #990C99",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" .++. ",
|
|
||||||
" .@##$. ",
|
|
||||||
" .$%&&*=. ",
|
|
||||||
" -;>,')!>~- ",
|
|
||||||
" -~>!{]^/(- ",
|
|
||||||
" -_:<[}|:1- ",
|
|
||||||
" 23(:456732 ",
|
|
||||||
" 23899802 ",
|
|
||||||
" 2abba2 ",
|
|
||||||
" 2222 ",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" "};
|
|
||||||
|
|
||||||
]]
|
|
||||||
|
|
||||||
--package icon
|
|
||||||
M.PACKAGE = [[
|
|
||||||
/* XPM */
|
|
||||||
static char * package_xpm[] = {
|
|
||||||
"16 16 6 1",
|
|
||||||
" c None",
|
|
||||||
". c #000100",
|
|
||||||
"+ c #050777",
|
|
||||||
"@ c #242BAE",
|
|
||||||
"# c #2E36BF",
|
|
||||||
"$ c #434FE5",
|
|
||||||
" ",
|
|
||||||
" ............ ",
|
|
||||||
" .$$$$$$$$$$$$. ",
|
|
||||||
" .$##@@+$##@@+. ",
|
|
||||||
" .$#@@@+$#@@@+. ",
|
|
||||||
" .$@@@#+$@@@#+. ",
|
|
||||||
" .$@@##+$@@##+. ",
|
|
||||||
" .$+++++$+++++. ",
|
|
||||||
" .$$$$$$$$$$$$. ",
|
|
||||||
" .$##@@+$##@@+. ",
|
|
||||||
" .$#@@@+$#@@@+. ",
|
|
||||||
" .$@@@#+$@@@#+. ",
|
|
||||||
" .$@@##+$@@##+. ",
|
|
||||||
" .$+++++$+++++. ",
|
|
||||||
" ............ ",
|
|
||||||
" "};
|
|
||||||
]]
|
|
||||||
|
|
||||||
-- module icon
|
|
||||||
M.MODULE = [[
|
|
||||||
/* XPM */
|
|
||||||
static char * module_xpm[] = {
|
|
||||||
"16 16 14 1",
|
|
||||||
" c None",
|
|
||||||
". c #000000",
|
|
||||||
"+ c #000100",
|
|
||||||
"@ c #FFFF83",
|
|
||||||
"# c #FFFF00",
|
|
||||||
"$ c #FFFF28",
|
|
||||||
"% c #FFFF6A",
|
|
||||||
"& c #FFFF4C",
|
|
||||||
"* c #D5D500",
|
|
||||||
"= c #CDCD00",
|
|
||||||
"- c #A3A300",
|
|
||||||
"; c #B2B200",
|
|
||||||
"> c #C3C300",
|
|
||||||
", c #919100",
|
|
||||||
" ",
|
|
||||||
" .+ ",
|
|
||||||
" .@#+ ",
|
|
||||||
" .@#+ ",
|
|
||||||
" .$@##+ ",
|
|
||||||
" ..%@##++ ",
|
|
||||||
" ..&%%@####++ ",
|
|
||||||
" .@@@@@%######+ ",
|
|
||||||
" +*****=-;;;;;+ ",
|
|
||||||
" ++>==*;--,.. ",
|
|
||||||
" ++=*;-.. ",
|
|
||||||
" +>*;,. ",
|
|
||||||
" +*;. ",
|
|
||||||
" +*;. ",
|
|
||||||
" ++ ",
|
|
||||||
" "};
|
|
||||||
]]
|
|
||||||
|
|
||||||
M.KEYWORD = [[
|
|
||||||
/* XPM */
|
|
||||||
static char * keyword_xpm[] = {
|
|
||||||
"16 16 24 1",
|
|
||||||
" c None",
|
|
||||||
". c #B91C1C",
|
|
||||||
"+ c #BA1C1C",
|
|
||||||
"@ c #BE1D1D",
|
|
||||||
"# c #C31E1E",
|
|
||||||
"$ c #C21E1E",
|
|
||||||
"% c #F0F0F0",
|
|
||||||
"& c #C71E1E",
|
|
||||||
"* c #F5F5F5",
|
|
||||||
"= c #CC1F1F",
|
|
||||||
"- c #FBFBFB",
|
|
||||||
"; c #CB1F1F",
|
|
||||||
"> c #CD1F1F",
|
|
||||||
", c #FDFDFD",
|
|
||||||
"' c #C91F1F",
|
|
||||||
") c #F7F7F7",
|
|
||||||
"! c #C41E1E",
|
|
||||||
"~ c #F2F2F2",
|
|
||||||
"{ c #C01D1D",
|
|
||||||
"q c #ECECEC",
|
|
||||||
"^ c #BB1D1D",
|
|
||||||
"/ c #E7E7E7",
|
|
||||||
"( c #B71C1C",
|
|
||||||
"_ c #B21B1B",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" .......... ",
|
|
||||||
" @@@@@@@@@@@@ ",
|
|
||||||
" #$%%%%%%$$#$ ",
|
|
||||||
" &&*******&&& ",
|
|
||||||
" ==--==;---== ",
|
|
||||||
" >>,,>>>>,,>> ",
|
|
||||||
" ''))''''))'' ",
|
|
||||||
" !!~~!!!~~~!! ",
|
|
||||||
" {{qqqqqqq{{{ ",
|
|
||||||
" ^^//////^^^^ ",
|
|
||||||
" (((((((((((( ",
|
|
||||||
" __________ ",
|
|
||||||
" ",
|
|
||||||
" "};
|
|
||||||
]]
|
|
||||||
|
|
||||||
|
|
||||||
local keywords = {
|
|
||||||
"__DATE__?5", "__EOF__?5", "__FILE__?5", "__FUNCTION__?5", "__LINE__?5",
|
|
||||||
"__MODULE__?5", "__PRETTY_FUNCTION__?5", "__TIMESTAMP__?5", "__TIME__?5",
|
|
||||||
"__VENDOR__?5", "__VERSION__?5", "__gshared?5", "__parameters?5",
|
|
||||||
"__thread?5", "__traits?5", "__vector?5", "abstract?5", "alias?5",
|
|
||||||
"align?5", "asm?5", "assert?5", "auto?5", "body?5", "bool?5", "break?5",
|
|
||||||
"byte?5", "case?5", "cast?5", "catch?5", "cdouble?5", "cent?5", "cfloat?5",
|
|
||||||
"char?5", "class?5", "const?5", "continue?5", "creal?5", "dchar?5",
|
|
||||||
"debug?5", "default?5", "delegate?5", "delete?5", "deprecated?5", "do?5",
|
|
||||||
"double?5", "dstring?5", "else?5", "enum?5", "export?5", "extern?5",
|
|
||||||
"false?5", "final?5", "finally?5", "float?5", "for?5", "foreach?5",
|
|
||||||
"foreach_reverse?5", "function?5", "goto?5", "idouble?5", "if?5",
|
|
||||||
"ifloat?5", "immutable?5", "import?5", "in?5", "inout?5", "int?5",
|
|
||||||
"interface?5", "invariant?5", "ireal?5", "is?5", "lazy?5", "long?5",
|
|
||||||
"macro?5", "mixin?5", "module?5", "new?5", "nothrow?5", "null?5", "out?5",
|
|
||||||
"override?5", "package?5", "pragma?5", "private?5", "protected?5", "public?5",
|
|
||||||
"pure?5", "real?5", "ref?5", "return?5", "scope?5", "shared?5", "short?5",
|
|
||||||
"static?5", "string?5", "struct?5", "super?5", "switch?5", "synchronized?5",
|
|
||||||
"template?5", "this?5", "throw?5", "true?5", "try?5", "typedef?5",
|
|
||||||
"typeid?5", "typeof?5", "ubyte?5", "ucent?5", "uint?5", "ulong?5",
|
|
||||||
"union?5", "unittest?5", "ushort?5", "version?5", "void?5", "volatile?5",
|
|
||||||
"wchar?5", "while?5", "with?5", "wstring?5"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
-- For this module to work the dscanner program must be installed. Configure the
|
|
||||||
-- path to the executable here
|
|
||||||
M.PATH_TO_DSCANNER = "/home/alaran/src/dscanner/dscanner"
|
|
||||||
M.PATH_TO_DCD_CLIENT = "/home/alaran/src/dcd/dcd-client"
|
|
||||||
|
|
||||||
_M.textadept.editing.comment_string.dmd = '//'
|
|
||||||
_M.textadept.run.compile_command.dmd = 'dmd -c -o- %(filename)'
|
|
||||||
_M.textadept.run.error_detail.dmd = {
|
|
||||||
pattern = '^(.-)%((%d+)%): (.+)$',
|
|
||||||
filename = 1, line = 2, message = 3
|
|
||||||
}
|
|
||||||
|
|
||||||
local function registerImages()
|
|
||||||
buffer:register_image(1, M.FIELDS)
|
|
||||||
buffer:register_image(2, M.FUNCTIONS)
|
|
||||||
buffer:register_image(3, M.PACKAGE)
|
|
||||||
buffer:register_image(4, M.MODULE)
|
|
||||||
buffer:register_image(5, M.KEYWORD)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local function showCompletionList(r)
|
|
||||||
registerImages()
|
|
||||||
local setting = buffer.auto_c_choose_single
|
|
||||||
buffer.auto_c_choose_single = false;
|
|
||||||
buffer.auto_c_max_width = 0
|
|
||||||
local completions = {}
|
|
||||||
for symbol, kind in r:gmatch("([@%w_%p]+)\t(%a)\n") do
|
|
||||||
completion = symbol
|
|
||||||
if kind == "k" then
|
|
||||||
completion = completion .. "?5"
|
|
||||||
elseif kind == "v" then
|
|
||||||
completion = completion .. "?1"
|
|
||||||
elseif kind == "e" then
|
|
||||||
completion = completion .. "?1"
|
|
||||||
elseif kind == "m" then
|
|
||||||
completion = completion .. "?1"
|
|
||||||
elseif kind == "c" then
|
|
||||||
completion = completion .. "?1"
|
|
||||||
elseif kind == "i" then
|
|
||||||
completion = completion .. "?1"
|
|
||||||
elseif kind == "f" then
|
|
||||||
completion = completion .. "?2"
|
|
||||||
elseif kind == "M" then
|
|
||||||
completion = completion .. "?4"
|
|
||||||
elseif kind == "P" then
|
|
||||||
completion = completion .. "?3"
|
|
||||||
end
|
|
||||||
completions[#completions + 1] = completion
|
|
||||||
end
|
|
||||||
buffer:auto_c_show(0, table.concat(completions, " "))
|
|
||||||
buffer.auto_c_choose_single = setting
|
|
||||||
end
|
|
||||||
|
|
||||||
events.connect(events.CHAR_ADDED, function(ch)
|
|
||||||
if buffer:get_lexer() ~= "dmd" then return end
|
|
||||||
if ch > 255 then return end
|
|
||||||
local character = string.char(ch)
|
|
||||||
if character == "." or character == "(" then
|
|
||||||
local fileName = os.tmpname()
|
|
||||||
local tmpFile = io.open(fileName, "w")
|
|
||||||
tmpFile:write(buffer:get_text())
|
|
||||||
local command = M.PATH_TO_DCD_CLIENT .. " -c" .. buffer.current_pos
|
|
||||||
.. " " .. fileName
|
|
||||||
print(command)
|
|
||||||
local p = io.popen(command)
|
|
||||||
local r = p:read("*a")
|
|
||||||
if r ~= "\n" then
|
|
||||||
showCompletionList(r)
|
|
||||||
end
|
|
||||||
os.remove(fileName)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
events.connect(events.FILE_AFTER_SAVE, function()
|
|
||||||
if buffer:get_lexer() ~= "dmd" then return end
|
|
||||||
buffer:annotation_clear_all()
|
|
||||||
--buffer.annotation_visible = _SCINTILLA.constants.ANNOTATION_STANDARD
|
|
||||||
local command = M.PATH_TO_DSCANNER .. " --syntaxCheck " .. buffer.filename
|
|
||||||
local p = io.popen(command)
|
|
||||||
for line in p:lines() do
|
|
||||||
lineNumber, column, level, message = string.match(line, "^.-%((%d+):(%d+)%)%[(%w+)%]: (.+)$")
|
|
||||||
local l = tonumber(lineNumber) - 1
|
|
||||||
if l >= 0 then
|
|
||||||
local c = tonumber(column)
|
|
||||||
if level == "error" then
|
|
||||||
buffer.annotation_style[l] = 8
|
|
||||||
else
|
|
||||||
buffer.annotation_style[l] = 2
|
|
||||||
end
|
|
||||||
local t = buffer.annotation_text[l]
|
|
||||||
if #t > 0 then
|
|
||||||
buffer.annotation_text[l] = buffer.annotation_text[l] .. "\n" .. message
|
|
||||||
else
|
|
||||||
buffer.annotation_text[l] = message
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
|
|
||||||
local function autocomplete()
|
|
||||||
registerImages()
|
|
||||||
_M.textadept.editing.autocomplete_word(keywords)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- D-specific key commands.
|
|
||||||
keys.dmd = {
|
|
||||||
[keys.LANGUAGE_MODULE_PREFIX] = {
|
|
||||||
m = { io.open_file,
|
|
||||||
(_USERHOME..'/modules/dmd/init.lua'):iconv('UTF-8', _CHARSET) },
|
|
||||||
},
|
|
||||||
['a\n'] = {_M.common.cstyle.newline},
|
|
||||||
['s\n'] = {_M.common.cstyle.newline_semicolon},
|
|
||||||
['c;'] = {_M.common.cstyle.endline_semicolon},
|
|
||||||
['}'] = {_M.common.cstyle.match_brace_indent},
|
|
||||||
['c{'] = {_M.common.cstyle.openBraceMagic, true},
|
|
||||||
['cs\n'] = {_M.common.cstyle.closeTagComStr},
|
|
||||||
['cM'] = {_M.common.cstyle.selectScope},
|
|
||||||
['\n'] = {_M.common.cstyle.enter_key_pressed},
|
|
||||||
['c\n'] = {autocomplete},
|
|
||||||
}
|
|
||||||
|
|
||||||
local snippets = _G.snippets
|
|
||||||
|
|
||||||
if type(snippets) == 'table' then
|
|
||||||
snippets.dmd = {
|
|
||||||
gpl = [[/*******************************************************************************
|
|
||||||
* Authors: %1(Your name here)
|
|
||||||
* Copyright: %1
|
|
||||||
* Date: %[date | cut -c 5-10] %[date | cut -c 25-]
|
|
||||||
*
|
|
||||||
* License:
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License version
|
|
||||||
* 2 as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
|
||||||
* MA 02111-1307, USA.
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
%0]],
|
|
||||||
gpl3 = [[/*******************************************************************************
|
|
||||||
* Authors: %1(Your name here)
|
|
||||||
* Copyright: %1
|
|
||||||
* Date: %[date | cut -c 5-10] %[date | cut -c 25-]
|
|
||||||
*
|
|
||||||
* License:
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
%0]],
|
|
||||||
mit = [[/*******************************************************************************
|
|
||||||
* The MIT License
|
|
||||||
*
|
|
||||||
* Copyright (c) %[date | cut -c 25-] %1(Your name here)
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
%0]],
|
|
||||||
boost = [[/*******************************************************************************
|
|
||||||
* Boost Software License - Version 1.0 - August 17th, 2003
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person or organization
|
|
||||||
* obtaining a copy of the software and accompanying documentation covered by
|
|
||||||
* this license (the "Software") to use, reproduce, display, distribute,
|
|
||||||
* execute, and transmit the Software, and to prepare derivative works of the
|
|
||||||
* Software, and to permit third-parties to whom the Software is furnished to
|
|
||||||
* do so, all subject to the following:
|
|
||||||
*
|
|
||||||
* The copyright notices in the Software and this entire statement, including
|
|
||||||
* the above license grant, this restriction and the following disclaimer,
|
|
||||||
* must be included in all copies of the Software, in whole or in part, and
|
|
||||||
* all derivative works of the Software, unless such copies or derivative
|
|
||||||
* works are solely in the form of machine-executable object code generated by
|
|
||||||
* a source language processor.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
|
||||||
* SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
|
||||||
* FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
|
||||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
* DEALINGS IN THE SOFTWARE.
|
|
||||||
******************************************************************************/
|
|
||||||
]],
|
|
||||||
banner = [[/%<string.rep("*", buffer.edge_column - buffer.column[buffer.current_pos] - 1)>
|
|
||||||
* %0
|
|
||||||
%<string.rep("*", buffer.edge_column - buffer.column[buffer.current_pos] - 2)>/]],
|
|
||||||
fun = [[%1(return type) %2(name)(%3(parameters))
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
return ;
|
|
||||||
}]],
|
|
||||||
vfun = [[void %1(name)(%2(parameters))
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
}]],
|
|
||||||
main = [[void main(string[] args)
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
}]],
|
|
||||||
['for'] = [[for (%1(initilization); %2(condition); %3(increment))
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
}]],
|
|
||||||
fore = [[foreach (%1(var); %2(range))
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
}]],
|
|
||||||
forei = [[foreach (%1(i); 0..%2(n))
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
}]],
|
|
||||||
forr = [[foreach (ref %1(var); %2(range))
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
}]],
|
|
||||||
fori = [[for (size_t i = 0; i != %1(condition); ++i)
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
}]],
|
|
||||||
['while'] = [[while (%1(condition))
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
}]],
|
|
||||||
['if'] = [[if (%1(condition))
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
}]],
|
|
||||||
dw = [[do
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
} while (%1(condition));]],
|
|
||||||
switch = [[switch (%1(value))
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}]],
|
|
||||||
fswitch = [[final switch (%1(value))
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}]],
|
|
||||||
case = [[case %1:
|
|
||||||
%0
|
|
||||||
break;]],
|
|
||||||
class = [[class %1(name)
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
private:
|
|
||||||
%0
|
|
||||||
}]],
|
|
||||||
struct = [[struct %1(name)
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
}]],
|
|
||||||
mem = 'm_%1 = %1;\n%0',
|
|
||||||
wf = 'writef(%0);',
|
|
||||||
wl = 'writeln(%0);',
|
|
||||||
wfl = 'writefln(%0);',
|
|
||||||
imp = 'import',
|
|
||||||
sta = 'static',
|
|
||||||
st = 'string',
|
|
||||||
wch = 'wchar',
|
|
||||||
dch = 'dchar',
|
|
||||||
ch = 'char',
|
|
||||||
dou = 'double',
|
|
||||||
fl = 'float',
|
|
||||||
by = 'byte',
|
|
||||||
ret = 'return',
|
|
||||||
im = 'immutable',
|
|
||||||
co = 'const',
|
|
||||||
ty = 'typeof',
|
|
||||||
iit = [[if(is(typeof(%1)))
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
}]],
|
|
||||||
itc = [[if(__traits(compiles, %1))
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
}]],
|
|
||||||
sif = [[static if(%1)
|
|
||||||
{
|
|
||||||
%0
|
|
||||||
}]],
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
function M.set_buffer_properties()
|
|
||||||
end
|
|
||||||
|
|
||||||
return M
|
|
|
@ -1,43 +0,0 @@
|
||||||
/* XPM */
|
|
||||||
static char * keyword_xpm[] = {
|
|
||||||
"16 16 24 1",
|
|
||||||
" c None",
|
|
||||||
". c #B91C1C",
|
|
||||||
"+ c #BA1C1C",
|
|
||||||
"@ c #BE1D1D",
|
|
||||||
"# c #C31E1E",
|
|
||||||
"$ c #C21E1E",
|
|
||||||
"% c #F0F0F0",
|
|
||||||
"& c #C71E1E",
|
|
||||||
"* c #F5F5F5",
|
|
||||||
"= c #CC1F1F",
|
|
||||||
"- c #FBFBFB",
|
|
||||||
"; c #CB1F1F",
|
|
||||||
"> c #CD1F1F",
|
|
||||||
", c #FDFDFD",
|
|
||||||
"' c #C91F1F",
|
|
||||||
") c #F7F7F7",
|
|
||||||
"! c #C41E1E",
|
|
||||||
"~ c #F2F2F2",
|
|
||||||
"{ c #C01D1D",
|
|
||||||
"] c #ECECEC",
|
|
||||||
"^ c #BB1D1D",
|
|
||||||
"/ c #E7E7E7",
|
|
||||||
"( c #B71C1C",
|
|
||||||
"_ c #B21B1B",
|
|
||||||
" ",
|
|
||||||
" ",
|
|
||||||
" ......+... ",
|
|
||||||
" @@@@@@@@@@@@ ",
|
|
||||||
" #$%%%%%%$$#$ ",
|
|
||||||
" &&*******&&& ",
|
|
||||||
" ==--==;---== ",
|
|
||||||
" >>,,>>>>,,>> ",
|
|
||||||
" ''))''''))'' ",
|
|
||||||
" !!~~!!!~~~!! ",
|
|
||||||
" {{]]]]]]]{{{ ",
|
|
||||||
" ^^//////^^^^ ",
|
|
||||||
" (((((((((((( ",
|
|
||||||
" __________ ",
|
|
||||||
" ",
|
|
||||||
" "};
|
|
|
@ -1,33 +0,0 @@
|
||||||
/* XPM */
|
|
||||||
static char * module_xpm[] = {
|
|
||||||
"16 16 14 1",
|
|
||||||
" c None",
|
|
||||||
". c #000000",
|
|
||||||
"+ c #000100",
|
|
||||||
"@ c #FFFF83",
|
|
||||||
"# c #FFFF00",
|
|
||||||
"$ c #FFFF28",
|
|
||||||
"% c #FFFF6A",
|
|
||||||
"& c #FFFF4C",
|
|
||||||
"* c #D5D500",
|
|
||||||
"= c #CDCD00",
|
|
||||||
"- c #A3A300",
|
|
||||||
"; c #B2B200",
|
|
||||||
"> c #C3C300",
|
|
||||||
", c #919100",
|
|
||||||
" ",
|
|
||||||
" .+ ",
|
|
||||||
" .@#+ ",
|
|
||||||
" .@#+ ",
|
|
||||||
" .$@##+ ",
|
|
||||||
" ..%@##++ ",
|
|
||||||
" ..&%%@####++ ",
|
|
||||||
" .@@@@@%######+ ",
|
|
||||||
" +*****=-;;;;;+ ",
|
|
||||||
" ++>==*;--,.. ",
|
|
||||||
" ++=*;-.. ",
|
|
||||||
" +>*;,. ",
|
|
||||||
" +*;. ",
|
|
||||||
" +*;. ",
|
|
||||||
" ++ ",
|
|
||||||
" "};
|
|
|
@ -1,25 +0,0 @@
|
||||||
/* XPM */
|
|
||||||
static char * package_xpm[] = {
|
|
||||||
"16 16 6 1",
|
|
||||||
" c None",
|
|
||||||
". c #000100",
|
|
||||||
"+ c #050777",
|
|
||||||
"@ c #242BAE",
|
|
||||||
"# c #2E36BF",
|
|
||||||
"$ c #434FE5",
|
|
||||||
" ",
|
|
||||||
" ............ ",
|
|
||||||
" .$$$$$$$$$$$$. ",
|
|
||||||
" .$##@@+$##@@+. ",
|
|
||||||
" .$#@@@+$#@@@+. ",
|
|
||||||
" .$@@@#+$@@@#+. ",
|
|
||||||
" .$@@##+$@@##+. ",
|
|
||||||
" .$+++++$+++++. ",
|
|
||||||
" .$$$$$$$$$$$$. ",
|
|
||||||
" .$##@@+$##@@+. ",
|
|
||||||
" .$#@@@+$#@@@+. ",
|
|
||||||
" .$@@@#+$@@@#+. ",
|
|
||||||
" .$@@##+$@@##+. ",
|
|
||||||
" .$+++++$+++++. ",
|
|
||||||
" ............ ",
|
|
||||||
" "};
|
|
18
main.d
18
main.d
|
@ -36,19 +36,35 @@ int main(string[] args)
|
||||||
bool syntaxCheck;
|
bool syntaxCheck;
|
||||||
bool ast;
|
bool ast;
|
||||||
bool imports;
|
bool imports;
|
||||||
|
bool muffin;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
getopt(args, "sloc|l", &sloc, "highlight", &highlight,
|
getopt(args, "sloc|l", &sloc, "highlight", &highlight,
|
||||||
"ctags|c", &ctags, "recursive|r|R", &recursive, "help|h", &help,
|
"ctags|c", &ctags, "recursive|r|R", &recursive, "help|h", &help,
|
||||||
"tokenCount|t", &tokenCount, "syntaxCheck|s", &syntaxCheck,
|
"tokenCount|t", &tokenCount, "syntaxCheck|s", &syntaxCheck,
|
||||||
"ast|xml", &ast, "imports|i", &imports);
|
"ast|xml", &ast, "imports|i", &imports, "muffinButton", &muffin);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
stderr.writeln(e.msg);
|
stderr.writeln(e.msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (muffin)
|
||||||
|
{
|
||||||
|
stdout.writeln(
|
||||||
|
` ___________
|
||||||
|
__(#*O 0** @%*)__
|
||||||
|
_(%*o#*O%*0 #O#%##@)_
|
||||||
|
(*#@%#o*@ #o%O*%@ #o #)
|
||||||
|
\=====================/
|
||||||
|
|I|I|I|I|I|I|I|I|I|I|
|
||||||
|
|I|I|I|I|I|I|I|I|I|I|
|
||||||
|
|I|I|I|I|I|I|I|I|I|I|
|
||||||
|
|I|I|I|I|I|I|I|I|I|I|`);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (help)
|
if (help)
|
||||||
{
|
{
|
||||||
printHelp(args[0]);
|
printHelp(args[0]);
|
||||||
|
|
|
@ -3500,5 +3500,3 @@ unittest
|
||||||
}
|
}
|
||||||
assert (tokenCount == 16);
|
assert (tokenCount == 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
//void main(string[] args){}
|
|
||||||
|
|
|
@ -1285,6 +1285,8 @@ class ClassFour(A, B) if (someTest()) : Super {}}c;
|
||||||
mixin(traceEnterAndExit!(__FUNCTION__));
|
mixin(traceEnterAndExit!(__FUNCTION__));
|
||||||
auto node = new CmpExpression;
|
auto node = new CmpExpression;
|
||||||
auto shift = parseShiftExpression();
|
auto shift = parseShiftExpression();
|
||||||
|
if (!moreTokens())
|
||||||
|
return shift;
|
||||||
with (TokenType) switch (current.type)
|
with (TokenType) switch (current.type)
|
||||||
{
|
{
|
||||||
case is_:
|
case is_:
|
||||||
|
@ -1766,8 +1768,8 @@ class ClassFour(A, B) if (someTest()) : Super {}}c;
|
||||||
auto dos = parseDeclarationOrStatement();
|
auto dos = parseDeclarationOrStatement();
|
||||||
if (dos !is null)
|
if (dos !is null)
|
||||||
node.declarationsAndStatements ~= dos;
|
node.declarationsAndStatements ~= dos;
|
||||||
else
|
/*else
|
||||||
return null;
|
return null;*/
|
||||||
}
|
}
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
@ -6181,7 +6183,7 @@ private:
|
||||||
messageFunction(fileName, line, column, message);
|
messageFunction(fileName, line, column, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void error(lazy string message)
|
void error(lazy string message, bool shouldAdvance = true)
|
||||||
{
|
{
|
||||||
import std.stdio;
|
import std.stdio;
|
||||||
if (suppressMessages <= 0)
|
if (suppressMessages <= 0)
|
||||||
|
@ -6195,12 +6197,12 @@ private:
|
||||||
else
|
else
|
||||||
messageFunction(fileName, line, column, message);
|
messageFunction(fileName, line, column, message);
|
||||||
}
|
}
|
||||||
while (moreTokens())
|
while (shouldAdvance && moreTokens())
|
||||||
{
|
{
|
||||||
if (currentIsOneOf(TokenType.semicolon, TokenType.rBrace,
|
if (currentIsOneOf(TokenType.semicolon, TokenType.rBrace,
|
||||||
TokenType.rParen, TokenType.rBracket))
|
TokenType.rParen, TokenType.rBracket))
|
||||||
{
|
{
|
||||||
advance();
|
advance();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -6317,12 +6319,15 @@ private:
|
||||||
return &tokens[index++];
|
return &tokens[index++];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (getTokenValue(type) is null)
|
string tokenString = getTokenValue(type) is null
|
||||||
error("Expected " ~ to!string(type) ~ " instead of "
|
? to!string(type) : getTokenValue(type);
|
||||||
~ (index < tokens.length ? tokens[index].value : "EOF"));
|
bool shouldNotAdvance = index < tokens.length
|
||||||
else
|
&& (tokens[index].type == TokenType.rParen
|
||||||
error("Expected " ~ getTokenValue(type) ~ " instead of "
|
|| tokens[index].type == TokenType.semicolon
|
||||||
~ (index < tokens.length ? tokens[index].value : "EOF"));
|
|| tokens[index].type == TokenType.rBrace);
|
||||||
|
error("Expected " ~ tokenString ~ " instead of "
|
||||||
|
~ (index < tokens.length ? tokens[index].value : "EOF"),
|
||||||
|
!shouldNotAdvance);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue