save progress
This commit is contained in:
parent
eac9c54ddb
commit
516dff5f36
|
|
@ -353,13 +353,13 @@ final class FirstPass : ASTVisitor
|
||||||
if (IdentifierOrTemplateInstance iot = ue.identifierOrTemplateInstance)
|
if (IdentifierOrTemplateInstance iot = ue.identifierOrTemplateInstance)
|
||||||
{
|
{
|
||||||
warning("has iot");
|
warning("has iot");
|
||||||
|
buildChainTemplateOrIdentifier(symbol, lookup, ctx, iot);
|
||||||
auto crumb = iot.identifier;
|
//auto crumb = iot.identifier;
|
||||||
if (crumb != tok!"")
|
//if (crumb != tok!"")
|
||||||
{
|
//{
|
||||||
warning(": ", crumb.text);
|
// warning(": ", crumb.text);
|
||||||
lookup.breadcrumbs.insert(istring(crumb.text));
|
// lookup.breadcrumbs.insert(istring(crumb.text));
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ue.unaryExpression) traverseUnaryExpression(symbol, lookup, ctx, ue.unaryExpression);
|
if(ue.unaryExpression) traverseUnaryExpression(symbol, lookup, ctx, ue.unaryExpression);
|
||||||
|
|
@ -420,12 +420,26 @@ final class FirstPass : ASTVisitor
|
||||||
currentScope.addSymbol(symbol.acSymbol, false);
|
currentScope.addSymbol(symbol.acSymbol, false);
|
||||||
|
|
||||||
warning(" part: ", symbol.acSymbol.name);
|
warning(" part: ", symbol.acSymbol.name);
|
||||||
|
|
||||||
scope(exit) warning("crumbs: ", symbol.typeLookups.front.breadcrumbs[]);
|
scope(exit) warning("crumbs: ", symbol.typeLookups.front.breadcrumbs[]);
|
||||||
|
|
||||||
|
|
||||||
|
if (currentSymbol.acSymbol.kind == CompletionKind.structName
|
||||||
|
|| currentSymbol.acSymbol.kind == CompletionKind.unionName)
|
||||||
|
{
|
||||||
|
structFieldNames.insert(symbol.acSymbol.name);
|
||||||
|
// TODO: remove this cast. See the note on structFieldTypes
|
||||||
|
structFieldTypes.insert(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// for auto declaration, we'll properly traverse the initializer
|
// for auto declaration, we'll properly traverse the initializer
|
||||||
// and set the proper crumbs instead of using just the first one
|
// and set the proper crumbs instead of using just the first one
|
||||||
// so we can handle things like cast/templates
|
// so we can handle things like cast/templates
|
||||||
auto lookup = symbol.typeLookups.front;
|
auto lookup = symbol.typeLookups.front;
|
||||||
|
istring[] copy;
|
||||||
|
foreach(crumb; lookup.breadcrumbs[])
|
||||||
|
copy ~= crumb;
|
||||||
lookup.breadcrumbs.clear();
|
lookup.breadcrumbs.clear();
|
||||||
|
|
||||||
auto initializer = part.initializer.nonVoidInitializer;
|
auto initializer = part.initializer.nonVoidInitializer;
|
||||||
|
|
@ -479,13 +493,14 @@ final class FirstPass : ASTVisitor
|
||||||
auto crumb = iot.identifier;
|
auto crumb = iot.identifier;
|
||||||
if (crumb != tok!"")
|
if (crumb != tok!"")
|
||||||
{
|
{
|
||||||
lookup.breadcrumbs.insert(istring(crumb.text));
|
//lookup.breadcrumbs.insert(istring(crumb.text));
|
||||||
}
|
}
|
||||||
else if (iot.templateInstance)
|
else if (iot.templateInstance)
|
||||||
{
|
{
|
||||||
auto tic = iot.templateInstance.identifier;
|
//auto tic = iot.templateInstance.identifier;
|
||||||
warning("template! ", tic.text);
|
//warning("template! ", tic.text);
|
||||||
lookup.breadcrumbs.insert(istring(tic.text));
|
//if (tic != tok!"")
|
||||||
|
// lookup.breadcrumbs.insert(istring(tic.text));
|
||||||
|
|
||||||
lookup.ctx.root = GCAllocator.instance.make!(VariableContext.TypeInstance)();
|
lookup.ctx.root = GCAllocator.instance.make!(VariableContext.TypeInstance)();
|
||||||
processTemplateInstance(symbol, lookup, &lookup.ctx, lookup.ctx.root, iot.templateInstance);
|
processTemplateInstance(symbol, lookup, &lookup.ctx, lookup.ctx.root, iot.templateInstance);
|
||||||
|
|
@ -494,12 +509,15 @@ final class FirstPass : ASTVisitor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentSymbol.acSymbol.kind == CompletionKind.structName
|
if (symbol.acSymbol.name == "it")
|
||||||
|| currentSymbol.acSymbol.kind == CompletionKind.unionName)
|
|
||||||
{
|
{
|
||||||
structFieldNames.insert(symbol.acSymbol.name);
|
import core.stdc.stdlib: exit;
|
||||||
// TODO: remove this cast. See the note on structFieldTypes
|
warning("crumb: ", lookup.breadcrumbs[]);
|
||||||
structFieldTypes.insert(null);
|
|
||||||
|
warning("root: ", lookup.ctx.root.chain);
|
||||||
|
foreach(arg; lookup.ctx.root.args)
|
||||||
|
warning(" arg: ", arg.chain);
|
||||||
|
//exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,8 @@ import std.experimental.logger;
|
||||||
import dparse.ast;
|
import dparse.ast;
|
||||||
import dparse.lexer;
|
import dparse.lexer;
|
||||||
|
|
||||||
|
//package void warning(A...)(A args){}
|
||||||
|
|
||||||
void secondPass(SemanticSymbol* currentSymbol, Scope* moduleScope, ref ModuleCache cache)
|
void secondPass(SemanticSymbol* currentSymbol, Scope* moduleScope, ref ModuleCache cache)
|
||||||
{
|
{
|
||||||
with (CompletionKind) final switch (currentSymbol.acSymbol.kind)
|
with (CompletionKind) final switch (currentSymbol.acSymbol.kind)
|
||||||
|
|
@ -63,7 +65,7 @@ void secondPass(SemanticSymbol* currentSymbol, Scope* moduleScope, ref ModuleCac
|
||||||
if (lookup.ctx.root)
|
if (lookup.ctx.root)
|
||||||
{
|
{
|
||||||
auto type = currentSymbol.acSymbol.type;
|
auto type = currentSymbol.acSymbol.type;
|
||||||
if (type.kind == structName || type.kind == className)
|
if (type.kind == structName || type.kind == className || (type.kind == functionName))
|
||||||
if (lookup.ctx.root.args.length > 0)
|
if (lookup.ctx.root.args.length > 0)
|
||||||
{
|
{
|
||||||
DSymbol*[string] mapping;
|
DSymbol*[string] mapping;
|
||||||
|
|
@ -120,6 +122,31 @@ void secondPass(SemanticSymbol* currentSymbol, Scope* moduleScope, ref ModuleCac
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string extractReturnType(string callTip)
|
||||||
|
{
|
||||||
|
import std.string: indexOf;
|
||||||
|
|
||||||
|
auto spaceIndex = callTip.indexOf(" ");
|
||||||
|
if (spaceIndex <= 0) return "";
|
||||||
|
|
||||||
|
auto retPart = callTip[0 .. spaceIndex];
|
||||||
|
auto returnTypeConst = retPart.length > 6 ? retPart[0 .. 6] == "const(" : false;
|
||||||
|
auto returnTypeInout = retPart.length > 6 ? retPart[0 .. 6] == "inout(" : false;
|
||||||
|
if (returnTypeConst || returnTypeInout)
|
||||||
|
{
|
||||||
|
retPart = retPart[retPart.indexOf("(") + 1 .. $];
|
||||||
|
retPart = retPart[0 .. retPart.indexOf(")")];
|
||||||
|
}
|
||||||
|
auto returnTypePtr = retPart[$-1] == '*';
|
||||||
|
auto returnTypeArr = retPart[$-1] == ']';
|
||||||
|
if (returnTypePtr)
|
||||||
|
{
|
||||||
|
retPart = retPart[0 .. $-1];
|
||||||
|
}
|
||||||
|
return retPart;
|
||||||
|
}
|
||||||
|
|
||||||
DSymbol* createTypeWithTemplateArgs(DSymbol* type, TypeLookup* lookup, VariableContext.TypeInstance* ti, ref ModuleCache cache, Scope* moduleScope, ref int depth, DSymbol*[string] m)
|
DSymbol* createTypeWithTemplateArgs(DSymbol* type, TypeLookup* lookup, VariableContext.TypeInstance* ti, ref ModuleCache cache, Scope* moduleScope, ref int depth, DSymbol*[string] m)
|
||||||
{
|
{
|
||||||
assert(type);
|
assert(type);
|
||||||
|
|
@ -209,11 +236,31 @@ DSymbol* createTypeWithTemplateArgs(DSymbol* type, TypeLookup* lookup, VariableC
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// HACK: to support functions with template arguments that return a generic type
|
||||||
|
// first.d in processParameters only store the function's return type in the callTip
|
||||||
|
// maybe it's time to properly handle it by creating a proper symbol, so we can have
|
||||||
|
// proper support for functions that return complex types such as templates
|
||||||
|
if (type.kind == CompletionKind.functionName)
|
||||||
|
{
|
||||||
|
auto callTip = type.callTip;
|
||||||
|
if (callTip.length > 1)
|
||||||
|
{
|
||||||
|
auto retType = extractReturnType(callTip);
|
||||||
|
if (retType in mapping)
|
||||||
|
{
|
||||||
|
newType.type = mapping[retType];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
assert(newType);
|
assert(newType);
|
||||||
warning("process parts..");
|
warning("process parts.. for type: ", type.name, ":", type.kind);
|
||||||
|
if (type.type)
|
||||||
|
warning (" >>>>>>".red, type.type.name);
|
||||||
string[] T_names;
|
string[] T_names;
|
||||||
foreach(part; type.opSlice())
|
foreach(part; type.opSlice())
|
||||||
{
|
{
|
||||||
|
warning("part: ", part.name, ":",part.kind, " t: ", part.type?part.type.name:"");
|
||||||
if (part.kind == CompletionKind.typeTmpParam)
|
if (part.kind == CompletionKind.typeTmpParam)
|
||||||
{
|
{
|
||||||
warning(" #", count, " ", part.name);
|
warning(" #", count, " ", part.name);
|
||||||
|
|
@ -244,6 +291,7 @@ DSymbol* createTypeWithTemplateArgs(DSymbol* type, TypeLookup* lookup, VariableC
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
error(" mapping not found: ".red, part.type.name," type: ", type.name, " cur: ", ti.chain, "args: ", ti.args);
|
error(" mapping not found: ".red, part.type.name," type: ", type.name, " cur: ", ti.chain, "args: ", ti.args);
|
||||||
|
|
||||||
newType.addChild(newPart, true);
|
newType.addChild(newPart, true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue