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