void Pdb::SetTree(const String& exp) { SaveTree(); tree.Clear(); NamedVal nv; try { CParser p(exp); nv.val = Exp(p); } catch(CParser::Error) { return; } nv.name = exp; String n = exp; if(nv.val.type >= 0) n = GetType(nv.val.type).name; tree.SetRoot(Null, RawToValue(nv), n + '=' + Visualise(nv.val).GetString()); if(nv.val.type >= 0) { String w = treetype.Get(n, Null); LOG("SetTree " << n << ' ' << w); tree.Open(0); CParser p(w); try { Point sc; sc.x = p.ReadInt(); sc.y = p.ReadInt(); int cursor = p.ReadInt(); ExpandTreeType(0, p); tree.ScrollTo(sc); if(cursor >= 0) tree.SetCursor(cursor); } catch(CParser::Error) {} } }
Value Compiler::ExeFor::Eval(ExeContext& x) const { LTIMING("ExeFor"); Value array = value->Eval(x); LLOG("ExeFor array: " << array); if(array.GetCount() == 0 && onempty) return onempty->Eval(x); ValueMap m; bool map = array.Is<ValueMap>(); if(map) m = array; int q = x.stack.GetCount(); x.stack.Add(); x.stack.Add(); for(int i = 0; i < array.GetCount(); i++) { x.stack[q] = array[i]; LoopInfo f; f.first = i == 0; f.last = i == array.GetCount() - 1; f.index = i; f.key = map ? m.GetKeys()[i] : (Value)i; x.stack[q + 1] = RawToValue(f); sCatAsString(x.out, body->Eval(x)); } x.stack.SetCount(q); return Value(); }
void Pdb::TreeNode(int parent, const String& name, Pdb::Val val) { NamedVal nv; nv.name = name; nv.val = val; tree.Add(parent, Null, RawToValue(nv), name + "=" + Visualise(val).GetString(), val.type >= 0 || val.ref > 0); }
void CheckRawValue() { typedef Tuple2<int, int> T; T x = MakeTuple(11, 22); Value v = RawToValue(x); const T& x2 = v.To<T>(); ASSERT(x2 == x); }
void UppList::Paint(Draw& w, const Rect& r, const Value& q, Color ink, Color paper, dword style) const { FileList::File file = ValueTo<FileList::File>(q); if(GetFileName(file.name) == "$.tpp" && IsFolder(file.name)) file.name = GetFileName(GetFileFolder(file.name)) + " templates"; if(file.name == ConfigFile("global.defs")) file.name = "Fixed macros"; FileList::Paint(w, r, RawToValue(file), ink, paper, style); }
void Ide::AddFoundFile(const String& fn, int ln, const String& line, int pos, int count) { ErrorInfo f; f.file = fn; f.lineno = ln; f.linepos = 0; f.kind = 0; f.message = "\1" + EditorSyntax::GetSyntaxForFilename(fn) + "\1" + AsString(pos) + "\1" + AsString(count) + "\1" + line; ffound.Add(fn, ln, f.message, RawToValue(f)); ffound.Sync(); }
void Navigator::SyncNavLines() { int sc = navlines.GetScroll(); navlines.Clear(); int ii = list.GetCursor(); if(ii >= 0 && ii < litem.GetCount()) { Vector<NavLine> l = GetNavLines(*litem[ii]); for(int i = 0; i < l.GetCount(); i++) { String p = GetSourceFilePath(l[i].file); navlines.Add(RawToValue(l[i])); } navlines.ScrollTo(sc); SyncLines(); } }
Value Compiler::ExeAdd::Eval(ExeContext& x) const { Value v1 = a->Eval(x); Value v2 = b->Eval(x); if(IsString(v1) && IsString(v2)) return (String)v1 + (String)v2; if(IsNumber(v1) && IsNumber(v2)) return (double)v1 + (double)v2; if(v1.Is<RawHtmlText>() || v2.Is<RawHtmlText>()) { RawHtmlText h; h.text = AsString(v1) + AsString(v2); return RawToValue(h); } return AsString(v1) + AsString(v2); }
void CodeBrowser::LoadScope() { String find = ToUpper((String)~search); Value key = item.GetKey(); int sc = item.GetCursorSc(); item.Clear(); if(!scope.IsCursor()) return; Value x = scope.Get(2); int file = IsNumber(x) ? (int)x : -1; String scope = file < 0 ? String(x) : String(); int q = CodeBase().Find(scope); bool filematch = file >= 0 && MatchCib(GetFileText(GetSourceFilePath(file)), find); bool scopematch = !filematch && MatchCib(scope, find); if(q >= 0) { const Array<CppItem>& n = CodeBase()[q]; VectorMap<String, bool> inherited; if(file < 0) GatherMethods(scope, inherited, false); Index<String> set; for(int i = 0; i < n.GetCount(); i++) { CppItemInfo m; (CppItem&) m = n[i]; if((find.GetCount() && m.uname.StartsWith(find) || filematch && m.file == file || scopematch) && set.Find(m.qitem) < 0) { set.Add(m.qitem); int q = inherited.Find(m.qitem); if(q >= 0) { m.over = true; m.virt = m.virt || inherited[q]; } item.Add(m.qitem, RawToValue(m)); } } } item.Sort(1, sort ? ItemCompareLexical : ItemCompare); if(item.FindSetCursor(key)) item.ScCursor(sc); // clear.Enable(IsSearch()); }
void ValuePut(Value& v, const Json& json) { RawJsonText x; x.json = json; v = RawToValue(x); }
void Ide::FindInFiles(bool replace) { CodeEditor::FindReplaceData d = editor.GetFindReplaceData(); CtrlRetriever rf; rf(ff.find, d.find) (ff.replace, d.replace) (ff.ignorecase, d.ignorecase) (ff.samecase, d.samecase) (ff.wholeword, d.wholeword) (ff.wildcards, d.wildcards) (ff.regexp, d.regexp) ; WriteList(ff.find, d.find_list); WriteList(ff.replace, d.replace_list); ff.Sync(); if(IsNull(~ff.folder)) ff.folder <<= GetUppDir(); ff.style <<= STYLE_NO_REPLACE; ff.Sync(); ff.itext = editor.GetI(); ff.Setup(replace); int c = ff.Execute(); ff.find.AddHistory(); ff.replace.AddHistory(); rf.Retrieve(); d.find_list = ReadList(ff.find); d.replace_list = ReadList(ff.replace); editor.SetFindReplaceData(d); if(c == IDOK) { ffound.HeaderTab(2).SetText("Source line"); Renumber(); ff.find.AddHistory(); ff.files.AddHistory(); ff.folder.AddHistory(); ff.replace.AddHistory(); Progress pi("Found %d files to search."); pi.AlignText(ALIGN_LEFT); Index<String> files; if(ff.workspace) { const Workspace& wspc = GetIdeWorkspace(); for(int i = 0; i < wspc.GetCount(); i++) SearchForFiles(files, GetFileFolder(PackagePath(wspc[i])), ~ff.files, ~ff.readonly, pi); } else SearchForFiles(files, NormalizePath(~~ff.folder, GetUppDir()), ~ff.files, ~ff.readonly, pi); if(!pi.Canceled()) { String pattern; RegExp rx, *regexp = NULL; if(ff.regexp) { rx.SetPattern(~ff.find); regexp = ℞ pattern = "dummy"; } else if(ff.wildcards) { String q = ~ff.find; for(const char *s = q; *s; s++) if(*s == '\\') { s++; if(*s == '\0') break; pattern.Cat(*s); } else switch(*s) { case '*': pattern.Cat(WILDANY); break; case '?': pattern.Cat(WILDONE); break; case '%': pattern.Cat(WILDSPACE); break; case '#': pattern.Cat(WILDNUMBER); break; case '$': pattern.Cat(WILDID); break; default: pattern.Cat(*s); } } else pattern = ~ff.find; pi.SetTotal(files.GetCount()); ShowConsole2(); ffound.Clear(); pi.SetPos(0); int n = 0; for(int i = 0; i < files.GetCount(); i++) { pi.SetText(files[i]); if(pi.StepCanceled()) break; if(!IsNull(pattern)) { if(!SearchInFile(files[i], pattern, ff.wholeword, ff.ignorecase, n, regexp)) break; } else { ErrorInfo f; f.file = files[i]; f.lineno = 1; f.linepos = 0; f.kind = 0; f.message = files[i]; ffound.Add(f.file, 1, f.message, RawToValue(f)); ffound.Sync(); n++; } } if(!IsNull(pattern)) ffound.Add(Null, Null, AsString(n) + " occurrence(s) have been found."); else ffound.Add(Null, Null, AsString(n) + " matching file(s) have been found."); ffound.HeaderTab(2).SetText(Format("Source line (%d)", ffound.GetCount())); } } }
operator Value() const { return RawToValue(*this); }
void Compiler::Optimize(One<Exe>& exe) { if(!exe) return; bool optimized2 = false; #ifdef _DEBUG0 String name = "Optimizing " + String(typeid(*~exe).name()); LLOGBLOCK(name); #endif do { optimized = false; Iterate(exe, THISBACK(Optimize)); if(ExeField *e = dynamic_cast<ExeField *>(~exe)) { if(ExeVar *e1 = dynamic_cast<ExeVar *>(~e->value)) { One<Exe> oxe; ExeVarField& vf = oxe.Create<ExeVarField>(); vf.id = e->id; vf.var_index = e1->var_index; exe = pick(oxe); optimized = true; LLOG("OPTIMIZED ExeVarField"); } } if(ExeLink *e = dynamic_cast<ExeLink *>(~exe)) { ExeVarField *e1; if(e->arg.GetCount() == 1 && (e1 = dynamic_cast<ExeVarField *>(~e->arg[0]))) { One<Exe> oxe; ExeLinkVarField1& o = oxe.Create<ExeLinkVarField1>(); o.id = e1->id; o.var_index = e1->var_index; o.part = e->part; exe = pick(oxe); optimized = true; LLOG("OPTIMIZED ExeLinkVarField1"); } } if(ExeBlock *e = dynamic_cast<ExeBlock *>(~exe)) { Vector< One<Exe> >& m = e->item; int i = 0; while(i < m.GetCount() - 1) { ExeConst *e1 = dynamic_cast<ExeConst *>(~m[i]); ExeConst *e2 = dynamic_cast<ExeConst *>(~m[i + 1]); if(e1 && e2 && e1->value.Is<RawHtmlText>() && e2->value.Is<RawHtmlText>()) { RawHtmlText t; t.text = ValueTo<RawHtmlText>(e1->value).text + ValueTo<RawHtmlText>(e2->value).text; One<Exe> oxe; oxe.Create<ExeConst>().value = RawToValue(t); m[i] = pick(oxe); m.Remove(i + 1); optimized = true; LLOG("OPTIMIZED ExeBlock constant folding"); } else i++; } } if(Exe2 *e = dynamic_cast<Exe2 *>(~exe)) { if(dynamic_cast<ExeConst *>(~e->a) && dynamic_cast<ExeConst *>(~e->b)) OptimizeConst(exe); } else if(Exe1 *e = dynamic_cast<Exe1 *>(~exe)) { if(dynamic_cast<ExeConst *>(~e->a)) OptimizeConst(exe); } optimized2 = optimized2 || optimized; LLOG("---------"); } while(optimized); optimized = optimized2; }