/// <summary> /// Returns DEEP COPY of a 'real' compiled constant. /// </summary> /// <param name="exp"></param> /// <returns></returns> public Expression GetCompiledConstValue(ConstInfo constant) { ConstInfo targetConstInfo = constant.SF.SI.FindLocalConst(constant.Name); // find actual instance! ScriptFile targetSF = targetConstInfo.SF; // SF in ConstInfo is not valid!! It has always reference to original SF!! ScriptFile overwriteSF = _overwriteSFList.Find(a => a == targetConstInfo.SF); // ConstInfo have always reference to original SF if (overwriteSF != null) { targetConstInfo = overwriteSF.SI.FindLocalConst(targetConstInfo.Name); targetSF = overwriteSF; } if (targetSF.SI.IsCompiled) { return(targetConstInfo.Value); } else if (targetSF != _sf) { if (!targetSF.PrepareCompileSC()) { throw new ApplicationException("Could not compile " + targetSF.ToString()); } return(targetSF.SC.CompileTree.GetCompiledConstValue(targetConstInfo)); } else // ConstInfo is in current SI { return(GetCompiledConstValue(targetConstInfo.ConstDef.OriginalContent)); } }
/// <summary> /// Returns DEEP COPY of a 'real' compiled constant. /// </summary> /// <param name="exp"></param> /// <returns></returns> public Expression GetCompiledConstValue(Expression exp) { Expression content = (Expression)exp.CreateCopy(); MoveInfo expTree = new MoveInfo(content, SearchTree.ContentTree, 0, _sf); IElement curElem = expTree.Find(SearchDirection.LeftToRight, SearchVisibility.Visible); while (curElem != null) { if (curElem is FuncCall) { ((FuncCall)curElem).Compile_SpecifyPath(this); } else if (curElem is DelegateDef) { ((DelegateDef)curElem).Compile_SpecifyPath(this); } else if (curElem is ConstName) { ConstName constName = (ConstName)curElem; IElement finalExp = null; OverwriteConstDef overwriteConst = OverwriteConstDefList.Find(a => a.ConstInfo.Compare(constName.ConstInfo)); if (overwriteConst != null) { finalExp = overwriteConst.OriginalContent; } else { ConstInfo targetConstInfo = constName.ConstInfo; if (targetConstInfo.SF.SI.IsGlobal) { finalExp = GetGlobalConstContent(constName); } else { finalExp = GetCompiledConstValue(targetConstInfo); } } expTree.ReplaceCurrent(finalExp); } else if (curElem is UsingName) { UsingName usingName = (UsingName)curElem; string finalSFPath = GetActualSFPath(usingName.UsingInfo.SFPath); expTree.ReplaceCurrent(new Path(usingName.UsingInfo.SFPath, finalSFPath)); } else if (curElem is Path) { string originalPath = ((Path)curElem).OriginalPath; string finalSFPath = GetActualSFPath(originalPath); ((Path)curElem).Update(finalSFPath); } curElem = expTree.FindNextBlack(SearchDirection.LeftToRight); } return(content); }
/// <summary> /// Create a deep copy of all children and attributes. /// </summary> /// <param name="sf"></param> /// <returns></returns> public BaseTree CreateCopy(ScriptFile sf) { List <IElement> newChildren = new List <IElement>(children.Count); foreach (IElement e in children) { newChildren.Add(e.CreateCopy()); } BaseTree bt = new BaseTree(newChildren); bt._sf = sf; bt.IncludeDefList = new List <PreProcessorInclude>(); bt.FuncDefList = new List <FuncDef>(); bt.ConstDefList = new List <ConstDef>(); bt.UsingDefList = new List <UsingDef>(); bt.OverwriteConstDefList = new List <OverwriteConstDef>(); // find defs... MoveInfo btInfo = new MoveInfo(bt, SearchTree.ChildrenBlock, 0, sf); IElement curElem = btInfo.Find(SearchDirection.LeftToRight, SearchVisibility.Visible); while (curElem != null) { if (curElem is PreProcessorInclude) { bt.IncludeDefList.Add((PreProcessorInclude)curElem); } if (curElem is FuncDef) { bt.FuncDefList.Add((FuncDef)curElem); } else if (curElem is ConstDef) { bt.ConstDefList.Add((ConstDef)curElem); // update SI def ConstInfo cInfo = sf.SI.FindLocalConst(((ConstDef)curElem).ConstInfo.Name); cInfo.ConstDef = (ConstDef)curElem; } else if (curElem is UsingDef) { bt.UsingDefList.Add((UsingDef)curElem); } else if (curElem is OverwriteConstDef) { bt.OverwriteConstDefList.Add((OverwriteConstDef)curElem); } curElem = btInfo.FindNextBlack(SearchDirection.LeftToRight); } return(bt); }
/// <summary> /// Nájde funkciu v globálnych súboroch. /// </summary> /// <param name="name"></param> /// <returns></returns> public ConstInfo FindGlobalsConst(string name) { ConstInfo constant = null; foreach (ScriptFile globalFile in this.SF.Manager.GetGlobalSFs()) { constant = globalFile.SI.FindLocalConst(name); if (constant != null) { break; } } return(constant); }
/// <summary> /// Nájde konštantu v includovaných súboroch. /// </summary> /// <param name="name"></param> /// <returns></returns> public ConstInfo FindIncludesConst(string name) { ConstInfo constant = null; foreach (IncludeInfo includeInfo in this.Includes) { if (includeInfo.SF.SI == null) { continue; } constant = includeInfo.SF.SI.FindLocalConst(name); if (constant != null) { break; } } return(constant); }
private static void ReadConst(ScriptInfo SI, XmlElement constElem) { string name = string.Empty; string originalValue = string.Empty; CODSCRIPT.Content.Expression value = null; MemberAccess access = MemberAccess.Public; string summary = string.Empty; bool isSealed = false; name = constElem.GetAttribute("name"); access = (MemberAccess)Enum.Parse(typeof(MemberAccess), constElem.GetAttribute("access")); string sealedStr = constElem.GetAttribute("sealed"); isSealed = String.IsNullOrEmpty(sealedStr) ? false : Boolean.Parse(sealedStr); foreach (XmlElement curElem in constElem.ChildNodes.OfType <XmlElement>()) { if (curElem.Name == "summary") { summary = curElem.InnerText; } else if (curElem.Name == "originalValue") { originalValue = curElem.InnerText; } else if (curElem.Name == "value") { value = CODSCRIPT.Content.Expression.FromXML(curElem); } else { throw new XmlException("Unknown ScriptInfo const node '" + curElem.Name + "'"); } } ConstInfo constInfo = new ConstInfo(SI.SF, name, originalValue, value, access, summary, isSealed, null); SI.AddConstant(constInfo); }
/// <summary> /// Nájde konštantu na všetkých dostupných miestach. /// </summary> /// <param name="name"></param> /// <returns></returns> public ConstInfo FindConst(string name) { ConstInfo constant = null; // search in local file... constant = FindLocalConst(name); if (constant != null) { return(constant); } // search in includes... constant = FindIncludesConst(name); if (constant != null) { return(constant); } // search in global files... constant = FindGlobalsConst(name); return(constant); }
public void AddConstant(ConstInfo constInfo) { Constants.Add(constInfo); localMembers = null; }
/// <summary> /// Vytvorí referenciu priamo zo SC. /// </summary> /// <param name="constInfo"></param> /// <param name="charIndex"></param> /// <param name="charLength"></param> public ConstRefInfo(ScriptFile sf, ConstInfo constInfo, int charIndex, int charLength, string codePart) : this(sf, charIndex, charLength, codePart) { this._definition = constInfo; }
public bool CompileMembers() { // replace usings & paths & constants & specify paths in constants foreach (ConstDef c in ConstDefList) { c.ReplaceMembersInContent(this); } foreach (OverwriteConstDef c in OverwriteConstDefList) { c.ReplaceMembersInContent(this); } // replace path in includes foreach (PreProcessorInclude i in IncludeDefList) { string originalPath = i.Path.OriginalPath; string finalPath = GetActualSFPath(originalPath); i.Path.Update(finalPath); } // update constants in overwritten SFs foreach (OverwriteConstDef c in OverwriteConstDefList) { ScriptFile overwriteSF = _overwriteSFList[c.ConstInfo.SF]; ConstInfo cInOverwriteSF = overwriteSF.SI.FindLocalConst(c.ConstInfo.Name); cInOverwriteSF.ConstDef.OriginalContent = c.CompiledContent; } // compile overwritten SFs foreach (ScriptFile originalSF in _overwriteSFList.Keys) { ScriptFile sf = _overwriteSFList[originalSF]; if (sf == _sf) // ignore itself { continue; } if (!sf.PrepareCompileSC()) { return(false); } if (!sf.CompileMembersSC()) { return(false); } sf.CompileCodeSC(); sf.CompileOutputSC(); } // replace usings & paths & constants in code MoveInfo treeInfo = new MoveInfo(this, SearchTree.ChildrenTree, 0, this._sf); IElement curElem = treeInfo.Find(SearchDirection.LeftToRight, SearchVisibility.Visible); while (curElem != null) { if (curElem is UsingName) { UsingName usingName = (UsingName)curElem; string finalSFPath = GetActualSFPath(usingName.UsingInfo.SFPath); treeInfo.ReplaceCurrent(new Path(usingName.UsingInfo.SFPath, finalSFPath)); } else if (curElem is Path) { string originalPath = ((Path)curElem).OriginalPath; string finalSFPath = GetActualSFPath(originalPath); ((Path)curElem).Update(finalSFPath); } else if (curElem is ConstName) { ConstName constName = (ConstName)curElem; IElement finalExp = null; OverwriteConstDef overwriteConst = OverwriteConstDefList.Find(a => a.ConstInfo.Compare(constName.ConstInfo)); if (overwriteConst != null) { finalExp = overwriteConst.OriginalContent; } else { ConstInfo targetConstInfo = constName.ConstInfo; if (targetConstInfo.SF.SI.IsGlobal) { finalExp = GetGlobalConstContent(constName); } else { finalExp = GetCompiledConstValue(targetConstInfo); } } treeInfo.ReplaceCurrent(finalExp); } curElem = treeInfo.FindNextBlack(SearchDirection.LeftToRight); } return(true); }