Merge 1835fb9cfa
into e48216e4a8
This commit is contained in:
commit
38ee93ef72
|
@ -312,15 +312,21 @@ private HashSet!(DSymbol*) symbolsMadeHere;
|
|||
|
||||
private DSymbol* makeSymbol(string s, CompletionKind kind, DSymbol* type = null)
|
||||
{
|
||||
import dparse.lexer : tok;
|
||||
|
||||
auto sym = rba.make!DSymbol(istring(s), kind, type);
|
||||
sym.ownType = false;
|
||||
sym.protection = tok!"public";
|
||||
symbolsMadeHere.insert(sym);
|
||||
return sym;
|
||||
}
|
||||
private DSymbol* makeSymbol(istring s, CompletionKind kind, DSymbol* type = null)
|
||||
{
|
||||
import dparse.lexer : tok;
|
||||
|
||||
auto sym = rba.make!DSymbol(s, kind, type);
|
||||
sym.ownType = false;
|
||||
sym.protection = tok!"public";
|
||||
symbolsMadeHere.insert(sym);
|
||||
return sym;
|
||||
}
|
||||
|
|
|
@ -127,9 +127,8 @@ final class FirstPass : ASTVisitor
|
|||
{
|
||||
assert(dec);
|
||||
pushSymbol(dec.name.text, CompletionKind.functionName, symbolFile,
|
||||
dec.name.index, dec.returnType);
|
||||
dec.name.index, dec.returnType, protection.current);
|
||||
scope (exit) popSymbol();
|
||||
currentSymbol.acSymbol.protection = protection.current;
|
||||
currentSymbol.acSymbol.doc = makeDocumentation(dec.comment);
|
||||
currentSymbol.acSymbol.qualifier = SymbolQualifier.func;
|
||||
|
||||
|
@ -381,6 +380,7 @@ final class FirstPass : ASTVisitor
|
|||
auto objectImport = allocateSemanticSymbol(IMPORT_SYMBOL_NAME,
|
||||
CompletionKind.importSymbol, objectLocation);
|
||||
objectImport.acSymbol.skipOver = true;
|
||||
objectImport.acSymbol.protection = protection.currentForImport;
|
||||
currentSymbol.addChild(objectImport, true);
|
||||
currentScope.addSymbol(objectImport.acSymbol, false);
|
||||
}
|
||||
|
@ -447,6 +447,7 @@ final class FirstPass : ASTVisitor
|
|||
thisSymbol.symbolFile = symbolFile;
|
||||
thisSymbol.type = currentSymbol.acSymbol;
|
||||
thisSymbol.ownType = false;
|
||||
thisSymbol.protection = tok!"private";
|
||||
currentScope.addSymbol(thisSymbol, false);
|
||||
|
||||
foreach (dec; structBody.declarations)
|
||||
|
@ -478,6 +479,7 @@ final class FirstPass : ASTVisitor
|
|||
SemanticSymbol* importSymbol = allocateSemanticSymbol(IMPORT_SYMBOL_NAME,
|
||||
CompletionKind.importSymbol, modulePath);
|
||||
importSymbol.acSymbol.skipOver = protection.currentForImport != tok!"public";
|
||||
importSymbol.acSymbol.protection = protection.currentForImport;
|
||||
if (single.rename == tok!"")
|
||||
{
|
||||
size_t i = 0;
|
||||
|
@ -495,6 +497,8 @@ final class FirstPass : ASTVisitor
|
|||
if (s.length == 0)
|
||||
{
|
||||
currentImportSymbol = GCAllocator.instance.make!DSymbol(ip, kind);
|
||||
currentImportSymbol.protection = protection.currentForImport;
|
||||
currentImportSymbol.skipOver = protection.currentForImport != tok!"public";
|
||||
currentScope.addSymbol(currentImportSymbol, true);
|
||||
if (last)
|
||||
{
|
||||
|
@ -512,6 +516,8 @@ final class FirstPass : ASTVisitor
|
|||
if (s.length == 0)
|
||||
{
|
||||
auto sym = GCAllocator.instance.make!DSymbol(ip, kind);
|
||||
sym.protection = protection.currentForImport;
|
||||
sym.skipOver = protection.currentForImport != tok!"public";
|
||||
currentImportSymbol.addChild(sym, true);
|
||||
currentImportSymbol = sym;
|
||||
if (last)
|
||||
|
@ -534,6 +540,7 @@ final class FirstPass : ASTVisitor
|
|||
SemanticSymbol* renameSymbol = allocateSemanticSymbol(
|
||||
internString(single.rename.text), CompletionKind.aliasName,
|
||||
modulePath);
|
||||
renameSymbol.acSymbol.protection = protection.currentForImport;
|
||||
renameSymbol.acSymbol.skipOver = protection.currentForImport != tok!"public";
|
||||
renameSymbol.acSymbol.type = importSymbol.acSymbol;
|
||||
renameSymbol.acSymbol.ownType = true;
|
||||
|
@ -551,7 +558,7 @@ final class FirstPass : ASTVisitor
|
|||
istring modulePath = cache.resolveImportLocation(chain);
|
||||
if (modulePath is null)
|
||||
{
|
||||
warning("Could not resolve location of module '", chain, "'");
|
||||
warning("Could not resolve location of module '", chain.data, "'");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -579,6 +586,7 @@ final class FirstPass : ASTVisitor
|
|||
importSymbol.acSymbol.qualifier = SymbolQualifier.selectiveImport;
|
||||
importSymbol.typeLookups.insert(lookup);
|
||||
importSymbol.acSymbol.skipOver = protection.currentForImport != tok!"public";
|
||||
importSymbol.acSymbol.protection = protection.currentForImport;
|
||||
currentSymbol.addChild(importSymbol, true);
|
||||
currentScope.addSymbol(importSymbol.acSymbol, false);
|
||||
}
|
||||
|
@ -838,10 +846,11 @@ private:
|
|||
}
|
||||
|
||||
void pushSymbol(string name, CompletionKind kind, istring symbolFile,
|
||||
size_t location = 0, const Type type = null)
|
||||
size_t location = 0, const Type type = null,
|
||||
const IdType protection = tok!"public")
|
||||
{
|
||||
SemanticSymbol* symbol = allocateSemanticSymbol(name, kind, symbolFile,
|
||||
location);
|
||||
location, protection);
|
||||
if (type !is null)
|
||||
addTypeToLookups(symbol.typeLookups, type);
|
||||
symbol.parent = currentSymbol;
|
||||
|
@ -874,14 +883,13 @@ private:
|
|||
dec.accept(this);
|
||||
return;
|
||||
}
|
||||
pushSymbol(dec.name.text, kind, symbolFile, dec.name.index);
|
||||
pushSymbol(dec.name.text, kind, symbolFile, dec.name.index, null, protection.current);
|
||||
scope(exit) popSymbol();
|
||||
|
||||
if (kind == CompletionKind.className)
|
||||
currentSymbol.acSymbol.addChildren(classSymbols[], false);
|
||||
else
|
||||
currentSymbol.acSymbol.addChildren(aggregateSymbols[], false);
|
||||
currentSymbol.acSymbol.protection = protection.current;
|
||||
currentSymbol.acSymbol.doc = makeDocumentation(dec.comment);
|
||||
|
||||
istring lastComment = this.lastComment;
|
||||
|
@ -1148,11 +1156,12 @@ private:
|
|||
}
|
||||
|
||||
SemanticSymbol* allocateSemanticSymbol(string name, CompletionKind kind,
|
||||
istring symbolFile, size_t location = 0)
|
||||
istring symbolFile, size_t location = 0, IdType protection = tok!"public")
|
||||
{
|
||||
DSymbol* acSymbol = GCAllocator.instance.make!DSymbol(istring(name), kind);
|
||||
acSymbol.location = location;
|
||||
acSymbol.symbolFile = symbolFile;
|
||||
acSymbol.protection = protection;
|
||||
symbolsAllocated++;
|
||||
return GCAllocator.instance.make!SemanticSymbol(acSymbol);
|
||||
}
|
||||
|
@ -1264,17 +1273,19 @@ struct ProtectionStack
|
|||
|
||||
IdType currentForImport() const
|
||||
{
|
||||
return stack.empty ? tok!"default" : current();
|
||||
// Imports are private unless specified otherwise.
|
||||
return stack.empty ? tok!"private" : current();
|
||||
}
|
||||
|
||||
IdType current() const
|
||||
out(t; isProtection(t), str(t))
|
||||
do
|
||||
{
|
||||
import std.algorithm.iteration : filter;
|
||||
import std.range : choose, only;
|
||||
|
||||
IdType retVal;
|
||||
foreach (t; choose(stack.empty, only(tok!"public"), stack[]).filter!(
|
||||
a => a != tok!"{" && a != tok!":"))
|
||||
IdType retVal = tok!"public";
|
||||
foreach (t; stack[].filter!(a => a != tok!"{" && a != tok!":"))
|
||||
retVal = cast(IdType) t;
|
||||
return retVal;
|
||||
}
|
||||
|
@ -1303,7 +1314,7 @@ struct ProtectionStack
|
|||
|
||||
void beginLocal(const IdType t)
|
||||
{
|
||||
assert (t != tok!"", "DERP!");
|
||||
assert(isProtection(t), str(t));
|
||||
stack.insertBack(t);
|
||||
}
|
||||
|
||||
|
|
|
@ -470,6 +470,7 @@ void resolveInheritance(DSymbol* symbol, ref TypeLookups typeLookups,
|
|||
|
||||
DSymbol* imp = GCAllocator.instance.make!DSymbol(IMPORT_SYMBOL_NAME,
|
||||
CompletionKind.importSymbol, baseClass);
|
||||
imp.protection = tok!"public";
|
||||
symbol.addChild(imp, true);
|
||||
symbolScope.addSymbol(imp, false);
|
||||
if (baseClass.kind == CompletionKind.className)
|
||||
|
@ -495,6 +496,7 @@ void resolveAliasThis(DSymbol* symbol,
|
|||
|
||||
DSymbol* s = GCAllocator.instance.make!DSymbol(IMPORT_SYMBOL_NAME,
|
||||
CompletionKind.importSymbol, parts[0].type);
|
||||
s.protection = tok!"public";
|
||||
symbol.addChild(s, true);
|
||||
auto symbolScope = moduleScope.getScopeByCursor(s.location);
|
||||
if (symbolScope !is null)
|
||||
|
@ -530,6 +532,7 @@ void resolveMixinTemplates(DSymbol* symbol,
|
|||
auto i = GCAllocator.instance.make!DSymbol(IMPORT_SYMBOL_NAME,
|
||||
CompletionKind.importSymbol, currentSymbol);
|
||||
i.ownType = false;
|
||||
i.protection = tok!"public";
|
||||
symbol.addChild(i, true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -311,6 +311,7 @@ struct DSymbol
|
|||
void addChild(DSymbol* symbol, bool owns)
|
||||
{
|
||||
assert(symbol !is null);
|
||||
assert(isProtection(symbol.protection));
|
||||
parts.insert(SymbolOwnership(symbol, owns));
|
||||
}
|
||||
|
||||
|
@ -319,6 +320,7 @@ struct DSymbol
|
|||
foreach (symbol; symbols)
|
||||
{
|
||||
assert(symbol !is null);
|
||||
assert(isProtection(symbol.protection));
|
||||
parts.insert(SymbolOwnership(symbol, owns));
|
||||
}
|
||||
}
|
||||
|
@ -328,6 +330,7 @@ struct DSymbol
|
|||
foreach (symbol; symbols)
|
||||
{
|
||||
assert(symbol !is null);
|
||||
assert(isProtection(symbol.protection));
|
||||
parts.insert(SymbolOwnership(symbol, owns));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue