This commit is contained in:
Hackerpilot 2015-02-16 22:51:50 -08:00
parent d81ed84101
commit 7da5d006c0
4 changed files with 134 additions and 45 deletions

View File

@ -101,12 +101,19 @@ public AutocompleteResponse complete(const AutocompleteRequest request)
auto cache = StringCache(StringCache.defaultBucketCount); auto cache = StringCache(StringCache.defaultBucketCount);
auto beforeTokens = getTokensBeforeCursor(request.sourceCode, auto beforeTokens = getTokensBeforeCursor(request.sourceCode,
request.cursorPosition, &cache, tokenArray); request.cursorPosition, &cache, tokenArray);
if (beforeTokens.length >= 2 && (beforeTokens[$ - 1] == tok!"(" if (beforeTokens.length >= 2)
|| beforeTokens[$ - 1] == tok!"[")) {
if (beforeTokens[$ - 1] == tok!"(" || beforeTokens[$ - 1] == tok!"[")
{ {
return parenCompletion(beforeTokens, tokenArray, request.cursorPosition); return parenCompletion(beforeTokens, tokenArray, request.cursorPosition);
} }
else if (beforeTokens.length >= 2) else if (beforeTokens[$ - 1] == tok!",")
{
immutable size_t end = goBackToOpenParen(beforeTokens);
if (end != size_t.max)
return parenCompletion(beforeTokens[0 .. end], tokenArray, request.cursorPosition);
}
else
{ {
ImportKind kind = determineImportKind(beforeTokens); ImportKind kind = determineImportKind(beforeTokens);
if (kind == ImportKind.neither) if (kind == ImportKind.neither)
@ -114,10 +121,8 @@ public AutocompleteResponse complete(const AutocompleteRequest request)
else else
return importCompletion(beforeTokens, kind); return importCompletion(beforeTokens, kind);
} }
else
{
return dotCompletion(beforeTokens, tokenArray, request.cursorPosition);
} }
return dotCompletion(beforeTokens, tokenArray, request.cursorPosition);
} }
/** /**
@ -922,12 +927,7 @@ body
return generatedStructConstructorCalltip; return generatedStructConstructorCalltip;
} }
/** private enum TYPE_IDENT_AND_LITERAL_CASES = q{
*
*/
T getExpression(T)(T beforeTokens)
{
enum TYPE_IDENT_AND_LITERAL_CASES = q{
case tok!"int": case tok!"int":
case tok!"uint": case tok!"uint":
case tok!"long": case tok!"long":
@ -956,8 +956,14 @@ T getExpression(T)(T beforeTokens)
case tok!"stringLiteral": case tok!"stringLiteral":
case tok!"wstringLiteral": case tok!"wstringLiteral":
case tok!"dstringLiteral": case tok!"dstringLiteral":
}; };
/**
*
*/
T getExpression(T)(T beforeTokens)
{
enum EXPRESSION_LOOP_BREAK = q{ enum EXPRESSION_LOOP_BREAK = q{
if (i + 1 < beforeTokens.length) switch (beforeTokens[i + 1].type) if (i + 1 < beforeTokens.length) switch (beforeTokens[i + 1].type)
{ {
@ -1057,6 +1063,75 @@ T getExpression(T)(T beforeTokens)
return beforeTokens[i .. sliceEnd]; return beforeTokens[i .. sliceEnd];
} }
size_t goBackToOpenParen(T)(T beforeTokens)
in
{
assert (beforeTokens.length > 0);
}
body
{
size_t i = beforeTokens.length - 1;
IdType open;
IdType close;
while (true) switch (beforeTokens[i].type)
{
case tok!",":
case tok!".":
case tok!"doubleLiteral":
case tok!"floatLiteral":
case tok!"idoubleLiteral":
case tok!"ifloatLiteral":
case tok!"intLiteral":
case tok!"longLiteral":
case tok!"realLiteral":
case tok!"irealLiteral":
case tok!"uintLiteral":
case tok!"ulongLiteral":
case tok!"characterLiteral":
mixin(TYPE_IDENT_AND_LITERAL_CASES);
if (i == 0)
return size_t.max;
else
i--;
break;
case tok!"(":
case tok!"[":
return i + 1;
case tok!")":
open = tok!")";
close = tok!"(";
goto skip;
case tok!"}":
open = tok!"}";
close = tok!"{";
goto skip;
case tok!"]":
open = tok!"]";
close = tok!"[";
skip:
if (i == 0)
return size_t.max;
else
i--;
int depth = 1;
do
{
if (depth == 0 || i == 0)
break;
else
i--;
if (beforeTokens[i].type == open)
depth++;
else if (beforeTokens[i].type == close)
depth--;
} while (true);
break;
default:
return size_t.max;
}
return size_t.max;
}
/** /**
* Params: * Params:
* completionType = the completion type being requested * completionType = the completion type being requested

View File

@ -0,0 +1,2 @@
calltips
void doStuff(int a, int b)

7
tests/tc008/file.d Normal file
View File

@ -0,0 +1,7 @@
void doStuff(int a, int b) { return; }
int getInt() { return 10; }
void main(string[] args)
{
doStuff(getInt(), );
auto x = 10, 20;
}

5
tests/tc008/run.sh Executable file
View File

@ -0,0 +1,5 @@
set -e
set -u
dcd-client file.d -c113 > actual1.txt
diff actual1.txt expected1.txt