summaryrefslogtreecommitdiff
path: root/scriptingprovider.cpp
diff options
context:
space:
mode:
author0cyn <kat@vector35.com>2026-04-14 05:03:15 -0400
committerAlexander Taylor <alex@vector35.com>2026-05-18 14:55:52 -0400
commit297a98bff289ecde90d808f6538c2c5edf804af6 (patch)
tree4ca5f9868354cb26f7c6ef70140e4ed0f0395944 /scriptingprovider.cpp
parentf1a688a1e7fb6d962d8c9addaaefdfd59e5dd28b (diff)
Argument Assist Popup
Diffstat (limited to 'scriptingprovider.cpp')
-rw-r--r--scriptingprovider.cpp60
1 files changed, 59 insertions, 1 deletions
diff --git a/scriptingprovider.cpp b/scriptingprovider.cpp
index 4fd40879..95726d6d 100644
--- a/scriptingprovider.cpp
+++ b/scriptingprovider.cpp
@@ -56,12 +56,13 @@ void ScriptingOutputListener::NotifyInputReadyStateChanged(BNScriptingProviderIn
ScriptingInstance::ScriptingInstance(ScriptingProvider* provider)
{
- BNScriptingInstanceCallbacks cb;
+ BNScriptingInstanceCallbacks cb = {};
cb.context = this;
cb.destroyInstance = DestroyInstanceCallback;
cb.externalRefTaken = nullptr;
cb.externalRefReleased = nullptr;
cb.executeScriptInput = ExecuteScriptInputCallback;
+ cb.executeScriptInputFromFilename = ExecuteScriptFromFilenameCallback;
cb.cancelScriptInput = CancelScriptInputCallback;
cb.releaseBinaryView = ReleaseBinaryViewCallback;
cb.setCurrentBinaryView = SetCurrentBinaryViewCallback;
@@ -71,6 +72,8 @@ ScriptingInstance::ScriptingInstance(ScriptingProvider* provider)
cb.setCurrentSelection = SetCurrentSelectionCallback;
cb.completeInput = CompleteInputCallback;
cb.stop = StopCallback;
+ cb.canCompleteArguments = CanCompleteArgumentsCallback;
+ cb.completeArguments = CompleteArgumentsCallback;
AddRefForRegistration();
m_object = BNInitScriptingInstance(provider->GetObject(), &cb);
}
@@ -96,6 +99,13 @@ BNScriptingProviderExecuteResult ScriptingInstance::ExecuteScriptInputCallback(v
}
+BNScriptingProviderExecuteResult ScriptingInstance::ExecuteScriptFromFilenameCallback(void* ctxt, const char* filename)
+{
+ CallbackRef<ScriptingInstance> instance(ctxt);
+ return instance->ExecuteScriptInputFromFilename(filename);
+}
+
+
void ScriptingInstance::CancelScriptInputCallback(void* ctxt)
{
CallbackRef<ScriptingInstance> instance(ctxt);
@@ -162,6 +172,24 @@ char* ScriptingInstance::CompleteInputCallback(void* ctxt, const char* text, uin
}
+bool ScriptingInstance::CanCompleteArgumentsCallback(void* ctxt, const char* text)
+{
+ CallbackRef<ScriptingInstance> instance(ctxt);
+ bool result = instance->CanCompleteArguments(text);
+ return result;
+}
+
+
+char* ScriptingInstance::CompleteArgumentsCallback(void* ctx, const char* text, uint64_t* argumentStart)
+{
+ CallbackRef<ScriptingInstance> instance(ctx);
+ auto result = instance->CompleteArguments(text);
+ if (argumentStart)
+ *argumentStart = result.second;
+ return BNAllocString(result.first.c_str());
+}
+
+
void ScriptingInstance::StopCallback(void* ctxt)
{
CallbackRef<ScriptingInstance> instance(ctxt);
@@ -202,6 +230,18 @@ std::string ScriptingInstance::CompleteInput(const std::string&, uint64_t)
}
+bool ScriptingInstance::CanCompleteArguments(const std::string&)
+{
+ return false;
+}
+
+
+std::pair<std::string, uint64_t> ScriptingInstance::CompleteArguments(const std::string&)
+{
+ return {"", 0};
+}
+
+
void ScriptingInstance::Output(const string& text)
{
BNNotifyOutputForScriptingInstance(m_object, text.c_str());
@@ -326,6 +366,24 @@ std::string CoreScriptingInstance::CompleteInput(const std::string& text, uint64
}
+bool CoreScriptingInstance::CanCompleteArguments(const std::string& text)
+{
+ return BNScriptingInstanceCanCompleteArguments(m_object, text.c_str());
+}
+
+
+std::pair<std::string, uint64_t> CoreScriptingInstance::CompleteArguments(const std::string& text)
+{
+ uint64_t argumentStart = 0;
+ char* result = BNScriptingInstanceCompleteArguments(m_object, text.c_str(), &argumentStart);
+ if (!result)
+ return {"", argumentStart};
+ std::string ret = result;
+ BNFreeString(result);
+ return {ret, argumentStart};
+}
+
+
void CoreScriptingInstance::Stop()
{
BNStopScriptingInstance(m_object);