diff --git a/dub.json b/dub.json index d381c7c..31dcad5 100644 --- a/dub.json +++ b/dub.json @@ -12,7 +12,7 @@ "stringImportPaths": ["views", "views/res", "views/res/i18n", "views/res/mdpi", "views/res/hdpi"], "dependencies": { - "dlangui": "~>0.7.61", + "dlangui": "~>0.7.62", "dcd": "~>0.7.5" }, diff --git a/src/dlangide/tools/d/dcdinterface.d b/src/dlangide/tools/d/dcdinterface.d index ddf5688..73550af 100644 --- a/src/dlangide/tools/d/dcdinterface.d +++ b/src/dlangide/tools/d/dcdinterface.d @@ -19,7 +19,7 @@ enum DCDResult : int { alias DocCommentsResultSet = Tuple!(DCDResult, "result", string[], "docComments"); alias FindDeclarationResultSet = Tuple!(DCDResult, "result", string, "fileName", ulong, "offset"); -alias CompletionResultSet = Tuple!(DCDResult, "result", dstring[], "output"); +alias CompletionResultSet = Tuple!(DCDResult, "result", dstring[], "output", char[], "completionKinds"); import server.autocomplete; import common.messages; @@ -219,9 +219,14 @@ class DCDInterface : Thread { result.result = DCDResult.SUCCESS; result.output.length = response.completions.length; + result.completionKinds.length = response.completions.length; int i=0; - foreach(s;response.completions){ - result.output[i++]=to!dstring(s); + foreach(s;response.completions) { + char type = 0; + if (i < response.completionKinds.length) + type = response.completionKinds[i]; + result.completionKinds[i] = type; + result.output[i++] = to!dstring(s); } debug(DCD) Log.d("DCD output:\n", response.completions); } diff --git a/src/dlangide/tools/d/deditortool.d b/src/dlangide/tools/d/deditortool.d index da30bdb..9e81d68 100644 --- a/src/dlangide/tools/d/deditortool.d +++ b/src/dlangide/tools/d/deditortool.d @@ -107,13 +107,78 @@ class DEditorTool : EditorTool } DCDTask _getCompletionsTask; - override void getCompletions(DSourceEdit editor, TextPosition caretPosition, void delegate(dstring[]) callback) { + override void getCompletions(DSourceEdit editor, TextPosition caretPosition, void delegate(dstring[] completions, string[] icons) callback) { string[] importPaths = editor.importPaths(); string content = toUTF8(editor.text); auto byteOffset = caretPositionToByteOffset(content, caretPosition); _getCompletionsTask = _frame.dcdInterface.getCompletions(editor.window, importPaths, editor.filename, content, byteOffset, delegate(CompletionResultSet output) { - callback(output.output); + string[] icons; + dstring[] labels; + foreach(index, label; output.output) { + string iconId; + char ch = index < output.completionKinds.length ? output.completionKinds[index] : 0; + switch(ch) { + case 'c': // - class name + iconId = "symbol-class"; + break; + case 'i': // - interface name + iconId = "symbol-interface"; + break; + case 's': // - struct name + iconId = "symbol-struct"; + break; + case 'u': // - union name + iconId = "symbol-union"; + break; + case 'v': // - variable name + iconId = "symbol-var"; + break; + case 'm': // - member variable name + iconId = "symbol-membervar"; + break; + case 'k': // - keyword, built-in version, scope statement + iconId = "symbol-keyword"; + break; + case 'f': // - function or method + iconId = "symbol-function"; + break; + case 'g': // - enum name + iconId = "symbol-enum"; + break; + case 'e': // - enum member + iconId = "symbol-enum"; + break; + case 'P': // - package name + iconId = "symbol-package"; + break; + case 'M': // - module name + iconId = "symbol-module"; + break; + case 'a': // - array + iconId = "symbol-array"; + break; + case 'A': // - associative array + iconId = "symbol-array"; + break; + case 'l': // - alias name + iconId = "symbol-alias"; + break; + case 't': // - template name + iconId = "symbol-template"; + break; + case 'T': // - mixin template name + iconId = "symbol-mixintemplate"; + break; + default: + break; + } + if (!iconId) + iconId = "symbol-other"; + icons ~= iconId; + labels ~= label; + } + callback(labels, icons); _getCompletionsTask = null; }); } diff --git a/src/dlangide/tools/editortool.d b/src/dlangide/tools/editortool.d index 2d958f3..3110a89 100644 --- a/src/dlangide/tools/editortool.d +++ b/src/dlangide/tools/editortool.d @@ -17,7 +17,7 @@ class EditorTool //Since files might be unsaved, we must send all the text content. abstract void goToDefinition(DSourceEdit editor, TextPosition caretPosition); abstract void getDocComments(DSourceEdit editor, TextPosition caretPosition, void delegate(string[]) callback); - abstract void getCompletions(DSourceEdit editor, TextPosition caretPosition, void delegate(dstring[]) callback); + abstract void getCompletions(DSourceEdit editor, TextPosition caretPosition, void delegate(dstring[] labels, string[] icons) callback); void cancelGoToDefinition() {} void cancelGetDocComments() {} @@ -37,7 +37,7 @@ class DefaultEditorTool : EditorTool assert(0); //Go To Definition should not be called for normal files. } - override void getCompletions(DSourceEdit editor, TextPosition caretPosition, void delegate(dstring[]) callback) { + override void getCompletions(DSourceEdit editor, TextPosition caretPosition, void delegate(dstring[] labels, string[] icons) callback) { assert(0); } diff --git a/src/dlangide/ui/dsourceedit.d b/src/dlangide/ui/dsourceedit.d index d8525d8..72af19e 100644 --- a/src/dlangide/ui/dsourceedit.d +++ b/src/dlangide/ui/dsourceedit.d @@ -499,7 +499,7 @@ class DSourceEdit : SourceEdit, EditableContentMarksChangeListener { window.update(); } - void showCompletionPopup(dstring[] suggestions) { + void showCompletionPopup(dstring[] suggestions, string[] icons) { if(suggestions.length == 0) { setFocus(); @@ -514,7 +514,11 @@ class DSourceEdit : SourceEdit, EditableContentMarksChangeListener { MenuItem completionPopupItems = new MenuItem(null); //Add all the suggestions. foreach(int i, dstring suggestion ; suggestions) { + string iconId; + if (i < icons.length) + iconId = icons[i]; auto action = new Action(IDEActions.InsertCompletion, suggestion); + action.iconId = iconId; completionPopupItems.add(action); } completionPopupItems.updateActionState(this); diff --git a/src/dlangide/ui/frame.d b/src/dlangide/ui/frame.d index 0361e45..129d5ab 100644 --- a/src/dlangide/ui/frame.d +++ b/src/dlangide/ui/frame.d @@ -895,9 +895,9 @@ class IDEFrame : AppFrame, ProgramExecutionStatusListener, BreakpointListChangeL return true; case IDEActions.GetCompletionSuggestions: Log.d("Getting auto completion suggestions."); - currentEditor.editorTool.getCompletions(currentEditor, currentEditor.caretPos, delegate(dstring[] results) { + currentEditor.editorTool.getCompletions(currentEditor, currentEditor.caretPos, delegate(dstring[] results, string[] icons) { if (currentEditor) - currentEditor.showCompletionPopup(results); + currentEditor.showCompletionPopup(results, icons); }); return true; case IDEActions.EditPreferences: diff --git a/views/res/mdpi/symbol-alias.png b/views/res/mdpi/symbol-alias.png new file mode 100644 index 0000000..50d0978 Binary files /dev/null and b/views/res/mdpi/symbol-alias.png differ diff --git a/views/res/mdpi/symbol-array.png b/views/res/mdpi/symbol-array.png new file mode 100644 index 0000000..c5ad1fe Binary files /dev/null and b/views/res/mdpi/symbol-array.png differ diff --git a/views/res/mdpi/symbol-class.png b/views/res/mdpi/symbol-class.png new file mode 100644 index 0000000..a1ff3a4 Binary files /dev/null and b/views/res/mdpi/symbol-class.png differ diff --git a/views/res/mdpi/symbol-enum.png b/views/res/mdpi/symbol-enum.png new file mode 100644 index 0000000..dc341fd Binary files /dev/null and b/views/res/mdpi/symbol-enum.png differ diff --git a/views/res/mdpi/symbol-function.png b/views/res/mdpi/symbol-function.png new file mode 100644 index 0000000..0fccb59 Binary files /dev/null and b/views/res/mdpi/symbol-function.png differ diff --git a/views/res/mdpi/symbol-interface.png b/views/res/mdpi/symbol-interface.png new file mode 100644 index 0000000..5e741f8 Binary files /dev/null and b/views/res/mdpi/symbol-interface.png differ diff --git a/views/res/mdpi/symbol-keyword.png b/views/res/mdpi/symbol-keyword.png new file mode 100644 index 0000000..a6be291 Binary files /dev/null and b/views/res/mdpi/symbol-keyword.png differ diff --git a/views/res/mdpi/symbol-membervar.png b/views/res/mdpi/symbol-membervar.png new file mode 100644 index 0000000..6a41efa Binary files /dev/null and b/views/res/mdpi/symbol-membervar.png differ diff --git a/views/res/mdpi/symbol-mixintemplate.png b/views/res/mdpi/symbol-mixintemplate.png new file mode 100644 index 0000000..e289c94 Binary files /dev/null and b/views/res/mdpi/symbol-mixintemplate.png differ diff --git a/views/res/mdpi/symbol-module.png b/views/res/mdpi/symbol-module.png new file mode 100644 index 0000000..7ac087b Binary files /dev/null and b/views/res/mdpi/symbol-module.png differ diff --git a/views/res/mdpi/symbol-other.png b/views/res/mdpi/symbol-other.png new file mode 100644 index 0000000..590352e Binary files /dev/null and b/views/res/mdpi/symbol-other.png differ diff --git a/views/res/mdpi/symbol-package.png b/views/res/mdpi/symbol-package.png new file mode 100644 index 0000000..602eb76 Binary files /dev/null and b/views/res/mdpi/symbol-package.png differ diff --git a/views/res/mdpi/symbol-struct.png b/views/res/mdpi/symbol-struct.png new file mode 100644 index 0000000..732dd09 Binary files /dev/null and b/views/res/mdpi/symbol-struct.png differ diff --git a/views/res/mdpi/symbol-template.png b/views/res/mdpi/symbol-template.png new file mode 100644 index 0000000..688a7fc Binary files /dev/null and b/views/res/mdpi/symbol-template.png differ diff --git a/views/res/mdpi/symbol-union.png b/views/res/mdpi/symbol-union.png new file mode 100644 index 0000000..ea14cc5 Binary files /dev/null and b/views/res/mdpi/symbol-union.png differ diff --git a/views/res/mdpi/symbol-var.png b/views/res/mdpi/symbol-var.png new file mode 100644 index 0000000..7c7fde8 Binary files /dev/null and b/views/res/mdpi/symbol-var.png differ diff --git a/views/resources.list b/views/resources.list index ffb67ad..555836e 100644 --- a/views/resources.list +++ b/views/resources.list @@ -62,6 +62,22 @@ res/mdpi/project-open.png res/mdpi/run-build.png res/mdpi/run-build-clean.png res/mdpi/run-build-configure.png +res/mdpi/symbol-function.png +res/mdpi/symbol-keyword.png +res/mdpi/symbol-var.png +res/mdpi/symbol-membervar.png +res/mdpi/symbol-other.png +res/mdpi/symbol-class.png +res/mdpi/symbol-union.png +res/mdpi/symbol-struct.png +res/mdpi/symbol-enum.png +res/mdpi/symbol-interface.png +res/mdpi/symbol-alias.png +res/mdpi/symbol-array.png +res/mdpi/symbol-template.png +res/mdpi/symbol-mixintemplate.png +res/mdpi/symbol-module.png +res/mdpi/symbol-package.png res/mdpi/text-d.png res/mdpi/text-dml.png res/mdpi/text-json.png