diff --git a/src/server/autocomplete.d b/src/server/autocomplete.d index ea9e4ac..34c7fc0 100644 --- a/src/server/autocomplete.d +++ b/src/server/autocomplete.d @@ -819,8 +819,11 @@ void setCompletions(T)(ref AutocompleteResponse response, Scope* completionScope, T tokens, size_t cursorPosition, CompletionType completionType, bool isBracket = false, string partial = null) { - static void addSymToResponse(DSymbol* s, ref AutocompleteResponse r, string p) + static void addSymToResponse(DSymbol* s, ref AutocompleteResponse r, string p, + size_t[] circularGuard = []) { + if (circularGuard.canFind(cast(size_t) s)) + return; foreach (sym; s.opSlice()) { if (sym.name !is null && sym.name.length > 0 && sym.kind != CompletionKind.importSymbol @@ -831,7 +834,7 @@ void setCompletions(T)(ref AutocompleteResponse response, r.completions ~= sym.name.dup; } if (sym.kind == CompletionKind.importSymbol && !sym.skipOver && sym.type !is null) - addSymToResponse(sym.type, r, p); + addSymToResponse(sym.type, r, p, circularGuard ~ (cast(size_t) s)); } } diff --git a/tests/imports/circular/a.d b/tests/imports/circular/a.d new file mode 100644 index 0000000..734eacf --- /dev/null +++ b/tests/imports/circular/a.d @@ -0,0 +1,5 @@ +module circular.a; +public import circular.b; + +int alpha; + diff --git a/tests/imports/circular/b.d b/tests/imports/circular/b.d new file mode 100644 index 0000000..63df8ad --- /dev/null +++ b/tests/imports/circular/b.d @@ -0,0 +1,4 @@ +module circular.b; +public import circular.a; + +int bravo; diff --git a/tests/imports/circular/x.d b/tests/imports/circular/x.d new file mode 100644 index 0000000..211a0d7 --- /dev/null +++ b/tests/imports/circular/x.d @@ -0,0 +1,4 @@ +module circular.x; +public import circular.y; + +int x_ray; diff --git a/tests/imports/circular/y.d b/tests/imports/circular/y.d new file mode 100644 index 0000000..c026282 --- /dev/null +++ b/tests/imports/circular/y.d @@ -0,0 +1,4 @@ +module circular.y; +public import circular.z; + +int yankee; diff --git a/tests/imports/circular/z.d b/tests/imports/circular/z.d new file mode 100644 index 0000000..3fb03ea --- /dev/null +++ b/tests/imports/circular/z.d @@ -0,0 +1,4 @@ +module circular.z; +public import circular.x; + +int zulu; diff --git a/tests/tc018/expected1.txt b/tests/tc018/expected1.txt new file mode 100644 index 0000000..9c51bf6 --- /dev/null +++ b/tests/tc018/expected1.txt @@ -0,0 +1,3 @@ +identifiers +alpha v +bravo v diff --git a/tests/tc018/expected2.txt b/tests/tc018/expected2.txt new file mode 100644 index 0000000..78f26ff --- /dev/null +++ b/tests/tc018/expected2.txt @@ -0,0 +1,4 @@ +identifiers +x_ray v +yankee v +zulu v diff --git a/tests/tc018/file.d b/tests/tc018/file.d new file mode 100644 index 0000000..499a83b --- /dev/null +++ b/tests/tc018/file.d @@ -0,0 +1,12 @@ +import circular.a; +import circular.x; +unittest +{ + circular.a. +} + +unittest +{ + circular.x. +} + diff --git a/tests/tc018/run.sh b/tests/tc018/run.sh new file mode 100755 index 0000000..545cb43 --- /dev/null +++ b/tests/tc018/run.sh @@ -0,0 +1,8 @@ +set -e +set -u + +../../bin/dcd-client file.d -c61 > actual1.txt +diff actual1.txt expected1.txt + +../../bin/dcd-client file.d -c88 > actual2.txt +diff actual2.txt expected2.txt