More complete selective import support

This commit is contained in:
Hackerpilot 2014-08-06 07:38:24 +00:00
parent 8f1effc5cc
commit 40582c232f
2 changed files with 47 additions and 20 deletions

View File

@ -293,22 +293,29 @@ AutocompleteResponse parenCompletion(T)(T beforeTokens,
return response; return response;
} }
bool isSelectiveImport(T)(T tokens) pure nothrow bool isSelectiveImport(T)(T tokens)
{ {
size_t i = 1; size_t i = tokens.length - 1;
if (tokens[$ - i] != tok!":") stderr.writeln(stringToken(tokens[i]));
if (!(tokens[i] == tok!":" || tokens[i] == tok!","))
return false; return false;
i++; i--;
loop: while (i < tokens.length) switch (tokens[$ - i].type) loop: while (true) switch (tokens[i].type)
{ {
case tok!"identifier": case tok!"identifier":
case tok!".": case tok!".":
i++; case tok!",":
case tok!":":
if (i == 0)
return false;
else
i--;
break; break;
case tok!"import":
return true;
default: default:
break loop; return false;
} }
return tokens[$ - i] == tok!"import";
} }
unittest unittest
@ -319,6 +326,8 @@ unittest
t ~= Token(tok!"."); t ~= Token(tok!".");
t ~= Token(tok!"identifier"); t ~= Token(tok!"identifier");
t ~= Token(tok!":"); t ~= Token(tok!":");
t ~= Token(tok!"identifier");
t ~= Token(tok!",");
assert (isSelectiveImport(t)); assert (isSelectiveImport(t));
Token[] t2; Token[] t2;
t2 ~= Token(tok!"else"); t2 ~= Token(tok!"else");
@ -335,30 +344,48 @@ unittest
* --- * ---
*/ */
AutocompleteResponse selectiveImportCompletion(T)(T beforeTokens) AutocompleteResponse selectiveImportCompletion(T)(T beforeTokens)
in
{
assert (beforeTokens.length >= 2);
}
body
{ {
Log.trace("selectiveImportCompletion"); Log.trace("selectiveImportCompletion");
AutocompleteResponse response; AutocompleteResponse response;
size_t i = 2; size_t i = beforeTokens.length - 2;
loop: while (i < beforeTokens.length) switch (beforeTokens[$ - i].type) loop: while (i > 0) switch (beforeTokens[i].type)
{ {
case tok!"identifier": case tok!"identifier":
case tok!",":
case tok!".": case tok!".":
i++; case tok!":":
i--;
break; break;
default: default:
break loop; break loop;
} }
Log.trace("i = ", i);
size_t j = i;
loop2: while (j <= beforeTokens.length) switch (beforeTokens[j].type)
{
case tok!":": break loop2;
default: j++; break;
}
Log.trace("j = ", j);
string path; string path;
size_t j = 0; {
foreach (token; beforeTokens[($ - i + 1) .. $ - 1]) size_t k = 0;
foreach (token; beforeTokens[i + 1 .. j])
{ {
if (token.type == tok!"identifier") if (token.type == tok!"identifier")
{ {
if (j != 0) if (k != 0)
path ~= "/"; path ~= "/";
path ~= token.text; path ~= token.text;
} }
j++; k++;
}
} }
auto symbols = ModuleCache.getSymbolsInModule(ModuleCache.resolveImportLoctation(path)); auto symbols = ModuleCache.getSymbolsInModule(ModuleCache.resolveImportLoctation(path));
import containers.hashset; import containers.hashset;

@ -1 +1 @@
Subproject commit 9187ad6c775e91c78fd2e9313d2d66d1922445eb Subproject commit 5a39c333a1264753b067d4ba34ebfa1e7a2f04fa