mirror of
https://onedev.site.tesses.net/crosslang
synced 2026-02-08 09:05:46 +00:00
Fix classes and add instance info
This commit is contained in:
9
.vscode/settings.json
vendored
9
.vscode/settings.json
vendored
@@ -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"
|
||||
|
||||
@@ -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 = "</";
|
||||
myVal += tagName;
|
||||
@@ -363,6 +363,13 @@ namespace Tesses::CrossLang
|
||||
nodes.push_back(AdvancedSyntaxNode::Create(ScopeNode,false,_nodes));
|
||||
|
||||
}
|
||||
else if(tagName == "return")
|
||||
{
|
||||
EnsureSymbol(">");
|
||||
std::vector<SyntaxNode> _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> syntaxNode = {
|
||||
compHtml
|
||||
};
|
||||
ParseHtml(syntaxNode,compHtml);
|
||||
|
||||
auto thytoken = AdvancedSyntaxNode::Create(HtmlRootExpression,true,syntaxNode);
|
||||
|
||||
return AdvancedSyntaxNode::Create(ReturnStatement,false,{thytoken});
|
||||
|
||||
}
|
||||
|
||||
if(IsIdentifier("yield"))
|
||||
{
|
||||
|
||||
@@ -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<TObject> 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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user