make private symbols not show up in auto complete
This commit is contained in:
parent
82432e1c06
commit
6a195ea86a
2
dsymbol
2
dsymbol
|
@ -1 +1 @@
|
||||||
Subproject commit 5b7f06ff005c63a2bf22db0736097ef35b9d36e7
|
Subproject commit 5825b717be321f8e69058848322752f5b9d8e698
|
2
dub.json
2
dub.json
|
@ -7,7 +7,7 @@
|
||||||
],
|
],
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dsymbol": "~>0.6.4",
|
"dsymbol": "~>0.7.0",
|
||||||
"libdparse": "~>0.11.4",
|
"libdparse": "~>0.11.4",
|
||||||
"msgpack-d": "~>1.0.0-beta.7",
|
"msgpack-d": "~>1.0.0-beta.7",
|
||||||
"stdx-allocator": "~>2.77.5",
|
"stdx-allocator": "~>2.77.5",
|
||||||
|
|
|
@ -503,7 +503,7 @@ void setCompletions(T)(ref AutocompleteResponse response,
|
||||||
CompletionType completionType, bool isBracket = false, string partial = null)
|
CompletionType completionType, bool isBracket = false, string partial = null)
|
||||||
{
|
{
|
||||||
static void addSymToResponse(const(DSymbol)* s, ref AutocompleteResponse r, string p,
|
static void addSymToResponse(const(DSymbol)* s, ref AutocompleteResponse r, string p,
|
||||||
size_t[] circularGuard = [])
|
Scope* completionScope, size_t[] circularGuard = [])
|
||||||
{
|
{
|
||||||
if (circularGuard.canFind(cast(size_t) s))
|
if (circularGuard.canFind(cast(size_t) s))
|
||||||
return;
|
return;
|
||||||
|
@ -512,12 +512,13 @@ void setCompletions(T)(ref AutocompleteResponse response,
|
||||||
if (sym.name !is null && sym.name.length > 0 && isPublicCompletionKind(sym.kind)
|
if (sym.name !is null && sym.name.length > 0 && isPublicCompletionKind(sym.kind)
|
||||||
&& (p is null ? true : toUpper(sym.name.data).startsWith(toUpper(p)))
|
&& (p is null ? true : toUpper(sym.name.data).startsWith(toUpper(p)))
|
||||||
&& !r.completions.canFind!(a => a.identifier == sym.name)
|
&& !r.completions.canFind!(a => a.identifier == sym.name)
|
||||||
&& sym.name[0] != '*')
|
&& sym.name[0] != '*'
|
||||||
|
&& mightBeRelevantInCompletionScope(sym, completionScope))
|
||||||
{
|
{
|
||||||
r.completions ~= makeSymbolCompletionInfo(sym, sym.kind);
|
r.completions ~= makeSymbolCompletionInfo(sym, sym.kind);
|
||||||
}
|
}
|
||||||
if (sym.kind == CompletionKind.importSymbol && !sym.skipOver && sym.type !is null)
|
if (sym.kind == CompletionKind.importSymbol && !sym.skipOver && sym.type !is null)
|
||||||
addSymToResponse(sym.type, r, p, circularGuard ~ (cast(size_t) s));
|
addSymToResponse(sym.type, r, p, completionScope, circularGuard ~ (cast(size_t) s));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -527,7 +528,8 @@ void setCompletions(T)(ref AutocompleteResponse response,
|
||||||
{
|
{
|
||||||
auto currentSymbols = completionScope.getSymbolsInCursorScope(cursorPosition);
|
auto currentSymbols = completionScope.getSymbolsInCursorScope(cursorPosition);
|
||||||
foreach (s; currentSymbols.filter!(a => isPublicCompletionKind(a.kind)
|
foreach (s; currentSymbols.filter!(a => isPublicCompletionKind(a.kind)
|
||||||
&& toUpper(a.name.data).startsWith(toUpper(partial))))
|
&& toUpper(a.name.data).startsWith(toUpper(partial))
|
||||||
|
&& mightBeRelevantInCompletionScope(a, completionScope)))
|
||||||
{
|
{
|
||||||
response.completions ~= makeSymbolCompletionInfo(s, s.kind);
|
response.completions ~= makeSymbolCompletionInfo(s, s.kind);
|
||||||
}
|
}
|
||||||
|
@ -545,7 +547,8 @@ void setCompletions(T)(ref AutocompleteResponse response,
|
||||||
&& a.kind != CompletionKind.dummy
|
&& a.kind != CompletionKind.dummy
|
||||||
&& a.symbolFile == "stdin"
|
&& a.symbolFile == "stdin"
|
||||||
&& (partial !is null && toUpper(a.name.data).startsWith(toUpper(partial))
|
&& (partial !is null && toUpper(a.name.data).startsWith(toUpper(partial))
|
||||||
|| partial is null)))
|
|| partial is null)
|
||||||
|
&& mightBeRelevantInCompletionScope(a, completionScope)))
|
||||||
{
|
{
|
||||||
response.completions ~= makeSymbolCompletionInfo(s, s.kind);
|
response.completions ~= makeSymbolCompletionInfo(s, s.kind);
|
||||||
}
|
}
|
||||||
|
@ -574,7 +577,7 @@ void setCompletions(T)(ref AutocompleteResponse response,
|
||||||
if (symbols.length == 0)
|
if (symbols.length == 0)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
addSymToResponse(symbols[0], response, partial);
|
addSymToResponse(symbols[0], response, partial, completionScope);
|
||||||
response.completionType = CompletionType.identifiers;
|
response.completionType = CompletionType.identifiers;
|
||||||
}
|
}
|
||||||
else if (completionType == CompletionType.calltips)
|
else if (completionType == CompletionType.calltips)
|
||||||
|
@ -651,6 +654,21 @@ void setCompletions(T)(ref AutocompleteResponse response,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool mightBeRelevantInCompletionScope(const DSymbol* symbol, Scope* scope_)
|
||||||
|
{
|
||||||
|
import dparse.lexer : tok;
|
||||||
|
|
||||||
|
if (symbol.protection == tok!"private" &&
|
||||||
|
!scope_.hasSymbolRecursive(symbol))
|
||||||
|
{
|
||||||
|
// scope is the scope of the current file so if the symbol is not in there, it's not accessible
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
AutocompleteResponse.Completion generateStructConstructorCalltip(const DSymbol* symbol)
|
AutocompleteResponse.Completion generateStructConstructorCalltip(const DSymbol* symbol)
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
module tc_access_modifiers.bar;
|
||||||
|
|
||||||
|
class Helper
|
||||||
|
{
|
||||||
|
private int mfieldPrivate;
|
||||||
|
protected int mfieldProtected;
|
||||||
|
package int mfieldPackage;
|
||||||
|
int mfieldPublic;
|
||||||
|
|
||||||
|
private void mfuncPrivate() {}
|
||||||
|
public void mfuncPublic() {}
|
||||||
|
private static void mfuncPrivateStatic() {}
|
||||||
|
public static void mfuncPublicStatic() {}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
identifiers
|
||||||
|
mfieldPackage v
|
||||||
|
mfieldProtected v
|
||||||
|
mfieldPublic v
|
|
@ -0,0 +1,3 @@
|
||||||
|
identifiers
|
||||||
|
mfuncPublic f
|
||||||
|
mfuncPublicStatic f
|
|
@ -0,0 +1,3 @@
|
||||||
|
identifiers
|
||||||
|
myprivate v
|
||||||
|
mypublic v
|
|
@ -0,0 +1,4 @@
|
||||||
|
identifiers
|
||||||
|
mfieldPackage v
|
||||||
|
mfieldProtected v
|
||||||
|
mfieldPublic v
|
|
@ -0,0 +1,16 @@
|
||||||
|
import tc_access_modifiers.bar;
|
||||||
|
|
||||||
|
struct X
|
||||||
|
{
|
||||||
|
public int mypublic;
|
||||||
|
private int myprivate;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
Helper helper;
|
||||||
|
helper.mfield;
|
||||||
|
helper.mfunc;
|
||||||
|
X foo;
|
||||||
|
foo.myp;
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
import tc_access_modifiers.bar;
|
||||||
|
|
||||||
|
class Subclass : Helper
|
||||||
|
{
|
||||||
|
this()
|
||||||
|
{
|
||||||
|
this.mfield
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
set -e
|
||||||
|
set -u
|
||||||
|
|
||||||
|
rm -f actual1.txt actual2.txt actual3.txt actual0.txt
|
||||||
|
|
||||||
|
../../bin/dcd-client $1 file1.d -c 137 | sed s\""$(dirname "$(pwd)")"\"\" > actual0.txt
|
||||||
|
diff actual0.txt expected0.txt
|
||||||
|
|
||||||
|
../../bin/dcd-client $1 -I bar.d
|
||||||
|
|
||||||
|
../../bin/dcd-client $1 file1.d -c 137 | sed s\""$(dirname "$(pwd)")"\"\" > actual1.txt
|
||||||
|
diff actual1.txt expected1.txt
|
||||||
|
|
||||||
|
../../bin/dcd-client $1 file1.d -c 152 | sed s\""$(dirname "$(pwd)")"\"\" > actual1_1.txt
|
||||||
|
diff actual1_1.txt expected1_1.txt
|
||||||
|
|
||||||
|
../../bin/dcd-client $1 file1.d -c 170 | sed s\""$(dirname "$(pwd)")"\"\" > actual2.txt
|
||||||
|
diff actual2.txt expected2.txt
|
||||||
|
|
||||||
|
../../bin/dcd-client $1 file2.d -c 83 | sed s\""$(dirname "$(pwd)")"\"\" > actual3.txt
|
||||||
|
diff actual3.txt expected3.txt
|
||||||
|
|
||||||
|
../../bin/dcd-client $1 -R bar.d
|
||||||
|
|
||||||
|
../../bin/dcd-client $1 file1.d -c 137 | sed s\""$(dirname "$(pwd)")"\"\" > actual0.txt
|
||||||
|
diff actual0.txt expected0.txt
|
Loading…
Reference in New Issue