From a7c9aa7ddb06fe14c4c67e317586177141c9e37a Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 2 Oct 2019 16:13:33 -0400 Subject: [PATCH 0001/1027] finish conversion of translate_c.cpp to use zig_clang.h See #1964 translate_c.cpp now exclusively uses the clang API via zig_clang.h shaves off 5 seconds from building zig when translate_c.cpp (or any h files it uses) change. --- src/translate_c.cpp | 212 +++++++++++++++-------------------- src/zig_clang.cpp | 263 ++++++++++++++++++++++++++++++++++++++++++++ src/zig_clang.h | 69 ++++++++++++ 3 files changed, 419 insertions(+), 125 deletions(-) diff --git a/src/translate_c.cpp b/src/translate_c.cpp index 660b3ad7d..203d186b9 100644 --- a/src/translate_c.cpp +++ b/src/translate_c.cpp @@ -14,19 +14,6 @@ #include "parser.hpp" #include "zig_clang.h" -#if __GNUC__ >= 8 -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wclass-memaccess" -#endif - -#include -#include -#include - -#if __GNUC__ >= 8 -#pragma GCC diagnostic pop -#endif - #include struct Alias { @@ -129,37 +116,6 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC ZigClangSourceLocation source_loc); static bool c_is_unsigned_integer(Context *c, ZigClangQualType qt); -static const ZigClangAPSInt *bitcast(const llvm::APSInt *src) { - return reinterpret_cast(src); -} - -static const ZigClangAPValue *bitcast(const clang::APValue *src) { - return reinterpret_cast(src); -} - -//static const ZigClangStmt *bitcast(const clang::Stmt *src) { -// return reinterpret_cast(src); -//} - -static const ZigClangExpr *bitcast(const clang::Expr *src) { - return reinterpret_cast(src); -} - -static ZigClangSourceLocation bitcast(clang::SourceLocation src) { - ZigClangSourceLocation dest; - memcpy(&dest, static_cast(&src), sizeof(ZigClangSourceLocation)); - return dest; -} -static ZigClangQualType bitcast(clang::QualType src) { - ZigClangQualType dest; - memcpy(&dest, static_cast(&src), sizeof(ZigClangQualType)); - return dest; -} -//static clang::QualType bitcast(ZigClangQualType src) { -// clang::QualType dest; -// memcpy(&dest, static_cast(&src), sizeof(ZigClangQualType)); -// return dest; -//} ATTRIBUTE_PRINTF(3, 4) static void emit_warning(Context *c, ZigClangSourceLocation sl, const char *format, ...) { @@ -521,10 +477,10 @@ static AstNode *trans_create_node_apint(Context *c, const ZigClangAPSInt *aps_in return node; } -static AstNode *trans_create_node_apfloat(Context *c, const llvm::APFloat &ap_float) { +static AstNode *trans_create_node_apfloat(Context *c, const ZigClangAPFloat *ap_float) { uint8_t buf[128]; - size_t written = ap_float.convertToHexString((char *)buf, 0, false, - llvm::APFloat::rmNearestTiesToEven); + size_t written = ZigClangAPFloat_convertToHexString(ap_float, (char *)buf, 0, false, + ZigClangAPFloat_roundingMode_NearestTiesToEven); AstNode *node = trans_create_node(c, NodeTypeFloatLiteral); node->data.float_literal.bigfloat = allocate(1); if (bigfloat_init_buf(node->data.float_literal.bigfloat, buf, written)) { @@ -868,13 +824,14 @@ static bool type_is_opaque(Context *c, const ZigClangType *ty, ZigClangSourceLoc if (record_def == nullptr) { return true; } - for (auto it = reinterpret_cast(record_def)->field_begin(), - it_end = reinterpret_cast(record_def)->field_end(); - it != it_end; ++it) + for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def), + it_end = ZigClangRecordDecl_field_end(record_def); + ZigClangRecordDecl_field_iterator_neq(it, it_end); + it = ZigClangRecordDecl_field_iterator_next(it)) { - const clang::FieldDecl *field_decl = *it; + const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it); - if (field_decl->isBitField()) { + if (ZigClangFieldDecl_isBitField(field_decl)) { return true; } } @@ -1393,8 +1350,8 @@ static AstNode *trans_integer_literal(Context *c, ResultUsed result_used, const } static AstNode *trans_floating_literal(Context *c, ResultUsed result_used, const ZigClangFloatingLiteral *stmt) { - llvm::APFloat result{0.0f}; - if (!reinterpret_cast(stmt)->EvaluateAsFloat(result, *reinterpret_cast(c->ctx))) { + ZigClangAPFloat *result; + if (!ZigClangExpr_EvaluateAsFloat((const ZigClangExpr *)stmt, &result, c->ctx)) { emit_warning(c, ZigClangExpr_getBeginLoc((ZigClangExpr*)stmt), "invalid floating literal"); return nullptr; } @@ -1434,15 +1391,14 @@ static AstNode *trans_character_literal(Context *c, ResultUsed result_used, cons static AstNode *trans_constant_expr(Context *c, ResultUsed result_used, const ZigClangConstantExpr *expr) { const ZigClangExpr *as_expr = reinterpret_cast(expr); - clang::Expr::EvalResult result; - if (!reinterpret_cast(expr)->EvaluateAsConstantExpr(result, - clang::Expr::EvaluateForCodeGen, - *reinterpret_cast(c->ctx))) + ZigClangExprEvalResult result; + if (!ZigClangExpr_EvaluateAsConstantExpr((const ZigClangExpr *)expr, &result, + ZigClangExpr_EvaluateForCodeGen, c->ctx)) { emit_warning(c, ZigClangExpr_getBeginLoc(as_expr), "invalid constant expression"); return nullptr; } - AstNode *node = trans_ap_value(c, bitcast(&result.Val), ZigClangExpr_getType(as_expr), + AstNode *node = trans_ap_value(c, &result.Val, ZigClangExpr_getType(as_expr), ZigClangExpr_getBeginLoc(as_expr)); return maybe_suppress_result(c, result_used, node); } @@ -2452,16 +2408,18 @@ static int trans_local_declaration(Context *c, TransScope *scope, const ZigClang TransScopeBlock *scope_block = trans_scope_block_find(scope); assert(scope_block != nullptr); - for (auto iter = reinterpret_cast(stmt)->decl_begin(); - iter != reinterpret_cast(stmt)->decl_end(); iter++) { - ZigClangDecl *decl = reinterpret_cast(*iter); + for (ZigClangDeclStmt_const_decl_iterator iter = ZigClangDeclStmt_decl_begin(stmt), + iter_end = ZigClangDeclStmt_decl_end(stmt); + iter != iter_end; ++iter) + { + ZigClangDecl *decl = *iter; switch (ZigClangDecl_getKind(decl)) { case ZigClangDeclVar: { - clang::VarDecl *var_decl = (clang::VarDecl *)decl; - ZigClangQualType qual_type = bitcast(var_decl->getTypeSourceInfo()->getType()); + ZigClangVarDecl *var_decl = (ZigClangVarDecl *)decl; + ZigClangQualType qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl); AstNode *init_node = nullptr; - if (var_decl->hasInit()) { - init_node = trans_expr(c, ResultUsedYes, scope, bitcast(var_decl->getInit()), TransRValue); + if (ZigClangVarDecl_hasInit(var_decl)) { + init_node = trans_expr(c, ResultUsedYes, scope, ZigClangVarDecl_getInit(var_decl), TransRValue); if (init_node == nullptr) return ErrorUnexpected; @@ -4317,12 +4275,13 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl) bool pure_enum = true; uint32_t field_count = 0; - for (auto it = reinterpret_cast(enum_def)->enumerator_begin(), - it_end = reinterpret_cast(enum_def)->enumerator_end(); - it != it_end; ++it, field_count += 1) + for (ZigClangEnumDecl_enumerator_iterator it = ZigClangEnumDecl_enumerator_begin(enum_def), + it_end = ZigClangEnumDecl_enumerator_end(enum_def); + ZigClangEnumDecl_enumerator_iterator_neq(it, it_end); + it = ZigClangEnumDecl_enumerator_iterator_next(it), field_count += 1) { - const clang::EnumConstantDecl *enum_const = *it; - if (enum_const->getInitExpr()) { + const ZigClangEnumConstantDecl *enum_const = ZigClangEnumDecl_enumerator_iterator_deref(it); + if (ZigClangEnumConstantDecl_getInitExpr(enum_const)) { pure_enum = false; } } @@ -4343,11 +4302,12 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl) } enum_node->data.container_decl.fields.resize(field_count); uint32_t i = 0; - for (auto it = reinterpret_cast(enum_def)->enumerator_begin(), - it_end = reinterpret_cast(enum_def)->enumerator_end(); - it != it_end; ++it, i += 1) + for (ZigClangEnumDecl_enumerator_iterator it = ZigClangEnumDecl_enumerator_begin(enum_def), + it_end = ZigClangEnumDecl_enumerator_end(enum_def); + ZigClangEnumDecl_enumerator_iterator_neq(it, it_end); + it = ZigClangEnumDecl_enumerator_iterator_next(it), i += 1) { - const clang::EnumConstantDecl *enum_const = *it; + const ZigClangEnumConstantDecl *enum_const = ZigClangEnumDecl_enumerator_iterator_deref(it); Buf *enum_val_name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)enum_const)); Buf *field_name; @@ -4358,7 +4318,7 @@ static AstNode *resolve_enum_decl(Context *c, const ZigClangEnumDecl *enum_decl) } AstNode *int_node = pure_enum && !is_anonymous ? - nullptr : trans_create_node_apint(c, bitcast(&enum_const->getInitVal())); + nullptr : trans_create_node_apint(c, ZigClangEnumConstantDecl_getInitVal(enum_const)); AstNode *field_node = trans_create_node(c, NodeTypeStructField); field_node->data.struct_field.name = field_name; field_node->data.struct_field.type = nullptr; @@ -4438,15 +4398,16 @@ static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record // count fields and validate uint32_t field_count = 0; - for (auto it = reinterpret_cast(record_def)->field_begin(), - it_end = reinterpret_cast(record_def)->field_end(); - it != it_end; ++it, field_count += 1) + for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def), + it_end = ZigClangRecordDecl_field_end(record_def); + ZigClangRecordDecl_field_iterator_neq(it, it_end); + it = ZigClangRecordDecl_field_iterator_next(it), field_count += 1) { - const clang::FieldDecl *field_decl = *it; + const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it); - if (field_decl->isBitField()) { - emit_warning(c, bitcast(field_decl->getLocation()), "%s %s demoted to opaque type - has bitfield", - container_kind_name, + if (ZigClangFieldDecl_isBitField(field_decl)) { + emit_warning(c, ZigClangFieldDecl_getLocation(field_decl), + "%s %s demoted to opaque type - has bitfield", container_kind_name, is_anonymous ? "(anon)" : buf_ptr(bare_name)); return demote_struct_to_opaque(c, record_decl, full_type_name, bare_name); } @@ -4468,19 +4429,20 @@ static AstNode *resolve_record_decl(Context *c, const ZigClangRecordDecl *record } uint32_t i = 0; - for (auto it = reinterpret_cast(record_def)->field_begin(), - it_end = reinterpret_cast(record_def)->field_end(); - it != it_end; ++it, i += 1) + for (ZigClangRecordDecl_field_iterator it = ZigClangRecordDecl_field_begin(record_def), + it_end = ZigClangRecordDecl_field_end(record_def); + ZigClangRecordDecl_field_iterator_neq(it, it_end); + it = ZigClangRecordDecl_field_iterator_next(it), i += 1) { - const clang::FieldDecl *field_decl = *it; + const ZigClangFieldDecl *field_decl = ZigClangRecordDecl_field_iterator_deref(it); AstNode *field_node = trans_create_node(c, NodeTypeStructField); field_node->data.struct_field.name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)field_decl)); - field_node->data.struct_field.type = trans_qual_type(c, bitcast(field_decl->getType()), - bitcast(field_decl->getLocation())); + field_node->data.struct_field.type = trans_qual_type(c, ZigClangFieldDecl_getType(field_decl), + ZigClangFieldDecl_getLocation(field_decl)); if (field_node->data.struct_field.type == nullptr) { - emit_warning(c, bitcast(field_decl->getLocation()), + emit_warning(c, ZigClangFieldDecl_getLocation(field_decl), "%s %s demoted to opaque type - unresolved type", container_kind_name, is_anonymous ? "(anon)" : buf_ptr(bare_name)); @@ -4522,8 +4484,8 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC init_node->data.container_init_expr.type = arr_type_node; init_node->data.container_init_expr.kind = ContainerInitKindArray; - const clang::Type *qt_type = reinterpret_cast(ZigClangQualType_getTypePtr(qt)); - ZigClangQualType child_qt = bitcast(qt_type->getAsArrayTypeUnsafe()->getElementType()); + const ZigClangType *qt_type = ZigClangQualType_getTypePtr(qt); + ZigClangQualType child_qt = ZigClangArrayType_getElementType(ZigClangType_getAsArrayTypeUnsafe(qt_type)); for (size_t i = 0; i < init_count; i += 1) { const ZigClangAPValue *elem_ap_val = ZigClangAPValue_getArrayInitializedElt(ap_value, i); @@ -4569,8 +4531,7 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC if (const ZigClangExpr *expr = ZigClangAPValueLValueBase_dyn_cast_Expr(lval_base)) { return trans_expr(c, ResultUsedYes, &c->global_scope->base, expr, TransRValue); } - //const clang::ValueDecl *value_decl = lval_base.get(); - emit_warning(c, source_loc, "TODO handle initializer LValue clang::ValueDecl"); + emit_warning(c, source_loc, "TODO handle initializer LValue ValueDecl"); return nullptr; } case ZigClangAPValueFloat: @@ -4607,43 +4568,43 @@ static AstNode *trans_ap_value(Context *c, const ZigClangAPValue *ap_value, ZigC zig_unreachable(); } -static void visit_var_decl(Context *c, const clang::VarDecl *var_decl) { +static void visit_var_decl(Context *c, const ZigClangVarDecl *var_decl) { Buf *name = buf_create_from_str(ZigClangDecl_getName_bytes_begin((const ZigClangDecl *)var_decl)); - switch (var_decl->getTLSKind()) { - case clang::VarDecl::TLS_None: + switch (ZigClangVarDecl_getTLSKind(var_decl)) { + case ZigClangVarDecl_TLSKind_None: break; - case clang::VarDecl::TLS_Static: - emit_warning(c, bitcast(var_decl->getLocation()), + case ZigClangVarDecl_TLSKind_Static: + emit_warning(c, ZigClangVarDecl_getLocation(var_decl), "ignoring variable '%s' - static thread local storage", buf_ptr(name)); return; - case clang::VarDecl::TLS_Dynamic: - emit_warning(c, bitcast(var_decl->getLocation()), + case ZigClangVarDecl_TLSKind_Dynamic: + emit_warning(c, ZigClangVarDecl_getLocation(var_decl), "ignoring variable '%s' - dynamic thread local storage", buf_ptr(name)); return; } - ZigClangQualType qt = bitcast(var_decl->getType()); - AstNode *var_type = trans_qual_type(c, qt, bitcast(var_decl->getLocation())); + ZigClangQualType qt = ZigClangVarDecl_getType(var_decl); + AstNode *var_type = trans_qual_type(c, qt, ZigClangVarDecl_getLocation(var_decl)); if (var_type == nullptr) { - emit_warning(c, bitcast(var_decl->getLocation()), "ignoring variable '%s' - unresolved type", buf_ptr(name)); + emit_warning(c, ZigClangVarDecl_getLocation(var_decl), "ignoring variable '%s' - unresolved type", buf_ptr(name)); return; } - bool is_extern = var_decl->hasExternalStorage(); - bool is_static = var_decl->isFileVarDecl(); + bool is_extern = ZigClangVarDecl_hasExternalStorage(var_decl); + bool is_static = ZigClangVarDecl_isFileVarDecl(var_decl); bool is_const = ZigClangQualType_isConstQualified(qt); if (is_static && !is_extern) { AstNode *init_node; - if (var_decl->hasInit()) { - const ZigClangAPValue *ap_value = bitcast(var_decl->evaluateValue()); + if (ZigClangVarDecl_hasInit(var_decl)) { + const ZigClangAPValue *ap_value = ZigClangVarDecl_evaluateValue(var_decl); if (ap_value == nullptr) { - emit_warning(c, bitcast(var_decl->getLocation()), + emit_warning(c, ZigClangVarDecl_getLocation(var_decl), "ignoring variable '%s' - unable to evaluate initializer", buf_ptr(name)); return; } - init_node = trans_ap_value(c, ap_value, qt, bitcast(var_decl->getLocation())); + init_node = trans_ap_value(c, ap_value, qt, ZigClangVarDecl_getLocation(var_decl)); if (init_node == nullptr) return; } else { @@ -4662,7 +4623,7 @@ static void visit_var_decl(Context *c, const clang::VarDecl *var_decl) { return; } - emit_warning(c, bitcast(var_decl->getLocation()), + emit_warning(c, ZigClangVarDecl_getLocation(var_decl), "ignoring variable '%s' - non-extern, non-static variable", buf_ptr(name)); return; } @@ -4684,7 +4645,7 @@ static bool decl_visitor(void *context, const ZigClangDecl *decl) { resolve_record_decl(c, reinterpret_cast(decl)); break; case ZigClangDeclVar: - visit_var_decl(c, reinterpret_cast(decl)); + visit_var_decl(c, reinterpret_cast(decl)); break; default: emit_warning(c, ZigClangDecl_getLocation(decl), "ignoring %s decl", ZigClangDecl_getDeclKindName(decl)); @@ -5114,25 +5075,26 @@ static void process_macro(Context *c, CTokenize *ctok, Buf *name, const char *ch c->macro_table.put(name, result_node); } -static void process_preprocessor_entities(Context *c, ZigClangASTUnit *zunit) { - clang::ASTUnit *unit = reinterpret_cast(zunit); +static void process_preprocessor_entities(Context *c, ZigClangASTUnit *unit) { CTokenize ctok = {{0}}; // TODO if we see #undef, delete it from the table + for (ZigClangPreprocessingRecord_iterator it = ZigClangASTUnit_getLocalPreprocessingEntities_begin(unit), + it_end = ZigClangASTUnit_getLocalPreprocessingEntities_end(unit); it.I != it_end.I; it.I += 1) + { + ZigClangPreprocessedEntity *entity = ZigClangPreprocessingRecord_iterator_deref(it); - for (clang::PreprocessedEntity *entity : unit->getLocalPreprocessingEntities()) { - switch (entity->getKind()) { - case clang::PreprocessedEntity::InvalidKind: - case clang::PreprocessedEntity::InclusionDirectiveKind: - case clang::PreprocessedEntity::MacroExpansionKind: + switch (ZigClangPreprocessedEntity_getKind(entity)) { + case ZigClangPreprocessedEntity_InvalidKind: + case ZigClangPreprocessedEntity_InclusionDirectiveKind: + case ZigClangPreprocessedEntity_MacroExpansionKind: continue; - case clang::PreprocessedEntity::MacroDefinitionKind: + case ZigClangPreprocessedEntity_MacroDefinitionKind: { - clang::MacroDefinitionRecord *macro = static_cast(entity); - const char *raw_name = macro->getName()->getNameStart(); - clang::SourceRange range = macro->getSourceRange(); - ZigClangSourceLocation begin_loc = bitcast(range.getBegin()); - ZigClangSourceLocation end_loc = bitcast(range.getEnd()); + ZigClangMacroDefinitionRecord *macro = reinterpret_cast(entity); + const char *raw_name = ZigClangMacroDefinitionRecord_getName_getNameStart(macro); + ZigClangSourceLocation begin_loc = ZigClangMacroDefinitionRecord_getSourceRange_getBegin(macro); + ZigClangSourceLocation end_loc = ZigClangMacroDefinitionRecord_getSourceRange_getEnd(macro); if (ZigClangSourceLocation_eq(begin_loc, end_loc)) { // this means it is a macro without a value diff --git a/src/zig_clang.cpp b/src/zig_clang.cpp index 2cf8ebc46..1025216dc 100644 --- a/src/zig_clang.cpp +++ b/src/zig_clang.cpp @@ -1346,6 +1346,31 @@ static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_Enum == clang::ETK_Enum, static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_Typename == clang::ETK_Typename, ""); static_assert((clang::ElaboratedTypeKeyword)ZigClangETK_None == clang::ETK_None, ""); +void ZigClang_detect_enum_EntityKind(clang::PreprocessedEntity::EntityKind x) { + switch (x) { + case clang::PreprocessedEntity::InvalidKind: + case clang::PreprocessedEntity::MacroExpansionKind: + case clang::PreprocessedEntity::MacroDefinitionKind: + case clang::PreprocessedEntity::InclusionDirectiveKind: + break; + } +} +static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_InvalidKind == clang::PreprocessedEntity::InvalidKind, ""); +static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_MacroExpansionKind == clang::PreprocessedEntity::MacroExpansionKind, ""); +static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_MacroDefinitionKind == clang::PreprocessedEntity::MacroDefinitionKind, ""); +static_assert((clang::PreprocessedEntity::EntityKind)ZigClangPreprocessedEntity_InclusionDirectiveKind == clang::PreprocessedEntity::InclusionDirectiveKind, ""); + + +void ZigClang_detect_enum_ConstExprUsage(clang::Expr::ConstExprUsage x) { + switch (x) { + case clang::Expr::EvaluateForCodeGen: + case clang::Expr::EvaluateForMangling: + break; + } +} +static_assert((clang::Expr::ConstExprUsage)ZigClangExpr_EvaluateForCodeGen == clang::Expr::EvaluateForCodeGen, ""); +static_assert((clang::Expr::ConstExprUsage)ZigClangExpr_EvaluateForMangling == clang::Expr::EvaluateForMangling, ""); + static_assert(sizeof(ZigClangAPValue) == sizeof(clang::APValue), ""); @@ -1406,6 +1431,43 @@ static ZigClangDeclStmt_const_decl_iterator bitcast(clang::DeclStmt::const_decl_ return dest; } +static_assert(sizeof(ZigClangPreprocessingRecord_iterator) == sizeof(clang::PreprocessingRecord::iterator), ""); +static ZigClangPreprocessingRecord_iterator bitcast(clang::PreprocessingRecord::iterator src) { + ZigClangPreprocessingRecord_iterator dest; + memcpy(&dest, static_cast(&src), sizeof(ZigClangPreprocessingRecord_iterator)); + return dest; +} +static clang::PreprocessingRecord::iterator bitcast(ZigClangPreprocessingRecord_iterator src) { + clang::PreprocessingRecord::iterator dest; + memcpy(&dest, static_cast(&src), sizeof(ZigClangPreprocessingRecord_iterator)); + return dest; +} + +static_assert(sizeof(ZigClangRecordDecl_field_iterator) == sizeof(clang::RecordDecl::field_iterator), ""); +static ZigClangRecordDecl_field_iterator bitcast(clang::RecordDecl::field_iterator src) { + ZigClangRecordDecl_field_iterator dest; + memcpy(&dest, static_cast(&src), sizeof(ZigClangRecordDecl_field_iterator)); + return dest; +} +static clang::RecordDecl::field_iterator bitcast(ZigClangRecordDecl_field_iterator src) { + clang::RecordDecl::field_iterator dest; + memcpy(&dest, static_cast(&src), sizeof(ZigClangRecordDecl_field_iterator)); + return dest; +} + +static_assert(sizeof(ZigClangEnumDecl_enumerator_iterator) == sizeof(clang::EnumDecl::enumerator_iterator), ""); +static ZigClangEnumDecl_enumerator_iterator bitcast(clang::EnumDecl::enumerator_iterator src) { + ZigClangEnumDecl_enumerator_iterator dest; + memcpy(&dest, static_cast(&src), sizeof(ZigClangEnumDecl_enumerator_iterator)); + return dest; +} +static clang::EnumDecl::enumerator_iterator bitcast(ZigClangEnumDecl_enumerator_iterator src) { + clang::EnumDecl::enumerator_iterator dest; + memcpy(&dest, static_cast(&src), sizeof(ZigClangEnumDecl_enumerator_iterator)); + return dest; +} + + ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const ZigClangSourceManager *self, ZigClangSourceLocation Loc) { @@ -1462,6 +1524,28 @@ bool ZigClangASTUnit_visitLocalTopLevelDecls(ZigClangASTUnit *self, void *contex reinterpret_cast(Fn)); } +struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_begin( + struct ZigClangASTUnit *self) +{ + auto casted = reinterpret_cast(self); + return bitcast(casted->getLocalPreprocessingEntities().begin()); +} + +struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_end( + struct ZigClangASTUnit *self) +{ + auto casted = reinterpret_cast(self); + return bitcast(casted->getLocalPreprocessingEntities().end()); +} + +struct ZigClangPreprocessedEntity *ZigClangPreprocessingRecord_iterator_deref( + struct ZigClangPreprocessingRecord_iterator self) +{ + clang::PreprocessingRecord::iterator casted = bitcast(self); + clang::PreprocessedEntity *result = *casted; + return reinterpret_cast(result); +} + const ZigClangRecordDecl *ZigClangRecordType_getDecl(const ZigClangRecordType *record_ty) { const clang::RecordDecl *record_decl = reinterpret_cast(record_ty)->getDecl(); return reinterpret_cast(record_decl); @@ -1674,6 +1758,12 @@ const char *ZigClangType_getTypeClassName(const ZigClangType *self) { return casted->getTypeClassName(); } +const ZigClangArrayType *ZigClangType_getAsArrayTypeUnsafe(const ZigClangType *self) { + auto casted = reinterpret_cast(self); + const clang::ArrayType *result = casted->getAsArrayTypeUnsafe(); + return reinterpret_cast(result); +} + ZigClangSourceLocation ZigClangStmt_getBeginLoc(const ZigClangStmt *self) { auto casted = reinterpret_cast(self); return bitcast(casted->getBeginLoc()); @@ -1712,6 +1802,29 @@ bool ZigClangExpr_EvaluateAsBooleanCondition(const ZigClangExpr *self, bool *res return casted->EvaluateAsBooleanCondition(*result, *casted_ctx, in_constant_context); } +bool ZigClangExpr_EvaluateAsFloat(const ZigClangExpr *self, ZigClangAPFloat **result, + const struct ZigClangASTContext *ctx) +{ + llvm::APFloat *ap_float = new llvm::APFloat(0.0f); + *result = reinterpret_cast(ap_float); + auto casted = reinterpret_cast(self); + auto casted_ctx = reinterpret_cast(ctx); + return casted->EvaluateAsFloat(*ap_float, *casted_ctx); +} + +bool ZigClangExpr_EvaluateAsConstantExpr(const ZigClangExpr *self, ZigClangExprEvalResult *result, + ZigClangExpr_ConstExprUsage usage, const struct ZigClangASTContext *ctx) +{ + auto casted_self = reinterpret_cast(self); + auto casted_ctx = reinterpret_cast(ctx); + clang::Expr::EvalResult eval_result; + if (!casted_self->EvaluateAsConstantExpr(eval_result, (clang::Expr::ConstExprUsage)usage, *casted_ctx)) { + return false; + } + *result = bitcast(eval_result); + return true; +} + ZigClangAPValueKind ZigClangAPValue_getKind(const ZigClangAPValue *self) { auto casted = reinterpret_cast(self); return (ZigClangAPValueKind)casted->getKind(); @@ -1911,6 +2024,11 @@ struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *se return bitcast(casted->getType()); } +struct ZigClangQualType ZigClangVarDecl_getTypeSourceInfo_getType(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->getTypeSourceInfo()->getType()); +} + const struct ZigClangExpr *ZigClangVarDecl_getInit(const struct ZigClangVarDecl *self) { auto casted = reinterpret_cast(self); return reinterpret_cast(casted->getInit()); @@ -1921,6 +2039,32 @@ enum ZigClangVarDecl_TLSKind ZigClangVarDecl_getTLSKind(const ZigClangVarDecl *s return (ZigClangVarDecl_TLSKind)casted->getTLSKind(); } +struct ZigClangSourceLocation ZigClangVarDecl_getLocation(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->getLocation()); +} + +bool ZigClangVarDecl_hasExternalStorage(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + return casted->hasExternalStorage(); +} + +bool ZigClangVarDecl_isFileVarDecl(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + return casted->isFileVarDecl(); +} + +bool ZigClangVarDecl_hasInit(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + return casted->hasInit(); +} + +const ZigClangAPValue * ZigClangVarDecl_evaluateValue(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + const clang::APValue *result = casted->evaluateValue(); + return reinterpret_cast(result); +} + enum ZigClangBuiltinTypeKind ZigClangBuiltinType_getKind(const struct ZigClangBuiltinType *self) { auto casted = reinterpret_cast(self); return (ZigClangBuiltinTypeKind)casted->getKind(); @@ -2396,3 +2540,122 @@ const struct ZigClangExpr *ZigClangParenExpr_getSubExpr(const struct ZigClangPar auto casted = reinterpret_cast(self); return reinterpret_cast(casted->getSubExpr()); } + +enum ZigClangPreprocessedEntity_EntityKind ZigClangPreprocessedEntity_getKind( + const struct ZigClangPreprocessedEntity *self) +{ + auto casted = reinterpret_cast(self); + return (ZigClangPreprocessedEntity_EntityKind)casted->getKind(); +} + +const char *ZigClangMacroDefinitionRecord_getName_getNameStart(const struct ZigClangMacroDefinitionRecord *self) { + auto casted = reinterpret_cast(self); + return casted->getName()->getNameStart(); +} + +struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getBegin(const struct ZigClangMacroDefinitionRecord *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->getSourceRange().getBegin()); +} + +struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getEnd(const struct ZigClangMacroDefinitionRecord *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->getSourceRange().getEnd()); +} + +ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_begin(const struct ZigClangRecordDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->field_begin()); +} + +ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_end(const struct ZigClangRecordDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->field_end()); +} + +bool ZigClangFieldDecl_isBitField(const struct ZigClangFieldDecl *self) { + auto casted = reinterpret_cast(self); + return casted->isBitField(); +} + +ZigClangSourceLocation ZigClangFieldDecl_getLocation(const struct ZigClangFieldDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->getLocation()); +} + +ZigClangQualType ZigClangFieldDecl_getType(const struct ZigClangFieldDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->getType()); +} + +ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_iterator_next( + struct ZigClangRecordDecl_field_iterator self) +{ + clang::RecordDecl::field_iterator casted = bitcast(self); + ++casted; + return bitcast(casted); +} + +const struct ZigClangFieldDecl * ZigClangRecordDecl_field_iterator_deref( + struct ZigClangRecordDecl_field_iterator self) +{ + clang::RecordDecl::field_iterator casted = bitcast(self); + const clang::FieldDecl *result = *casted; + return reinterpret_cast(result); +} + +bool ZigClangRecordDecl_field_iterator_neq( + struct ZigClangRecordDecl_field_iterator a, + struct ZigClangRecordDecl_field_iterator b) +{ + clang::RecordDecl::field_iterator casted_a = bitcast(a); + clang::RecordDecl::field_iterator casted_b = bitcast(b); + return casted_a != casted_b; +} + +ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_begin(const struct ZigClangEnumDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->enumerator_begin()); +} + +ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_end(const struct ZigClangEnumDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->enumerator_end()); +} + +ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_iterator_next( + struct ZigClangEnumDecl_enumerator_iterator self) +{ + clang::EnumDecl::enumerator_iterator casted = bitcast(self); + ++casted; + return bitcast(casted); +} + +const struct ZigClangEnumConstantDecl * ZigClangEnumDecl_enumerator_iterator_deref( + struct ZigClangEnumDecl_enumerator_iterator self) +{ + clang::EnumDecl::enumerator_iterator casted = bitcast(self); + const clang::EnumConstantDecl *result = *casted; + return reinterpret_cast(result); +} + +bool ZigClangEnumDecl_enumerator_iterator_neq( + struct ZigClangEnumDecl_enumerator_iterator a, + struct ZigClangEnumDecl_enumerator_iterator b) +{ + clang::EnumDecl::enumerator_iterator casted_a = bitcast(a); + clang::EnumDecl::enumerator_iterator casted_b = bitcast(b); + return casted_a != casted_b; +} + +const struct ZigClangExpr *ZigClangEnumConstantDecl_getInitExpr(const struct ZigClangEnumConstantDecl *self) { + auto casted = reinterpret_cast(self); + const clang::Expr *result = casted->getInitExpr(); + return reinterpret_cast(result); +} + +const struct ZigClangAPSInt *ZigClangEnumConstantDecl_getInitVal(const struct ZigClangEnumConstantDecl *self) { + auto casted = reinterpret_cast(self); + const llvm::APSInt *result = &casted->getInitVal(); + return reinterpret_cast(result); +} diff --git a/src/zig_clang.h b/src/zig_clang.h index 474ec57ba..baa010555 100644 --- a/src/zig_clang.h +++ b/src/zig_clang.h @@ -122,6 +122,7 @@ struct ZigClangParmVarDecl; struct ZigClangPointerType; struct ZigClangPredefinedExpr; struct ZigClangPreprocessedEntity; +struct ZigClangPreprocessingRecord; struct ZigClangRecordDecl; struct ZigClangRecordType; struct ZigClangReturnStmt; @@ -146,6 +147,19 @@ struct ZigClangWhileStmt; typedef struct ZigClangStmt *const * ZigClangCompoundStmt_const_body_iterator; typedef struct ZigClangDecl *const * ZigClangDeclStmt_const_decl_iterator; +struct ZigClangRecordDecl_field_iterator { + void *opaque; +}; + +struct ZigClangEnumDecl_enumerator_iterator { + void *opaque; +}; + +struct ZigClangPreprocessingRecord_iterator { + int I; + struct ZigClangPreprocessingRecord *Self; +}; + enum ZigClangBO { ZigClangBO_PtrMemD, ZigClangBO_PtrMemI, @@ -790,6 +804,18 @@ enum ZigClangElaboratedTypeKeyword { ZigClangETK_None, }; +enum ZigClangPreprocessedEntity_EntityKind { + ZigClangPreprocessedEntity_InvalidKind, + ZigClangPreprocessedEntity_MacroExpansionKind, + ZigClangPreprocessedEntity_MacroDefinitionKind, + ZigClangPreprocessedEntity_InclusionDirectiveKind, +}; + +enum ZigClangExpr_ConstExprUsage { + ZigClangExpr_EvaluateForCodeGen, + ZigClangExpr_EvaluateForMangling, +}; + ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const struct ZigClangSourceManager *, struct ZigClangSourceLocation Loc); ZIG_EXTERN_C const char *ZigClangSourceManager_getFilename(const struct ZigClangSourceManager *, @@ -814,6 +840,13 @@ ZIG_EXTERN_C struct ZigClangASTContext *ZigClangASTUnit_getASTContext(struct Zig ZIG_EXTERN_C struct ZigClangSourceManager *ZigClangASTUnit_getSourceManager(struct ZigClangASTUnit *); ZIG_EXTERN_C bool ZigClangASTUnit_visitLocalTopLevelDecls(struct ZigClangASTUnit *, void *context, bool (*Fn)(void *context, const struct ZigClangDecl *decl)); +ZIG_EXTERN_C struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_begin(struct ZigClangASTUnit *); +ZIG_EXTERN_C struct ZigClangPreprocessingRecord_iterator ZigClangASTUnit_getLocalPreprocessingEntities_end(struct ZigClangASTUnit *); + +ZIG_EXTERN_C struct ZigClangPreprocessedEntity *ZigClangPreprocessingRecord_iterator_deref( + struct ZigClangPreprocessingRecord_iterator); + +ZIG_EXTERN_C enum ZigClangPreprocessedEntity_EntityKind ZigClangPreprocessedEntity_getKind(const struct ZigClangPreprocessedEntity *); ZIG_EXTERN_C const struct ZigClangRecordDecl *ZigClangRecordType_getDecl(const struct ZigClangRecordType *record_ty); ZIG_EXTERN_C const struct ZigClangEnumDecl *ZigClangEnumType_getDecl(const struct ZigClangEnumType *record_ty); @@ -840,8 +873,22 @@ ZIG_EXTERN_C const struct ZigClangStmt *ZigClangFunctionDecl_getBody(const struc ZIG_EXTERN_C bool ZigClangRecordDecl_isUnion(const struct ZigClangRecordDecl *record_decl); ZIG_EXTERN_C bool ZigClangRecordDecl_isStruct(const struct ZigClangRecordDecl *record_decl); ZIG_EXTERN_C bool ZigClangRecordDecl_isAnonymousStructOrUnion(const struct ZigClangRecordDecl *record_decl); +ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_begin(const struct ZigClangRecordDecl *); +ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_end(const struct ZigClangRecordDecl *); +ZIG_EXTERN_C ZigClangRecordDecl_field_iterator ZigClangRecordDecl_field_iterator_next(struct ZigClangRecordDecl_field_iterator); +ZIG_EXTERN_C const struct ZigClangFieldDecl * ZigClangRecordDecl_field_iterator_deref(struct ZigClangRecordDecl_field_iterator); +ZIG_EXTERN_C bool ZigClangRecordDecl_field_iterator_neq( + struct ZigClangRecordDecl_field_iterator a, + struct ZigClangRecordDecl_field_iterator b); ZIG_EXTERN_C struct ZigClangQualType ZigClangEnumDecl_getIntegerType(const struct ZigClangEnumDecl *); +ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_begin(const struct ZigClangEnumDecl *); +ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_end(const struct ZigClangEnumDecl *); +ZIG_EXTERN_C ZigClangEnumDecl_enumerator_iterator ZigClangEnumDecl_enumerator_iterator_next(struct ZigClangEnumDecl_enumerator_iterator); +ZIG_EXTERN_C const struct ZigClangEnumConstantDecl * ZigClangEnumDecl_enumerator_iterator_deref(struct ZigClangEnumDecl_enumerator_iterator); +ZIG_EXTERN_C bool ZigClangEnumDecl_enumerator_iterator_neq( + struct ZigClangEnumDecl_enumerator_iterator a, + struct ZigClangEnumDecl_enumerator_iterator b); ZIG_EXTERN_C const char *ZigClangDecl_getName_bytes_begin(const struct ZigClangDecl *decl); ZIG_EXTERN_C enum ZigClangDeclKind ZigClangDecl_getKind(const struct ZigClangDecl *decl); @@ -850,6 +897,12 @@ ZIG_EXTERN_C const char *ZigClangDecl_getDeclKindName(const struct ZigClangDecl ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *); ZIG_EXTERN_C const struct ZigClangExpr *ZigClangVarDecl_getInit(const struct ZigClangVarDecl *var_decl); ZIG_EXTERN_C enum ZigClangVarDecl_TLSKind ZigClangVarDecl_getTLSKind(const struct ZigClangVarDecl *var_decl); +ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangVarDecl_getLocation(const struct ZigClangVarDecl *); +ZIG_EXTERN_C bool ZigClangVarDecl_hasExternalStorage(const struct ZigClangVarDecl *); +ZIG_EXTERN_C bool ZigClangVarDecl_isFileVarDecl(const struct ZigClangVarDecl *); +ZIG_EXTERN_C bool ZigClangVarDecl_hasInit(const struct ZigClangVarDecl *); +ZIG_EXTERN_C const struct ZigClangAPValue *ZigClangVarDecl_evaluateValue(const struct ZigClangVarDecl *); +ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getTypeSourceInfo_getType(const struct ZigClangVarDecl *); ZIG_EXTERN_C bool ZigClangSourceLocation_eq(struct ZigClangSourceLocation a, struct ZigClangSourceLocation b); @@ -869,6 +922,7 @@ ZIG_EXTERN_C enum ZigClangTypeClass ZigClangType_getTypeClass(const struct ZigCl ZIG_EXTERN_C struct ZigClangQualType ZigClangType_getPointeeType(const struct ZigClangType *self); ZIG_EXTERN_C bool ZigClangType_isVoidType(const struct ZigClangType *self); ZIG_EXTERN_C const char *ZigClangType_getTypeClassName(const struct ZigClangType *self); +ZIG_EXTERN_C const struct ZigClangArrayType *ZigClangType_getAsArrayTypeUnsafe(const struct ZigClangType *self); ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangStmt_getBeginLoc(const struct ZigClangStmt *self); ZIG_EXTERN_C enum ZigClangStmtClass ZigClangStmt_getStmtClass(const struct ZigClangStmt *self); @@ -879,6 +933,10 @@ ZIG_EXTERN_C struct ZigClangQualType ZigClangExpr_getType(const struct ZigClangE ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangExpr_getBeginLoc(const struct ZigClangExpr *self); ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsBooleanCondition(const struct ZigClangExpr *self, bool *result, const struct ZigClangASTContext *ctx, bool in_constant_context); +ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsFloat(const struct ZigClangExpr *self, + ZigClangAPFloat **result, const struct ZigClangASTContext *ctx); +ZIG_EXTERN_C bool ZigClangExpr_EvaluateAsConstantExpr(const struct ZigClangExpr *, + struct ZigClangExprEvalResult *, ZigClangExpr_ConstExprUsage, const struct ZigClangASTContext *); ZIG_EXTERN_C enum ZigClangAPValueKind ZigClangAPValue_getKind(const struct ZigClangAPValue *self); ZIG_EXTERN_C const struct ZigClangAPSInt *ZigClangAPValue_getInt(const struct ZigClangAPValue *self); @@ -1031,4 +1089,15 @@ ZIG_EXTERN_C const struct ZigClangStmt *ZigClangCaseStmt_getSubStmt(const struct ZIG_EXTERN_C const struct ZigClangStmt *ZigClangDefaultStmt_getSubStmt(const struct ZigClangDefaultStmt *); ZIG_EXTERN_C const struct ZigClangExpr *ZigClangParenExpr_getSubExpr(const struct ZigClangParenExpr *); + +ZIG_EXTERN_C const char *ZigClangMacroDefinitionRecord_getName_getNameStart(const struct ZigClangMacroDefinitionRecord *); +ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getBegin(const struct ZigClangMacroDefinitionRecord *); +ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangMacroDefinitionRecord_getSourceRange_getEnd(const struct ZigClangMacroDefinitionRecord *); + +ZIG_EXTERN_C bool ZigClangFieldDecl_isBitField(const struct ZigClangFieldDecl *); +ZIG_EXTERN_C struct ZigClangQualType ZigClangFieldDecl_getType(const struct ZigClangFieldDecl *); +ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangFieldDecl_getLocation(const struct ZigClangFieldDecl *); + +ZIG_EXTERN_C const struct ZigClangExpr *ZigClangEnumConstantDecl_getInitExpr(const struct ZigClangEnumConstantDecl *); +ZIG_EXTERN_C const struct ZigClangAPSInt *ZigClangEnumConstantDecl_getInitVal(const struct ZigClangEnumConstantDecl *); #endif From edef35bb57c3e205b5adb577828aa90681793151 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 3 Oct 2019 11:15:55 -0400 Subject: [PATCH 0002/1027] docs: use the updated png favicon --- doc/langref.html.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/langref.html.in b/doc/langref.html.in index 1869681d0..b0552d1f1 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -4,7 +4,7 @@ Documentation - The Zig Programming Language - + + + +

