Handle array and map slicing and indexing properly
This commit is contained in:
parent
cf65c47a85
commit
126e101e78
|
|
@ -223,7 +223,7 @@ public:
|
||||||
|| a.kind == CompletionKind.functionName
|
|| a.kind == CompletionKind.functionName
|
||||||
|| a.kind == CompletionKind.memberVariableName) && a.resolvedType is null)())
|
|| a.kind == CompletionKind.memberVariableName) && a.resolvedType is null)())
|
||||||
{
|
{
|
||||||
writeln("Resolving type of symbol ", s.name);
|
//writeln("Resolving type of symbol ", s.name);
|
||||||
Type type = s.type;
|
Type type = s.type;
|
||||||
if (type is null)
|
if (type is null)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,7 @@ class AutocompleteVisitor : ASTVisitor
|
||||||
{
|
{
|
||||||
foreach (parameter; dec.parameters.parameters)
|
foreach (parameter; dec.parameters.parameters)
|
||||||
{
|
{
|
||||||
writeln("Adding parameter ", parameter.name.value);
|
// writeln("Adding parameter ", parameter.name.value);
|
||||||
ACSymbol paramSymbol = new ACSymbol;
|
ACSymbol paramSymbol = new ACSymbol;
|
||||||
paramSymbol.name = parameter.name.value;
|
paramSymbol.name = parameter.name.value;
|
||||||
paramSymbol.type = parameter.type;
|
paramSymbol.type = parameter.type;
|
||||||
|
|
@ -114,7 +114,7 @@ class AutocompleteVisitor : ASTVisitor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
writeln("Parameter symbols added");
|
// writeln("Parameter symbols added");
|
||||||
if (dec.returnType !is null)
|
if (dec.returnType !is null)
|
||||||
{
|
{
|
||||||
symbol.calltip = format("%s %s%s", dec.returnType.toString(),
|
symbol.calltip = format("%s %s%s", dec.returnType.toString(),
|
||||||
|
|
@ -129,7 +129,7 @@ class AutocompleteVisitor : ASTVisitor
|
||||||
|
|
||||||
if (functionBody !is null)
|
if (functionBody !is null)
|
||||||
{
|
{
|
||||||
writeln("Processing function body");
|
// writeln("Processing function body");
|
||||||
auto s = scope_;
|
auto s = scope_;
|
||||||
scope_ = new Scope(functionBody.startLocation,
|
scope_ = new Scope(functionBody.startLocation,
|
||||||
functionBody.endLocation);
|
functionBody.endLocation);
|
||||||
|
|
|
||||||
|
|
@ -153,6 +153,7 @@ void setCompletions(T)(ref AutocompleteResponse response,
|
||||||
AutocompleteVisitor visitor, T tokens, size_t cursorPosition,
|
AutocompleteVisitor visitor, T tokens, size_t cursorPosition,
|
||||||
CompletionType completionType)
|
CompletionType completionType)
|
||||||
{
|
{
|
||||||
|
|
||||||
writeln("Getting completions for ", map!"a.value"(tokens));
|
writeln("Getting completions for ", map!"a.value"(tokens));
|
||||||
writeln("Resolving symbols for editor buffer");
|
writeln("Resolving symbols for editor buffer");
|
||||||
visitor.scope_.resolveSymbolTypes();
|
visitor.scope_.resolveSymbolTypes();
|
||||||
|
|
@ -176,6 +177,22 @@ void setCompletions(T)(ref AutocompleteResponse response,
|
||||||
{
|
{
|
||||||
TokenType open;
|
TokenType open;
|
||||||
TokenType close;
|
TokenType close;
|
||||||
|
|
||||||
|
void skip()
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
for (int depth = 1; depth > 0 && i < tokens.length; i++)
|
||||||
|
{
|
||||||
|
if (tokens[i].type == open)
|
||||||
|
depth++;
|
||||||
|
else if (tokens[i].type == close)
|
||||||
|
{
|
||||||
|
depth--;
|
||||||
|
if (depth == 0) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
with (TokenType) switch (tokens[i].type)
|
with (TokenType) switch (tokens[i].type)
|
||||||
{
|
{
|
||||||
case TokenType.int_:
|
case TokenType.int_:
|
||||||
|
|
@ -207,11 +224,11 @@ void setCompletions(T)(ref AutocompleteResponse response,
|
||||||
break loop;
|
break loop;
|
||||||
break;
|
break;
|
||||||
case identifier:
|
case identifier:
|
||||||
writeln("looking for ", tokens[i].value, " in ", symbol.name);
|
//writeln("looking for ", tokens[i].value, " in ", symbol.name);
|
||||||
symbol = symbol.getPartByName(tokens[i].value);
|
symbol = symbol.getPartByName(tokens[i].value);
|
||||||
if (symbol is null)
|
if (symbol is null)
|
||||||
{
|
{
|
||||||
writeln("Couldn't find it.");
|
//writeln("Couldn't find it.");
|
||||||
break loop;
|
break loop;
|
||||||
}
|
}
|
||||||
if (symbol.kind == CompletionKind.variableName
|
if (symbol.kind == CompletionKind.variableName
|
||||||
|
|
@ -220,40 +237,37 @@ void setCompletions(T)(ref AutocompleteResponse response,
|
||||||
&& (completionType == CompletionType.identifiers
|
&& (completionType == CompletionType.identifiers
|
||||||
|| i + 1 < tokens.length)))
|
|| i + 1 < tokens.length)))
|
||||||
{
|
{
|
||||||
|
|
||||||
symbol = symbol.resolvedType;
|
symbol = symbol.resolvedType;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case lParen:
|
case lParen:
|
||||||
open = TokenType.lParen;
|
open = TokenType.lParen;
|
||||||
close = TokenType.rParen;
|
close = TokenType.rParen;
|
||||||
goto skip;
|
skip();
|
||||||
|
break;
|
||||||
case lBracket:
|
case lBracket:
|
||||||
open = TokenType.lBracket;
|
open = TokenType.lBracket;
|
||||||
close = TokenType.rBracket;
|
close = TokenType.rBracket;
|
||||||
// TODO: handle slicing
|
|
||||||
// TODO: handle opIndex
|
// TODO: handle opIndex
|
||||||
// TODO: handle opSlice
|
// TODO: handle opSlice
|
||||||
if (symbol.qualifier == SymbolQualifier.array
|
if (symbol.qualifier == SymbolQualifier.array)
|
||||||
|| symbol.qualifier == SymbolQualifier.assocArray)
|
{
|
||||||
|
auto h = i;
|
||||||
|
skip();
|
||||||
|
Parser p;
|
||||||
|
p.setTokens(tokens[h .. i].array());
|
||||||
|
if (!p.isSliceExpression())
|
||||||
{
|
{
|
||||||
symbol = symbol.resolvedType;
|
symbol = symbol.resolvedType;
|
||||||
goto skip;
|
}
|
||||||
|
}
|
||||||
|
else if (symbol.qualifier == SymbolQualifier.assocArray)
|
||||||
|
{
|
||||||
|
symbol = symbol.resolvedType;
|
||||||
|
skip();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return;
|
return;
|
||||||
skip:
|
|
||||||
i++;
|
|
||||||
for (int depth = 1; depth > 0 && i < tokens.length; i++)
|
|
||||||
{
|
|
||||||
if (tokens[i].type == open)
|
|
||||||
depth++;
|
|
||||||
else if (tokens[i].type == close)
|
|
||||||
{
|
|
||||||
depth--;
|
|
||||||
if (depth == 0) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case dot:
|
case dot:
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue