TSClass* RegisterEnum(TClassRegistryParams& params, const char* source) { auto syntax = params.syntax; TClass* cl = new TClass(syntax->base_class.get()); syntax->base_class->AddNested(cl); syntax->lexer.ParseSource(source); cl->AnalyzeSyntax(syntax->lexer); syntax->lexer.GetToken(TTokenType::Done); TSClass* scl = new TSClass(syntax->sem_base_class.get(), cl); syntax->sem_base_class->AddClass(scl); scl->Build(); std::vector<TSClassField*> static_fields; std::vector<TSLocalVar*> static_variables; TGlobalBuildContext global_build_context(&static_fields, &static_variables); scl->LinkSignature(global_build_context); scl->InitAutoMethods(); scl->LinkBody(global_build_context); scl->CheckForErrors(); std::vector<TSClass*> owners; scl->CalculateSizes(owners); scl->CalculateMethodsSizes(); owners.clear(); syntax->sem_base_class->CalculateSizes(owners);//т.к. в этом классе могут использоваться другие шаблонные класса, реализацию которых нужно обновить InitializeStaticClassFields(static_fields, *params.static_objects); InitializeStaticVariables(static_variables, *params.static_objects); return scl; }
ISClass* SAnalyzeExternalClass(Lexer::ILexer* lexer, SyntaxApi::IClass* base_class, SemanticApi::ISClass* _sbase_class, TExternalClassDecl decl, TGlobalBuildContext build_context, std::vector<SemanticApi::TExternalSMethod> external_classes_bindings, int& curr_bind) { auto sbase_class = dynamic_cast<TSClass*>(_sbase_class); lexer->ParseSource(decl.source.c_str()); auto cl = SyntaxApi::AnalyzeNestedClass(lexer, base_class); TSClass* scl = new TSClass(sbase_class, cl); sbase_class->AddClass(scl); scl->Build(); scl->LinkSignature(build_context); scl->SetSize(decl.size); if (scl->GetType() == SemanticApi::TNodeWithTemplatesType::Template) scl->SetAutoMethodsInitialized(); else scl->InitAutoMethods(); //scl->CalculateMethodsSizes(); //TODO проверка что заданы все external_func scl->SetExternal(external_classes_bindings, curr_bind); return scl; }