Browse Source

Implemented inheritance semantic for spell level configuration.
This allows more simplification.

AlexVinS 11 years ago
parent
commit
2fc16b231f
1 changed files with 15 additions and 9 deletions
  1. 15 9
      lib/CSpellHandler.cpp

+ 15 - 9
lib/CSpellHandler.cpp

@@ -868,17 +868,23 @@ void CSpellHandler::beforeValidate(JsonNode & object)
 {
 	//handle "base" level info
 	
-	JsonNode levels = object["levels"];
-	
-	if(levels["base"].getType() == JsonNode::DATA_STRUCT)
-	{
-		JsonUtils::mergeCopy(levels["none"],levels["base"]);
-		JsonUtils::mergeCopy(levels["basic"],levels["base"]);
-		JsonUtils::mergeCopy(levels["advanced"],levels["base"]);
-		JsonUtils::mergeCopy(levels["expert"],levels["base"]);
-	}
+	JsonNode& levels = object["levels"];
+	JsonNode& base = levels["base"];
 	
+	auto inheritNode = [&](JsonNode & dest){
+		//merging destination node into copy of base node implements inheritance semantic
+		//detail configuration is priority
+		//this allows more simplification
+		JsonNode inheritedNode(base);		
+		JsonUtils::merge(inheritedNode,dest);
+		dest.swap(inheritedNode);
+	};
 	
+	inheritNode(levels["none"]);
+	inheritNode(levels["basic"]);
+	inheritNode(levels["advanced"]);
+	inheritNode(levels["expert"]);
+
 }