FocusAnalysisData.java

package dev.civl.abc.analysis.IF;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

import dev.civl.abc.ast.node.IF.expression.ExpressionNode;
import dev.civl.abc.token.IF.SyntaxException;

public class FocusAnalysisData {
	public class TagData {
		public TagData(String focusTag) {
			focusVarName = "$focus_"+focusTag;
			altFocusVarName = "$_focus_"+focusTag;
		}
		String focusVarName;
		String altFocusVarName;
		SortedSet<Integer> offsets = new TreeSet<>();
		List<ExpressionNode> protectedMemExprs = new ArrayList<>();
	}
	private HashMap<String, TagData> tagMap;

	public FocusAnalysisData() {
		tagMap = new HashMap<String, TagData>();
	}

	/**
	 * Adds a new tag entry into the tagMap if not previously there. If one did
	 * not already exist then an insert transformer is added at the top of the
	 * AST to insert the tag's corresponding focus variables.
	 * 
	 * @param tag
	 *            The tag that this new data pertains to.
	 */
	public void addFocusTag(String tag)
			throws SyntaxException {
		if (!tagMap.containsKey(tag)) {
			TagData newData = new TagData(tag);
			tagMap.put(tag, newData);
		}
	}

	public void addFocusOffset(String tag, int offset) {
		TagData data = tagData(tag);
		data.offsets.add(offset);
	}
	
	public SortedSet<Integer> getFocusOffsets(String tag) {
		return tagData(tag).offsets;
	}

	public void addProtectedMemExpr(String tag, ExpressionNode expr) {
		tagData(tag).protectedMemExprs.add(expr);
	}

	public List<ExpressionNode> getProtectedMemExprs(String tag) {
		return tagData(tag).protectedMemExprs;
	}

	private TagData tagData(String tag) {
		return tagMap.get(tag);
	}

	public String getVarNameFromTag(String tag) {
		return tagData(tag).focusVarName;
	}
	
	public String getAltVarNameFromTag(String tag) {
		return tagData(tag).altFocusVarName;
	}

	public Set<String> getFocusTags() {
		return tagMap.keySet();
	}
}