diff --git a/.vscode/settings.json b/.vscode/settings.json index 7ae39e0..d2113a3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -75,7 +75,14 @@ "thread": "cpp", "bitset": "cpp", "regex": "cpp", - "cstdbool": "cpp" + "cstdbool": "cpp", + "complex": "cpp", + "set": "cpp", + "unordered_set": "cpp", + "future": "cpp", + "queue": "cpp", + "stack": "cpp", + "stdfloat": "cpp" }, "clangd.fallbackFlags": [ "-Iinclude" diff --git a/src/compiler/parser.cpp b/src/compiler/parser.cpp index 95d7500..d6703cd 100644 --- a/src/compiler/parser.cpp +++ b/src/compiler/parser.cpp @@ -223,7 +223,7 @@ namespace Tesses::CrossLang } this->EnsureSymbol(">"); - if(tagName != "if" && tagName != "true" && tagName != "false" && tagName != "for" && tagName != "while" && tagName != "do" && tagName != "each" && tagName != "null") + if(tagName != "if" && tagName != "true" && tagName != "false" && tagName != "for" && tagName != "while" && tagName != "do" && tagName != "each" && tagName != "null" && tagName != "return") { std::string myVal = ""); + std::vector _nodes; + parseFn(_nodes,"return"); + nodes.push_back(AdvancedSyntaxNode::Create(ScopeNode,false,_nodes)); + } else if(tagName == "while") { @@ -448,6 +455,7 @@ namespace Tesses::CrossLang nodes.push_back(AdvancedSyntaxNode::Create(EachStatement,false,{item,list,body})); } + else { std::string s = "<"; @@ -1476,6 +1484,7 @@ namespace Tesses::CrossLang EnsureSymbol(":"); return r; } + if(IsIdentifier("return")) { SyntaxNode v = Undefined(); @@ -1486,6 +1495,22 @@ namespace Tesses::CrossLang } return AdvancedSyntaxNode::Create(ReturnStatement,false,{v}); } + if(IsSymbol("<",false) && this->i+1 < this->tokens.size() && this->tokens[this->i+1].type == LexTokenType::Identifier && this->tokens[this->i+1].text == "return") + { + this->i++; + uint32_t htmlId = NewId(); + std::string compHtml = "__compGenHtml"; + compHtml.append(std::to_string(htmlId)); + std::vector syntaxNode = { + compHtml + }; + ParseHtml(syntaxNode,compHtml); + + auto thytoken = AdvancedSyntaxNode::Create(HtmlRootExpression,true,syntaxNode); + + return AdvancedSyntaxNode::Create(ReturnStatement,false,{thytoken}); + + } if(IsIdentifier("yield")) { diff --git a/src/runtime_methods/class.cpp b/src/runtime_methods/class.cpp index ea9a669..c228dc9 100644 --- a/src/runtime_methods/class.cpp +++ b/src/runtime_methods/class.cpp @@ -48,6 +48,33 @@ namespace Tesses::CrossLang ls.GetGC()->BarrierEnd(); return list; } + static TList* ClassInstanceToList(GCList& ls, TClassObject* co) + { + TList* list=TList::Create(ls); + ls.GetGC()->BarrierBegin(); + for(auto& item : co->entries) + { + if(item.modifier == TClassModifier::Public) + { + list->Add(TDictionary::Create(ls, { + TDItem( + "Name", item.name + ), + TDItem( + "IsFunction", !item.canSet + ), + TDItem( + "Owner", item.owner + ), + TDItem( + "Value", item.value + ) + })); + } + } + ls.GetGC()->BarrierEnd(); + return list; + } TObject GetClassInfo(GCList& ls,TFile* f, uint32_t index) { return TDictionary::Create(ls,{ @@ -233,6 +260,24 @@ namespace Tesses::CrossLang } return ""; }); + + + cls->DeclareFunction(gc, "GetInstanceInfo", "Get the instance specific info, including current values", {}, [](GCList& ls, std::vector args)->TObject { + TClassObject* co; + if(GetArgumentHeap(args, 0, co)) + { + return TDictionary::Create(ls, + { + TDItem("Name", co->name), + TDItem("File", co->file), + TDItem("ClassIndex", (int64_t)co->classIndex), + TDItem("InheritList", VectorOfStringToList(ls, co->inherit_tree)), + TDItem("Entries", ClassInstanceToList(ls,co)) + } + ); + } + return nullptr; + }); gc->BarrierEnd(); } diff --git a/src/types/class.cpp b/src/types/class.cpp index 1bdaa18..12ddc57 100644 --- a/src/types/class.cpp +++ b/src/types/class.cpp @@ -109,7 +109,7 @@ namespace Tesses::CrossLang { obj->inherit_tree.push_back(JoinPeriod(clsCur->inherits)); size_t idx; - if(rEnv->TryFindClass(clsCur->name,idx)) + if(rEnv->TryFindClass(clsCur->inherits,idx)) { auto file = rEnv->classes[idx].first; clsCur = &rEnv->classes[idx].first->classes.at(rEnv->classes[idx].second);