From 224ed55474bff6c992d8e60530e169dfa57d8b9e Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Sun, 9 Apr 2017 06:01:07 +0200 Subject: [PATCH] fixup #369, dot completion broken in bodies + handle templatized UDAs --- src/server/autocomplete.d | 47 ++++++++++++++++++++++++++++++--------- tests/tc051/expected2.txt | 9 ++++++++ tests/tc051/file2.d | 1 + tests/tc051/run.sh | 3 +++ 4 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 tests/tc051/expected2.txt create mode 100644 tests/tc051/file2.d diff --git a/src/server/autocomplete.d b/src/server/autocomplete.d index 822ac90..3356df7 100644 --- a/src/server/autocomplete.d +++ b/src/server/autocomplete.d @@ -1204,25 +1204,52 @@ bool isUdaExpression(T)(ref T tokens) bool result; ptrdiff_t skip; ptrdiff_t i = tokens.length - 2; - - while (i >= 2) + + if (i < 1) + return result; + + // skips the UDA ctor + if (tokens[i].type == tok!")") { - if (skip == 0 && tokens[i].type == tok!"identifier" && tokens[i-1].type == tok!"@") + ++skip; + --i; + while (i >= 2) + { + skip += tokens[i].type == tok!")"; + skip -= tokens[i].type == tok!"("; + --i; + if (skip == 0) + { + // @UDA!(TemplateParameters)(FunctionParameters) + if (i > 3 && tokens[i].type == tok!"!" && tokens[i-1].type == tok!")") + { + skip = 1; + i -= 2; + continue; + } + else break; + } + } + } + + if (skip == 0) + { + // @UDA!SingleTemplateParameter + if (i > 2 && tokens[i].type == tok!"identifier" && tokens[i-1].type == tok!"!") + { + i -= 2; + } + + // @UDA + if (i > 0 && tokens[i].type == tok!"identifier" && tokens[i-1].type == tok!"@") { result = true; - break; } - - skip += tokens[i].type == tok!")"; - skip -= tokens[i].type == tok!"("; - - --i; } return result; } - /** * */ diff --git a/tests/tc051/expected2.txt b/tests/tc051/expected2.txt new file mode 100644 index 0000000..1b7ebc2 --- /dev/null +++ b/tests/tc051/expected2.txt @@ -0,0 +1,9 @@ +identifiers +alignof k +bar f +c v +init k +mangleof k +sizeof k +stringof k +tupleof k diff --git a/tests/tc051/file2.d b/tests/tc051/file2.d new file mode 100644 index 0000000..249b5ca --- /dev/null +++ b/tests/tc051/file2.d @@ -0,0 +1 @@ +struct UDA(T){int a,b;} struct Foo{int c; @UDA!(int)(0,1) void bar(){this.}} diff --git a/tests/tc051/run.sh b/tests/tc051/run.sh index be458fd..e8f8a4f 100755 --- a/tests/tc051/run.sh +++ b/tests/tc051/run.sh @@ -6,3 +6,6 @@ diff actual.txt expected.txt ../../bin/dcd-client $1 file1.d -c25 > actual1.txt diff actual1.txt expected1.txt + +../../bin/dcd-client $1 file2.d -c74 > actual2.txt +diff actual2.txt expected2.txt