Handle array and map slicing and indexing properly

This commit is contained in:
Hackerpilot 2013-08-11 13:08:56 +00:00
parent cf65c47a85
commit 126e101e78
3 changed files with 213 additions and 199 deletions

View File

@ -223,7 +223,7 @@ public:
|| a.kind == CompletionKind.functionName
|| 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;
if (type is null)
continue;

View File

@ -104,7 +104,7 @@ class AutocompleteVisitor : ASTVisitor
{
foreach (parameter; dec.parameters.parameters)
{
writeln("Adding parameter ", parameter.name.value);
// writeln("Adding parameter ", parameter.name.value);
ACSymbol paramSymbol = new ACSymbol;
paramSymbol.name = parameter.name.value;
paramSymbol.type = parameter.type;
@ -114,7 +114,7 @@ class AutocompleteVisitor : ASTVisitor
}
}
writeln("Parameter symbols added");
// writeln("Parameter symbols added");
if (dec.returnType !is null)
{
symbol.calltip = format("%s %s%s", dec.returnType.toString(),
@ -129,7 +129,7 @@ class AutocompleteVisitor : ASTVisitor
if (functionBody !is null)
{
writeln("Processing function body");
// writeln("Processing function body");
auto s = scope_;
scope_ = new Scope(functionBody.startLocation,
functionBody.endLocation);

View File

@ -153,6 +153,7 @@ void setCompletions(T)(ref AutocompleteResponse response,
AutocompleteVisitor visitor, T tokens, size_t cursorPosition,
CompletionType completionType)
{
writeln("Getting completions for ", map!"a.value"(tokens));
writeln("Resolving symbols for editor buffer");
visitor.scope_.resolveSymbolTypes();
@ -176,6 +177,22 @@ void setCompletions(T)(ref AutocompleteResponse response,
{
TokenType open;
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)
{
case TokenType.int_:
@ -207,11 +224,11 @@ void setCompletions(T)(ref AutocompleteResponse response,
break loop;
break;
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);
if (symbol is null)
{
writeln("Couldn't find it.");
//writeln("Couldn't find it.");
break loop;
}
if (symbol.kind == CompletionKind.variableName
@ -220,40 +237,37 @@ void setCompletions(T)(ref AutocompleteResponse response,
&& (completionType == CompletionType.identifiers
|| i + 1 < tokens.length)))
{
symbol = symbol.resolvedType;
}
break;
case lParen:
open = TokenType.lParen;
close = TokenType.rParen;
goto skip;
skip();
break;
case lBracket:
open = TokenType.lBracket;
close = TokenType.rBracket;
// TODO: handle slicing
// TODO: handle opIndex
// TODO: handle opSlice
if (symbol.qualifier == SymbolQualifier.array
|| symbol.qualifier == SymbolQualifier.assocArray)
if (symbol.qualifier == SymbolQualifier.array)
{
auto h = i;
skip();
Parser p;
p.setTokens(tokens[h .. i].array());
if (!p.isSliceExpression())
{
symbol = symbol.resolvedType;
goto skip;
}
}
else if (symbol.qualifier == SymbolQualifier.assocArray)
{
symbol = symbol.resolvedType;
skip();
}
else
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;
case dot:
break;