Improve error message when merging an override fails

This commit is contained in:
Pieter Vander Vennet 2024-04-22 23:43:30 +02:00
parent b484ea005b
commit f2d4458e15
4 changed files with 25 additions and 13 deletions

View file

@ -1,4 +1,5 @@
import { ConversionMessage, ConversionMsgLevel } from "./Conversion" import { ConversionMessage, ConversionMsgLevel } from "./Conversion"
import { Utils } from "../../../Utils"
export class ConversionContext { export class ConversionContext {
private static reported = false private static reported = false
@ -148,4 +149,18 @@ export class ConversionContext {
debug(message: string) { debug(message: string) {
this.messages.push({ context: this, level: "debug", message }) this.messages.push({ context: this, level: "debug", message })
} }
/**
* Exactly the same as Utils.Merge, except that it wraps the error message
* @param source
* @param target
* @constructor
*/
MergeObjectsForOverride<T, S>(source: Readonly<S>, target: T): T & S {
try{
return Utils.Merge(source,target)
}catch (e) {
this.err("Could not apply an override: due to "+e+"\n\tHINT: did you just pull changes from the repository or switch branches? Try 'npm run reset:layeroverview'")
}
}
} }

View file

@ -212,7 +212,7 @@ class ExpandTagRendering extends Conversion<
return result return result
} }
private lookup(name: string): TagRenderingConfigJson[] | undefined { private lookup(name: string, ctx: ConversionContext): TagRenderingConfigJson[] | undefined {
const direct = this.directLookup(name) const direct = this.directLookup(name)
if (direct === undefined) { if (direct === undefined) {
@ -224,13 +224,13 @@ class ExpandTagRendering extends Conversion<
if (nm !== undefined) { if (nm !== undefined) {
let indirect: TagRenderingConfigJson[] let indirect: TagRenderingConfigJson[]
if (typeof nm === "string") { if (typeof nm === "string") {
indirect = this.lookup(nm) indirect = this.lookup(nm, ctx)
} else { } else {
indirect = [].concat(...nm.map((n) => this.lookup(n))) indirect = [].concat(...nm.map((n) => this.lookup(n, ctx)))
} }
for (let foundTr of indirect) { for (let foundTr of indirect) {
foundTr = Utils.Clone<any>(foundTr) foundTr = Utils.Clone<any>(foundTr)
Utils.Merge(tagRenderingConfigJson["override"] ?? {}, foundTr) ctx.Merge(tagRenderingConfigJson["override"] ?? {}, foundTr)
foundTr["id"] = tagRenderingConfigJson["id"] ?? foundTr["id"] foundTr["id"] = tagRenderingConfigJson["id"] ?? foundTr["id"]
result.push(foundTr) result.push(foundTr)
} }
@ -318,7 +318,7 @@ class ExpandTagRendering extends Conversion<
if (typeof tr === "string") { if (typeof tr === "string") {
let lookup let lookup
if (this._state.tagRenderings !== null) { if (this._state.tagRenderings !== null) {
lookup = this.lookup(tr) lookup = this.lookup(tr, ctx)
} }
if (lookup === undefined) { if (lookup === undefined) {
if ( if (
@ -382,7 +382,7 @@ class ExpandTagRendering extends Conversion<
const trs: TagRenderingConfigJson[] = [] const trs: TagRenderingConfigJson[] = []
for (const name of names) { for (const name of names) {
const lookup = this.lookup(name) const lookup = this.lookup(name, ctx)
if (lookup === undefined) { if (lookup === undefined) {
let candidates = Array.from(state.tagRenderings.keys()) let candidates = Array.from(state.tagRenderings.keys())
if (name.indexOf(".") > 0) { if (name.indexOf(".") > 0) {
@ -433,7 +433,7 @@ class ExpandTagRendering extends Conversion<
} }
for (let foundTr of lookup) { for (let foundTr of lookup) {
foundTr = Utils.Clone<any>(foundTr) foundTr = Utils.Clone<any>(foundTr)
Utils.Merge(tr["override"] ?? {}, foundTr) ctx.MergeObjectsForOverride(tr["override"] ?? {}, foundTr)
if (names.length == 1) { if (names.length == 1) {
foundTr["id"] = tr["id"] ?? foundTr["id"] foundTr["id"] = tr["id"] ?? foundTr["id"]
} }

View file

@ -97,7 +97,7 @@ class SubstituteLayer extends Conversion<string | LayerConfigJson, LayerConfigJs
delete json["override"]["tagRenderings+"] delete json["override"]["tagRenderings+"]
} }
Utils.Merge(json["override"], found) context.MergeObjectsForOverride(json["override"], found)
layers.push(found) layers.push(found)
} catch (e) { } catch (e) {
context.err( context.err(
@ -305,7 +305,7 @@ class ApplyOverrideAll extends DesugaringStep<LayoutConfigJson> {
) )
} }
convert(json: LayoutConfigJson, _: ConversionContext): LayoutConfigJson { convert(json: LayoutConfigJson, ctx: ConversionContext): LayoutConfigJson {
const overrideAll = json.overrideAll const overrideAll = json.overrideAll
if (overrideAll === undefined) { if (overrideAll === undefined) {
return json return json
@ -324,7 +324,7 @@ class ApplyOverrideAll extends DesugaringStep<LayoutConfigJson> {
for (let layer of json.layers) { for (let layer of json.layers) {
layer = Utils.Clone(<LayerConfigJson>layer) layer = Utils.Clone(<LayerConfigJson>layer)
Utils.Merge(overrideAll, layer) ctx.MergeObjectsForOverride(overrideAll, layer)
if (tagRenderingsPlus) { if (tagRenderingsPlus) {
if (!layer.tagRenderings) { if (!layer.tagRenderings) {
layer.tagRenderings = tagRenderingsPlus layer.tagRenderings = tagRenderingsPlus

View file

@ -622,9 +622,6 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
} }
for (const key in source) { for (const key in source) {
if (!source.hasOwnProperty(key)) {
continue
}
if (key.startsWith("=")) { if (key.startsWith("=")) {
const trimmedKey = key.substr(1) const trimmedKey = key.substr(1)
target[trimmedKey] = source[key] target[trimmedKey] = source[key]