mirror of
https://github.com/dlang-community/DCD.git
synced 2025-04-25 21:00:02 +03:00
Udated readme. Also added a change that was supposed to be in the last commit
This commit is contained in:
parent
ffe8169ead
commit
5d71e4ff2a
3 changed files with 17 additions and 28 deletions
|
@ -1,11 +1,15 @@
|
||||||
#Overview
|
#Overview
|
||||||
The D Completion Daemon is an auto-complete program for the D programming language.
|
The D Completion Daemon is an auto-complete program for the D programming language.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
#Status
|
#Status
|
||||||
* Working:
|
* Working:
|
||||||
* Autocomplete class, struct, interface, and enum members if the class, struct, or
|
|
||||||
enum was declared in the current file.
|
|
||||||
* Autocompletion of properties of built-in types such as int, float, double, etc.
|
* Autocompletion of properties of built-in types such as int, float, double, etc.
|
||||||
|
* Autocompletion of __traits, scope, and extern arguments
|
||||||
|
* Autocompletion of enums
|
||||||
|
* Crashes frequently
|
||||||
|
* Autocompletion of class, struct, and interfacae instances.
|
||||||
* Not working:
|
* Not working:
|
||||||
* Everything else
|
* Everything else
|
||||||
|
|
||||||
|
|
|
@ -74,14 +74,14 @@ AutocompleteResponse complete(AutocompleteRequest request, string[] importPaths)
|
||||||
response.completionKinds ~= CompletionKind.keyword;
|
response.completionKinds ~= CompletionKind.keyword;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TokenType.identifier:
|
/+case TokenType.identifier:
|
||||||
case TokenType.rParen:
|
case TokenType.rParen:
|
||||||
case TokenType.rBracket:
|
case TokenType.rBracket:
|
||||||
auto expression = getExpression(beforeTokens[0..$]);
|
auto expression = getExpression(beforeTokens[0..$]);
|
||||||
writeln("Expression: ", expression.map!"a.value"());
|
writeln("Expression: ", expression.map!"a.value"());
|
||||||
response.completionType = CompletionType.calltips;
|
response.completionType = CompletionType.calltips;
|
||||||
// TODO
|
// TODO
|
||||||
break;
|
break;+/
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -121,6 +121,7 @@ AutocompleteResponse complete(AutocompleteRequest request, string[] importPaths)
|
||||||
case TokenType.identifier:
|
case TokenType.identifier:
|
||||||
case TokenType.rParen:
|
case TokenType.rParen:
|
||||||
case TokenType.rBracket:
|
case TokenType.rBracket:
|
||||||
|
case TokenType.this_:
|
||||||
auto visitor = processModule(tokenArray);
|
auto visitor = processModule(tokenArray);
|
||||||
visitor.scope_.symbols ~= builtinSymbols;
|
visitor.scope_.symbols ~= builtinSymbols;
|
||||||
auto expression = getExpression(beforeTokens[0..$]);
|
auto expression = getExpression(beforeTokens[0..$]);
|
||||||
|
@ -142,10 +143,11 @@ AutocompleteResponse complete(AutocompleteRequest request, string[] importPaths)
|
||||||
}
|
}
|
||||||
|
|
||||||
void setCompletions(T)(ref AutocompleteResponse response,
|
void setCompletions(T)(ref AutocompleteResponse response,
|
||||||
AutoCompleteVisitor visitor, T tokens, size_t cursorPosition)
|
AutocompleteVisitor visitor, T tokens, size_t cursorPosition)
|
||||||
{
|
{
|
||||||
// TODO: Completely hacked together.
|
// TODO: Completely hacked together.
|
||||||
writeln("Getting completions for ", map!"a.value"(tokens));
|
writeln("Getting completions for ", map!"a.value"(tokens));
|
||||||
|
visitor.scope_.resolveSymbolTypes();
|
||||||
ACSymbol symbol = visitor.scope_.findSymbolInCurrentScope(cursorPosition, tokens[0].value);
|
ACSymbol symbol = visitor.scope_.findSymbolInCurrentScope(cursorPosition, tokens[0].value);
|
||||||
if (symbol is null)
|
if (symbol is null)
|
||||||
{
|
{
|
||||||
|
@ -153,12 +155,14 @@ void setCompletions(T)(ref AutocompleteResponse response,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
writeln(symbol.kind);
|
if (symbol.kind == CompletionKind.memberVariableName
|
||||||
if (symbol.kind == CompletionKind.variableName
|
|| symbol.kind == CompletionKind.variableName)
|
||||||
|| symbol.kind == CompletionKind.memberVariableName)
|
|
||||||
{
|
{
|
||||||
symbol = resolveType(cursorPosition, symbol, visitor.scope_);
|
symbol = symbol.resolvedType;
|
||||||
|
if (symbol is null)
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
loop: for (size_t i = 1; i < tokens.length; i++)
|
loop: for (size_t i = 1; i < tokens.length; i++)
|
||||||
{
|
{
|
||||||
TokenType open;
|
TokenType open;
|
||||||
|
@ -233,25 +237,6 @@ void setCompletions(T)(ref AutocompleteResponse response,
|
||||||
response.completionType = CompletionType.identifiers;
|
response.completionType = CompletionType.identifiers;
|
||||||
}
|
}
|
||||||
|
|
||||||
ACSymbol resolveType(size_t cursorPosition, ACSymbol symbol, Scope scope_)
|
|
||||||
{
|
|
||||||
writeln("Resolving type of ", symbol.name);
|
|
||||||
Type type = symbol.type;
|
|
||||||
|
|
||||||
// Simple case
|
|
||||||
if (type.type2.builtinType != TokenType.invalid && type.typeSuffixes.length == 0)
|
|
||||||
{
|
|
||||||
return scope_.findSymbolInCurrentScope(cursorPosition, getTokenValue(type.type2.builtinType));
|
|
||||||
}
|
|
||||||
if (type.type2.symbol !is null && type.typeSuffixes.length == 0)
|
|
||||||
{
|
|
||||||
return scope_.findSymbolInCurrentScope(cursorPosition,
|
|
||||||
type.type2.symbol.identifierOrTemplateChain.identifiersOrTemplateInstances[0].identifier.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
T getExpression(T)(T beforeTokens)
|
T getExpression(T)(T beforeTokens)
|
||||||
{
|
{
|
||||||
size_t i = beforeTokens.length - 1;
|
size_t i = beforeTokens.length - 1;
|
||||||
|
|
BIN
teaser.png
Normal file
BIN
teaser.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
Loading…
Add table
Add a link
Reference in a new issue