Browse Source

Autocomplete fixes, debugger fixes

Fixed autocomplete issue typing out base class name
Fixed autocomplete issue typing before a member access (ie: in 'val' for 'val.MethodA()')
Fixed invocation autocomplete with [Friend] access
Brian Fiete 6 years ago
parent
commit
1e04bb1b3e

+ 10 - 2
IDE/mintest/mintest2/src/main4.bf

@@ -1,7 +1,15 @@
 using System;
 // Zapples
 
-class Mintest2
+
+static
+{
+	
+
+	
+}
+
+/*class Mintest2
 {
 
 	public static void Main()
@@ -29,4 +37,4 @@ class Mintest2
 			1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +
 			1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
 	}
-}
+}*/

+ 15 - 2
IDE/mintest/src/main3.bf

@@ -92,11 +92,20 @@ class Bloozer
 	int mA;
 }
 
+
+
+
 class Blurg
 {
 	delegate void() mFuncA;
 	delegate void() mFuncB;
-	
+
+
+	void TestIt(int a, int b, int c)
+	{
+
+	}
+
 	public static void Hey()
 	{
 		int a = 123;
@@ -113,6 +122,9 @@ class Blurg
 			PrintF("YoB!\n");
 		};
 
+		blurg.TestIt(1, 2, 3);
+		blurg.[Friend]TestIt(1, 2, 3);
+
 		while (true)
 		{
 			blurg.mFuncA();
@@ -129,4 +141,5 @@ class CustomAlloc
 		//return Internal.Malloc(size);
 		return null;
 	}
-}
+}
+

+ 4 - 1
IDEHelper/Compiler/BfAutoComplete.cpp

@@ -1440,7 +1440,7 @@ bool BfAutoComplete::CheckMemberReference(BfAstNode* target, BfAstNode* dotToken
 	}
 
 	if (memberName != NULL)
-		isAutocompletingName = IsAutocompleteNode(dotToken, memberName);
+		isAutocompletingName = IsAutocompleteNode(dotToken, memberName, 0, 1);
 
 	if ((IsAutocompleteNode(dotToken, 0, 1)) || (isAutocompletingName))
 	{
@@ -1773,6 +1773,9 @@ void BfAutoComplete::CheckInvocation(BfAstNode* invocationNode, BfTokenNode* ope
 			target = qualifiedTypeRef->mRight;
 		else if (auto qualifiedNameNode = BfNodeDynCast<BfQualifiedNameNode>(target))
 			target = qualifiedNameNode->mRight;
+
+		if (auto attributedMember = BfNodeDynCast<BfAttributedIdentifierNode>(target))
+			target = attributedMember->mIdentifier;
 	}
 
 	bool doCapture = (bfParser->mCursorIdx >= openParen->GetSrcStart());

+ 1 - 1
IDEHelper/Compiler/BfDefBuilder.cpp

@@ -1106,7 +1106,7 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration)
 		isAutoCompleteTempType = (mResolvePassData->mAutoComplete != NULL);
 
 		int cursorIdx = mResolvePassData->mParser->mCursorIdx;		
-		if (typeDeclaration->Contains(cursorIdx))
+		if (typeDeclaration->Contains(cursorIdx, 1, 0))
 		{
 			// Within bounds
 		}

+ 3 - 1
IDEHelper/Compiler/BfModule.cpp

@@ -12607,7 +12607,9 @@ BfMethodInstance* BfModule::GetDelegateInvokeMethod(BfTypeInstance* typeInstance
 void BfModule::CreateDelegateInvokeMethod()
 {
 	// Clear out debug loc - otherwise we'll single step onto the delegate type declaration
-	mBfIRBuilder->ClearDebugLocation();
+	//mBfIRBuilder->ClearDebugLocation();
+
+	SetIllegalSrcPos();
 
 	auto typeInstance = mCurTypeInstance;
 	auto memberFuncType = mBfIRBuilder->MapMethod(mCurMethodInstance);

+ 12 - 0
IDEHelper/DbgModule.cpp

@@ -99,6 +99,18 @@ DbgSrcFile* DbgSubprogram::GetLineSrcFile(const DbgLineData& lineData)
 	return inlineRoot->mLineInfo->mContexts[lineData.mCtxIdx].mSrcFile;
 }
 
+bool DbgSubprogram::HasValidLines()
+{
+	auto inlineRoot = GetRootInlineParent();
+	for (int lineIdx = 0; lineIdx < (int)inlineRoot->mLineInfo->mLines.size(); lineIdx++)
+	{
+		auto& lineInfo = inlineRoot->mLineInfo->mLines[lineIdx];
+		if (lineInfo.mColumn >= 0)
+			return true;
+	}
+	return false;
+}
+
 void DbgSubprogram::PopulateSubprogram()
 {
 	if (mDeferredInternalsSize == 0)

+ 1 - 0
IDEHelper/DbgModule.h

@@ -459,6 +459,7 @@ public:
 	addr_target GetLineAddr(const DbgLineData& lineData);	
 	DbgSubprogram* GetLineInlinee(const DbgLineData& lineData);
 	DbgSrcFile* GetLineSrcFile(const DbgLineData& lineData);
+	bool HasValidLines();
 	void PopulateSubprogram();
 };
 

+ 7 - 0
IDEHelper/WinDebugger.cpp

@@ -2033,6 +2033,13 @@ bool WinDebugger::DoUpdate()
 									break;
 								}
 
+								if ((dwLineData->mColumn == -1) && (!dwSubprogram->HasValidLines()))
+								{
+									// This is a method we don't actually want to be in, it has no valid lines!
+									SetupStep(StepType_StepOut);
+									break;
+								}
+
 								if ((dwSubprogram != NULL) && (dwSubprogram->mInlineeInfo != NULL) && (pcAddress == dwSubprogram->mBlock.mLowPC))
 								{
 									// We've stepped out, but right into the start of an inlined method, so step out of this inlined method now...