Editor/ink-compiler/ParsedHierarchy/ListDefinition.cs
using System;
using System.Collections.Generic;
using System.Linq;
namespace Ink.Parsed
{
public class ListDefinition : Parsed.Object
{
public Identifier identifier;
public List<ListElementDefinition> itemDefinitions;
public VariableAssignment variableAssignment;
public Runtime.ListDefinition runtimeListDefinition {
get {
var allItems = new Dictionary<string, int> ();
foreach (var e in itemDefinitions) {
if( !allItems.ContainsKey(e.name) )
allItems.Add (e.name, e.seriesValue);
else
Error("List '"+identifier+"' contains dupicate items called '"+e.name+"'");
}
return new Runtime.ListDefinition (identifier?.name, allItems);
}
}
public ListElementDefinition ItemNamed (string itemName)
{
if (_elementsByName == null) {
_elementsByName = new Dictionary<string, ListElementDefinition> ();
foreach (var el in itemDefinitions) {
_elementsByName [el.name] = el;
}
}
ListElementDefinition foundElement;
if (_elementsByName.TryGetValue (itemName, out foundElement))
return foundElement;
return null;
}
public ListDefinition (List<ListElementDefinition> elements)
{
this.itemDefinitions = elements;
int currentValue = 1;
foreach (var e in this.itemDefinitions) {
if (e.explicitValue != null)
currentValue = e.explicitValue.Value;
e.seriesValue = currentValue;
currentValue++;
}
AddContent (elements);
}
public override Runtime.Object GenerateRuntimeObject ()
{
var initialValues = new Runtime.InkList ();
foreach (var itemDef in itemDefinitions) {
if (itemDef.inInitialList) {
var item = new Runtime.InkListItem (this.identifier?.name, itemDef.name);
initialValues [item] = itemDef.seriesValue;
}
}
// Set origin name, so
initialValues.SetInitialOriginName (identifier?.name);
return new Runtime.ListValue (initialValues);
}
public override void ResolveReferences (Story context)
{
base.ResolveReferences (context);
context.CheckForNamingCollisions (this, identifier, Story.SymbolType.List);
}
public override string typeName {
get {
return "List definition";
}
}
Dictionary<string, ListElementDefinition> _elementsByName;
}
public class ListElementDefinition : Parsed.Object
{
public string name
{
get { return identifier?.name; }
}
public Identifier identifier;
public int? explicitValue;
public int seriesValue;
public bool inInitialList;
public string fullName {
get {
var parentList = parent as ListDefinition;
if (parentList == null)
throw new System.Exception ("Can't get full name without a parent list");
return parentList.identifier + "." + name;
}
}
public ListElementDefinition (Identifier identifier, bool inInitialList, int? explicitValue = null)
{
this.identifier = identifier;
this.inInitialList = inInitialList;
this.explicitValue = explicitValue;
}
public override Runtime.Object GenerateRuntimeObject ()
{
throw new System.NotImplementedException ();
}
public override void ResolveReferences (Story context)
{
base.ResolveReferences (context);
context.CheckForNamingCollisions (this, identifier, Story.SymbolType.ListItem);
}
public override string typeName {
get {
return "List element";
}
}
}
}