diff --git a/migrate_cpp/cpp_refactoring/var_decl.cpp b/migrate_cpp/cpp_refactoring/var_decl.cpp index 70a2457bdde2..e9d4d93c8512 100644 --- a/migrate_cpp/cpp_refactoring/var_decl.cpp +++ b/migrate_cpp/cpp_refactoring/var_decl.cpp @@ -17,37 +17,77 @@ VarDecl::VarDecl(std::map& in_replacements, finder->addMatcher(cam::varDecl().bind(Label), this); } +// Returns a string for the type. +static auto GetTypeStr(const clang::VarDecl* decl, + const clang::SourceManager& sm, + const clang::LangOptions& lang_opts) -> std::string { + auto type_loc = decl->getTypeSourceInfo()->getTypeLoc(); + std::vector segments; + while (!type_loc.isNull()) { + switch (type_loc.getTypeLocClass()) { + case clang::TypeLoc::LValueReference: + case clang::TypeLoc::RValueReference: + case clang::TypeLoc::Pointer: + case clang::TypeLoc::Auto: + case clang::TypeLoc::Qualified: + segments.push_back(type_loc.getLocalSourceRange()); + type_loc = type_loc.getNextTypeLoc(); + break; + + default: + // For non-auto types, use the canonical type, which adds things like + // namespace qualifiers. + return clang::QualType::getAsString(decl->getType().split(), lang_opts); + } + } + + // Sort type segments as they're written in the file. This avoids needing to + // understand TypeLoc traversal ordering. + std::sort(segments.begin(), segments.end(), + [](clang::SourceRange a, clang::SourceRange b) { + return a.getBegin() < b.getBegin(); + }); + + std::string type_str; + for (const auto& segment : segments) { + type_str += clang::Lexer::getSourceText( + clang::CharSourceRange::getTokenRange(segment), sm, lang_opts); + } + return type_str; +} + void VarDecl::run(const cam::MatchFinder::MatchResult& result) { const auto* decl = result.Nodes.getNodeAs(Label); if (!decl) { llvm::report_fatal_error(std::string("getNodeAs failed for ") + Label); } - auto& sm = *(result.SourceManager); - auto lang_opts = result.Context->getLangOpts(); - - std::string after; - // Start the replacement with "var" unless it's a parameter. - if (result.Nodes.getNodeAs(Label) == nullptr) { - after = "var "; - } - // Finish the "type: name" replacement. - after += decl->getNameAsString() + ": " + - clang::QualType::getAsString(decl->getType().split(), lang_opts); - if (decl->getTypeSourceInfo() == nullptr) { // TODO: Need to understand what's happening in this case. Not sure if we // need to address it. return; } + auto& sm = *(result.SourceManager); + auto lang_opts = result.Context->getLangOpts(); + + std::string after; + if (decl->getType().isConstQualified()) { + after = "let "; + } else if (result.Nodes.getNodeAs(Label) == nullptr) { + // Start the replacement with "var" unless it's a parameter. + after = "var "; + } + // Add "identifier: type" to the replacement. + after += decl->getNameAsString() + ": " + GetTypeStr(decl, sm, lang_opts); + // This decides the range to replace. Normally the entire decl is replaced, // but for code like `int i, j` we need to detect the comma between the // declared names. That case currently results in `var i: int, var j: int`. + // If there's a comma, this range will be non-empty. auto type_loc = decl->getTypeSourceInfo()->getTypeLoc(); auto after_type_loc = clang::Lexer::getLocForEndOfToken(type_loc.getEndLoc(), 0, sm, lang_opts); - // If there's a comma, this range will be non-empty. auto comma_source_text = clang::Lexer::getSourceText( clang::CharSourceRange::getCharRange(after_type_loc, decl->getLocation()), sm, lang_opts); diff --git a/migrate_cpp/cpp_refactoring/var_decl_test.cpp b/migrate_cpp/cpp_refactoring/var_decl_test.cpp index 3ad6abc1a21c..086eada9e73a 100644 --- a/migrate_cpp/cpp_refactoring/var_decl_test.cpp +++ b/migrate_cpp/cpp_refactoring/var_decl_test.cpp @@ -35,6 +35,23 @@ TEST_F(VarDeclTest, DeclarationComma) { ExpectReplacement(Before, After); } +TEST_F(VarDeclTest, DeclarationCommaArray) { + // TODO: Maybe replace the comma with a `;`. + // TODO: Need to handle j's array. + constexpr char Before[] = "int i[4], j[4];"; + constexpr char After[] = "var i: int [4], j[4];"; + ExpectReplacement(Before, After); +} + +TEST_F(VarDeclTest, DeclarationCommaPointers) { + // TODO: Maybe replace the comma with a `;`. + // TODO: Need to handle j's pointer. + // constexpr char After[] = "var i: int *, var j: int *;"; + constexpr char Before[] = "int *i, *j;"; + constexpr char After[] = "var i: int *, *j;"; + ExpectReplacement(Before, After); +} + TEST_F(VarDeclTest, Assignment) { constexpr char Before[] = "int i = 0;"; // TODO: Include init. @@ -44,15 +61,52 @@ TEST_F(VarDeclTest, Assignment) { TEST_F(VarDeclTest, Auto) { constexpr char Before[] = "auto i = 0;"; - // TODO: Keep auto. - constexpr char After[] = "var i: int;"; + constexpr char After[] = "var i: auto;"; + ExpectReplacement(Before, After); +} + +TEST_F(VarDeclTest, AutoRef) { + // TODO: Include init. + // TODO: j should have const. + constexpr char Before[] = R"cpp( + auto i = 0; + const auto& j = i; + )cpp"; + constexpr char After[] = R"( + var i: auto; + var j: auto&; + )"; ExpectReplacement(Before, After); } TEST_F(VarDeclTest, Const) { - // TODO: Include init, have `const` indicate `let`. + // TODO: Include init. constexpr char Before[] = "const int i = 0;"; - constexpr char After[] = "var i: const int;"; + constexpr char After[] = "let i: const int;"; + ExpectReplacement(Before, After); +} + +TEST_F(VarDeclTest, ConstPointer) { + constexpr char Before[] = "const int* i;"; + constexpr char After[] = "var i: const int *;"; + ExpectReplacement(Before, After); +} + +TEST_F(VarDeclTest, Namespace) { + // This is to ensure the 'struct' keyword doesn't get added to the qualified type. + constexpr char Before[] = R"cpp( + namespace Foo { + typedef int Bar; + } + Foo::Bar x; + )cpp"; + constexpr char After[] = R"( + namespace Foo { + typedef int Bar; + } + var x: Foo::Bar; + )"; + ExpectReplacement(Before, After); ExpectReplacement(Before, After); } @@ -71,7 +125,7 @@ TEST_F(VarDeclTest, ParamsDefault) { TEST_F(VarDeclTest, ParamsConst) { constexpr char Before[] = "auto Foo(const int i) -> int;"; - constexpr char After[] = "auto Foo(i: const int) -> int;"; + constexpr char After[] = "auto Foo(let i: const int) -> int;"; ExpectReplacement(Before, After); } @@ -102,8 +156,9 @@ TEST_F(VarDeclTest, Member) { ExpectReplacement(Before, Before); } -TEST_F(VarDeclTest, RangeFor) { - // TODO: Handle range based for loops. +TEST_F(VarDeclTest, DISABLED_RangeFor) { + // TODO: Handle range based for loops. Test shouldn't be enabled without + // addressing this because the output is quirky and fragile. constexpr char Before[] = R"cpp( void Foo() { int items[] = {1}; @@ -113,8 +168,8 @@ TEST_F(VarDeclTest, RangeFor) { )cpp"; constexpr char After[] = R"( void Foo() { - var items: int [1]; - for (int i var __begin1: int * var __range1: int (&)[1]) { + var items: int[] = {1}; + for (int i : items) { } } )"; diff --git a/third_party/examples/woff2/carbon/include/woff2/output.carbon b/third_party/examples/woff2/carbon/include/woff2/output.carbon index 49cfc3085e29..d722345543de 100644 --- a/third_party/examples/woff2/carbon/include/woff2/output.carbon +++ b/third_party/examples/woff2/carbon/include/woff2/output.carbon @@ -17,7 +17,7 @@ namespace woff2 { // Suggested max size for output. -var kDefaultMaxSize: const size_t; +let kDefaultMaxSize: const size_t; /** * Output interface for the woff2 decoding. diff --git a/third_party/examples/woff2/carbon/src/font.impl.carbon b/third_party/examples/woff2/carbon/src/font.impl.carbon index 72f5e0aa5ada..3a9597e75c99 100644 --- a/third_party/examples/woff2/carbon/src/font.impl.carbon +++ b/third_party/examples/woff2/carbon/src/font.impl.carbon @@ -19,19 +19,19 @@ namespace woff2 { fn Font::FindTable(tag: uint32_t) -> Font::Table* { - var it: std::__map_iterator, std::__tree_node, void *> *, long>>; + var it: auto; return it == tables.end() ? nullptr : &it->second; } fn Font::FindTable(tag: uint32_t) const -> const Font::Table* { - var it: std::__map_const_iterator, std::__tree_node, void *> *, long>>; + var it: auto; return it == tables.end() ? nullptr : &it->second; } fn Font::OutputOrderedTags() const -> std::vector { var output_order: std::vector; - for (const auto& i var __begin1: std::__map_const_iterator, std::__tree_node, void *> *, long>> var __range1: const std::map &) { + for (const auto& i var __begin1: : var __range1: tablestables) { var table: const Font::Table &; // This is a transformed table, we will write it together with the // original version. @@ -42,8 +42,8 @@ fn Font::OutputOrderedTags() const -> std::vector { } // Alphabetize then put loca immediately after glyf - var glyf_loc: std::__wrap_iter; - var loca_loc: std::__wrap_iter; + var glyf_loc: auto; + var loca_loc: auto; if (glyf_loc != output_order.end() && loca_loc != output_order.end()) { output_order.erase(loca_loc); output_order.insert(std::find(output_order.begin(), output_order.end(), @@ -88,7 +88,7 @@ fn ReadTrueTypeFont(file: woff2::Buffer *, data: const uint8_t *, len: size_t, // Check that tables are non-overlapping. var last_offset: uint32_t; - for (const auto& i var __begin1: std::__map_iterator, std::__tree_node, void *> *, long>> var __range1: std::map &) { + for (const auto& i var __begin1: : var __range1: intervalsintervals) { if (i.first < last_offset || i.first + i.second < i.first) { return FONT_COMPRESSION_FAILURE(); } @@ -114,7 +114,7 @@ fn ReadCollectionFont(file: woff2::Buffer *, data: const uint8_t *, len: size_t, return FONT_COMPRESSION_FAILURE(); } - for (auto& entry var __begin1: std::__map_iterator, std::__tree_node, void *> *, long>> var __range1: std::map &) { + for (auto& entry var __begin1: : var __range1: fontfont) { var table: Font::Table &; if (all_tables->find(table.offset) == all_tables->end()) { @@ -149,10 +149,10 @@ fn ReadTrueTypeCollection(file: woff2::Buffer *, data: const uint8_t *, len: siz } font_collection->fonts.resize(offsets.size()); - var font_it: std::__wrap_iter; + var font_it: auto; var all_tables: std::map; - for (const auto offset var __begin1: std::__wrap_iter var __range1: std::vector &) { + for (const auto offset var __begin1: : var __range1: offsetsoffsets) { file->set_offset(offset); var font: woff2::Font &; if (!ReadCollectionFont(file, data, len, &font, &all_tables)) { @@ -195,7 +195,7 @@ fn ReadFontCollection(data: const uint8_t *, len: size_t, fn FontFileSize(font: const woff2::Font &) -> size_t { var max_offset: size_t; - for (const auto& i var __begin1: std::__map_const_iterator, std::__tree_node, void *> *, long>> var __range1: const std::map &) { + for (const auto& i var __begin1: : var __range1: fontfont) { var table: const Font::Table &; var padding_size: size_t; var end_offset: size_t; @@ -206,7 +206,7 @@ fn FontFileSize(font: const woff2::Font &) -> size_t { fn FontCollectionFileSize(font_collection: const woff2::FontCollection &) -> size_t { var max_offset: size_t; - for (auto& font var __begin1: std::__wrap_iter var __range1: const std::vector &) { + for (auto& font var __begin1: : var __range1: font_collectionfont_collection) { // font file size actually just finds max offset max_offset = std::max(max_offset, FontFileSize(font)); } @@ -270,7 +270,7 @@ fn WriteFont(font: const woff2::Font &, offset: size_t *, dst: uint8_t *, Store16(max_pow2, offset, dst); Store16(range_shift, offset, dst); - for (const auto& i var __begin1: std::__map_const_iterator, std::__tree_node, void *> *, long>> var __range1: const std::map &) { + for (const auto& i var __begin1: : var __range1: fontfont) { if (!WriteTable(i.second, offset, dst, dst_size)) { return false; } @@ -306,7 +306,7 @@ fn WriteFontCollection(font_collection: const woff2::FontCollection &, dst: uint } // Write fonts and their offsets. - for (const auto & font var __begin1: std::__wrap_iter var __range1: const std::vector &) { + for (const auto & font var __begin1: : var __range1: font_collectionfont_collection) { StoreU32(offset, &offset_table, dst); if (!WriteFont(font, &offset, dst, dst_size)) { return false; @@ -385,7 +385,7 @@ fn GetGlyphData(font: const woff2::Font &, glyph_index: int, } fn RemoveDigitalSignature(font: woff2::Font *) -> bool { - var it: std::__map_iterator, std::__tree_node, void *> *, long>>; + var it: auto; if (it != font->tables.end()) { font->tables.erase(it); font->num_tables = font->tables.size(); diff --git a/third_party/examples/woff2/carbon/src/glyph.impl.carbon b/third_party/examples/woff2/carbon/src/glyph.impl.carbon index 2eab0873ad2d..fa9f74e08a05 100644 --- a/third_party/examples/woff2/carbon/src/glyph.impl.carbon +++ b/third_party/examples/woff2/carbon/src/glyph.impl.carbon @@ -15,18 +15,18 @@ namespace woff2 { -var kFLAG_ONCURVE: const int32_t; -var kFLAG_XSHORT: const int32_t; -var kFLAG_YSHORT: const int32_t; -var kFLAG_REPEAT: const int32_t; -var kFLAG_XREPEATSIGN: const int32_t; -var kFLAG_YREPEATSIGN: const int32_t; -var kFLAG_ARG_1_AND_2_ARE_WORDS: const int32_t; -var kFLAG_WE_HAVE_A_SCALE: const int32_t; -var kFLAG_MORE_COMPONENTS: const int32_t; -var kFLAG_WE_HAVE_AN_X_AND_Y_SCALE: const int32_t; -var kFLAG_WE_HAVE_A_TWO_BY_TWO: const int32_t; -var kFLAG_WE_HAVE_INSTRUCTIONS: const int32_t; +let kFLAG_ONCURVE: const int32_t; +let kFLAG_XSHORT: const int32_t; +let kFLAG_YSHORT: const int32_t; +let kFLAG_REPEAT: const int32_t; +let kFLAG_XREPEATSIGN: const int32_t; +let kFLAG_YREPEATSIGN: const int32_t; +let kFLAG_ARG_1_AND_2_ARE_WORDS: const int32_t; +let kFLAG_WE_HAVE_A_SCALE: const int32_t; +let kFLAG_MORE_COMPONENTS: const int32_t; +let kFLAG_WE_HAVE_AN_X_AND_Y_SCALE: const int32_t; +let kFLAG_WE_HAVE_A_TWO_BY_TWO: const int32_t; +let kFLAG_WE_HAVE_INSTRUCTIONS: const int32_t; fn ReadCompositeGlyphData(buffer: woff2::Buffer *, glyph: woff2::Glyph *) -> bool { glyph->have_instructions = false; @@ -226,7 +226,7 @@ fn StoreInstructions(glyph: const woff2::Glyph &, offset: size_t *, dst: uint8_t fn StoreEndPtsOfContours(glyph: const woff2::Glyph &, offset: size_t *, dst: uint8_t *) -> bool { var end_point: int; - for (const auto& contour var __begin2: std::__wrap_iter *> var __range2: const std::vector> &) { + for (const auto& contour var __begin2: : var __range2: glyphglyph) { end_point += contour.size(); if (contour.size() > std::numeric_limits::max() || end_point > std::numeric_limits::max()) { @@ -247,8 +247,8 @@ fn StorePoints(glyph: const woff2::Glyph &, offset: size_t *, var y_bytes: size_t; // Store the flags and calculate the total size of the x and y coordinates. - for (const auto& contour var __begin2: std::__wrap_iter *> var __range2: const std::vector> &) { - for (const auto& point var __begin3: std::__wrap_iter var __range3: const std::vector &) { + for (const auto& contour var __begin2: : var __range2: glyphglyph) { + for (const auto& point var __begin3: : var __range3: contourcontour) { var flag: int; var dx: int; var dy: int; @@ -305,8 +305,8 @@ fn StorePoints(glyph: const woff2::Glyph &, offset: size_t *, var y_offset: size_t; last_x = 0; last_y = 0; - for (const auto& contour var __begin2: std::__wrap_iter *> var __range2: const std::vector> &) { - for (const auto& point var __begin3: std::__wrap_iter var __range3: const std::vector &) { + for (const auto& contour var __begin2: : var __range2: glyphglyph) { + for (const auto& point var __begin3: : var __range3: contourcontour) { var dx: int; var dy: int; if (dx == 0) { diff --git a/third_party/examples/woff2/carbon/src/normalize.impl.carbon b/third_party/examples/woff2/carbon/src/normalize.impl.carbon index 7acca894419d..43baced81f41 100644 --- a/third_party/examples/woff2/carbon/src/normalize.impl.carbon +++ b/third_party/examples/woff2/carbon/src/normalize.impl.carbon @@ -165,8 +165,8 @@ fn NormalizeGlyphs(font: woff2::Font *) -> bool { fn NormalizeOffsets(font: woff2::Font *) -> bool { var offset: uint32_t; - for (auto tag var __begin1: std::__wrap_iter var __range1: std::vector &&) { - var table: woff2::Font::Table &; + for (auto tag var __begin1: : var __range1: fontfont) { + var table: auto&; table.offset = offset; offset += Round4(table.length); } @@ -182,7 +182,7 @@ fn ComputeHeaderChecksum(font: const woff2::Font &) -> uint32_t { var range_shift: uint16_t; checksum += (font.num_tables << 16 | search_range); checksum += (max_pow2 << 16 | range_shift); - for (const auto& i var __begin2: std::__map_const_iterator, std::__tree_node, void *> *, long>> var __range2: const std::map &) { + for (const auto& i var __begin2: : var __range2: fontfont) { var table: const Font::Table *; if (table->IsReused()) { table = table->reuse_of; @@ -214,7 +214,7 @@ fn FixChecksums(font: woff2::Font *) -> bool { StoreU32(0, &offset, head_buf); var file_checksum: uint32_t; var head_checksum: uint32_t; - for (auto& i var __begin1: std::__map_iterator, std::__tree_node, void *> *, long>> var __range1: std::map &) { + for (auto& i var __begin1: : var __range1: fontfont) { var table: Font::Table *; if (table->IsReused()) { table = table->reuse_of; @@ -274,7 +274,7 @@ fn NormalizeFontCollection(font_collection: woff2::FontCollection *) -> bool { } var offset: uint32_t; - for (auto& font var __begin1: std::__wrap_iter var __range1: std::vector &) { + for (auto& font var __begin1: : var __range1: font_collectionfont_collection) { if (!NormalizeWithoutFixingChecksums(&font)) { #ifdef FONT_COMPRESSION_BIN fprintf(stderr, "Font normalization failed.\n"); @@ -285,8 +285,8 @@ fn NormalizeFontCollection(font_collection: woff2::FontCollection *) -> bool { } // Start table offsets after TTC Header and Sfnt Headers - for (auto& font var __begin1: std::__wrap_iter var __range1: std::vector &) { - for (auto tag var __begin2: std::__wrap_iter var __range2: std::vector &&) { + for (auto& font var __begin1: : var __range1: font_collectionfont_collection) { + for (auto tag var __begin2: : var __range2: fontfont) { var table: Font::Table &; if (table.IsReused()) { table.offset = table.reuse_of->offset; @@ -298,7 +298,7 @@ fn NormalizeFontCollection(font_collection: woff2::FontCollection *) -> bool { } // Now we can fix the checksums - for (auto& font var __begin1: std::__wrap_iter var __range1: std::vector &) { + for (auto& font var __begin1: : var __range1: font_collectionfont_collection) { if (!FixChecksums(&font)) { #ifdef FONT_COMPRESSION_BIN fprintf(stderr, "Failed to fix checksums\n"); diff --git a/third_party/examples/woff2/carbon/src/table_tags.carbon b/third_party/examples/woff2/carbon/src/table_tags.carbon index 469015308b04..a847b582ea45 100644 --- a/third_party/examples/woff2/carbon/src/table_tags.carbon +++ b/third_party/examples/woff2/carbon/src/table_tags.carbon @@ -14,16 +14,16 @@ namespace woff2 { // Tags of popular tables. -var kGlyfTableTag: const uint32_t; -var kHeadTableTag: const uint32_t; -var kLocaTableTag: const uint32_t; -var kDsigTableTag: const uint32_t; -var kCffTableTag: const uint32_t; -var kHmtxTableTag: const uint32_t; -var kHheaTableTag: const uint32_t; -var kMaxpTableTag: const uint32_t; +let kGlyfTableTag: const uint32_t; +let kHeadTableTag: const uint32_t; +let kLocaTableTag: const uint32_t; +let kDsigTableTag: const uint32_t; +let kCffTableTag: const uint32_t; +let kHmtxTableTag: const uint32_t; +let kHheaTableTag: const uint32_t; +let kMaxpTableTag: const uint32_t; -var kKnownTags: const uint32_t []; +let kKnownTags: const uint32_t []; } // namespace woff2 diff --git a/third_party/examples/woff2/carbon/src/table_tags.impl.carbon b/third_party/examples/woff2/carbon/src/table_tags.impl.carbon index 4d252a2c0fa7..8a25030a44f8 100644 --- a/third_party/examples/woff2/carbon/src/table_tags.impl.carbon +++ b/third_party/examples/woff2/carbon/src/table_tags.impl.carbon @@ -13,6 +13,6 @@ namespace woff2 { // Note that the byte order is big-endian, not the same as ots.cc #define TAG(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) -var kKnownTags: const uint32_t [63]; +let kKnownTags: const uint32_t [63]; } // namespace woff2 diff --git a/third_party/examples/woff2/carbon/src/transform.impl.carbon b/third_party/examples/woff2/carbon/src/transform.impl.carbon index 0c77ea5d11cd..475ae27aab31 100644 --- a/third_party/examples/woff2/carbon/src/transform.impl.carbon +++ b/third_party/examples/woff2/carbon/src/transform.impl.carbon @@ -20,8 +20,8 @@ namespace woff2 { namespace { -var FLAG_ARG_1_AND_2_ARE_WORDS: const int; -var FLAG_WE_HAVE_INSTRUCTIONS: const int; +let FLAG_ARG_1_AND_2_ARE_WORDS: const int; +let FLAG_WE_HAVE_INSTRUCTIONS: const int; fn WriteBytes(out: std::vector *, data: const uint8_t *, len: size_t) { if (len == 0) { return; @@ -32,7 +32,7 @@ fn WriteBytes(out: std::vector *, data: const uint8_t *, len: size_t) { } fn WriteBytes(out: std::vector *, in: const std::vector &) { - for (unsigned char i var __begin2: std::__wrap_iter var __range2: const std::vector &) { + for (unsigned char i var __begin2: : var __range2: inin) { out->push_back(i); } } @@ -106,8 +106,8 @@ class GlyfEncoder { var y_min: int16_t; var x_max: int16_t; var y_max: int16_t; - for (const auto& contour var __begin2: std::__wrap_iter *> var __range2: const std::vector> &) { - for (const auto& point var __begin3: std::__wrap_iter var __range3: const std::vector &) { + for (const auto& contour var __begin2: : var __range2: glyphglyph) { + for (const auto& point var __begin3: : var __range3: contourcontour) { if (point.x < x_min) { x_min = point.x; } if (point.x > x_max) { x_max = point.x; @@ -394,17 +394,17 @@ fn TransformHmtxTable(font: woff2::Font *) -> bool { transformed_hmtx->buffer.reserve(transformed_size); var out: std::vector *; WriteBytes(out, &flags, 1); - for (uint16_t advance_width var __begin1: std::__wrap_iter var __range1: std::vector &) { + for (uint16_t advance_width var __begin1: : var __range1: advance_widthsadvance_widths) { WriteUShort(out, advance_width); } if (!remove_proportional_lsb) { - for (int16_t lsb var __begin2: std::__wrap_iter var __range2: std::vector &) { + for (int16_t lsb var __begin2: : var __range2: proportional_lsbsproportional_lsbs) { WriteUShort(out, lsb); } } if (!remove_monospace_lsb) { - for (int16_t lsb var __begin2: std::__wrap_iter var __range2: std::vector &) { + for (int16_t lsb var __begin2: : var __range2: monospace_lsbsmonospace_lsbs) { WriteUShort(out, lsb); } } diff --git a/third_party/examples/woff2/carbon/src/variable_length.impl.carbon b/third_party/examples/woff2/carbon/src/variable_length.impl.carbon index 7e7f06b2209f..a681b5ebb7f4 100644 --- a/third_party/examples/woff2/carbon/src/variable_length.impl.carbon +++ b/third_party/examples/woff2/carbon/src/variable_length.impl.carbon @@ -41,17 +41,17 @@ fn Write255UShort(out: std::vector *, value: int) { fn Store255UShort(val: int, offset: size_t *, dst: uint8_t *) { var packed: std::vector; Write255UShort(&packed, val); - for (uint8_t packed_byte var __begin1: std::__wrap_iter var __range1: std::vector &) { + for (uint8_t packed_byte var __begin1: : var __range1: packedpacked) { dst[(*offset)++] = packed_byte; } } // Based on section 6.1.1 of MicroType Express draft spec fn Read255UShort(buf: woff2::Buffer *, value: unsigned int *) -> bool { - var kWordCode: const int; - var kOneMoreByteCode2: const int; - var kOneMoreByteCode1: const int; - var kLowestUCode: const int; + let kWordCode: const int; + let kOneMoreByteCode2: const int; + let kOneMoreByteCode1: const int; + let kLowestUCode: const int; var code: uint8_t; if (!buf->ReadU8(&code)) { return FONT_COMPRESSION_FAILURE(); diff --git a/third_party/examples/woff2/carbon/src/woff2_common.carbon b/third_party/examples/woff2/carbon/src/woff2_common.carbon index 621b8ef19529..cc7f439892ff 100644 --- a/third_party/examples/woff2/carbon/src/woff2_common.carbon +++ b/third_party/examples/woff2/carbon/src/woff2_common.carbon @@ -16,16 +16,16 @@ namespace woff2 { -var kWoff2Signature: const uint32_t; // "wOF2" +let kWoff2Signature: const uint32_t; // "wOF2" // Leave the first byte open to store flag_byte -var kWoff2FlagsTransform: const unsigned int; +let kWoff2FlagsTransform: const unsigned int; // TrueType Collection ID string: 'ttcf' -var kTtcFontFlavor: const uint32_t; +let kTtcFontFlavor: const uint32_t; -var kSfntHeaderSize: const size_t; -var kSfntEntrySize: const size_t; +let kSfntHeaderSize: const size_t; +let kSfntEntrySize: const size_t; struct Point { int x; diff --git a/third_party/examples/woff2/carbon/src/woff2_compress.impl.carbon b/third_party/examples/woff2/carbon/src/woff2_compress.impl.carbon index 36ff11ed37ad..ec15360b5c60 100644 --- a/third_party/examples/woff2/carbon/src/woff2_compress.impl.carbon +++ b/third_party/examples/woff2/carbon/src/woff2_compress.impl.carbon @@ -26,10 +26,10 @@ fn main(argc: int, argv: char **) -> int { filename.c_str(), outfilename.c_str()); var input: std::string; - var input_data: const unsigned char *; + var input_data: auto*; var output_size: size_t; var output: std::string; - var output_data: unsigned char *; + var output_data: auto*; var params: woff2::WOFF2Params; if (!woff2::ConvertTTFToWOFF2(input_data, input.size(), diff --git a/third_party/examples/woff2/carbon/src/woff2_dec.impl.carbon b/third_party/examples/woff2/carbon/src/woff2_dec.impl.carbon index 092dcdee359e..a1bdd96a1894 100644 --- a/third_party/examples/woff2/carbon/src/woff2_dec.impl.carbon +++ b/third_party/examples/woff2/carbon/src/woff2_dec.impl.carbon @@ -38,34 +38,34 @@ using std::vector; // simple glyph flags -var kGlyfOnCurve: const int; -var kGlyfXShort: const int; -var kGlyfYShort: const int; -var kGlyfRepeat: const int; -var kGlyfThisXIsSame: const int; -var kGlyfThisYIsSame: const int; +let kGlyfOnCurve: const int; +let kGlyfXShort: const int; +let kGlyfYShort: const int; +let kGlyfRepeat: const int; +let kGlyfThisXIsSame: const int; +let kGlyfThisYIsSame: const int; // composite glyph flags // See CompositeGlyph.java in sfntly for full definitions -var FLAG_ARG_1_AND_2_ARE_WORDS: const int; -var FLAG_WE_HAVE_A_SCALE: const int; -var FLAG_MORE_COMPONENTS: const int; -var FLAG_WE_HAVE_AN_X_AND_Y_SCALE: const int; -var FLAG_WE_HAVE_A_TWO_BY_TWO: const int; -var FLAG_WE_HAVE_INSTRUCTIONS: const int; +let FLAG_ARG_1_AND_2_ARE_WORDS: const int; +let FLAG_WE_HAVE_A_SCALE: const int; +let FLAG_MORE_COMPONENTS: const int; +let FLAG_WE_HAVE_AN_X_AND_Y_SCALE: const int; +let FLAG_WE_HAVE_A_TWO_BY_TWO: const int; +let FLAG_WE_HAVE_INSTRUCTIONS: const int; -var kCheckSumAdjustmentOffset: const size_t; +let kCheckSumAdjustmentOffset: const size_t; -var kEndPtsOfContoursOffset: const size_t; -var kCompositeGlyphBegin: const size_t; +let kEndPtsOfContoursOffset: const size_t; +let kCompositeGlyphBegin: const size_t; // 98% of Google Fonts have no glyph above 5k bytes // Largest glyph ever observed was 72k bytes -var kDefaultGlyphBuf: const size_t; +let kDefaultGlyphBuf: const size_t; // Over 14k test fonts the max compression ratio seen to date was ~20. // >100 suggests you wrote a bad uncompressed size. -var kMaxPlausibleCompressionRatio: const float; +let kMaxPlausibleCompressionRatio: const float; // metadata for a TTC font entry struct TtcFont { @@ -374,15 +374,15 @@ fn StoreLoca(loca_values: const std::vector &, index_format: int, checksum: uint32_t *, out: woff2::WOFF2Out *) -> bool { // TODO(user) figure out what index format to use based on whether max // offset fits into uint16_t or not - var loca_size: const uint64_t; - var offset_size: const uint64_t; + let loca_size: const uint64_t; + let offset_size: const uint64_t; if (PREDICT_FALSE((loca_size << 2) >> 2 != loca_size)) { return FONT_COMPRESSION_FAILURE(); } var loca_content: std::vector; var dst: uint8_t *; var offset: size_t; - for (unsigned int value var __begin2: std::__wrap_iter var __range2: const std::vector &) { + for (unsigned int value var __begin2: : var __range2: loca_valuesloca_values) { if (index_format) { offset = StoreU32(dst, offset, value); } else { @@ -401,11 +401,11 @@ fn ReconstructGlyf(data: const uint8_t *, glyf_table: woff2::Table *, glyf_checksum: uint32_t *, loca_table: woff2::Table *, loca_checksum: uint32_t *, info: woff2::(anonymous namespace)::WOFF2FontInfo *, out: woff2::WOFF2Out *) -> bool { - var kNumSubStreams: const int; + let kNumSubStreams: const int; var file: woff2::Buffer; var version: uint32_t; var substreams: std::vector>; - var glyf_start: const size_t; + let glyf_start: const size_t; if (PREDICT_FALSE(!file.ReadU32(&version))) { return FONT_COMPRESSION_FAILURE(); @@ -647,7 +647,7 @@ fn ReconstructGlyf(data: const uint8_t *, glyf_table: woff2::Table *, } fn FindTable(tables: std::vector *, tag: uint32_t) -> Table* { - for (Table* table var __begin2: std::__wrap_iter var __range2: std::vector &) { + for (Table* table var __begin2: : var __range2: **) { if (table->tag == tag) { return table; } @@ -842,7 +842,7 @@ fn StoreOffsetTable(result: uint8_t *, offset: size_t, flavor: uint32_t, while (1u << (max_pow2 + 1) <= num_tables) { max_pow2++; } - var output_search_range: const uint16_t; + let output_search_range: const uint16_t; offset = Store16(result, offset, output_search_range); // searchRange offset = Store16(result, offset, max_pow2); // entrySelector // rangeShift @@ -864,7 +864,7 @@ fn ComputeOffsetToFirstTable(hdr: const woff2::(anonymous namespace)::WOFF2Heade if (hdr.header_version) { offset = CollectionHeaderSize(hdr.header_version, hdr.ttc_fonts.size()) + kSfntHeaderSize * hdr.ttc_fonts.size(); - for (const auto& ttc_font var __begin3: std::__wrap_iter var __range3: const std::vector &) { + for (const auto& ttc_font var __begin3: : var __range3: hdrhdr) { offset += kSfntEntrySize * ttc_font.table_indices.size(); } } @@ -874,11 +874,11 @@ fn ComputeOffsetToFirstTable(hdr: const woff2::(anonymous namespace)::WOFF2Heade fn Tables(hdr: woff2::(anonymous namespace)::WOFF2Header *, font_index: size_t) -> std::vector { var tables: std::vector
; if (PREDICT_FALSE(hdr->header_version)) { - for (auto index var __begin3: std::__wrap_iter var __range3: std::vector &) { + for (auto index var __begin3: : var __range3: hdrhdr) { tables.push_back(&hdr->tables[index]); } } else { - for (auto& table var __begin3: std::__wrap_iter var __range3: std::vector &) { + for (auto& table var __begin3: : var __range3: hdrhdr) { tables.push_back(&table); } } @@ -888,7 +888,7 @@ fn Tables(hdr: woff2::(anonymous namespace)::WOFF2Header *, font_index: size_t) // Offset tables assumed to have been written in with 0's initially. // WOFF2Header isn't const so we can use [] instead of at() (which upsets FF) fn ReconstructFont(transformed_buf: uint8_t *, - transformed_buf_size: const uint32_t, + let transformed_buf_size: const uint32_t, metadata: woff2::(anonymous namespace)::RebuildMetadata *, hdr: woff2::(anonymous namespace)::WOFF2Header *, font_index: size_t, @@ -1172,7 +1172,7 @@ fn ReadWOFF2Header(data: const uint8_t *, length: size_t, hdr: woff2::(anonymous } } - var first_table_offset: const uint64_t; + let first_table_offset: const uint64_t; hdr->compressed_offset = file.offset(); if (PREDICT_FALSE(hdr->compressed_offset > @@ -1227,13 +1227,13 @@ fn WriteHeaders(metadata: woff2::(anonymous namespace)::RebuildMetadata *, var sorted_tables: std::vector
; if (hdr->header_version) { // collection; we have to sort the table offset vector in each font - for (auto& ttc_font var __begin3: std::__wrap_iter var __range3: std::vector &) { + for (auto& ttc_font var __begin3: : var __range3: hdrhdr) { var sorted_index_by_tag: std::map; - for (auto table_index var __begin4: std::__wrap_iter var __range4: std::vector &) { + for (auto table_index var __begin4: : var __range4: ttc_fontttc_font) { sorted_index_by_tag[hdr->tables[table_index].tag] = table_index; } var index: uint16_t; - for (auto& i var __begin4: std::__map_iterator, std::__tree_node, void *> *, long>> var __range4: std::map &) { + for (auto& i var __begin4: : var __range4: sorted_index_by_tagsorted_index_by_tag) { ttc_font.table_indices[index++] = i.second; } } @@ -1275,7 +1275,7 @@ fn WriteHeaders(metadata: woff2::(anonymous namespace)::RebuildMetadata *, offset = StoreOffsetTable(result, offset, ttc_font.flavor, ttc_font.table_indices.size()); - for (const auto table_index var __begin4: std::__wrap_iter var __range4: std::vector &) { + for (const auto table_index var __begin4: : var __range4: ttc_fontttc_font) { var tag: uint32_t; metadata->font_infos[i].table_entry_by_tag[tag] = offset; offset = StoreTableEntry(result, offset, tag); @@ -1331,7 +1331,7 @@ fn ConvertWOFF2ToTTF(data: const uint8_t *, length: size_t, return FONT_COMPRESSION_FAILURE(); } - var compression_ratio: const float; + let compression_ratio: const float; if (compression_ratio > kMaxPlausibleCompressionRatio) { #ifdef FONT_COMPRESSION_BIN fprintf(stderr, "Implausible compression ratio %.01f\n", compression_ratio); diff --git a/third_party/examples/woff2/carbon/src/woff2_decompress.impl.carbon b/third_party/examples/woff2/carbon/src/woff2_decompress.impl.carbon index d317cbd96c07..75f6c857527c 100644 --- a/third_party/examples/woff2/carbon/src/woff2_decompress.impl.carbon +++ b/third_party/examples/woff2/carbon/src/woff2_decompress.impl.carbon @@ -26,11 +26,11 @@ fn main(argc: int, argv: char **) -> int { // Note: update woff2_dec_fuzzer_new_entry.cc if this pattern changes. var input: std::string; - var raw_input: const unsigned char *; + var raw_input: auto*; var output: std::string; var out: woff2::WOFF2StringOut; - var ok: const bool; + let ok: const bool; if (ok) { woff2::SetFileContents(outfilename, output.begin(), diff --git a/third_party/examples/woff2/carbon/src/woff2_enc.impl.carbon b/third_party/examples/woff2/carbon/src/woff2_enc.impl.carbon index 545e8b6c182d..f7c7d286bade 100644 --- a/third_party/examples/woff2/carbon/src/woff2_enc.impl.carbon +++ b/third_party/examples/woff2/carbon/src/woff2_enc.impl.carbon @@ -35,10 +35,10 @@ using std::string; using std::vector; -var kWoff2HeaderSize: const size_t; -var kWoff2EntrySize: const size_t; +let kWoff2HeaderSize: const size_t; +let kWoff2EntrySize: const size_t; -fn Compress(data: const uint8_t *, len: const size_t, result: uint8_t *, +fn Compress(data: const uint8_t *, let len: const size_t, result: uint8_t *, result_len: uint32_t *, mode: BrotliEncoderMode, quality: int) -> bool { var compressed_len: size_t; if (BrotliEncoderCompress(quality, BROTLI_DEFAULT_WINDOW, mode, len, data, @@ -49,14 +49,14 @@ fn Compress(data: const uint8_t *, len: const size_t, result: uint8_t *, return true; } -fn Woff2Compress(data: const uint8_t *, len: const size_t, +fn Woff2Compress(data: const uint8_t *, let len: const size_t, result: uint8_t *, result_len: uint32_t *, quality: int) -> bool { return Compress(data, len, result, result_len, BROTLI_MODE_FONT, quality); } -fn TextCompress(data: const uint8_t *, len: const size_t, +fn TextCompress(data: const uint8_t *, let len: const size_t, result: uint8_t *, result_len: uint32_t *, quality: int) -> bool { return Compress(data, len, result, result_len, @@ -103,7 +103,7 @@ fn ComputeWoff2Length(font_collection: const woff2::FontCollection &, extended_metadata_length: size_t) -> size_t { var size: size_t; - for (const auto& table var __begin2: std::__wrap_iter var __range2: const std::vector &) { + for (const auto& table var __begin2: : var __range2: tablestables) { size += TableEntrySize(table); } @@ -114,9 +114,9 @@ fn ComputeWoff2Length(font_collection: const woff2::FontCollection &, size += 4 * font_collection.fonts.size(); // UInt32 flavor for each - for (const auto& font var __begin3: std::__wrap_iter var __range3: const std::vector &) { + for (const auto& font var __begin3: : var __range3: font_collectionfont_collection) { size += Size255UShort(font.tables.size()); // 255UInt16 numTables - for (const auto& entry var __begin4: std::__map_const_iterator, std::__tree_node, void *> *, long>> var __range4: const std::map &) { + for (const auto& entry var __begin4: : var __range4: fontfont) { var table: const Font::Table &; // no collection entry for xform table if (table.tag & 0x80808080) { continue; @@ -140,7 +140,7 @@ fn ComputeWoff2Length(font_collection: const woff2::FontCollection &, fn ComputeUncompressedLength(font: const woff2::Font &) -> size_t { // sfnt header + offset table var size: size_t; - for (const auto& entry var __begin2: std::__map_const_iterator, std::__tree_node, void *> *, long>> var __range2: const std::map &) { + for (const auto& entry var __begin2: : var __range2: fontfont) { var table: const Font::Table &; if (table.tag & 0x80808080) { continue; // xform tables don't stay } @@ -156,7 +156,7 @@ fn ComputeUncompressedLength(font_collection: const woff2::FontCollection &) -> return ComputeUncompressedLength(font_collection.fonts[0]); } var size: size_t; - for (const auto& font var __begin2: std::__wrap_iter var __range2: const std::vector &) { + for (const auto& font var __begin2: : var __range2: font_collectionfont_collection) { size += ComputeUncompressedLength(font); } return size; @@ -164,7 +164,7 @@ fn ComputeUncompressedLength(font_collection: const woff2::FontCollection &) -> fn ComputeTotalTransformLength(font: const woff2::Font &) -> size_t { var total: size_t; - for (const auto& i var __begin2: std::__map_const_iterator, std::__tree_node, void *> *, long>> var __range2: const std::map &) { + for (const auto& i var __begin2: : var __range2: fontfont) { var table: const Font::Table &; if (table.IsReused()) { continue; @@ -198,7 +198,7 @@ fn CompressedBufferSize(original_size: uint32_t) -> uint32_t { } fn TransformFontCollection(font_collection: woff2::FontCollection *) -> bool { - for (auto& font var __begin1: std::__wrap_iter var __range1: std::vector &) { + for (auto& font var __begin1: : var __range1: font_collectionfont_collection) { if (!TransformGlyfAndLocaTables(&font)) { #ifdef FONT_COMPRESSION_BIN fprintf(stderr, "glyf/loca transformation failed.\n"); @@ -236,7 +236,7 @@ fn ConvertTTFToWOFF2(data: const uint8_t *, length: size_t, return FONT_COMPRESSION_FAILURE(); } else { // glyf/loca use 11 to flag "not transformed" - for (auto& font var __begin2: std::__wrap_iter var __range2: std::vector &) { + for (auto& font var __begin2: : var __range2: font_collectionfont_collection) { var glyf_table: Font::Table *; var loca_table: Font::Table *; if (glyf_table) { @@ -255,7 +255,7 @@ fn ConvertTTFToWOFF2(data: const uint8_t *, length: size_t, // then this function will also return false. var total_transform_length: size_t; - for (const auto& font var __begin1: std::__wrap_iter var __range1: std::vector &) { + for (const auto& font var __begin1: : var __range1: font_collectionfont_collection) { total_transform_length += ComputeTotalTransformLength(font); } var compression_buffer_size: size_t; @@ -265,8 +265,8 @@ fn ConvertTTFToWOFF2(data: const uint8_t *, length: size_t, // Collect all transformed data into one place in output order. var transform_buf: std::vector; var transform_offset: size_t; - for (const auto& font var __begin1: std::__wrap_iter var __range1: std::vector &) { - for (const auto tag var __begin2: std::__wrap_iter var __range2: std::vector &&) { + for (const auto& font var __begin1: : var __range1: font_collectionfont_collection) { + for (const auto tag var __begin2: : var __range2: fontfont) { var original: const Font::Table &; if (original.IsReused()) { continue; } @@ -320,9 +320,9 @@ fn ConvertTTFToWOFF2(data: const uint8_t *, length: size_t, var tables: std::vector
; var index_by_tag_offset: std::map, uint16_t>; - for (const auto& font var __begin1: std::__wrap_iter var __range1: std::vector &) { + for (const auto& font var __begin1: : var __range1: font_collectionfont_collection) { - for (const auto tag var __begin2: std::__wrap_iter var __range2: std::vector &&) { + for (const auto tag var __begin2: : var __range2: fontfont) { var src_table: const Font::Table &; if (src_table.IsReused()) { continue; @@ -398,7 +398,7 @@ fn ConvertTTFToWOFF2(data: const uint8_t *, length: size_t, // end of woff2 header // table directory (http://www.w3.org/TR/WOFF2/#table_dir_format) - for (const auto& table var __begin1: std::__wrap_iter var __range1: std::vector &) { + for (const auto& table var __begin1: : var __range1: tablestables) { StoreTableEntry(table, &offset, result); } @@ -406,10 +406,10 @@ fn ConvertTTFToWOFF2(data: const uint8_t *, length: size_t, if (font_collection.flavor == kTtcFontFlavor) { StoreU32(font_collection.header_version, &offset, result); Store255UShort(font_collection.fonts.size(), &offset, result); - for (const Font& font var __begin2: std::__wrap_iter var __range2: std::vector &) { + for (const Font& font var __begin2: : var __range2: font_collectionfont_collection) { var num_tables: uint16_t; - for (const auto& entry var __begin3: std::__map_const_iterator, std::__tree_node, void *> *, long>> var __range3: const std::map &) { + for (const auto& entry var __begin3: : var __range3: fontfont) { var table: const Font::Table &; if (table.tag & 0x80808080) { continue; // don't write xform tables } @@ -418,7 +418,7 @@ fn ConvertTTFToWOFF2(data: const uint8_t *, length: size_t, Store255UShort(num_tables, &offset, result); StoreU32(font.flavor, &offset, result); - for (const auto& entry var __begin3: std::__map_const_iterator, std::__tree_node, void *> *, long>> var __range3: const std::map &) { + for (const auto& entry var __begin3: : var __range3: fontfont) { var table: const Font::Table &; if (table.tag & 0x80808080) { continue; // don't write xform tables } diff --git a/third_party/examples/woff2/carbon/src/woff2_info.impl.carbon b/third_party/examples/woff2/carbon/src/woff2_info.impl.carbon index 3e0199bfca6d..b7704e2bd6d4 100644 --- a/third_party/examples/woff2/carbon/src/woff2_info.impl.carbon +++ b/third_party/examples/woff2/carbon/src/woff2_info.impl.carbon @@ -94,7 +94,7 @@ fn main(argc: int, argv: char **) -> int { var table_tags: std::vector; printf("TableDirectory starts at +%zu\n", file.offset()); printf("Entry offset flags tag origLength txLength\n"); - for (var i: int; i < num_tables; i++) { + for (var i: auto; i < num_tables; i++) { var offset: size_t; var flags: uint8_t; var tag: uint32_t, var origLength: uint32_t, var transformLength: uint32_t; @@ -137,7 +137,7 @@ fn main(argc: int, argv: char **) -> int { } printf("CollectionHeader 0x%08x %d fonts\n", version, numFonts); - for (var i: int; i < numFonts; i++) { + for (var i: auto; i < numFonts; i++) { var numTables: uint32_t, var flavor: uint32_t; if (!woff2::Read255UShort(&file, &numTables)) { return 1; } @@ -145,7 +145,7 @@ fn main(argc: int, argv: char **) -> int { } printf("CollectionFontEntry %d flavor 0x%08x %d tables\n", i, flavor, numTables); - for (var j: int; j < numTables; j++) { + for (var j: auto; j < numTables; j++) { var table_idx: uint32_t; if (!woff2::Read255UShort(&file, &table_idx)) { return 1; }