From c931f9263288d91e4f22ef9edf7ab1c3a190baf1 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sun, 29 Sep 2019 09:21:51 -0700 Subject: [PATCH] Added support for autocomplete inserting property overrides --- IDE/mintest/src/main3.bf | 27 +++++++++ IDE/src/ui/AutoComplete.bf | 60 ++++++++++++++++--- IDE/src/ui/SourceEditWidgetContent.bf | 6 +- IDEHelper/Compiler/BfAutoComplete.cpp | 83 +++++++++++++++++++++------ 4 files changed, 148 insertions(+), 28 deletions(-) diff --git a/IDE/mintest/src/main3.bf b/IDE/mintest/src/main3.bf index a495e617..7cbe4b84 100644 --- a/IDE/mintest/src/main3.bf +++ b/IDE/mintest/src/main3.bf @@ -152,6 +152,33 @@ class Norg { return a + b + c + bl.mA; } + + public virtual int Zorf + { + set + { + + } + + + } + + public virtual int GetVal() + { + return 99; + } +} + +class Norg2 : Norg +{ + public override void Zorf + { + set + { + base.Zorf = 123; + } + } + } struct Blurg diff --git a/IDE/src/ui/AutoComplete.bf b/IDE/src/ui/AutoComplete.bf index 75a6dcf6..f67819ff 100644 --- a/IDE/src/ui/AutoComplete.bf +++ b/IDE/src/ui/AutoComplete.bf @@ -2198,7 +2198,7 @@ namespace IDE.ui }*/ } - public void InsertSelection(char32 keyChar, String insertType = null) + public void InsertSelection(char32 keyChar, String insertType = null, String insertStr = null) { //Debug.WriteLine("InsertSelection"); @@ -2223,6 +2223,9 @@ namespace IDE.ui } } + if (insertStr != null) + insertStr.Append(entry.mEntryInsert ?? entry.mEntryDisplay); + if (entry.mEntryType == "fixit") { if (insertType != null) @@ -2240,7 +2243,7 @@ namespace IDE.ui if (tabIdx != -1) { implText = scope:: String(); - implText.Append(insertText, tabIdx + 1); + implText.Append(insertText, tabIdx); insertText.RemoveToEnd(tabIdx); } String prevText = scope String(); @@ -2294,13 +2297,52 @@ namespace IDE.ui UpdateAsyncInfo();*/ if (implText != null) - { - sourceEditWidgetContent.InsertAtCursor("\n"); - sourceEditWidgetContent.CursorToLineEnd(); - sourceEditWidgetContent.OpenCodeBlock(); - var lineAndColumn = sourceEditWidgetContent.CursorLineAndColumn; - sourceEditWidgetContent.InsertAtCursor(implText); - sourceEditWidgetContent.CursorLineAndColumn = lineAndColumn; + { + String implSect = scope .(); + + int startIdx = 0; + for (int i < implText.Length) + { + char8 c = implText[i]; + if ((c == '\t') || (c == '\b') || (c == '\r')) + { + implSect.Clear(); + implSect.Append(implText, startIdx, i - startIdx); + if (!implSect.IsEmpty) + { + sourceEditWidgetContent.InsertAtCursor(implSect); + } + + if (c == '\t') + { + sourceEditWidgetContent.InsertAtCursor("\n"); + sourceEditWidgetContent.CursorToLineEnd(); + sourceEditWidgetContent.OpenCodeBlock(); + } + else if (c == '\r') + { + sourceEditWidgetContent.InsertAtCursor("\n"); + sourceEditWidgetContent.CursorToLineEnd(); + } + else + { + let lc = sourceEditWidgetContent.CursorLineAndColumn; + sourceEditWidgetContent.CursorLineAndColumn = .(lc.mLine + 1, 0); + sourceEditWidgetContent.CursorToLineEnd(); + sourceEditWidgetContent.InsertAtCursor("\n"); + sourceEditWidgetContent.CursorToLineEnd(); + } + + startIdx = i + 1; + } + } + + implSect.Clear(); + implSect.Append(implText, startIdx, implText.Length - startIdx); + if (!implSect.IsEmpty) + { + sourceEditWidgetContent.InsertAtCursor(implSect); + } } if (persistentInvokeSrcPositons != null) diff --git a/IDE/src/ui/SourceEditWidgetContent.bf b/IDE/src/ui/SourceEditWidgetContent.bf index f84a8096..16a97dec 100644 --- a/IDE/src/ui/SourceEditWidgetContent.bf +++ b/IDE/src/ui/SourceEditWidgetContent.bf @@ -2184,12 +2184,14 @@ namespace IDE.ui bool allowChar = true; mIsInKeyChar = true; String insertType = scope String(); - mAutoComplete.InsertSelection(theChar, insertType); + String insertStr = scope String(); + mAutoComplete.InsertSelection(theChar, insertType, insertStr); mIsInKeyChar = false; if (insertType != null) { //mGenerateAutocompleteHandler(false, false); - if ((insertType == "method") && (theChar == '(')) + if (((insertType == "method") && (theChar == '(')) || + ((insertType == "token") && (insertStr == "override"))) { if (IsCursorVisible(false)) mOnGenerateAutocomplete('\0', default); diff --git a/IDEHelper/Compiler/BfAutoComplete.cpp b/IDEHelper/Compiler/BfAutoComplete.cpp index aec4b23b..5be0678d 100644 --- a/IDEHelper/Compiler/BfAutoComplete.cpp +++ b/IDEHelper/Compiler/BfAutoComplete.cpp @@ -1862,31 +1862,31 @@ void BfAutoComplete::AddOverrides(const StringImpl& filter) if (!curType->IsTypeMemberAccessible(methodDef->mDeclaringType, activeTypeDef)) continue; } - - if (methodDef->mMethodType == BfMethodType_Normal) + + auto& methodGroup = curType->mMethodInstanceGroups[methodDef->mIdx]; + if (methodGroup.mDefault == NULL) { - auto& methodGroup = curType->mMethodInstanceGroups[methodDef->mIdx]; - if (methodGroup.mDefault == NULL) - { - continue; - } - auto methodInst = methodGroup.mDefault; + continue; + } + auto methodInst = methodGroup.mDefault; - if ((methodDef->mIsVirtual) && (!methodDef->mIsOverride)) + if ((methodDef->mIsVirtual) && (!methodDef->mIsOverride)) + { + if (methodDef->mMethodType == BfMethodType_Normal) { String methodPrefix; String methodName; String impString; - - if (!methodInst->mReturnType->IsVoid()) - impString = "return "; - + bool isAbstract = methodDef->mIsAbstract; if (!isAbstract) { + if (!methodInst->mReturnType->IsVoid()) + impString = "return "; + impString += "base."; - impString += methodDef->mName;; + impString += methodDef->mName; impString += "("; } @@ -1898,7 +1898,7 @@ void BfAutoComplete::AddOverrides(const StringImpl& filter) methodPrefix += " "; methodName += methodDef->mName; methodName += "("; - for (int paramIdx = 0; paramIdx < (int) methodInst->GetParamCount(); paramIdx++) + for (int paramIdx = 0; paramIdx < (int)methodInst->GetParamCount(); paramIdx++) { if (paramIdx > 0) { @@ -1918,8 +1918,57 @@ void BfAutoComplete::AddOverrides(const StringImpl& filter) if (!isAbstract) impString += ");"; - AddEntry(AutoCompleteEntry("override", methodName + "\t" + methodPrefix + methodName + "\t" + impString, methodDeclaration->mDocumentation), filter); - } + AddEntry(AutoCompleteEntry("override", methodName + "\t" + methodPrefix + methodName + "\t" + impString, NULL), filter); + } + else if ((methodDef->mMethodType == BfMethodType_PropertyGetter) || (methodDef->mMethodType == BfMethodType_PropertySetter)) + { + auto propDeclaration = methodDef->GetPropertyDeclaration(); + bool hasGet = propDeclaration->GetMethod("get") != NULL; + bool hasSet = propDeclaration->GetMethod("set") != NULL; + + if ((methodDef->mMethodType == BfMethodType_PropertyGetter) || (!hasGet)) + { + String propName; + String impl; + + propDeclaration->mNameNode->ToString(propName); + + bool isAbstract = methodDef->mIsAbstract; + + if (propDeclaration->mProtectionSpecifier != NULL) + impl += propDeclaration->mProtectionSpecifier->ToString() + " "; + impl += "override "; + impl += mModule->TypeToString(methodInst->mReturnType, BfTypeNameFlag_ReduceName); + impl += " "; + impl += propName; + impl += "\t"; + if (hasGet) + { + impl += "get\t"; + if (!isAbstract) + { + impl += "return base."; + impl += propName; + impl += ";"; + } + } + if (hasSet) + { + if (hasGet) + impl += "\b\r"; + + impl += "set\t"; + if (!isAbstract) + { + impl += "base."; + impl += propName; + impl += " = value;"; + } + } + + AddEntry(AutoCompleteEntry("override", propName + "\t" + impl, NULL), filter); + } + } } }