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.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;

View File

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

View File

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