diff --git a/package.json b/package.json index 1d04778..a42dfa0 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,13 @@ ], "default": "off", "description": "Traces the communication between VS Code and the language server." + }, + "angelscript-languageserver.defines": { + "scope": "window", + "type": "array", + "items": { + "type": "string" + } } } }, diff --git a/server/src/server.ts b/server/src/server.ts index b2869bd..0a6397b 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -108,6 +108,14 @@ connection.onInitialized(() => { }); } + connection.workspace.getConfiguration('angelscript-languageserver.defines').then((config) => { + let defines = config as string[]; + for (let index = 0; index < defines.length; index++) { + const define = defines[index]; + database.addDefine(define); + } + }); + connection.workspace.getWorkspaceFolders().then((ws) => { ws?.forEach(element => { registerFiles(element.uri.substr(7)) diff --git a/server/src/src/Database.cpp b/server/src/src/Database.cpp index a91985c..a42cbd2 100644 --- a/server/src/src/Database.cpp +++ b/server/src/src/Database.cpp @@ -11,6 +11,7 @@ Napi::Object Database::Init(Napi::Env env, Napi::Object exports) { {InstanceMethod("reset", &Database::Reset), InstanceMethod("loadTypeDef", &Database::LoadTypeDef), InstanceMethod("loadScript", &Database::LoadScript), InstanceMethod("build", &Database::Build), InstanceMethod("messages", &Database::GetMessages), + InstanceMethod("addDefine", &Database::AddDefine), InstanceMethod("setEngineProperty", &Database::SetEngineProperty)}); auto* constructor = new Napi::FunctionReference(); @@ -37,6 +38,9 @@ void Database::SetupEngine() { _engine->SetEngineProperty(asEP_REQUIRE_ENUM_SCOPE, true); _engine->SetEngineProperty(asEP_PROPERTY_ACCESSOR_MODE, 2); _engine->SetEngineProperty(asEP_COMPILER_WARNINGS, 2); + for (auto& flag : _defines) { + _builder.DefineWord(flag.c_str()); + } RegisterStdString(_engine); RegisterScriptArray(_engine, true); _builder.StartNewModule(_engine, "Module"); @@ -103,4 +107,11 @@ Napi::Value Database::GetMessages(const Napi::CallbackInfo& info) { return messages; } + +void Database::AddDefine(const Napi::CallbackInfo& info) { + if (info.Length() < 1) + throw std::logic_error("Not enough arguments"); + auto name = info[0].As().Utf8Value(); + _defines.emplace_back(name); +} #endif \ No newline at end of file diff --git a/server/src/src/Database.hpp b/server/src/src/Database.hpp index 8841737..2095813 100644 --- a/server/src/src/Database.hpp +++ b/server/src/src/Database.hpp @@ -12,6 +12,7 @@ private: asIScriptEngine* _engine = nullptr; CScriptBuilder _builder; ASTypeDefParser::TypeDefResult _result; + std::vector _defines; std::vector _messages; std::mutex _lock; @@ -22,6 +23,7 @@ public: static Napi::Object Init(Napi::Env env, Napi::Object exports); explicit Database(const Napi::CallbackInfo& info); + void AddDefine(const Napi::CallbackInfo& info); void SetEngineProperty(const Napi::CallbackInfo& info); void Reset(const Napi::CallbackInfo& info); void LoadScript(const Napi::CallbackInfo& info); diff --git a/server/src/wrapper.ts b/server/src/wrapper.ts index e4f079a..36d12aa 100644 --- a/server/src/wrapper.ts +++ b/server/src/wrapper.ts @@ -55,6 +55,7 @@ export interface ScriptDatabase { loadScript(name: string, script: string): void; build(): number; messages(): Message[]; + addDefine(define: string) : void; } export function BuildDatabase(): ScriptDatabase {