forked from MapComplete/MapComplete
		
	Add validation warning: a condition which conflicts with a mapping will now emit a warning.
This commit is contained in:
		
							parent
							
								
									a1de3b81ea
								
							
						
					
					
						commit
						600727e820
					
				
					 1 changed files with 53 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -561,6 +561,57 @@ export class DetectNonErasedKeysInMappings extends DesugaringStep<QuestionableTa
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export class DetectMappingsShadowedByCondition extends DesugaringStep<TagRenderingConfigJson> {
 | 
			
		||||
 | 
			
		||||
    constructor() {
 | 
			
		||||
        super("Checks that, if the tagrendering has a condition, that a mapping is not contradictory to it, i.e. that there are no dead mappings", [], "DetectMappingsShadowedByCondition")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * const validator = new DetectMappingsShadowedByCondition()
 | 
			
		||||
     * const ctx = ConversionContext.construct([],["test"])
 | 
			
		||||
     * validator.convert({
 | 
			
		||||
     *     condition: "count>0",
 | 
			
		||||
     *     mappings:[
 | 
			
		||||
     *         {
 | 
			
		||||
     *             if: "count=0",
 | 
			
		||||
     *             then:{
 | 
			
		||||
     *                 en: "No count"
 | 
			
		||||
     *             }
 | 
			
		||||
     *         }
 | 
			
		||||
     *     ]
 | 
			
		||||
     * }, ctx)
 | 
			
		||||
     * ctx.hasErrors() // => true
 | 
			
		||||
     */
 | 
			
		||||
    convert(json: TagRenderingConfigJson, context: ConversionContext): TagRenderingConfigJson {
 | 
			
		||||
        if(!json.condition && !json.metacondition){
 | 
			
		||||
            return json
 | 
			
		||||
        }
 | 
			
		||||
        if(!json.mappings || json.mappings?.length ==0){
 | 
			
		||||
            return json
 | 
			
		||||
        }
 | 
			
		||||
        let conditionJson = json.condition ?? json.metacondition
 | 
			
		||||
        if(json.condition !== undefined && json.metacondition !== undefined){
 | 
			
		||||
            conditionJson = {and: [json.condition, json.metacondition]}
 | 
			
		||||
        }
 | 
			
		||||
        const condition = TagUtils.Tag(conditionJson, context.path.join("."))
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < json.mappings.length; i++){
 | 
			
		||||
            const mapping = json.mappings[i]
 | 
			
		||||
            const tagIf = TagUtils.Tag(mapping.if, context.path.join("."))
 | 
			
		||||
            const optimized = new And([tagIf, condition]).optimize()
 | 
			
		||||
            if(optimized === false){
 | 
			
		||||
                context.enters("mappings",i).warn("Detected a conflicting mapping and condition. The mapping requires tags " + tagIf.asHumanString()+", yet this can never happen because the set condition requires "+condition.asHumanString())
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        return undefined
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export class DetectShadowedMappings extends DesugaringStep<TagRenderingConfigJson> {
 | 
			
		||||
    private readonly _calculatedTagNames: string[]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1079,6 +1130,8 @@ export class ValidateTagRenderings extends Fuse<TagRenderingConfigJson> {
 | 
			
		|||
            "Various validation on tagRenderingConfigs",
 | 
			
		||||
            new MiscTagRenderingChecks(),
 | 
			
		||||
            new DetectShadowedMappings(layerConfig),
 | 
			
		||||
 | 
			
		||||
            new DetectMappingsShadowedByCondition(),
 | 
			
		||||
            new DetectConflictingAddExtraTags(),
 | 
			
		||||
            // TODO enable   new DetectNonErasedKeysInMappings(),
 | 
			
		||||
            new DetectMappingsWithImages(doesImageExist),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue