/// <summary> /// Run statement, /// a second pass will be done after the visit is over to determine if a run is /// internal or external (calling internal proc or programs) /// </summary> /// <param name="pars"></param> public void Visit(ParsedRun pars) { // try to find the file in the propath if (pars.Flags.HasFlag(ParseFlag.Persistent) && !pars.Flags.HasFlag(ParseFlag.Uncertain)) { string procName = pars.Name.ToLower(); string fullFilePath; if (!procName.EndsWith(".p") && !procName.EndsWith(".w")) { fullFilePath = ProEnvironment.Current.FindFirstFileInEnv(pars.Name + ".p"); if (String.IsNullOrEmpty(fullFilePath)) { fullFilePath = ProEnvironment.Current.FindFirstFileInEnv(pars.Name + ".w"); } } else { fullFilePath = ProEnvironment.Current.FindFirstFileInEnv(pars.Name); } if (String.IsNullOrEmpty(fullFilePath)) { pars.Flags |= ParseFlag.NotFound; } else { // if the run is PERSISTENT, we need to load the functions/proc of the program // ensure to not parse the same file twice in a parser session! if (!RunPersistentFiles.Contains(fullFilePath)) { RunPersistentFiles.Add(fullFilePath); LoadProcPersistent(fullFilePath, pars.Scope); } } } // to code explorer var internalRun = _parser.ParsedItemsList.Exists(item => { var proc = item as ParsedProcedure; return(proc != null && proc.Name.EqualsCi(pars.Name)); }); var parentNode = internalRun ? GetExplorerListNode("Run internal routine", CodeExplorerIconType.RunInternal) : GetExplorerListNode("Run external procedure", CodeExplorerIconType.RunExternal); var newNode = CodeItem.Factory.New(internalRun ? CodeExplorerIconType.RunInternal : CodeExplorerIconType.RunExternal); newNode.DisplayText = pars.Name; newNode.Flags = pars.Flags; newNode.SubText = pars.Scope.Name; newNode.DocumentOwner = pars.FilePath; newNode.GoToLine = pars.Line; newNode.GoToColumn = pars.Column; PushToCodeExplorer(parentNode, newNode); }
public void Visit(ParsedRun pars) { AppendEverything(pars); }