Beispiel #1
0
        /// <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));
            }
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
        /// <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);
        }
Beispiel #5
0
        /// <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);
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        /// <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);
        }
Beispiel #8
0
 public void AddConstant(ConstInfo constInfo)
 {
     Constants.Add(constInfo);
     localMembers = null;
 }
Beispiel #9
0
 /// <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;
 }
Beispiel #10
0
        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);
        }