diff --git a/src/ast/lang/property_validator_language.nim b/src/ast/lang/property_validator_language.nim index e884395d..06f94c33 100644 --- a/src/ast/lang/property_validator_language.nim +++ b/src/ast/lang/property_validator_language.nim @@ -2,6 +2,7 @@ import std/[tables, strformat, options, json] import misc/[id, util, custom_logger, custom_async] import ui/node import ast/[model, cells, cell_builder_database, base_language] +import workspaces/[workspace] import lang_language, cell_language export id, ast_ids @@ -31,36 +32,36 @@ scopeComputers[IdPropertyValidatorDefinition] = proc(ctx: ModelComputationContex return nodes -var propertyValidatorLanguage*: Future[Language] = nil -proc createPropertyValidatorLanguage(): Future[Language] {.async.} = - let cellLanguage = cell_language.cellLanguage.await +proc resolveLanguage(project: Project, workspace: WorkspaceFolder, id: LanguageId): Future[Option[Language]] {.async.} = + if id == IdLangLanguage: + assert lang_language.langLanguage.isNotNil + return lang_language.langLanguage.some + if id == IdCellLanguage: + let cellLanguage = cell_language.cellLanguage.await + assert cellLanguage.isNotNil + return cellLanguage.some + if id == IdBaseInterfaces: + assert base_language.baseInterfaces.isNotNil + return base_language.baseInterfaces.some + else: + log lvlError, "createPropertyValidatorLanguage::resolveLanguage: unknown language id: ", id - proc resolveLanguage(id: LanguageId): Option[Language] = - if id == IdLangLanguage: - assert lang_language.langLanguage.isNotNil - return lang_language.langLanguage.some - if id == IdCellLanguage: - assert cellLanguage.isNotNil - return cellLanguage.some - if id == IdBaseInterfaces: - assert base_language.baseInterfaces.isNotNil - return base_language.baseInterfaces.some - else: - log lvlError, "createPropertyValidatorLanguage::resolveLanguage: unknown language id: ", id +proc resolveModel(project: Project, workspace: WorkspaceFolder, id: ModelId): Future[Option[Model]] {.async.} = + assert baseInterfacesModel.isNotNil + if id == baseInterfacesModel.id: + return baseInterfacesModel.some + if id == baseLanguageModel.id: + return baseLanguageModel.some + log lvlError, fmt"createPropertyValidatorLanguage::resolveModel: unknown model id: {id}" - proc resolveModel(project: Project, id: ModelId): Option[Model] = - assert baseInterfacesModel.isNotNil - if id == baseInterfacesModel.id: - return baseInterfacesModel.some - if id == baseLanguageModel.id: - return baseLanguageModel.some - log lvlError, fmt"createPropertyValidatorLanguage::resolveModel: unknown model id: {id}" +var propertyValidatorLanguage*: Future[Language] = nil +proc createPropertyValidatorLanguage(): Future[Language] {.async.} = let model = newModel(IdPropertyValidatorLanguage.ModelId) model.addLanguage(lang_language.langLanguage) const jsonText = staticRead "../model/lang/property-validator.ast-model" - if not model.loadFromJson("model/lang/property-validator.ast-model", jsonText.parseJson, resolveLanguage, resolveModel): + if not model.loadFromJsonAsync(nil, nil, "model/lang/property-validator.ast-model", jsonText.parseJson, resolveLanguage, resolveModel).await: log lvlError, "Failed to load property validator model" return Language nil diff --git a/src/ast/model.nim b/src/ast/model.nim index 410abe95..59173cc3 100644 --- a/src/ast/model.nim +++ b/src/ast/model.nim @@ -1289,16 +1289,17 @@ proc loadFromJson*(project: Project, json: JsonNode, opt = Joptions()): bool = proc loadFromJsonAsync*(model: Model, project: Project, workspace: WorkspaceFolder, path: string, json: JsonNode, resolveLanguage: proc(project: Project, workspace: WorkspaceFolder, id: LanguageId): Future[Option[Language]], resolveModel: proc(project: Project, workspace: WorkspaceFolder, id: ModelId): Future[Option[Model]], - opt = Joptions()): Future[void] {.async.} = + opt = Joptions()): Future[bool] {.async.} = model.path = path if json.kind != JObject: log(lvlError, fmt"Expected JObject") - return + return false if json.hasKey("id"): model.id = json["id"].jsonTo ModelId else: log(lvlError, fmt"Missing id") + return false if json.hasKey("languages"): for languageIdJson in json["languages"]: @@ -1307,6 +1308,7 @@ proc loadFromJsonAsync*(model: Model, project: Project, workspace: WorkspaceFold model.addLanguage(language) else: log(lvlError, fmt"Unknown language {id}") + return false else: log(lvlWarn, fmt"Missing languages") @@ -1318,6 +1320,7 @@ proc loadFromJsonAsync*(model: Model, project: Project, workspace: WorkspaceFold model.addImport(m) else: log(lvlError, fmt"Unknown model {id}") + return false if json.hasKey("rootNodes"): for node in json["rootNodes"]: @@ -1325,9 +1328,12 @@ proc loadFromJsonAsync*(model: Model, project: Project, workspace: WorkspaceFold model.addRootNode(node) else: log(lvlError, fmt"Failed to parse root node from json") + return false else: log(lvlWarn, fmt"Missing root nodes") + return true + proc loadFromJson*(model: Model, path: string, json: JsonNode, resolveLanguage: proc(id: LanguageId): Option[Language], resolveModel: proc(project: Project, id: ModelId): Option[Model], diff --git a/src/ast/model_document.nim b/src/ast/model_document.nim index c8b2ac06..1bc1255d 100644 --- a/src/ast/model_document.nim +++ b/src/ast/model_document.nim @@ -572,8 +572,7 @@ proc loadModelAsync(project: Project, ws: WorkspaceFolder, path: string): Future let json = jsonText.parseJson var model = newModel() - await model.loadFromJsonAsync(project, ws, path, json, resolveLanguage, resolveModel) - if model.id.isNone: + if not model.loadFromJsonAsync(project, ws, path, json, resolveLanguage, resolveModel).await: log lvlError, fmt"Failed to load model: no id" return Model.none