This commit is contained in:
Jan Jurzitza 2025-03-01 02:12:59 +01:00 committed by GitHub
commit 38ee93ef72
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 36 additions and 13 deletions

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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));
}
}