diff --git a/package.json b/package.json index a42dfa0..3a1b109 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,170 @@ "items": { "type": "string" } + }, + "angelscript-languageserver.engine-settings": { + "scope": "window", + "type": "object", + "properties": { + "asEP_ALLOW_UNSAFE_REFERENCES": { + "type": "boolean", + "default": false + }, + "asEP_OPTIMIZE_BYTECODE": { + "type": "boolean", + "default": true + }, + "asEP_COPY_SCRIPT_SECTIONS": { + "type": "boolean", + "default": true + }, + "asEP_MAX_STACK_SIZE ": { + "type": "integer", + "default": 0 + }, + "asEP_USE_CHARACTER_LITERALS": { + "type": "boolean", + "default": false + }, + "asEP_ALLOW_MULTILINE_STRINGS ": { + "type": "boolean", + "default": false + }, + "asEP_ALLOW_IMPLICIT_HANDLE_TYPES": { + "type": "boolean", + "default": false + }, + "asEP_BUILD_WITHOUT_LINE_CUES": { + "type": "boolean", + "default": false + }, + "asEP_INIT_GLOBAL_VARS_AFTER_BUILD": { + "type": "boolean", + "default": true + }, + "asEP_REQUIRE_ENUM_SCOPE": { + "type": "boolean", + "default": true + }, + "asEP_SCRIPT_SCANNER": { + "type": "integer", + "default": 1, + "enum": [ + 0, + 1 + ] + }, + "asEP_INCLUDE_JIT_INSTRUCTIONS": { + "type": "boolean", + "default": false + }, + "asEP_STRING_ENCODING": { + "type": "integer", + "default": 0, + "enum": [ + 0, + 1 + ] + }, + "asEP_PROPERTY_ACCESSOR_MODE": { + "type": "integer", + "default": 3, + "enum": [ + 0, + 1, + 2, + 3 + ] + }, + "asEP_EXPAND_DEF_ARRAY_TO_TMPL": { + "type": "boolean", + "default": false + }, + "asEP_AUTO_GARBAGE_COLLECT": { + "type": "boolean", + "default": true + }, + "asEP_DISALLOW_GLOBAL_VARS": { + "type": "boolean", + "default": false + }, + "asEP_ALWAYS_IMPL_DEFAULT_CONSTRUCT": { + "type": "boolean", + "default": false + }, + "asEP_COMPILER_WARNINGS": { + "type": "integer", + "default": 1, + "enum": [ + 0, + 1, + 2 + ] + }, + "asEP_DISALLOW_VALUE_ASSIGN_FOR_REF_TYPE": { + "type": "boolean", + "default": false + }, + "asEP_ALTER_SYNTAX_NAMED_ARGS": { + "type": "integer", + "default": 0, + "enum": [ + 0, + 1, + 2 + ] + }, + "asEP_DISABLE_INTEGER_DIVISION": { + "type": "boolean", + "default": false + }, + "asEP_DISALLOW_EMPTY_LIST_ELEMENTS": { + "type": "boolean", + "default": false + }, + "asEP_PRIVATE_PROP_AS_PROTECTED": { + "type": "boolean", + "default": false + }, + "asEP_ALLOW_UNICODE_IDENTIFIERS": { + "type": "boolean", + "default": false + }, + "asEP_HEREDOC_TRIM_MODE": { + "type": "integer", + "default": 1, + "enum": [ + 0, + 1, + 2 + ] + }, + "asEP_MAX_NESTED_CALLS": { + "type": "integer", + "default": 100 + }, + "asEP_GENERIC_CALL_MODE": { + "type": "integer", + "default": 1, + "enum": [ + 0, + 1 + ] + }, + "asEP_INIT_STACK_SIZE": { + "type": "integer", + "default": 4096 + }, + "asEP_INIT_CALL_STACK_SIZE ": { + "type": "integer", + "default": 10 + }, + "asEP_MAX_CALL_STACK_SIZE": { + "type": "integer", + "default": 0 + } + }, + "additionalProperties": false } } }, @@ -90,4 +254,4 @@ "@typescript-eslint/parser": "^2.3.0", "typescript": "^4.0.2" } -} +} \ No newline at end of file diff --git a/server/src/server.ts b/server/src/server.ts index 0a6397b..ad1b599 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -116,6 +116,17 @@ connection.onInitialized(() => { } }); + connection.workspace.getConfiguration('angelscript-languageserver.engine-settings').then((config) => { + for (const key in config) { + if (Object.prototype.hasOwnProperty.call(config, key)) { + const element = config[key]; + let keyValue : NativeWrapper.ASEngineProperty = NativeWrapper.ASEngineProperty[key as keyof typeof NativeWrapper.ASEngineProperty]; + database.setEngineProperty(keyValue, element); + } + } + }); + + 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 a42cbd2..df8dc45 100644 --- a/server/src/src/Database.cpp +++ b/server/src/src/Database.cpp @@ -6,13 +6,12 @@ #include "ASTypeDefParser/Parser.hpp" Napi::Object Database::Init(Napi::Env env, Napi::Object exports) { - Napi::Function func = - DefineClass(env, "Database", - {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)}); + Napi::Function func = DefineClass( + env, "Database", + {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(); *constructor = Napi::Persistent(func); @@ -30,14 +29,9 @@ void Database::SetupEngine() { _engine = asCreateScriptEngine(); _builder = {}; _engine->SetMessageCallback(asMETHOD(Database, MessageCallback), this, asCALL_THISCALL); - _engine->SetEngineProperty(asEP_DISALLOW_EMPTY_LIST_ELEMENTS, true); - _engine->SetEngineProperty(asEP_DISALLOW_VALUE_ASSIGN_FOR_REF_TYPE, false); - _engine->SetEngineProperty(asEP_ALLOW_UNSAFE_REFERENCES, true); - _engine->SetEngineProperty(asEP_ALWAYS_IMPL_DEFAULT_CONSTRUCT, true); - _engine->SetEngineProperty(asEP_AUTO_GARBAGE_COLLECT, false); - _engine->SetEngineProperty(asEP_REQUIRE_ENUM_SCOPE, true); - _engine->SetEngineProperty(asEP_PROPERTY_ACCESSOR_MODE, 2); - _engine->SetEngineProperty(asEP_COMPILER_WARNINGS, 2); + for (auto& prop : _engineProperties) { + _engine->SetEngineProperty(prop.first, prop.second); + } for (auto& flag : _defines) { _builder.DefineWord(flag.c_str()); } @@ -46,20 +40,22 @@ void Database::SetupEngine() { _builder.StartNewModule(_engine, "Module"); } -Database::Database(const Napi::CallbackInfo& info) : ObjectWrap(info) { - Reset(info); -} +Database::Database(const Napi::CallbackInfo& info) : ObjectWrap(info) { Reset(info); } void Database::SetEngineProperty(const Napi::CallbackInfo& info) { auto property = info[0].As().Int32Value(); - auto value = info[1].As().Int32Value(); - - _engine->SetEngineProperty(static_cast(property), value); + if (info[1].IsBoolean()) { + auto value = info[1].As().Value(); + _engineProperties[(asEEngineProp)property] = value; + } else { + auto value = info[1].As().Int32Value(); + _engineProperties[(asEEngineProp)property] = value; + } } void Database::Reset(const Napi::CallbackInfo&) { std::lock_guard lck(_lock); - if (_engine != nullptr){ + if (_engine != nullptr) { _engine->DiscardModule("Module"); _engine->Release(); } diff --git a/server/src/src/Database.hpp b/server/src/src/Database.hpp index 2095813..bb1b6e7 100644 --- a/server/src/src/Database.hpp +++ b/server/src/src/Database.hpp @@ -13,6 +13,7 @@ private: CScriptBuilder _builder; ASTypeDefParser::TypeDefResult _result; std::vector _defines; + std::unordered_map _engineProperties; std::vector _messages; std::mutex _lock;