Fixed a segfault

This commit is contained in:
Hackerpilot 2013-08-11 22:28:12 +00:00
parent 20e575bdc2
commit 8594302b48
1 changed files with 10 additions and 13 deletions

View File

@ -151,7 +151,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)
{ {
assert (visitor.scope_);
visitor.scope_.resolveSymbolTypes(); visitor.scope_.resolveSymbolTypes();
ACSymbol[] symbols = visitor.scope_.findSymbolsInCurrentScope(cursorPosition, tokens[0].value); ACSymbol[] symbols = visitor.scope_.findSymbolsInCurrentScope(cursorPosition, tokens[0].value);
if (symbols.length == 0) if (symbols.length == 0)
@ -165,7 +165,7 @@ void setCompletions(T)(ref AutocompleteResponse response,
|| symbols[0].kind == CompletionKind.variableName || symbols[0].kind == CompletionKind.variableName
|| symbols[0].kind == CompletionKind.enumMember) || symbols[0].kind == CompletionKind.enumMember)
{ {
symbols = [symbols[0].resolvedType]; symbols = symbols[0].resolvedType is null ? [] : [symbols[0].resolvedType];
if (symbols.length == 0) if (symbols.length == 0)
return; return;
} }
@ -174,7 +174,6 @@ void setCompletions(T)(ref AutocompleteResponse response,
{ {
TokenType open; TokenType open;
TokenType close; TokenType close;
void skip() void skip()
{ {
i++; i++;
@ -189,7 +188,6 @@ void setCompletions(T)(ref AutocompleteResponse response,
} }
} }
} }
with (TokenType) switch (tokens[i].type) with (TokenType) switch (tokens[i].type)
{ {
case TokenType.int_: case TokenType.int_:
@ -221,7 +219,7 @@ 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); // stderr.writeln("looking for ", tokens[i].value, " in ", symbols[0].name);
symbols = symbols[0].getPartsByName(tokens[i].value); symbols = symbols[0].getPartsByName(tokens[i].value);
if (symbols.length == 0) if (symbols.length == 0)
{ {
@ -235,7 +233,7 @@ void setCompletions(T)(ref AutocompleteResponse response,
&& (completionType == CompletionType.identifiers && (completionType == CompletionType.identifiers
|| i + 1 < tokens.length))) || i + 1 < tokens.length)))
{ {
symbols = [symbols[0].resolvedType]; symbols = symbols[0].resolvedType is null ? [] :[symbols[0].resolvedType];
} }
break; break;
case lParen: case lParen:
@ -254,12 +252,12 @@ void setCompletions(T)(ref AutocompleteResponse response,
p.setTokens(tokens[h .. i].array()); p.setTokens(tokens[h .. i].array());
if (!p.isSliceExpression()) if (!p.isSliceExpression())
{ {
symbols = [symbols[0].resolvedType]; symbols = symbols[0].resolvedType is null ? [] :[symbols[0].resolvedType];
} }
} }
else if (symbols[0].qualifier == SymbolQualifier.assocArray) else if (symbols[0].qualifier == SymbolQualifier.assocArray)
{ {
symbols = [symbols[0].resolvedType]; symbols = symbols[0].resolvedType is null ? [] :[symbols[0].resolvedType];
skip(); skip();
} }
else else
@ -275,8 +273,7 @@ void setCompletions(T)(ref AutocompleteResponse response,
overloads = symbols[0].getPartsByName("opIndex"); overloads = symbols[0].getPartsByName("opIndex");
if (overloads.length > 0) if (overloads.length > 0)
{ {
writeln("opIndex or opSlice used, ", overloads[0].name); symbols = overloads[0].resolvedType is null ? [] : [overloads[0].resolvedType];
symbols = [overloads[0].resolvedType];
} }
else else
return; return;
@ -288,6 +285,7 @@ void setCompletions(T)(ref AutocompleteResponse response,
break loop; break loop;
} }
} }
if (symbols.length == 0) if (symbols.length == 0)
{ {
writeln("Could not get completions"); writeln("Could not get completions");
@ -295,8 +293,7 @@ void setCompletions(T)(ref AutocompleteResponse response,
} }
if (completionType == CompletionType.identifiers) if (completionType == CompletionType.identifiers)
{ {
// writeln("Writing completions for ", symbol.name); foreach (s; symbols[0].parts.filter!(a => a.name !is null && a.name[0] != '*'))
foreach (s; symbols[0].parts.filter!(a => a.name[0] != '*'))
{ {
// writeln("Adding ", s.name, " to the completion list"); // writeln("Adding ", s.name, " to the completion list");
response.completionKinds ~= s.kind; response.completionKinds ~= s.kind;
@ -327,7 +324,7 @@ void setCompletions(T)(ref AutocompleteResponse response,
response.completionType = CompletionType.calltips; response.completionType = CompletionType.calltips;
foreach (symbol; symbols) foreach (symbol; symbols)
{ {
writeln("Adding calltip ", symbol.calltip); // writeln("Adding calltip ", symbol.calltip);
response.completions ~= symbol.calltip; response.completions ~= symbol.calltip;
} }
} }