Loading...

+ + + + + + diff --git a/lib/std/special/doc/main.js b/lib/std/special/doc/main.js new file mode 100644 index 000000000..2ce822e64 --- /dev/null +++ b/lib/std/special/doc/main.js @@ -0,0 +1,126 @@ +(function() { + var domStatus = document.getElementById("status"); + var domSectPkgs = document.getElementById("sectPkgs"); + var domListPkgs = document.getElementById("listPkgs"); + var domSectTypes = document.getElementById("sectTypes"); + var domListTypes = document.getElementById("listTypes"); + + var curNav = { + kind: "pkg", + index: zigAnalysis.rootPkg, + }; + + var rootIsStd = detectRootIsStd(); + var typeKindTypeId = findTypeKindType(); + var typeTypeId = findTypeTypeId(); + render(); + + function render() { + domStatus.classList.add("hidden"); + + if (curNav.kind === "pkg") { + var pkg = zigAnalysis.packages[curNav.index]; + renderPkgList(pkg); + var pkgStruct = zigAnalysis.types[pkg.main]; + renderContainer(pkgStruct); + } else { + throw new Error("TODO"); + } + } + + function renderPkgList(pkg) { + var list = []; + for (var key in pkg.table) { + if (key === "root" && rootIsStd) continue; + list.push({ + name: key, + pkg: pkg.table[key], + }); + } + list.sort(function(a, b) { + return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); + }); + + resizeDomList(domListPkgs, list.length, '
  • '); + var domItems = domListPkgs.children; + for (var i = 0; i < list.length; i += 1) { + var domItem = domItems[i]; + domItem.textContent = list[i].name; + } + + domSectPkgs.classList.remove("hidden"); + } + + function resizeDomList(listDom, desiredLen, templateHtml) { + // add the missing dom entries + var i, ev; + for (i = listDom.childElementCount; i < desiredLen; i += 1) { + listDom.insertAdjacentHTML('beforeend', templateHtml); + } + // remove extra dom entries + while (desiredLen < listDom.childElementCount) { + listDom.removeChild(listDom.lastChild); + } + } + + function renderContainer(container) { + // Find only the types of this package + var list = []; + for (var i = 0; i < container.decls.length; i += 1) { + var decl = zigAnalysis.decls[container.decls[i]]; + if (decl.type == typeTypeId) { + list.push(decl); + } + } + list.sort(function(a, b) { + return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); + }); + + resizeDomList(domListTypes, list.length, '
  • '); + for (var i = 0; i < list.length; i += 1) { + var domItem = domListTypes.children[i]; + var decl = list[i]; + domItem.textContent = decl.name; + } + + domSectTypes.classList.remove("hidden"); + } + + function operatorCompare(a, b) { + if (a === b) { + return 0; + } else if (a < b) { + return -1; + } else { + return 1; + } + } + + function detectRootIsStd() { + var rootPkg = zigAnalysis.packages[zigAnalysis.rootPkg]; + if (rootPkg.table["std"] == null) { + // no std mapped into the root package + return false; + } + var stdPkg = zigAnalysis.packages[rootPkg.table["std"]]; + return rootPkg.file === stdPkg.file; + } + + function findTypeKindType() { + for (var i = 0; i < zigAnalysis.typeKinds.length; i += 1) { + if (zigAnalysis.typeKinds[i] === "Type") { + return i; + } + } + throw new Error("No type kind 'Type' found"); + } + + function findTypeTypeId() { + for (var i = 0; i < zigAnalysis.types.length; i += 1) { + if (zigAnalysis.types[i].kind == typeKindTypeId) { + return i; + } + } + throw new Error("No type 'type' found"); + } +})(); diff --git a/src/all_types.hpp b/src/all_types.hpp index 6ebfe934b..1119d2bf4 100644 --- a/src/all_types.hpp +++ b/src/all_types.hpp @@ -2063,6 +2063,7 @@ struct CodeGen { bool have_stack_probing; bool function_sections; bool enable_dump_analysis; + bool enable_doc_generation; Buf *mmacosx_version_min; Buf *mios_version_min; diff --git a/src/codegen.cpp b/src/codegen.cpp index 0f8663564..88ff179ca 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -10158,6 +10158,7 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) { cache_bool(ch, g->is_dummy_so); cache_bool(ch, g->function_sections); cache_bool(ch, g->enable_dump_analysis); + cache_bool(ch, g->enable_doc_generation); cache_buf_opt(ch, g->mmacosx_version_min); cache_buf_opt(ch, g->mios_version_min); cache_usize(ch, g->version_major); @@ -10347,12 +10348,48 @@ void codegen_build_and_link(CodeGen *g) { fprintf(stderr, "Unable to open '%s': %s\n", analysis_json_filename, strerror(errno)); exit(1); } - zig_print_analysis_dump(g, f); + zig_print_analysis_dump(g, f, " ", "\n"); if (fclose(f) != 0) { fprintf(stderr, "Unable to write '%s': %s\n", analysis_json_filename, strerror(errno)); exit(1); } + } + if (g->enable_doc_generation) { + Buf *doc_dir_path = buf_sprintf("%s" OS_SEP "doc", buf_ptr(g->output_dir)); + if ((err = os_make_path(doc_dir_path))) { + fprintf(stderr, "Unable to create directory %s: %s\n", buf_ptr(doc_dir_path), err_str(err)); + exit(1); + } + Buf *index_html_src_path = buf_sprintf("%s" OS_SEP "special" OS_SEP "doc" OS_SEP "index.html", + buf_ptr(g->zig_std_dir)); + Buf *index_html_dest_path = buf_sprintf("%s" OS_SEP "index.html", buf_ptr(doc_dir_path)); + Buf *main_js_src_path = buf_sprintf("%s" OS_SEP "special" OS_SEP "doc" OS_SEP "main.js", + buf_ptr(g->zig_std_dir)); + Buf *main_js_dest_path = buf_sprintf("%s" OS_SEP "main.js", buf_ptr(doc_dir_path)); + if ((err = os_copy_file(index_html_src_path, index_html_dest_path))) { + fprintf(stderr, "Unable to copy %s to %s: %s\n", buf_ptr(index_html_src_path), + buf_ptr(index_html_dest_path), err_str(err)); + exit(1); + } + if ((err = os_copy_file(main_js_src_path, main_js_dest_path))) { + fprintf(stderr, "Unable to copy %s to %s: %s\n", buf_ptr(main_js_src_path), + buf_ptr(main_js_dest_path), err_str(err)); + exit(1); + } + const char *data_js_filename = buf_ptr(buf_sprintf("%s" OS_SEP "data.js", buf_ptr(doc_dir_path))); + FILE *f = fopen(data_js_filename, "wb"); + if (f == nullptr) { + fprintf(stderr, "Unable to open '%s': %s\n", data_js_filename, strerror(errno)); + exit(1); + } + fprintf(f, "zigAnalysis="); + zig_print_analysis_dump(g, f, "", ""); + fprintf(f, ";"); + if (fclose(f) != 0) { + fprintf(stderr, "Unable to write '%s': %s\n", data_js_filename, strerror(errno)); + exit(1); + } } // If we're outputting assembly or llvm IR we skip linking. diff --git a/src/dump_analysis.cpp b/src/dump_analysis.cpp index 401fa37de..b110e0e03 100644 --- a/src/dump_analysis.cpp +++ b/src/dump_analysis.cpp @@ -688,12 +688,12 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) { jw_end_object(jw); } -void zig_print_analysis_dump(CodeGen *g, FILE *f) { +void zig_print_analysis_dump(CodeGen *g, FILE *f, const char *one_indent, const char *nl) { Error err; AnalDumpCtx ctx = {}; ctx.g = g; JsonWriter *jw = &ctx.jw; - jw_init(jw, f, " ", "\n"); + jw_init(jw, f, one_indent, nl); ctx.type_map.init(16); ctx.pkg_map.init(16); ctx.file_map.init(16); @@ -728,6 +728,9 @@ void zig_print_analysis_dump(CodeGen *g, FILE *f) { Buf triple_buf = BUF_INIT; target_triple_zig(&triple_buf, g->zig_target); jw_string(jw, buf_ptr(&triple_buf)); + + jw_object_field(jw, "rootName"); + jw_string(jw, buf_ptr(g->root_out_name)); } jw_end_object(jw); diff --git a/src/dump_analysis.hpp b/src/dump_analysis.hpp index 44a87290e..6d1c644ea 100644 --- a/src/dump_analysis.hpp +++ b/src/dump_analysis.hpp @@ -12,6 +12,6 @@ #include void zig_print_stack_report(CodeGen *g, FILE *f); -void zig_print_analysis_dump(CodeGen *g, FILE *f); +void zig_print_analysis_dump(CodeGen *g, FILE *f, const char *one_indent, const char *nl); #endif diff --git a/src/main.cpp b/src/main.cpp index 5300938f8..9b8bddabd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -64,7 +64,8 @@ static int print_full_usage(const char *arg0, FILE *file, int return_code) { " -fno-PIC disable Position Independent Code\n" " -ftime-report print timing diagnostics\n" " -fstack-report print stack size diagnostics\n" - " -fdump-analysis write analysis.json file for use with zig docs\n" + " -fdump-analysis write analysis.json file with type information\n" + " -fgenerate-docs create a doc/ dir with html documentation\n" " --libc [file] Provide a file which specifies libc paths\n" " --name [name] override output name\n" " --output-dir [dir] override output directory (defaults to cwd)\n" @@ -481,6 +482,7 @@ int main(int argc, char **argv) { bool timing_info = false; bool stack_report = false; bool enable_dump_analysis = false; + bool enable_doc_generation = false; const char *cache_dir = nullptr; CliPkg *cur_pkg = allocate(1); BuildMode build_mode = BuildModeDebug; @@ -666,6 +668,8 @@ int main(int argc, char **argv) { stack_report = true; } else if (strcmp(arg, "-fdump-analysis") == 0) { enable_dump_analysis = true; + } else if (strcmp(arg, "-fgenerate-docs") == 0) { + enable_doc_generation = true; } else if (strcmp(arg, "--enable-valgrind") == 0) { valgrind_support = ValgrindSupportEnabled; } else if (strcmp(arg, "--disable-valgrind") == 0) { @@ -1143,6 +1147,7 @@ int main(int argc, char **argv) { g->enable_time_report = timing_info; g->enable_stack_report = stack_report; g->enable_dump_analysis = enable_dump_analysis; + g->enable_doc_generation = enable_doc_generation; codegen_set_out_name(g, buf_out_name); codegen_set_lib_version(g, ver_major, ver_minor, ver_patch); g->want_single_threaded = want_single_threaded; From f78d49c9168d894774ec9d61c7d734702c59dfe6 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 5 Oct 2019 13:07:59 -0400 Subject: [PATCH 0011/1027] generated docs: navigable packages --- lib/std/special/doc/index.html | 3 + lib/std/special/doc/main.js | 123 ++++++++++++++++++++++++++++----- 2 files changed, 109 insertions(+), 17 deletions(-) diff --git a/lib/std/special/doc/index.html b/lib/std/special/doc/index.html index b00a8f046..34810b29a 100644 --- a/lib/std/special/doc/index.html +++ b/lib/std/special/doc/index.html @@ -14,6 +14,9 @@ background-color: #111; color: #bbb; } + a { + color: #88f; + } } diff --git a/lib/std/special/doc/main.js b/lib/std/special/doc/main.js index 2ce822e64..0fa281854 100644 --- a/lib/std/special/doc/main.js +++ b/lib/std/special/doc/main.js @@ -6,26 +6,74 @@ var domListTypes = document.getElementById("listTypes"); var curNav = { - kind: "pkg", - index: zigAnalysis.rootPkg, + // each element is a package name, e.g. @import("a") then within there @import("b") + // starting implicitly from root package + pkgNames: [], + // same as above except actual packages, not names + pkgObjs: [], + // Each element is a decl name, `a.b.c`, a is 0, b is 1, c is 2, etc. + // empty array means refers to the package itself + declNames: [], + // these will be all types, except the last one may be a type or a decl + declObjs: [], }; var rootIsStd = detectRootIsStd(); var typeKindTypeId = findTypeKindType(); var typeTypeId = findTypeTypeId(); - render(); + window.addEventListener('hashchange', onHashChange, false); + onHashChange(); function render() { domStatus.classList.add("hidden"); - if (curNav.kind === "pkg") { - var pkg = zigAnalysis.packages[curNav.index]; - renderPkgList(pkg); - var pkgStruct = zigAnalysis.types[pkg.main]; - renderContainer(pkgStruct); - } else { - throw new Error("TODO"); + var pkg = zigAnalysis.packages[zigAnalysis.rootPkg]; + curNav.pkgObjs = [pkg]; + for (var i = 0; i < curNav.pkgNames.length; i += 1) { + var childPkg = zigAnalysis.packages[pkg.table[curNav.pkgNames[i]]]; + if (childPkg == null) { + return render404(); + } + pkg = childPkg; + curNav.pkgObjs.push(pkg); } + + var decl = zigAnalysis.types[pkg.main]; + curNav.declObjs = [decl]; + for (var i = 0; i < curNav.declNames.length; i += 1) { + var childDecl = findSubDecl(decl, curNav.declNames[i]); + if (childDecl == null) { + return render404(); + } + var container = getDeclContainerType(childDecl); + if (container == null) { + if (i + 1 === curNav.declNames.length) { + curNav.declObjs.push(childDecl); + break; + } else { + return render404(); + } + } + decl = container; + curNav.declObjs.push(decl); + } + + var lastPkg = curNav.pkgObjs[curNav.pkgObjs.length - 1]; + renderPkgList(lastPkg); + + var lastDecl = curNav.declObjs[curNav.declObjs.length - 1]; + if (lastDecl.decls != null) { + return renderContainer(lastDecl); + } else { + throw new Error("docs for this decl which is not a container"); + } + } + + function render404() { + domStatus.textContent = "404 Not Found"; + domStatus.classList.remove("hidden"); + domSectPkgs.classList.add("hidden"); + domListPkgs.classList.add("hidden"); } function renderPkgList(pkg) { @@ -41,14 +89,19 @@ return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); }); - resizeDomList(domListPkgs, list.length, '
  • '); - var domItems = domListPkgs.children; - for (var i = 0; i < list.length; i += 1) { - var domItem = domItems[i]; - domItem.textContent = list[i].name; - } + if (list.length === 0) { + domSectPkgs.classList.remove("hidden"); + } else { + resizeDomList(domListPkgs, list.length, '
  • '); + for (var i = 0; i < list.length; i += 1) { + var liDom = domListPkgs.children[i]; + var aDom = liDom.children[0]; + aDom.textContent = list[i].name; + aDom.setAttribute('href', "#" + list[i].name); + } - domSectPkgs.classList.remove("hidden"); + domSectPkgs.classList.remove("hidden"); + } } function resizeDomList(listDom, desiredLen, templateHtml) { @@ -123,4 +176,40 @@ } throw new Error("No type 'type' found"); } + + function onHashChange() { + curNav = { + pkgNames: [], + pkgObjs: [], + declNames: [], + declObjs: [], + }; + if (location.hash[0] === '#') { + var parts = location.hash.substring(1).split(";"); + curNav.pkgNames = parts[0].split("."); + if (parts[1] != null) { + curNav.declNames = parts[1] ? parts[1].split(".") : []; + } + } + render(); + } + + function findSubDecl(parentType, childName) { + if (parentType.decls == null) throw new Error("parent object has no decls"); + for (var i = 0; i < parentType.decls.length; i += 1) { + var declIndex = parentType.decls[i]; + var childDecl = zigAnalysis.decls[declIndex]; + if (childDecl.name === childName) { + return childDecl; + } + } + return null; + } + + function getDeclContainerType(decl) { + if (decl.type === typeTypeId) { + return zigAnalysis.types[decl.value]; + } + return null; + } })(); From 5aa1e7880747d80ddbbd31a87fc1343af46e7db6 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 5 Oct 2019 13:29:35 -0400 Subject: [PATCH 0012/1027] generated docs: navigable types --- lib/std/special/doc/main.js | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/std/special/doc/main.js b/lib/std/special/doc/main.js index 0fa281854..d27efd2b4 100644 --- a/lib/std/special/doc/main.js +++ b/lib/std/special/doc/main.js @@ -73,7 +73,7 @@ domStatus.textContent = "404 Not Found"; domStatus.classList.remove("hidden"); domSectPkgs.classList.add("hidden"); - domListPkgs.classList.add("hidden"); + domSectTypes.classList.add("hidden"); } function renderPkgList(pkg) { @@ -90,20 +90,28 @@ }); if (list.length === 0) { - domSectPkgs.classList.remove("hidden"); + domSectPkgs.classList.add("hidden"); } else { resizeDomList(domListPkgs, list.length, '
  • '); for (var i = 0; i < list.length; i += 1) { var liDom = domListPkgs.children[i]; var aDom = liDom.children[0]; aDom.textContent = list[i].name; - aDom.setAttribute('href', "#" + list[i].name); + aDom.setAttribute('href', navLinkPkg(list[i].name)); } domSectPkgs.classList.remove("hidden"); } } + function navLinkPkg(childName) { + return '#' + (curNav.pkgNames.concat([childName])).join(','); + } + + function navLinkDecl(childName) { + return '#' + curNav.pkgNames.join(",") + ';' + (curNav.declNames.concat([childName])).join(","); + } + function resizeDomList(listDom, desiredLen, templateHtml) { // add the missing dom entries var i, ev; @@ -129,11 +137,13 @@ return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); }); - resizeDomList(domListTypes, list.length, '
  • '); + resizeDomList(domListTypes, list.length, '
  • '); for (var i = 0; i < list.length; i += 1) { - var domItem = domListTypes.children[i]; + var liDom = domListTypes.children[i]; + var aDom = liDom.children[0]; var decl = list[i]; - domItem.textContent = decl.name; + aDom.textContent = decl.name; + aDom.setAttribute('href', navLinkDecl(decl.name)); } domSectTypes.classList.remove("hidden"); From a23a022820d24f660b314457e1984ceb2586e109 Mon Sep 17 00:00:00 2001 From: Michael Dusan Date: Sat, 5 Oct 2019 14:09:09 -0400 Subject: [PATCH 0013/1027] fix container member access for fn/struct-fn - decls brought in via `usingnamespace` were not always found because lookup was performed directly against decl_table and use_decls was never consulted - fix to use find_container_decl() path instead - closes #3367 --- src/ir.cpp | 3 +-- test/stage1/behavior.zig | 1 + test/stage1/behavior/bugs/3367.zig | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 test/stage1/behavior/bugs/3367.zig diff --git a/src/ir.cpp b/src/ir.cpp index 14adf6fbd..52b59ddca 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -17673,8 +17673,7 @@ static IrInstruction *ir_analyze_container_member_access_inner(IrAnalyze *ira, if (!is_slice(bare_struct_type)) { ScopeDecls *container_scope = get_container_scope(bare_struct_type); assert(container_scope != nullptr); - auto entry = container_scope->decl_table.maybe_get(field_name); - Tld *tld = entry ? entry->value : nullptr; + auto tld = find_container_decl(ira->codegen, container_scope, field_name); if (tld) { if (tld->id == TldIdFn) { resolve_top_level_decl(ira->codegen, tld, source_instr->source_node, false); diff --git a/test/stage1/behavior.zig b/test/stage1/behavior.zig index 8696ddfaa..95cb98f8e 100644 --- a/test/stage1/behavior.zig +++ b/test/stage1/behavior.zig @@ -34,6 +34,7 @@ comptime { _ = @import("behavior/bugs/2692.zig"); _ = @import("behavior/bugs/3046.zig"); _ = @import("behavior/bugs/3112.zig"); + _ = @import("behavior/bugs/3367.zig"); _ = @import("behavior/bugs/394.zig"); _ = @import("behavior/bugs/421.zig"); _ = @import("behavior/bugs/529.zig"); diff --git a/test/stage1/behavior/bugs/3367.zig b/test/stage1/behavior/bugs/3367.zig new file mode 100644 index 000000000..06b633df6 --- /dev/null +++ b/test/stage1/behavior/bugs/3367.zig @@ -0,0 +1,15 @@ +const std = @import("std"); +const expect = std.testing.expect; + +const Foo = struct { + usingnamespace Mixin; +}; + +const Mixin = struct { + pub fn two(self: Foo) void {} +}; + +test "container member access usingnamespace decls" { + var foo = Foo{}; + foo.two(); +} From edadccde549b99305882e795e44672a9f41be037 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 5 Oct 2019 15:33:23 -0400 Subject: [PATCH 0014/1027] generated docs: add navigation bar --- lib/std/special/doc/index.html | 55 ++++++++++--- lib/std/special/doc/main.js | 146 ++++++++++++++++++++++++++++----- 2 files changed, 170 insertions(+), 31 deletions(-) diff --git a/lib/std/special/doc/index.html b/lib/std/special/doc/index.html index 34810b29a..4fadc35e1 100644 --- a/lib/std/special/doc/index.html +++ b/lib/std/special/doc/index.html @@ -5,22 +5,52 @@ Documentation - Zig +

      Loading...

      + diff --git a/lib/std/special/doc/main.js b/lib/std/special/doc/main.js index d27efd2b4..4de26fe4b 100644 --- a/lib/std/special/doc/main.js +++ b/lib/std/special/doc/main.js @@ -1,9 +1,17 @@ (function() { var domStatus = document.getElementById("status"); + var domSectNav = document.getElementById("sectNav"); + var domListNav = document.getElementById("listNav"); var domSectPkgs = document.getElementById("sectPkgs"); var domListPkgs = document.getElementById("listPkgs"); var domSectTypes = document.getElementById("sectTypes"); var domListTypes = document.getElementById("listTypes"); + var domSectFns = document.getElementById("sectFns"); + var domListFns = document.getElementById("listFns"); + + var typeKindTypeId; + var typeKindFnId; + findTypeKinds(); var curNav = { // each element is a package name, e.g. @import("a") then within there @import("b") @@ -19,14 +27,29 @@ }; var rootIsStd = detectRootIsStd(); - var typeKindTypeId = findTypeKindType(); var typeTypeId = findTypeTypeId(); window.addEventListener('hashchange', onHashChange, false); onHashChange(); + function renderTitle() { + var list = curNav.pkgNames.concat(curNav.declNames); + var suffix = " - Zig"; + if (list.length === 0) { + if (rootIsStd) { + document.title = "std" + suffix; + } else { + document.title = zigAnalysis.params.rootName + suffix; + } + } else { + document.title = list.join('.') + suffix; + } + } + function render() { domStatus.classList.add("hidden"); + renderTitle(); + var pkg = zigAnalysis.packages[zigAnalysis.rootPkg]; curNav.pkgObjs = [pkg]; for (var i = 0; i < curNav.pkgNames.length; i += 1) { @@ -58,6 +81,8 @@ curNav.declObjs.push(decl); } + renderNav(); + var lastPkg = curNav.pkgObjs[curNav.pkgObjs.length - 1]; renderPkgList(lastPkg); @@ -69,11 +94,46 @@ } } + function renderNav() { + var len = curNav.pkgNames.length + curNav.declNames.length; + resizeDomList(domListNav, len, '
    • '); + var list = []; + var hrefPkgNames = []; + var hrefDeclNames = []; + for (var i = 0; i < curNav.pkgNames.length; i += 1) { + hrefPkgNames.push(curNav.pkgNames[i]); + list.push({ + name: curNav.pkgNames[i], + link: navLink(hrefPkgNames, hrefDeclNames), + }); + } + for (var i = 0; i < curNav.declNames.length; i += 1) { + hrefDeclNames.push(curNav.declNames[i]); + list.push({ + name: curNav.declNames[i], + link: navLink(hrefPkgNames, hrefDeclNames), + }); + } + + for (var i = 0; i < list.length; i += 1) { + var liDom = domListNav.children[i]; + var aDom = liDom.children[0]; + aDom.textContent = list[i].name; + aDom.setAttribute('href', list[i].link); + if (i + 1 == list.length) { + aDom.classList.add("active"); + } else { + aDom.classList.remove("active"); + } + } + } + function render404() { domStatus.textContent = "404 Not Found"; domStatus.classList.remove("hidden"); domSectPkgs.classList.add("hidden"); domSectTypes.classList.add("hidden"); + domSectFns.classList.add("hidden"); } function renderPkgList(pkg) { @@ -104,12 +164,22 @@ } } + function navLink(pkgNames, declNames) { + if (pkgNames.length === 0 && declNames.length === 0) { + return '#'; + } else if (declNames.length === 0) { + return '#' + pkgNames.join('.'); + } else { + return '#' + pkgNames.join('.') + ';' + declNames.join('.'); + } + } + function navLinkPkg(childName) { - return '#' + (curNav.pkgNames.concat([childName])).join(','); + return navLink(curNav.pkgNames.concat([childName]), []); } function navLinkDecl(childName) { - return '#' + curNav.pkgNames.join(",") + ';' + (curNav.declNames.concat([childName])).join(","); + return navLink(curNav.pkgNames, curNav.declNames.concat([childName])); } function resizeDomList(listDom, desiredLen, templateHtml) { @@ -125,28 +195,55 @@ } function renderContainer(container) { - // Find only the types of this package - var list = []; + var typesList = []; + var fnsList = []; for (var i = 0; i < container.decls.length; i += 1) { var decl = zigAnalysis.decls[container.decls[i]]; - if (decl.type == typeTypeId) { - list.push(decl); + if (decl.type != null) { + if (decl.type == typeTypeId) { + typesList.push(decl); + } else { + var typeKind = zigAnalysis.types[decl.type].kind; + if (typeKind === typeKindFnId) { + fnsList.push(decl); + } + } } } - list.sort(function(a, b) { + typesList.sort(function(a, b) { + return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); + }); + fnsList.sort(function(a, b) { return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); }); - resizeDomList(domListTypes, list.length, '
    • '); - for (var i = 0; i < list.length; i += 1) { - var liDom = domListTypes.children[i]; - var aDom = liDom.children[0]; - var decl = list[i]; - aDom.textContent = decl.name; - aDom.setAttribute('href', navLinkDecl(decl.name)); + if (typesList.length === 0) { + domSectTypes.classList.add("hidden"); + } else { + resizeDomList(domListTypes, typesList.length, '
    • '); + for (var i = 0; i < typesList.length; i += 1) { + var liDom = domListTypes.children[i]; + var aDom = liDom.children[0]; + var decl = typesList[i]; + aDom.textContent = decl.name; + aDom.setAttribute('href', navLinkDecl(decl.name)); + } + domSectTypes.classList.remove("hidden"); } - domSectTypes.classList.remove("hidden"); + if (fnsList.length === 0) { + domSectFns.classList.add("hidden"); + } else { + resizeDomList(domListFns, fnsList.length, '
    • '); + for (var i = 0; i < fnsList.length; i += 1) { + var liDom = domListFns.children[i]; + var aDom = liDom.children[0]; + var decl = fnsList[i]; + aDom.textContent = decl.name; + aDom.setAttribute('href', navLinkDecl(decl.name)); + } + domSectFns.classList.remove("hidden"); + } } function operatorCompare(a, b) { @@ -169,13 +266,20 @@ return rootPkg.file === stdPkg.file; } - function findTypeKindType() { + function findTypeKinds() { for (var i = 0; i < zigAnalysis.typeKinds.length; i += 1) { if (zigAnalysis.typeKinds[i] === "Type") { - return i; + typeKindTypeId = i; + } else if (zigAnalysis.typeKinds[i] === "Fn") { + typeKindFnId = i; } } - throw new Error("No type kind 'Type' found"); + if (typeKindTypeId == null) { + throw new Error("No type kind 'Type' found"); + } + if (typeKindFnId == null) { + throw new Error("No type kind 'Fn' found"); + } } function findTypeTypeId() { @@ -194,11 +298,11 @@ declNames: [], declObjs: [], }; - if (location.hash[0] === '#') { + if (location.hash[0] === '#' && location.hash.length > 1) { var parts = location.hash.substring(1).split(";"); curNav.pkgNames = parts[0].split("."); if (parts[1] != null) { - curNav.declNames = parts[1] ? parts[1].split(".") : []; + curNav.declNames = parts[1].split("."); } } render(); From 19c2474b342aa8f4e6f3dc846f3475016d713329 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 5 Oct 2019 16:18:26 -0400 Subject: [PATCH 0015/1027] generated docs: render functions --- lib/std/special/doc/index.html | 14 +++++++++++++- lib/std/special/doc/main.js | 25 ++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/lib/std/special/doc/index.html b/lib/std/special/doc/index.html index 4fadc35e1..db80ec955 100644 --- a/lib/std/special/doc/index.html +++ b/lib/std/special/doc/index.html @@ -14,6 +14,12 @@ a { color: #2A6286; } + pre{ + font-family:"Source Code Pro",monospace; + font-size:1em; + background-color:#F5F5F5; + padding:1em; + } #listNav { list-style-type: none; margin: 0; @@ -46,12 +52,18 @@ a { color: #88f; } + pre{ + background-color:#2A2A2A; + } } -

        Loading...

        + +

        + +

        + +

        - + + +